From 36f6ccc251698c37865fb9f832845294c76d3f1c Mon Sep 17 00:00:00 2001 From: JohnCorby Date: Wed, 1 Dec 2021 01:10:38 -0800 Subject: [PATCH 1/9] started --- QSB/AssetBundles/network | Bin 3780 -> 3948 bytes QSB/AssetBundles/network.manifest | 9 ++- QSB/JellyfishSync/JellyfishManager.cs | 11 +++ QSB/JellyfishSync/Patches/JellyfishPatches.cs | 40 ++++++++++ .../TransformSync/JellyfishTransformSync.cs | 70 ++++++++++++++++++ .../WorldObjects/QSBJellyfish.cs | 40 ++++++++++ QSB/Patches/QSBPatchManager.cs | 10 ++- QSB/QSBCore.cs | 6 +- QSB/QSBNetworkManager.cs | 4 + 9 files changed, 181 insertions(+), 9 deletions(-) create mode 100644 QSB/JellyfishSync/JellyfishManager.cs create mode 100644 QSB/JellyfishSync/Patches/JellyfishPatches.cs create mode 100644 QSB/JellyfishSync/TransformSync/JellyfishTransformSync.cs create mode 100644 QSB/JellyfishSync/WorldObjects/QSBJellyfish.cs diff --git a/QSB/AssetBundles/network b/QSB/AssetBundles/network index 8de1b060a42ca0f6d5ef58f6790e7cf7091a8986..6efbc1fcc2c4971a1c6b8b8a12be6f8142567480 100644 GIT binary patch delta 3864 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 MC~Ql4|F@N}k(=8e^Z)<= diff --git a/QSB/AssetBundles/network.manifest b/QSB/AssetBundles/network.manifest index 12010b7b..6e5ee70c 100644 --- a/QSB/AssetBundles/network.manifest +++ b/QSB/AssetBundles/network.manifest @@ -1,12 +1,12 @@ ManifestFileVersion: 0 -CRC: 1923832523 +CRC: 551896829 Hashes: AssetFileHash: serializedVersion: 2 - Hash: 81ec87f15e23d40065c2c9c6a04728d0 + Hash: 0fa5758f55c8803c7ba77a52ab2c9488 TypeTreeHash: serializedVersion: 2 - Hash: 0f787b84b284b04ad8bc62b6e0ef5423 + Hash: 927887737c4cf3ead147733f47326ca9 HashAppended: 0 ClassTypes: - Class: 1 @@ -29,6 +29,8 @@ ClassTypes: Script: {fileID: -1164351254, guid: 27687deae413b90448366870cb0de502, type: 3} - Class: 114 Script: {fileID: -1309757293, guid: 27687deae413b90448366870cb0de502, type: 3} +- Class: 114 + Script: {fileID: 316226861, guid: 27687deae413b90448366870cb0de502, type: 3} - Class: 114 Script: {fileID: 78926581, guid: 27687deae413b90448366870cb0de502, type: 3} - Class: 114 @@ -47,6 +49,7 @@ ClassTypes: Script: {instanceID: 0} SerializeReferenceClassIdentifiers: [] Assets: +- Assets/Prefabs/NetworkJellyfish.prefab - Assets/Prefabs/NetworkProbe.prefab - Assets/Prefabs/NETWORK_Player_Body.prefab - Assets/Prefabs/NetworkOrb.prefab diff --git a/QSB/JellyfishSync/JellyfishManager.cs b/QSB/JellyfishSync/JellyfishManager.cs new file mode 100644 index 00000000..f85fa7cd --- /dev/null +++ b/QSB/JellyfishSync/JellyfishManager.cs @@ -0,0 +1,11 @@ +using QSB.JellyfishSync.WorldObjects; +using QSB.WorldSync; + +namespace QSB.JellyfishSync +{ + public class JellyfishManager : WorldObjectManager + { + protected override void RebuildWorldObjects(OWScene scene) + => QSBWorldSync.Init(); + } +} diff --git a/QSB/JellyfishSync/Patches/JellyfishPatches.cs b/QSB/JellyfishSync/Patches/JellyfishPatches.cs new file mode 100644 index 00000000..c194fcc5 --- /dev/null +++ b/QSB/JellyfishSync/Patches/JellyfishPatches.cs @@ -0,0 +1,40 @@ +using HarmonyLib; +using QSB.Events; +using QSB.JellyfishSync.WorldObjects; +using QSB.Patches; +using QSB.WorldSync; + +namespace QSB.JellyfishSync.Patches +{ + public class JellyfishPatches : QSBPatch + { + public override QSBPatchTypes Type => QSBPatchTypes.OnClientConnect; + + [HarmonyPrefix] + [HarmonyPatch(typeof(JellyfishController), nameof(JellyfishController.OnSectorOccupantsUpdated))] + public static bool OnSectorOccupantsUpdated(JellyfishController __instance) + { + if (!QSBCore.WorldObjectsReady) + { + return false; + } + var qsbJellyfish = QSBWorldSync.GetWorldFromUnity(__instance); + + if (!__instance.gameObject.activeSelf && __instance._sector.ContainsAnyOccupants(DynamicOccupant.Player | DynamicOccupant.Probe | DynamicOccupant.Ship)) + { + __instance.gameObject.SetActive(true); + __instance._jellyfishBody.Unsuspend(); + QSBEventManager.FireEvent(EventNames.QSBSuspendChange, qsbJellyfish.TransformSync.NetIdentity, true); + return false; + } + if (__instance.gameObject.activeSelf && !__instance._sector.ContainsAnyOccupants(DynamicOccupant.Player | DynamicOccupant.Probe | DynamicOccupant.Ship)) + { + __instance._jellyfishBody.Suspend(); + __instance.gameObject.SetActive(false); + QSBEventManager.FireEvent(EventNames.QSBSuspendChange, qsbJellyfish.TransformSync.NetIdentity, true); + } + + return false; + } + } +} diff --git a/QSB/JellyfishSync/TransformSync/JellyfishTransformSync.cs b/QSB/JellyfishSync/TransformSync/JellyfishTransformSync.cs new file mode 100644 index 00000000..5f3a614e --- /dev/null +++ b/QSB/JellyfishSync/TransformSync/JellyfishTransformSync.cs @@ -0,0 +1,70 @@ +using System.Collections.Generic; +using QSB.JellyfishSync.WorldObjects; +using QSB.Syncs.Unsectored.Rigidbodies; +using QSB.WorldSync; +using QuantumUNET.Transport; + +namespace QSB.JellyfishSync.TransformSync +{ + public class JellyfishTransformSync : UnsectoredRigidbodySync + { + public override bool IsReady => QSBCore.WorldObjectsReady; + public override bool UseInterpolation => false; + + private QSBJellyfish _qsbJellyfish; + private static readonly List _instances = new(); + + protected override OWRigidbody GetRigidbody() + => _qsbJellyfish.AttachedObject._jellyfishBody; + + private static int _nextId; + private int _id; + + public override void Start() + { + _id = _nextId++; + base.Start(); + } + + protected override void OnDestroy() + { + _nextId--; + base.OnDestroy(); + } + + public override float GetNetworkSendInterval() => 1; + + protected override void Init() + { + _qsbJellyfish = QSBWorldSync.GetWorldFromId(_id); + _qsbJellyfish.TransformSync = this; + + base.Init(); + SetReferenceTransform(_qsbJellyfish.AttachedObject._planetBody.transform); + } + + private bool _shouldUpdate; + + public override void DeserializeTransform(QNetworkReader reader, bool initialState) + { + base.DeserializeTransform(reader, initialState); + _shouldUpdate = true; + } + + protected override bool UpdateTransform() + { + if (HasAuthority) + { + return base.UpdateTransform(); + } + + if (!_shouldUpdate) + { + return false; + } + + _shouldUpdate = false; + return base.UpdateTransform(); + } + } +} diff --git a/QSB/JellyfishSync/WorldObjects/QSBJellyfish.cs b/QSB/JellyfishSync/WorldObjects/QSBJellyfish.cs new file mode 100644 index 00000000..9641f551 --- /dev/null +++ b/QSB/JellyfishSync/WorldObjects/QSBJellyfish.cs @@ -0,0 +1,40 @@ +using QSB.Events; +using QSB.JellyfishSync.TransformSync; +using QSB.SuspendableSync; +using QSB.WorldSync; +using QuantumUNET; +using UnityEngine; + +namespace QSB.JellyfishSync.WorldObjects +{ + public class QSBJellyfish : WorldObject + { + public JellyfishTransformSync TransformSync; + + public override void Init(JellyfishController attachedObject, int id) + { + ObjectId = id; + AttachedObject = attachedObject; + + if (QSBCore.IsHost) + { + QNetworkServer.Spawn(Object.Instantiate(QSBNetworkManager.Instance.JellyfishPrefab)); + QSBCore.UnityEvents.RunWhen(() => TransformSync, () => + SuspendableManager.Register(TransformSync.NetIdentity)); + } + + // for when you host/connect mid-game + QSBCore.UnityEvents.RunWhen(() => TransformSync, () => + QSBEventManager.FireEvent(EventNames.QSBSuspendChange, TransformSync.NetIdentity, AttachedObject._jellyfishBody.IsSuspended())); + } + + public override void OnRemoval() + { + if (QSBCore.IsHost) + { + SuspendableManager.Unregister(TransformSync.NetIdentity); + QNetworkServer.Destroy(TransformSync.gameObject); + } + } + } +} diff --git a/QSB/Patches/QSBPatchManager.cs b/QSB/Patches/QSBPatchManager.cs index 8d3745cb..9712fdb5 100644 --- a/QSB/Patches/QSBPatchManager.cs +++ b/QSB/Patches/QSBPatchManager.cs @@ -1,4 +1,7 @@ -using HarmonyLib; +using System; +using System.Collections.Generic; +using System.Linq; +using HarmonyLib; using OWML.Common; using QSB.Anglerfish.Patches; using QSB.Animation.NPC.Patches; @@ -11,6 +14,7 @@ using QSB.ElevatorSync.Patches; using QSB.GeyserSync.Patches; using QSB.Inputs.Patches; using QSB.ItemSync.Patches; +using QSB.JellyfishSync.Patches; using QSB.LogSync.Patches; using QSB.MeteorSync.Patches; using QSB.OrbSync.Patches; @@ -27,9 +31,6 @@ using QSB.Tools.SignalscopeTool.FrequencySync.Patches; using QSB.Tools.TranslatorTool.TranslationSync.Patches; using QSB.Utility; using QSB.ZeroGCaveSync.Patches; -using System; -using System.Collections.Generic; -using System.Linq; namespace QSB.Patches { @@ -78,6 +79,7 @@ namespace QSB.Patches new AnglerPatches(), new MeteorClientPatches(), new MeteorServerPatches(), + new JellyfishPatches(), new TravelerControllerPatches(), new ZeroGCavePatches() }; diff --git a/QSB/QSBCore.cs b/QSB/QSBCore.cs index 97e13472..93dd0944 100644 --- a/QSB/QSBCore.cs +++ b/QSB/QSBCore.cs @@ -1,4 +1,5 @@ -using OWML.Common; +using System.Linq; +using OWML.Common; using OWML.ModHelper; using OWML.ModHelper.Input; using QSB.Anglerfish; @@ -11,6 +12,7 @@ using QSB.ElevatorSync; using QSB.GeyserSync; using QSB.Inputs; using QSB.ItemSync; +using QSB.JellyfishSync; using QSB.Menus; using QSB.MeteorSync; using QSB.OrbSync; @@ -32,7 +34,6 @@ using QSB.WorldSync; using QSB.ZeroGCaveSync; using QuantumUNET; using QuantumUNET.Components; -using System.Linq; using UnityEngine; /* @@ -141,6 +142,7 @@ namespace QSB gameObject.AddComponent(); gameObject.AddComponent(); gameObject.AddComponent(); + gameObject.AddComponent(); gameObject.AddComponent(); DebugBoxManager.Init(); diff --git a/QSB/QSBNetworkManager.cs b/QSB/QSBNetworkManager.cs index 57b5f4d3..a9f5c970 100644 --- a/QSB/QSBNetworkManager.cs +++ b/QSB/QSBNetworkManager.cs @@ -35,6 +35,7 @@ namespace QSB public GameObject OrbPrefab { get; private set; } public GameObject ShipPrefab { get; private set; } public GameObject AnglerPrefab { get; private set; } + public GameObject JellyfishPrefab { get; private set; } public string PlayerName { get; private set; } private const int MaxConnections = 128; @@ -66,6 +67,9 @@ namespace QSB AnglerPrefab = _assetBundle.LoadAsset("assets/Prefabs/networkangler.prefab"); spawnPrefabs.Add(AnglerPrefab); + JellyfishPrefab = _assetBundle.LoadAsset("assets/Prefabs/networkjellyfish.prefab"); + spawnPrefabs.Add(JellyfishPrefab); + ConfigureNetworkManager(); } From f9323728d6f86df67ba513698d792bdb319f79b5 Mon Sep 17 00:00:00 2001 From: JohnCorby Date: Wed, 1 Dec 2021 01:44:12 -0800 Subject: [PATCH 2/9] wow look at all those gizmos --- .../TransformSync/AnglerTransformSync.cs | 19 +++++++++-- QSB/JellyfishSync/Patches/JellyfishPatches.cs | 2 +- .../TransformSync/JellyfishTransformSync.cs | 34 +++++++++++++++---- 3 files changed, 45 insertions(+), 10 deletions(-) diff --git a/QSB/Anglerfish/TransformSync/AnglerTransformSync.cs b/QSB/Anglerfish/TransformSync/AnglerTransformSync.cs index 297524da..612c3d8b 100644 --- a/QSB/Anglerfish/TransformSync/AnglerTransformSync.cs +++ b/QSB/Anglerfish/TransformSync/AnglerTransformSync.cs @@ -72,12 +72,27 @@ namespace QSB.Anglerfish.TransformSync if (!QSBCore.WorldObjectsReady || !QSBCore.ShowLinesInDebug || !IsReady - || ReferenceTransform == null) + || ReferenceTransform == null + || ((OWRigidbody)AttachedObject).IsSuspended()) { return; } - Popcron.Gizmos.Line(AttachedObject.transform.position, _qsbAngler.AttachedObject.GetTargetPosition(), Color.white); + Popcron.Gizmos.Sphere(AttachedObject.transform.position, _qsbAngler.AttachedObject._arrivalDistance, Color.blue); + Popcron.Gizmos.Sphere(AttachedObject.transform.position, _qsbAngler.AttachedObject._pursueDistance, Color.red); + Popcron.Gizmos.Sphere(AttachedObject.transform.position, _qsbAngler.AttachedObject._escapeDistance, Color.yellow); + Popcron.Gizmos.Sphere(AttachedObject.transform.position + + AttachedObject.transform.TransformDirection(_qsbAngler.AttachedObject._mouthOffset), 3, Color.grey); + + if (_qsbAngler.TargetTransform != null) + { + Popcron.Gizmos.Line(_qsbAngler.TargetTransform.position, ((OWRigidbody)AttachedObject).GetPosition(), Color.gray); + Popcron.Gizmos.Line(_qsbAngler.TargetTransform.position, _qsbAngler.TargetTransform.position + _qsbAngler.TargetVelocity, Color.green); + Popcron.Gizmos.Line(((OWRigidbody)AttachedObject).GetPosition(), _qsbAngler.AttachedObject._targetPos, Color.red); + Popcron.Gizmos.Sphere(_qsbAngler.AttachedObject._targetPos, 5, Color.red); + } + + // Popcron.Gizmos.Line(AttachedObject.transform.position, _qsbAngler.AttachedObject.GetTargetPosition(), Color.white); } } } diff --git a/QSB/JellyfishSync/Patches/JellyfishPatches.cs b/QSB/JellyfishSync/Patches/JellyfishPatches.cs index c194fcc5..bb547e3d 100644 --- a/QSB/JellyfishSync/Patches/JellyfishPatches.cs +++ b/QSB/JellyfishSync/Patches/JellyfishPatches.cs @@ -24,7 +24,7 @@ namespace QSB.JellyfishSync.Patches { __instance.gameObject.SetActive(true); __instance._jellyfishBody.Unsuspend(); - QSBEventManager.FireEvent(EventNames.QSBSuspendChange, qsbJellyfish.TransformSync.NetIdentity, true); + QSBEventManager.FireEvent(EventNames.QSBSuspendChange, qsbJellyfish.TransformSync.NetIdentity, false); return false; } if (__instance.gameObject.activeSelf && !__instance._sector.ContainsAnyOccupants(DynamicOccupant.Player | DynamicOccupant.Probe | DynamicOccupant.Ship)) diff --git a/QSB/JellyfishSync/TransformSync/JellyfishTransformSync.cs b/QSB/JellyfishSync/TransformSync/JellyfishTransformSync.cs index 5f3a614e..c5b146f3 100644 --- a/QSB/JellyfishSync/TransformSync/JellyfishTransformSync.cs +++ b/QSB/JellyfishSync/TransformSync/JellyfishTransformSync.cs @@ -1,8 +1,8 @@ -using System.Collections.Generic; -using QSB.JellyfishSync.WorldObjects; +using QSB.JellyfishSync.WorldObjects; using QSB.Syncs.Unsectored.Rigidbodies; using QSB.WorldSync; using QuantumUNET.Transport; +using UnityEngine; namespace QSB.JellyfishSync.TransformSync { @@ -12,14 +12,12 @@ namespace QSB.JellyfishSync.TransformSync public override bool UseInterpolation => false; private QSBJellyfish _qsbJellyfish; - private static readonly List _instances = new(); + private static int _nextId; + private int _id; protected override OWRigidbody GetRigidbody() => _qsbJellyfish.AttachedObject._jellyfishBody; - private static int _nextId; - private int _id; - public override void Start() { _id = _nextId++; @@ -32,7 +30,7 @@ namespace QSB.JellyfishSync.TransformSync base.OnDestroy(); } - public override float GetNetworkSendInterval() => 1; + public override float GetNetworkSendInterval() => 10; protected override void Init() { @@ -66,5 +64,27 @@ namespace QSB.JellyfishSync.TransformSync _shouldUpdate = false; return base.UpdateTransform(); } + + + protected override void OnRenderObject() + { + base.OnRenderObject(); + + if (!QSBCore.WorldObjectsReady + || !QSBCore.ShowLinesInDebug + || !IsReady + || ReferenceTransform == null + || ((OWRigidbody)AttachedObject).IsSuspended()) + { + return; + } + + var jellyfish = _qsbJellyfish.AttachedObject; + var position = ReferenceTransform.position; + var dir = Vector3.Normalize(jellyfish.transform.position - position); + Popcron.Gizmos.Line(position + dir * jellyfish._lowerLimit, position + dir * jellyfish._upperLimit, Color.magenta); + Popcron.Gizmos.Sphere(position + dir * jellyfish._lowerLimit, 10f, Color.magenta); + Popcron.Gizmos.Sphere(position + dir * jellyfish._upperLimit, 10f, Color.magenta); + } } } From 2493e8f97d706563a4540d228cfc55f4a0827845 Mon Sep 17 00:00:00 2001 From: JohnCorby Date: Wed, 1 Dec 2021 01:46:43 -0800 Subject: [PATCH 3/9] go back to using list. rip --- .../TransformSync/JellyfishTransformSync.cs | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/QSB/JellyfishSync/TransformSync/JellyfishTransformSync.cs b/QSB/JellyfishSync/TransformSync/JellyfishTransformSync.cs index c5b146f3..9cb851d6 100644 --- a/QSB/JellyfishSync/TransformSync/JellyfishTransformSync.cs +++ b/QSB/JellyfishSync/TransformSync/JellyfishTransformSync.cs @@ -1,4 +1,5 @@ -using QSB.JellyfishSync.WorldObjects; +using System.Collections.Generic; +using QSB.JellyfishSync.WorldObjects; using QSB.Syncs.Unsectored.Rigidbodies; using QSB.WorldSync; using QuantumUNET.Transport; @@ -12,21 +13,20 @@ namespace QSB.JellyfishSync.TransformSync public override bool UseInterpolation => false; private QSBJellyfish _qsbJellyfish; - private static int _nextId; - private int _id; + private static readonly List _instances = new(); protected override OWRigidbody GetRigidbody() => _qsbJellyfish.AttachedObject._jellyfishBody; public override void Start() { - _id = _nextId++; + _instances.Add(this); base.Start(); } protected override void OnDestroy() { - _nextId--; + _instances.Remove(this); base.OnDestroy(); } @@ -34,7 +34,7 @@ namespace QSB.JellyfishSync.TransformSync protected override void Init() { - _qsbJellyfish = QSBWorldSync.GetWorldFromId(_id); + _qsbJellyfish = QSBWorldSync.GetWorldFromId(_instances.IndexOf(this)); _qsbJellyfish.TransformSync = this; base.Init(); From aa28364c55b34833cbd8643cb2e98c419d14e8a6 Mon Sep 17 00:00:00 2001 From: JohnCorby Date: Wed, 1 Dec 2021 02:23:12 -0800 Subject: [PATCH 4/9] rising sync --- .../Events/AnglerChangeStateEvent.cs | 5 +-- QSB/Events/EventNames.cs | 1 + QSB/Events/QSBEventManager.cs | 2 ++ .../Events/JellyfishRisingEvent.cs | 35 +++++++++++++++++++ QSB/JellyfishSync/Patches/JellyfishPatches.cs | 33 +++++++++++++++++ .../WorldObjects/QSBJellyfish.cs | 11 ++++++ 6 files changed, 83 insertions(+), 4 deletions(-) create mode 100644 QSB/JellyfishSync/Events/JellyfishRisingEvent.cs diff --git a/QSB/Anglerfish/Events/AnglerChangeStateEvent.cs b/QSB/Anglerfish/Events/AnglerChangeStateEvent.cs index 01c6d68f..f1fb0ab1 100644 --- a/QSB/Anglerfish/Events/AnglerChangeStateEvent.cs +++ b/QSB/Anglerfish/Events/AnglerChangeStateEvent.cs @@ -24,10 +24,7 @@ namespace QSB.Anglerfish.Events LocalDisturbancePos = qsbAngler.AttachedObject._localDisturbancePos }; - public override void OnReceiveLocal(bool isHost, AnglerChangeStateMessage message) => OnReceive(message); - public override void OnReceiveRemote(bool isHost, AnglerChangeStateMessage message) => OnReceive(message); - - private static void OnReceive(AnglerChangeStateMessage message) + public override void OnReceiveRemote(bool isHost, AnglerChangeStateMessage message) { if (!QSBCore.WorldObjectsReady) { diff --git a/QSB/Events/EventNames.cs b/QSB/Events/EventNames.cs index 4b73735a..5bdfd749 100644 --- a/QSB/Events/EventNames.cs +++ b/QSB/Events/EventNames.cs @@ -102,5 +102,6 @@ public static string QSBSatelliteRepairTick = "QSBSatelliteRepairTick"; public static string QSBSatelliteRepaired = "QSBSatelliteRepairTick"; public static string QSBSuspendChange = "QSBSuspendChange"; + public static string QSBJellyfishRising = "QSBJellyfishRising"; } } diff --git a/QSB/Events/QSBEventManager.cs b/QSB/Events/QSBEventManager.cs index aefa7493..38aaaf4c 100644 --- a/QSB/Events/QSBEventManager.cs +++ b/QSB/Events/QSBEventManager.cs @@ -10,6 +10,7 @@ using QSB.DeathSync.Events; using QSB.ElevatorSync.Events; using QSB.GeyserSync.Events; using QSB.ItemSync.Events; +using QSB.JellyfishSync.Events; using QSB.LogSync.Events; using QSB.MeteorSync.Events; using QSB.OrbSync.Events; @@ -104,6 +105,7 @@ namespace QSB.Events new MeteorSpecialImpactEvent(), new FragmentDamageEvent(), new FragmentResyncEvent(), + new JellyfishRisingEvent(), // Conversation/dialogue/exploration new ConversationEvent(), new ConversationStartEndEvent(), diff --git a/QSB/JellyfishSync/Events/JellyfishRisingEvent.cs b/QSB/JellyfishSync/Events/JellyfishRisingEvent.cs new file mode 100644 index 00000000..35e535c3 --- /dev/null +++ b/QSB/JellyfishSync/Events/JellyfishRisingEvent.cs @@ -0,0 +1,35 @@ +using QSB.Events; +using QSB.JellyfishSync.WorldObjects; +using QSB.WorldSync; +using QSB.WorldSync.Events; + +namespace QSB.JellyfishSync.Events +{ + public class JellyfishRisingEvent : QSBEvent + { + 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) + { + if (!QSBCore.WorldObjectsReady) + { + return; + } + + var qsbJellyfish = QSBWorldSync.GetWorldFromId(message.ObjectId); + qsbJellyfish.IsRising = message.State; + } + } +} diff --git a/QSB/JellyfishSync/Patches/JellyfishPatches.cs b/QSB/JellyfishSync/Patches/JellyfishPatches.cs index bb547e3d..65437dc2 100644 --- a/QSB/JellyfishSync/Patches/JellyfishPatches.cs +++ b/QSB/JellyfishSync/Patches/JellyfishPatches.cs @@ -36,5 +36,38 @@ namespace QSB.JellyfishSync.Patches return false; } + + [HarmonyPrefix] + [HarmonyPatch(typeof(JellyfishController), nameof(JellyfishController.FixedUpdate))] + public static bool FixedUpdate(JellyfishController __instance) + { + if (!QSBCore.WorldObjectsReady) + { + return false; + } + var qsbJellyfish = QSBWorldSync.GetWorldFromUnity(__instance); + + var sqrMagnitude = (__instance._jellyfishBody.GetPosition() - __instance._planetBody.GetPosition()).sqrMagnitude; + if (qsbJellyfish.IsRising) + { + __instance._jellyfishBody.AddAcceleration(__instance.transform.up * __instance._upwardsAcceleration); + if (sqrMagnitude > __instance._upperLimit * __instance._upperLimit) + { + qsbJellyfish.IsRising = false; + QSBEventManager.FireEvent(EventNames.QSBJellyfishRising, qsbJellyfish); + } + } + else + { + __instance._jellyfishBody.AddAcceleration(-__instance.transform.up * __instance._downwardsAcceleration); + if (sqrMagnitude < __instance._lowerLimit * __instance._lowerLimit) + { + qsbJellyfish.IsRising = true; + QSBEventManager.FireEvent(EventNames.QSBJellyfishRising, qsbJellyfish); + } + } + + return false; + } } } diff --git a/QSB/JellyfishSync/WorldObjects/QSBJellyfish.cs b/QSB/JellyfishSync/WorldObjects/QSBJellyfish.cs index 9641f551..1dd4245a 100644 --- a/QSB/JellyfishSync/WorldObjects/QSBJellyfish.cs +++ b/QSB/JellyfishSync/WorldObjects/QSBJellyfish.cs @@ -36,5 +36,16 @@ namespace QSB.JellyfishSync.WorldObjects QNetworkServer.Destroy(TransformSync.gameObject); } } + + + public bool IsRising + { + get => AttachedObject._isRising; + set + { + AttachedObject._isRising = value; + AttachedObject._attractiveFluidVolume.SetVolumeActivation(!value); + } + } } } From 7b81e1b4e0affe8719d5b2a0e792b86128f523d7 Mon Sep 17 00:00:00 2001 From: JohnCorby Date: Wed, 1 Dec 2021 03:55:56 -0800 Subject: [PATCH 5/9] funny moments with kinematic simulation and alignment --- .../TransformSync/AnglerTransformSync.cs | 4 +- .../TransformSync/JellyfishTransformSync.cs | 63 +++++++++++++++++-- .../WorldObjects/QSBJellyfish.cs | 7 +++ .../Rigidbodies/UnsectoredRigidbodySync.cs | 2 +- 4 files changed, 68 insertions(+), 8 deletions(-) diff --git a/QSB/Anglerfish/TransformSync/AnglerTransformSync.cs b/QSB/Anglerfish/TransformSync/AnglerTransformSync.cs index 612c3d8b..af971677 100644 --- a/QSB/Anglerfish/TransformSync/AnglerTransformSync.cs +++ b/QSB/Anglerfish/TransformSync/AnglerTransformSync.cs @@ -67,8 +67,6 @@ namespace QSB.Anglerfish.TransformSync protected override void OnRenderObject() { - base.OnRenderObject(); - if (!QSBCore.WorldObjectsReady || !QSBCore.ShowLinesInDebug || !IsReady @@ -78,6 +76,8 @@ namespace QSB.Anglerfish.TransformSync return; } + base.OnRenderObject(); + Popcron.Gizmos.Sphere(AttachedObject.transform.position, _qsbAngler.AttachedObject._arrivalDistance, Color.blue); Popcron.Gizmos.Sphere(AttachedObject.transform.position, _qsbAngler.AttachedObject._pursueDistance, Color.red); Popcron.Gizmos.Sphere(AttachedObject.transform.position, _qsbAngler.AttachedObject._escapeDistance, Color.yellow); diff --git a/QSB/JellyfishSync/TransformSync/JellyfishTransformSync.cs b/QSB/JellyfishSync/TransformSync/JellyfishTransformSync.cs index 9cb851d6..96fd888e 100644 --- a/QSB/JellyfishSync/TransformSync/JellyfishTransformSync.cs +++ b/QSB/JellyfishSync/TransformSync/JellyfishTransformSync.cs @@ -1,6 +1,8 @@ using System.Collections.Generic; using QSB.JellyfishSync.WorldObjects; +using QSB.Syncs; using QSB.Syncs.Unsectored.Rigidbodies; +using QSB.Utility; using QSB.WorldSync; using QuantumUNET.Transport; using UnityEngine; @@ -49,11 +51,14 @@ namespace QSB.JellyfishSync.TransformSync _shouldUpdate = true; } + /// replacement using SetPosition/Rotation instead of Move protected override bool UpdateTransform() { if (HasAuthority) { - return base.UpdateTransform(); + _qsbJellyfish.Align = true; + SetValuesToSync(); + return true; } if (!_shouldUpdate) @@ -62,14 +67,60 @@ namespace QSB.JellyfishSync.TransformSync } _shouldUpdate = false; - return base.UpdateTransform(); + + var targetPos = ReferenceTransform.DecodePos(transform.position); + var targetRot = ReferenceTransform.DecodeRot(transform.rotation); + + if (targetPos == Vector3.zero || transform.position == Vector3.zero) + { + return false; + } + + var positionToSet = targetPos; + var rotationToSet = targetRot; + + if (UseInterpolation) + { + positionToSet = SmartSmoothDamp(AttachedObject.transform.position, targetPos); + rotationToSet = QuaternionHelper.SmoothDamp(AttachedObject.transform.rotation, targetRot, ref _rotationSmoothVelocity, SmoothTime); + } + + var hasMoved = CustomHasMoved( + transform.position, + _localPrevPosition, + transform.rotation, + _localPrevRotation, + _relativeVelocity, + _localPrevVelocity, + _relativeAngularVelocity, + _localPrevAngularVelocity); + + _localPrevPosition = transform.position; + _localPrevRotation = transform.rotation; + _localPrevVelocity = _relativeVelocity; + _localPrevAngularVelocity = _relativeAngularVelocity; + + if (!hasMoved) + { + return true; + } + + _qsbJellyfish.Align = false; + ((OWRigidbody)AttachedObject).SetPosition(positionToSet); + ((OWRigidbody)AttachedObject).SetRotation(rotationToSet); + + var targetVelocity = ReferenceTransform.GetAttachedOWRigidbody().DecodeVel(_relativeVelocity, targetPos); + var targetAngularVelocity = ReferenceTransform.GetAttachedOWRigidbody().DecodeAngVel(_relativeAngularVelocity); + + ((OWRigidbody)AttachedObject).SetVelocity(targetVelocity); + ((OWRigidbody)AttachedObject).SetAngularVelocity(targetAngularVelocity); + + return true; } protected override void OnRenderObject() { - base.OnRenderObject(); - if (!QSBCore.WorldObjectsReady || !QSBCore.ShowLinesInDebug || !IsReady @@ -79,10 +130,12 @@ namespace QSB.JellyfishSync.TransformSync return; } + base.OnRenderObject(); + var jellyfish = _qsbJellyfish.AttachedObject; var position = ReferenceTransform.position; var dir = Vector3.Normalize(jellyfish.transform.position - position); - Popcron.Gizmos.Line(position + dir * jellyfish._lowerLimit, position + dir * jellyfish._upperLimit, Color.magenta); + // Popcron.Gizmos.Line(position + dir * jellyfish._lowerLimit, position + dir * jellyfish._upperLimit, Color.magenta); Popcron.Gizmos.Sphere(position + dir * jellyfish._lowerLimit, 10f, Color.magenta); Popcron.Gizmos.Sphere(position + dir * jellyfish._upperLimit, 10f, Color.magenta); } diff --git a/QSB/JellyfishSync/WorldObjects/QSBJellyfish.cs b/QSB/JellyfishSync/WorldObjects/QSBJellyfish.cs index 1dd4245a..f8457609 100644 --- a/QSB/JellyfishSync/WorldObjects/QSBJellyfish.cs +++ b/QSB/JellyfishSync/WorldObjects/QSBJellyfish.cs @@ -10,11 +10,13 @@ namespace QSB.JellyfishSync.WorldObjects public class QSBJellyfish : WorldObject { public JellyfishTransformSync TransformSync; + private AlignWithTargetBody _alignWithTargetBody; public override void Init(JellyfishController attachedObject, int id) { ObjectId = id; AttachedObject = attachedObject; + _alignWithTargetBody = AttachedObject.GetRequiredComponent(); if (QSBCore.IsHost) { @@ -47,5 +49,10 @@ namespace QSB.JellyfishSync.WorldObjects AttachedObject._attractiveFluidVolume.SetVolumeActivation(!value); } } + + public bool Align + { + set => _alignWithTargetBody.enabled = value; + } } } diff --git a/QSB/Syncs/Unsectored/Rigidbodies/UnsectoredRigidbodySync.cs b/QSB/Syncs/Unsectored/Rigidbodies/UnsectoredRigidbodySync.cs index e4be3e0a..71cb667c 100644 --- a/QSB/Syncs/Unsectored/Rigidbodies/UnsectoredRigidbodySync.cs +++ b/QSB/Syncs/Unsectored/Rigidbodies/UnsectoredRigidbodySync.cs @@ -162,7 +162,7 @@ namespace QSB.Syncs.Unsectored.Rigidbodies _prevAngularVelocity); // OPTIMIZE : optimize by using sqrMagnitude - private bool CustomHasMoved( + internal bool CustomHasMoved( Vector3 newPosition, Vector3 prevPosition, Quaternion newRotation, From b206bba1cd446309e0d07a320b0064185b26c6f1 Mon Sep 17 00:00:00 2001 From: JohnCorby Date: Wed, 1 Dec 2021 23:09:34 -0800 Subject: [PATCH 6/9] sync rising with transform sync (note: rising var does not touch dirty bit) --- .../TransformSync/AnglerTransformSync.cs | 6 +++++ .../TransformSync/JellyfishTransformSync.cs | 25 +++++++++++++++++-- .../WorldObjects/QSBJellyfish.cs | 5 ++++ QSB/WorldSync/WorldObjectManager.cs | 1 + 4 files changed, 35 insertions(+), 2 deletions(-) diff --git a/QSB/Anglerfish/TransformSync/AnglerTransformSync.cs b/QSB/Anglerfish/TransformSync/AnglerTransformSync.cs index af971677..3ed36de3 100644 --- a/QSB/Anglerfish/TransformSync/AnglerTransformSync.cs +++ b/QSB/Anglerfish/TransformSync/AnglerTransformSync.cs @@ -46,6 +46,12 @@ namespace QSB.Anglerfish.TransformSync public override void DeserializeTransform(QNetworkReader reader, bool initialState) { base.DeserializeTransform(reader, initialState); + + if (!QSBCore.WorldObjectsReady || HasAuthority) + { + return; + } + _shouldUpdate = true; } diff --git a/QSB/JellyfishSync/TransformSync/JellyfishTransformSync.cs b/QSB/JellyfishSync/TransformSync/JellyfishTransformSync.cs index 96fd888e..b83e0426 100644 --- a/QSB/JellyfishSync/TransformSync/JellyfishTransformSync.cs +++ b/QSB/JellyfishSync/TransformSync/JellyfishTransformSync.cs @@ -43,11 +43,34 @@ namespace QSB.JellyfishSync.TransformSync SetReferenceTransform(_qsbJellyfish.AttachedObject._planetBody.transform); } + public override void SerializeTransform(QNetworkWriter writer, bool initialState) + { + base.SerializeTransform(writer, initialState); + + if (!QSBCore.WorldObjectsReady) + { + writer.Write(false); + return; + } + + _qsbJellyfish.Align = true; + writer.Write(_qsbJellyfish.IsRising); + } + private bool _shouldUpdate; public override void DeserializeTransform(QNetworkReader reader, bool initialState) { base.DeserializeTransform(reader, initialState); + + if (!QSBCore.WorldObjectsReady || HasAuthority) + { + reader.ReadBoolean(); + return; + } + + _qsbJellyfish.Align = false; + _qsbJellyfish.IsRising = reader.ReadBoolean(); _shouldUpdate = true; } @@ -56,7 +79,6 @@ namespace QSB.JellyfishSync.TransformSync { if (HasAuthority) { - _qsbJellyfish.Align = true; SetValuesToSync(); return true; } @@ -105,7 +127,6 @@ namespace QSB.JellyfishSync.TransformSync return true; } - _qsbJellyfish.Align = false; ((OWRigidbody)AttachedObject).SetPosition(positionToSet); ((OWRigidbody)AttachedObject).SetRotation(rotationToSet); diff --git a/QSB/JellyfishSync/WorldObjects/QSBJellyfish.cs b/QSB/JellyfishSync/WorldObjects/QSBJellyfish.cs index f8457609..63e74bd1 100644 --- a/QSB/JellyfishSync/WorldObjects/QSBJellyfish.cs +++ b/QSB/JellyfishSync/WorldObjects/QSBJellyfish.cs @@ -45,6 +45,11 @@ namespace QSB.JellyfishSync.WorldObjects get => AttachedObject._isRising; set { + if (AttachedObject._isRising == value) + { + return; + } + AttachedObject._isRising = value; AttachedObject._attractiveFluidVolume.SetVolumeActivation(!value); } diff --git a/QSB/WorldSync/WorldObjectManager.cs b/QSB/WorldSync/WorldObjectManager.cs index f619787b..1372d883 100644 --- a/QSB/WorldSync/WorldObjectManager.cs +++ b/QSB/WorldSync/WorldObjectManager.cs @@ -10,6 +10,7 @@ namespace QSB.WorldSync { private static readonly List _managers = new(); + // BUG : this gets set to true even if the objects aren't technically ready (i.e. they wait for something else) public static bool AllReady { get; private set; } public virtual void Awake() From b9eee5c6b5bdba25649678005d59b79f628c862b Mon Sep 17 00:00:00 2001 From: JohnCorby Date: Thu, 2 Dec 2021 02:08:42 -0800 Subject: [PATCH 7/9] use orig method if world objects not ready --- QSB/Anglerfish/Patches/AnglerPatches.cs | 6 +++--- QSB/JellyfishSync/Patches/JellyfishPatches.cs | 4 ++-- QSB/MeteorSync/Patches/MeteorClientPatches.cs | 2 +- QSB/MeteorSync/Patches/MeteorServerPatches.cs | 4 ++-- 4 files changed, 8 insertions(+), 8 deletions(-) diff --git a/QSB/Anglerfish/Patches/AnglerPatches.cs b/QSB/Anglerfish/Patches/AnglerPatches.cs index 08ea9cf8..86aed7c6 100644 --- a/QSB/Anglerfish/Patches/AnglerPatches.cs +++ b/QSB/Anglerfish/Patches/AnglerPatches.cs @@ -33,7 +33,7 @@ namespace QSB.Anglerfish.Patches { if (!QSBCore.WorldObjectsReady) { - return false; + return true; } var qsbAngler = QSBWorldSync.GetWorldFromUnity(__instance); @@ -78,7 +78,7 @@ namespace QSB.Anglerfish.Patches { if (!QSBCore.WorldObjectsReady) { - return false; + return true; } var qsbAngler = QSBWorldSync.GetWorldFromUnity(__instance); @@ -173,7 +173,7 @@ namespace QSB.Anglerfish.Patches { if (!QSBCore.WorldObjectsReady) { - return false; + return true; } var qsbAngler = QSBWorldSync.GetWorldFromUnity(__instance); qsbAngler.UpdateTargetVelocity(); diff --git a/QSB/JellyfishSync/Patches/JellyfishPatches.cs b/QSB/JellyfishSync/Patches/JellyfishPatches.cs index 65437dc2..b399ea8e 100644 --- a/QSB/JellyfishSync/Patches/JellyfishPatches.cs +++ b/QSB/JellyfishSync/Patches/JellyfishPatches.cs @@ -16,7 +16,7 @@ namespace QSB.JellyfishSync.Patches { if (!QSBCore.WorldObjectsReady) { - return false; + return true; } var qsbJellyfish = QSBWorldSync.GetWorldFromUnity(__instance); @@ -43,7 +43,7 @@ namespace QSB.JellyfishSync.Patches { if (!QSBCore.WorldObjectsReady) { - return false; + return true; } var qsbJellyfish = QSBWorldSync.GetWorldFromUnity(__instance); diff --git a/QSB/MeteorSync/Patches/MeteorClientPatches.cs b/QSB/MeteorSync/Patches/MeteorClientPatches.cs index ca7db543..fd4272e5 100644 --- a/QSB/MeteorSync/Patches/MeteorClientPatches.cs +++ b/QSB/MeteorSync/Patches/MeteorClientPatches.cs @@ -150,7 +150,7 @@ namespace QSB.MeteorSync.Patches } if (!MeteorManager.Ready) { - return false; + return true; } var qsbFragment = QSBWorldSync.GetWorldFromUnity(__instance._detachableFragment._fragmentIntegrity); diff --git a/QSB/MeteorSync/Patches/MeteorServerPatches.cs b/QSB/MeteorSync/Patches/MeteorServerPatches.cs index 5cc71d7b..272f397d 100644 --- a/QSB/MeteorSync/Patches/MeteorServerPatches.cs +++ b/QSB/MeteorSync/Patches/MeteorServerPatches.cs @@ -17,7 +17,7 @@ namespace QSB.MeteorSync.Patches { if (!MeteorManager.Ready) { - return false; + return true; } if (__instance._launchedMeteors != null) @@ -204,7 +204,7 @@ namespace QSB.MeteorSync.Patches } if (!MeteorManager.Ready) { - return false; + return true; } var qsbFragment = QSBWorldSync.GetWorldFromUnity(__instance._detachableFragment._fragmentIntegrity); From 267c62403753b84a9d298baf9ceb7e403e6eb861 Mon Sep 17 00:00:00 2001 From: Mister_Nebula <41904486+misternebula@users.noreply.github.com> Date: Thu, 2 Dec 2021 14:58:03 +0000 Subject: [PATCH 8/9] remove jellyfish stuff --- QSB/Events/QSBEventManager.cs | 2 - .../Events/JellyfishRisingEvent.cs | 35 ---- QSB/JellyfishSync/JellyfishManager.cs | 11 -- QSB/JellyfishSync/Patches/JellyfishPatches.cs | 73 -------- .../TransformSync/JellyfishTransformSync.cs | 164 ------------------ .../WorldObjects/QSBJellyfish.cs | 63 ------- QSB/Patches/QSBPatchManager.cs | 2 - QSB/QSBCore.cs | 2 - 8 files changed, 352 deletions(-) delete mode 100644 QSB/JellyfishSync/Events/JellyfishRisingEvent.cs delete mode 100644 QSB/JellyfishSync/JellyfishManager.cs delete mode 100644 QSB/JellyfishSync/Patches/JellyfishPatches.cs delete mode 100644 QSB/JellyfishSync/TransformSync/JellyfishTransformSync.cs delete mode 100644 QSB/JellyfishSync/WorldObjects/QSBJellyfish.cs diff --git a/QSB/Events/QSBEventManager.cs b/QSB/Events/QSBEventManager.cs index 38aaaf4c..aefa7493 100644 --- a/QSB/Events/QSBEventManager.cs +++ b/QSB/Events/QSBEventManager.cs @@ -10,7 +10,6 @@ using QSB.DeathSync.Events; using QSB.ElevatorSync.Events; using QSB.GeyserSync.Events; using QSB.ItemSync.Events; -using QSB.JellyfishSync.Events; using QSB.LogSync.Events; using QSB.MeteorSync.Events; using QSB.OrbSync.Events; @@ -105,7 +104,6 @@ namespace QSB.Events new MeteorSpecialImpactEvent(), new FragmentDamageEvent(), new FragmentResyncEvent(), - new JellyfishRisingEvent(), // Conversation/dialogue/exploration new ConversationEvent(), new ConversationStartEndEvent(), diff --git a/QSB/JellyfishSync/Events/JellyfishRisingEvent.cs b/QSB/JellyfishSync/Events/JellyfishRisingEvent.cs deleted file mode 100644 index 35e535c3..00000000 --- a/QSB/JellyfishSync/Events/JellyfishRisingEvent.cs +++ /dev/null @@ -1,35 +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 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) - { - if (!QSBCore.WorldObjectsReady) - { - return; - } - - var qsbJellyfish = QSBWorldSync.GetWorldFromId(message.ObjectId); - qsbJellyfish.IsRising = message.State; - } - } -} diff --git a/QSB/JellyfishSync/JellyfishManager.cs b/QSB/JellyfishSync/JellyfishManager.cs deleted file mode 100644 index f85fa7cd..00000000 --- a/QSB/JellyfishSync/JellyfishManager.cs +++ /dev/null @@ -1,11 +0,0 @@ -using QSB.JellyfishSync.WorldObjects; -using QSB.WorldSync; - -namespace QSB.JellyfishSync -{ - public class JellyfishManager : WorldObjectManager - { - protected override void RebuildWorldObjects(OWScene scene) - => QSBWorldSync.Init(); - } -} diff --git a/QSB/JellyfishSync/Patches/JellyfishPatches.cs b/QSB/JellyfishSync/Patches/JellyfishPatches.cs deleted file mode 100644 index b399ea8e..00000000 --- a/QSB/JellyfishSync/Patches/JellyfishPatches.cs +++ /dev/null @@ -1,73 +0,0 @@ -using HarmonyLib; -using QSB.Events; -using QSB.JellyfishSync.WorldObjects; -using QSB.Patches; -using QSB.WorldSync; - -namespace QSB.JellyfishSync.Patches -{ - public class JellyfishPatches : QSBPatch - { - public override QSBPatchTypes Type => QSBPatchTypes.OnClientConnect; - - [HarmonyPrefix] - [HarmonyPatch(typeof(JellyfishController), nameof(JellyfishController.OnSectorOccupantsUpdated))] - public static bool OnSectorOccupantsUpdated(JellyfishController __instance) - { - if (!QSBCore.WorldObjectsReady) - { - return true; - } - var qsbJellyfish = QSBWorldSync.GetWorldFromUnity(__instance); - - if (!__instance.gameObject.activeSelf && __instance._sector.ContainsAnyOccupants(DynamicOccupant.Player | DynamicOccupant.Probe | DynamicOccupant.Ship)) - { - __instance.gameObject.SetActive(true); - __instance._jellyfishBody.Unsuspend(); - QSBEventManager.FireEvent(EventNames.QSBSuspendChange, qsbJellyfish.TransformSync.NetIdentity, false); - return false; - } - if (__instance.gameObject.activeSelf && !__instance._sector.ContainsAnyOccupants(DynamicOccupant.Player | DynamicOccupant.Probe | DynamicOccupant.Ship)) - { - __instance._jellyfishBody.Suspend(); - __instance.gameObject.SetActive(false); - QSBEventManager.FireEvent(EventNames.QSBSuspendChange, qsbJellyfish.TransformSync.NetIdentity, true); - } - - return false; - } - - [HarmonyPrefix] - [HarmonyPatch(typeof(JellyfishController), nameof(JellyfishController.FixedUpdate))] - public static bool FixedUpdate(JellyfishController __instance) - { - if (!QSBCore.WorldObjectsReady) - { - return true; - } - var qsbJellyfish = QSBWorldSync.GetWorldFromUnity(__instance); - - var sqrMagnitude = (__instance._jellyfishBody.GetPosition() - __instance._planetBody.GetPosition()).sqrMagnitude; - if (qsbJellyfish.IsRising) - { - __instance._jellyfishBody.AddAcceleration(__instance.transform.up * __instance._upwardsAcceleration); - if (sqrMagnitude > __instance._upperLimit * __instance._upperLimit) - { - qsbJellyfish.IsRising = false; - QSBEventManager.FireEvent(EventNames.QSBJellyfishRising, qsbJellyfish); - } - } - else - { - __instance._jellyfishBody.AddAcceleration(-__instance.transform.up * __instance._downwardsAcceleration); - if (sqrMagnitude < __instance._lowerLimit * __instance._lowerLimit) - { - qsbJellyfish.IsRising = true; - QSBEventManager.FireEvent(EventNames.QSBJellyfishRising, qsbJellyfish); - } - } - - return false; - } - } -} diff --git a/QSB/JellyfishSync/TransformSync/JellyfishTransformSync.cs b/QSB/JellyfishSync/TransformSync/JellyfishTransformSync.cs deleted file mode 100644 index b83e0426..00000000 --- a/QSB/JellyfishSync/TransformSync/JellyfishTransformSync.cs +++ /dev/null @@ -1,164 +0,0 @@ -using System.Collections.Generic; -using QSB.JellyfishSync.WorldObjects; -using QSB.Syncs; -using QSB.Syncs.Unsectored.Rigidbodies; -using QSB.Utility; -using QSB.WorldSync; -using QuantumUNET.Transport; -using UnityEngine; - -namespace QSB.JellyfishSync.TransformSync -{ - public class JellyfishTransformSync : UnsectoredRigidbodySync - { - public override bool IsReady => QSBCore.WorldObjectsReady; - public override bool UseInterpolation => false; - - private QSBJellyfish _qsbJellyfish; - private static readonly List _instances = new(); - - protected override OWRigidbody GetRigidbody() - => _qsbJellyfish.AttachedObject._jellyfishBody; - - public override void Start() - { - _instances.Add(this); - base.Start(); - } - - protected override void OnDestroy() - { - _instances.Remove(this); - base.OnDestroy(); - } - - public override float GetNetworkSendInterval() => 10; - - protected override void Init() - { - _qsbJellyfish = QSBWorldSync.GetWorldFromId(_instances.IndexOf(this)); - _qsbJellyfish.TransformSync = this; - - base.Init(); - SetReferenceTransform(_qsbJellyfish.AttachedObject._planetBody.transform); - } - - public override void SerializeTransform(QNetworkWriter writer, bool initialState) - { - base.SerializeTransform(writer, initialState); - - if (!QSBCore.WorldObjectsReady) - { - writer.Write(false); - return; - } - - _qsbJellyfish.Align = true; - writer.Write(_qsbJellyfish.IsRising); - } - - private bool _shouldUpdate; - - public override void DeserializeTransform(QNetworkReader reader, bool initialState) - { - base.DeserializeTransform(reader, initialState); - - if (!QSBCore.WorldObjectsReady || HasAuthority) - { - reader.ReadBoolean(); - return; - } - - _qsbJellyfish.Align = false; - _qsbJellyfish.IsRising = reader.ReadBoolean(); - _shouldUpdate = true; - } - - /// replacement using SetPosition/Rotation instead of Move - protected override bool UpdateTransform() - { - if (HasAuthority) - { - SetValuesToSync(); - return true; - } - - if (!_shouldUpdate) - { - return false; - } - - _shouldUpdate = false; - - var targetPos = ReferenceTransform.DecodePos(transform.position); - var targetRot = ReferenceTransform.DecodeRot(transform.rotation); - - if (targetPos == Vector3.zero || transform.position == Vector3.zero) - { - return false; - } - - var positionToSet = targetPos; - var rotationToSet = targetRot; - - if (UseInterpolation) - { - positionToSet = SmartSmoothDamp(AttachedObject.transform.position, targetPos); - rotationToSet = QuaternionHelper.SmoothDamp(AttachedObject.transform.rotation, targetRot, ref _rotationSmoothVelocity, SmoothTime); - } - - var hasMoved = CustomHasMoved( - transform.position, - _localPrevPosition, - transform.rotation, - _localPrevRotation, - _relativeVelocity, - _localPrevVelocity, - _relativeAngularVelocity, - _localPrevAngularVelocity); - - _localPrevPosition = transform.position; - _localPrevRotation = transform.rotation; - _localPrevVelocity = _relativeVelocity; - _localPrevAngularVelocity = _relativeAngularVelocity; - - if (!hasMoved) - { - return true; - } - - ((OWRigidbody)AttachedObject).SetPosition(positionToSet); - ((OWRigidbody)AttachedObject).SetRotation(rotationToSet); - - var targetVelocity = ReferenceTransform.GetAttachedOWRigidbody().DecodeVel(_relativeVelocity, targetPos); - var targetAngularVelocity = ReferenceTransform.GetAttachedOWRigidbody().DecodeAngVel(_relativeAngularVelocity); - - ((OWRigidbody)AttachedObject).SetVelocity(targetVelocity); - ((OWRigidbody)AttachedObject).SetAngularVelocity(targetAngularVelocity); - - return true; - } - - - protected override void OnRenderObject() - { - if (!QSBCore.WorldObjectsReady - || !QSBCore.ShowLinesInDebug - || !IsReady - || ReferenceTransform == null - || ((OWRigidbody)AttachedObject).IsSuspended()) - { - return; - } - - base.OnRenderObject(); - - var jellyfish = _qsbJellyfish.AttachedObject; - var position = ReferenceTransform.position; - var dir = Vector3.Normalize(jellyfish.transform.position - position); - // Popcron.Gizmos.Line(position + dir * jellyfish._lowerLimit, position + dir * jellyfish._upperLimit, Color.magenta); - Popcron.Gizmos.Sphere(position + dir * jellyfish._lowerLimit, 10f, Color.magenta); - Popcron.Gizmos.Sphere(position + dir * jellyfish._upperLimit, 10f, Color.magenta); - } - } -} diff --git a/QSB/JellyfishSync/WorldObjects/QSBJellyfish.cs b/QSB/JellyfishSync/WorldObjects/QSBJellyfish.cs deleted file mode 100644 index 63e74bd1..00000000 --- a/QSB/JellyfishSync/WorldObjects/QSBJellyfish.cs +++ /dev/null @@ -1,63 +0,0 @@ -using QSB.Events; -using QSB.JellyfishSync.TransformSync; -using QSB.SuspendableSync; -using QSB.WorldSync; -using QuantumUNET; -using UnityEngine; - -namespace QSB.JellyfishSync.WorldObjects -{ - public class QSBJellyfish : WorldObject - { - public JellyfishTransformSync TransformSync; - private AlignWithTargetBody _alignWithTargetBody; - - public override void Init(JellyfishController attachedObject, int id) - { - ObjectId = id; - AttachedObject = attachedObject; - _alignWithTargetBody = AttachedObject.GetRequiredComponent(); - - if (QSBCore.IsHost) - { - QNetworkServer.Spawn(Object.Instantiate(QSBNetworkManager.Instance.JellyfishPrefab)); - QSBCore.UnityEvents.RunWhen(() => TransformSync, () => - SuspendableManager.Register(TransformSync.NetIdentity)); - } - - // for when you host/connect mid-game - QSBCore.UnityEvents.RunWhen(() => TransformSync, () => - QSBEventManager.FireEvent(EventNames.QSBSuspendChange, TransformSync.NetIdentity, AttachedObject._jellyfishBody.IsSuspended())); - } - - public override void OnRemoval() - { - if (QSBCore.IsHost) - { - SuspendableManager.Unregister(TransformSync.NetIdentity); - QNetworkServer.Destroy(TransformSync.gameObject); - } - } - - - public bool IsRising - { - get => AttachedObject._isRising; - set - { - if (AttachedObject._isRising == value) - { - return; - } - - AttachedObject._isRising = value; - AttachedObject._attractiveFluidVolume.SetVolumeActivation(!value); - } - } - - public bool Align - { - set => _alignWithTargetBody.enabled = value; - } - } -} diff --git a/QSB/Patches/QSBPatchManager.cs b/QSB/Patches/QSBPatchManager.cs index 9712fdb5..17b833d5 100644 --- a/QSB/Patches/QSBPatchManager.cs +++ b/QSB/Patches/QSBPatchManager.cs @@ -14,7 +14,6 @@ using QSB.ElevatorSync.Patches; using QSB.GeyserSync.Patches; using QSB.Inputs.Patches; using QSB.ItemSync.Patches; -using QSB.JellyfishSync.Patches; using QSB.LogSync.Patches; using QSB.MeteorSync.Patches; using QSB.OrbSync.Patches; @@ -79,7 +78,6 @@ namespace QSB.Patches new AnglerPatches(), new MeteorClientPatches(), new MeteorServerPatches(), - new JellyfishPatches(), new TravelerControllerPatches(), new ZeroGCavePatches() }; diff --git a/QSB/QSBCore.cs b/QSB/QSBCore.cs index 93dd0944..2117b467 100644 --- a/QSB/QSBCore.cs +++ b/QSB/QSBCore.cs @@ -12,7 +12,6 @@ using QSB.ElevatorSync; using QSB.GeyserSync; using QSB.Inputs; using QSB.ItemSync; -using QSB.JellyfishSync; using QSB.Menus; using QSB.MeteorSync; using QSB.OrbSync; @@ -142,7 +141,6 @@ namespace QSB gameObject.AddComponent(); gameObject.AddComponent(); gameObject.AddComponent(); - gameObject.AddComponent(); gameObject.AddComponent(); DebugBoxManager.Init(); From 0fb03a90cc66bdb0bcefc9c53d035098c890dc6a Mon Sep 17 00:00:00 2001 From: Mister_Nebula <41904486+misternebula@users.noreply.github.com> Date: Thu, 2 Dec 2021 15:00:08 +0000 Subject: [PATCH 9/9] remove more jellyfish stuff --- QSB/Events/EventNames.cs | 1 - QSB/QSBNetworkManager.cs | 4 ---- 2 files changed, 5 deletions(-) diff --git a/QSB/Events/EventNames.cs b/QSB/Events/EventNames.cs index 5bdfd749..4b73735a 100644 --- a/QSB/Events/EventNames.cs +++ b/QSB/Events/EventNames.cs @@ -102,6 +102,5 @@ public static string QSBSatelliteRepairTick = "QSBSatelliteRepairTick"; public static string QSBSatelliteRepaired = "QSBSatelliteRepairTick"; public static string QSBSuspendChange = "QSBSuspendChange"; - public static string QSBJellyfishRising = "QSBJellyfishRising"; } } diff --git a/QSB/QSBNetworkManager.cs b/QSB/QSBNetworkManager.cs index a9f5c970..57b5f4d3 100644 --- a/QSB/QSBNetworkManager.cs +++ b/QSB/QSBNetworkManager.cs @@ -35,7 +35,6 @@ namespace QSB public GameObject OrbPrefab { get; private set; } public GameObject ShipPrefab { get; private set; } public GameObject AnglerPrefab { get; private set; } - public GameObject JellyfishPrefab { get; private set; } public string PlayerName { get; private set; } private const int MaxConnections = 128; @@ -67,9 +66,6 @@ namespace QSB AnglerPrefab = _assetBundle.LoadAsset("assets/Prefabs/networkangler.prefab"); spawnPrefabs.Add(AnglerPrefab); - JellyfishPrefab = _assetBundle.LoadAsset("assets/Prefabs/networkjellyfish.prefab"); - spawnPrefabs.Add(JellyfishPrefab); - ConfigureNetworkManager(); }