diff --git a/QSB/Anglerfish/AnglerManager.cs b/QSB/Anglerfish/AnglerManager.cs index 7426752d..09ea3945 100644 --- a/QSB/Anglerfish/AnglerManager.cs +++ b/QSB/Anglerfish/AnglerManager.cs @@ -5,6 +5,7 @@ namespace QSB.Anglerfish { public class AnglerManager : WorldObjectManager { - protected override void RebuildWorldObjects(OWScene scene) => QSBWorldSync.Init(); + protected override void RebuildWorldObjects(OWScene scene) + => QSBWorldSync.Init(); } } diff --git a/QSB/Anglerfish/Events/AnglerChangeStateEvent.cs b/QSB/Anglerfish/Events/AnglerChangeStateEvent.cs index 7c5b5045..d6918780 100644 --- a/QSB/Anglerfish/Events/AnglerChangeStateEvent.cs +++ b/QSB/Anglerfish/Events/AnglerChangeStateEvent.cs @@ -11,17 +11,22 @@ namespace QSB.Anglerfish.Events public class AnglerChangeStateEvent : QSBEvent { public override EventType Type => EventType.AnglerChangeState; - public override void SetupListener() => GlobalMessenger.AddListener(EventNames.QSBAnglerChangeState, Handler); - public override void CloseListener() => GlobalMessenger.RemoveListener(EventNames.QSBAnglerChangeState, Handler); - private void Handler(QSBAngler qsbAngler) => - SendEvent(new AnglerChangeStateMessage - { - ObjectId = qsbAngler.ObjectId, - EnumValue = qsbAngler.AttachedObject._currentState, - targetId = TargetToId(qsbAngler.targetTransform), - localDisturbancePos = qsbAngler.AttachedObject._localDisturbancePos - }); + 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 AnglerChangeStateMessage + { + ObjectId = qsbAngler.ObjectId, + EnumValue = qsbAngler.AttachedObject._currentState, + TargetId = TargetToId(qsbAngler.TargetTransform), + LocalDisturbancePos = qsbAngler.AttachedObject._localDisturbancePos + }; public override void OnReceiveLocal(bool isHost, AnglerChangeStateMessage message) => OnReceive(isHost, message); public override void OnReceiveRemote(bool isHost, AnglerChangeStateMessage message) => OnReceive(isHost, message); @@ -36,8 +41,8 @@ namespace QSB.Anglerfish.Events qsbAngler.TransferAuthority(message.FromId); } - qsbAngler.targetTransform = IdToTarget(message.targetId); - qsbAngler.AttachedObject._localDisturbancePos = message.localDisturbancePos; + qsbAngler.TargetTransform = IdToTarget(message.TargetId); + qsbAngler.AttachedObject._localDisturbancePos = message.LocalDisturbancePos; qsbAngler.AttachedObject.ChangeState(message.EnumValue); } @@ -47,10 +52,12 @@ namespace QSB.Anglerfish.Events { return uint.MaxValue; } + if (transform == Locator.GetShipTransform()) { return uint.MaxValue - 1; } + return QSBPlayerManager.LocalPlayerId; } @@ -60,10 +67,12 @@ namespace QSB.Anglerfish.Events { 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 index 9a5a40cd..0615153d 100644 --- a/QSB/Anglerfish/Events/AnglerChangeStateMessage.cs +++ b/QSB/Anglerfish/Events/AnglerChangeStateMessage.cs @@ -6,21 +6,21 @@ namespace QSB.Anglerfish.Events { public class AnglerChangeStateMessage : EnumWorldObjectMessage { - public uint targetId; - public Vector3 localDisturbancePos; + public uint TargetId; + public Vector3 LocalDisturbancePos; public override void Deserialize(QNetworkReader reader) { base.Deserialize(reader); - targetId = reader.ReadUInt32(); - localDisturbancePos = reader.ReadVector3(); + TargetId = reader.ReadUInt32(); + LocalDisturbancePos = reader.ReadVector3(); } public override void Serialize(QNetworkWriter writer) { base.Serialize(writer); - writer.Write(targetId); - writer.Write(localDisturbancePos); + writer.Write(TargetId); + writer.Write(LocalDisturbancePos); } } } diff --git a/QSB/Anglerfish/Patches/AnglerPatches.cs b/QSB/Anglerfish/Patches/AnglerPatches.cs index ce106806..0f930cbc 100644 --- a/QSB/Anglerfish/Patches/AnglerPatches.cs +++ b/QSB/Anglerfish/Patches/AnglerPatches.cs @@ -17,12 +17,14 @@ namespace QSB.Anglerfish.Patches public static bool GetTargetPosition(AnglerfishController __instance, ref Vector3 __result) { var qsbAngler = QSBWorldSync.GetWorldFromUnity(__instance); - if (qsbAngler == null || qsbAngler.transformSync == null) + if (qsbAngler == null || qsbAngler.TransformSync == null) { return false; } - __result = qsbAngler.targetTransform != null ? qsbAngler.targetTransform.position : __instance._brambleBody.transform.TransformPoint(__instance._localDisturbancePos); + __result = qsbAngler.TargetTransform != null + ? qsbAngler.TargetTransform.position + : __instance._brambleBody.transform.TransformPoint(__instance._localDisturbancePos); return false; } @@ -34,17 +36,17 @@ namespace QSB.Anglerfish.Patches SectorDetector sectorDetector) { var qsbAngler = QSBWorldSync.GetWorldFromUnity(__instance); - if (qsbAngler == null || qsbAngler.transformSync == null) + if (qsbAngler == null || qsbAngler.TransformSync == null) { return false; } - if (!(qsbAngler.targetTransform != null) || !(sectorDetector.GetAttachedOWRigidbody().transform == qsbAngler.targetTransform)) + if (!(qsbAngler.TargetTransform != null) || !(sectorDetector.GetAttachedOWRigidbody().transform == qsbAngler.TargetTransform)) { return false; } - qsbAngler.targetTransform = null; + qsbAngler.TargetTransform = null; return false; } @@ -55,7 +57,7 @@ namespace QSB.Anglerfish.Patches public static bool UpdateState(AnglerfishController __instance) { var qsbAngler = QSBWorldSync.GetWorldFromUnity(__instance); - if (qsbAngler == null || qsbAngler.transformSync == null) + if (qsbAngler == null || qsbAngler.TransformSync == null) { return false; } @@ -71,49 +73,54 @@ namespace QSB.Anglerfish.Patches __instance.ChangeState(AnglerfishController.AnglerState.Lurking); QSBEventManager.FireEvent(EventNames.QSBAnglerChangeState, qsbAngler); break; + case AnglerfishController.AnglerState.Chasing: - if (qsbAngler.targetTransform == null) + if (qsbAngler.TargetTransform == null) { __instance.ChangeState(AnglerfishController.AnglerState.Lurking); QSBEventManager.FireEvent(EventNames.QSBAnglerChangeState, qsbAngler); break; } - if ((qsbAngler.targetTransform.position - __instance._anglerBody.GetPosition()).sqrMagnitude <= __instance._escapeDistance * (double)__instance._escapeDistance) + + if ((qsbAngler.TargetTransform.position - __instance._anglerBody.GetPosition()).sqrMagnitude <= __instance._escapeDistance * (double)__instance._escapeDistance) { break; } - qsbAngler.targetTransform = null; + qsbAngler.TargetTransform = null; __instance.ChangeState(AnglerfishController.AnglerState.Lurking); QSBEventManager.FireEvent(EventNames.QSBAnglerChangeState, qsbAngler); break; + case AnglerfishController.AnglerState.Consuming: if (__instance._consumeComplete) { break; } - if (qsbAngler.targetTransform == null) + if (qsbAngler.TargetTransform == null) { __instance.ChangeState(AnglerfishController.AnglerState.Lurking); QSBEventManager.FireEvent(EventNames.QSBAnglerChangeState, qsbAngler); break; } + var num = Time.time - __instance._consumeStartTime; - if (qsbAngler.targetTransform.CompareTag("Player") && num > (double)__instance._consumeDeathDelay) + if (qsbAngler.TargetTransform.CompareTag("Player") && num > (double)__instance._consumeDeathDelay) { Locator.GetDeathManager().KillPlayer(DeathType.Digestion); __instance._consumeComplete = true; break; } - if (!qsbAngler.targetTransform.CompareTag("Ship")) + + if (!qsbAngler.TargetTransform.CompareTag("Ship")) { break; } if (num > (double)__instance._consumeShipCrushDelay) { - qsbAngler.targetTransform.GetComponentInChildren().TriggerSystemFailure(); + qsbAngler.TargetTransform.GetComponentInChildren().TriggerSystemFailure(); } if (num <= (double)__instance._consumeDeathDelay) @@ -128,6 +135,7 @@ namespace QSB.Anglerfish.Patches __instance._consumeComplete = true; break; + case AnglerfishController.AnglerState.Stunned: __instance._stunTimer -= Time.deltaTime; if (__instance._stunTimer > 0.0) @@ -135,7 +143,7 @@ namespace QSB.Anglerfish.Patches break; } - if (qsbAngler.targetTransform != null) + if (qsbAngler.TargetTransform != null) { __instance.ChangeState(AnglerfishController.AnglerState.Chasing); QSBEventManager.FireEvent(EventNames.QSBAnglerChangeState, qsbAngler); @@ -155,14 +163,16 @@ namespace QSB.Anglerfish.Patches public static bool UpdateMovement(AnglerfishController __instance) { var qsbAngler = QSBWorldSync.GetWorldFromUnity(__instance); - if (qsbAngler == null || qsbAngler.transformSync == null) + if (qsbAngler == null || qsbAngler.TransformSync == null) { return false; } - if (!qsbAngler.transformSync.HasAuthority) + + if (!qsbAngler.TransformSync.HasAuthority) { return false; } + qsbAngler.FixedUpdate(); if (__instance._anglerBody.GetVelocity().sqrMagnitude > (double)Mathf.Pow(__instance._chaseSpeed * 1.5f, 2f)) @@ -175,6 +185,7 @@ namespace QSB.Anglerfish.Patches case AnglerfishController.AnglerState.Lurking: __instance.ApplyDrag(1f); break; + case AnglerfishController.AnglerState.Investigating: var targetPos = __instance._brambleBody.transform.TransformPoint(__instance._localDisturbancePos); __instance.RotateTowardsTarget(targetPos, __instance._turnSpeed, __instance._turnSpeed); @@ -185,10 +196,11 @@ namespace QSB.Anglerfish.Patches __instance.MoveTowardsTarget(targetPos, __instance._investigateSpeed, __instance._acceleration); break; + case AnglerfishController.AnglerState.Chasing: var velocity = qsbAngler.TargetVelocity; var normalized = velocity.normalized; - var from = __instance._anglerBody.GetPosition() + __instance.transform.TransformDirection(__instance._mouthOffset) - qsbAngler.targetTransform.position; + var from = __instance._anglerBody.GetPosition() + __instance.transform.TransformDirection(__instance._mouthOffset) - qsbAngler.TargetTransform.position; var magnitude1 = velocity.magnitude; var num1 = Vector3.Angle(from, normalized); var a = magnitude1 * 2f; @@ -211,7 +223,8 @@ namespace QSB.Anglerfish.Patches num2 = Mathf.Lerp(num4, 0.0f, num6 * num6); } } - __instance._targetPos = qsbAngler.targetTransform.position + normalized * num2; + + __instance._targetPos = qsbAngler.TargetTransform.position + normalized * num2; __instance.RotateTowardsTarget(__instance._targetPos, __instance._turnSpeed, __instance._quickTurnSpeed); if (__instance._turningInPlace) { @@ -220,9 +233,11 @@ namespace QSB.Anglerfish.Patches __instance.MoveTowardsTarget(__instance._targetPos, __instance._chaseSpeed, __instance._acceleration); break; + case AnglerfishController.AnglerState.Consuming: __instance.ApplyDrag(1f); break; + case AnglerfishController.AnglerState.Stunned: __instance.ApplyDrag(0.5f); break; @@ -238,15 +253,17 @@ namespace QSB.Anglerfish.Patches ImpactData impact) { var qsbAngler = QSBWorldSync.GetWorldFromUnity(__instance); - if (qsbAngler == null || qsbAngler.transformSync == null) + if (qsbAngler == null || qsbAngler.TransformSync == null) { return false; } var attachedOwRigidbody = impact.otherCollider.GetAttachedOWRigidbody(); - if ((attachedOwRigidbody.CompareTag("Player") || attachedOwRigidbody.CompareTag("Ship")) && __instance._currentState != AnglerfishController.AnglerState.Consuming && __instance._currentState != AnglerfishController.AnglerState.Stunned) + if ((attachedOwRigidbody.CompareTag("Player") || attachedOwRigidbody.CompareTag("Ship")) + && __instance._currentState != AnglerfishController.AnglerState.Consuming + && __instance._currentState != AnglerfishController.AnglerState.Stunned) { - qsbAngler.targetTransform = attachedOwRigidbody.transform; + qsbAngler.TargetTransform = attachedOwRigidbody.transform; __instance.ChangeState(AnglerfishController.AnglerState.Chasing); QSBEventManager.FireEvent(EventNames.QSBAnglerChangeState, qsbAngler); } @@ -261,24 +278,25 @@ namespace QSB.Anglerfish.Patches NoiseMaker noiseMaker) { var qsbAngler = QSBWorldSync.GetWorldFromUnity(__instance); - if (qsbAngler == null || qsbAngler.transformSync == null) + if (qsbAngler == null || qsbAngler.TransformSync == null) { return false; } - if (__instance._currentState == AnglerfishController.AnglerState.Consuming || __instance._currentState == AnglerfishController.AnglerState.Stunned) + if (__instance._currentState == AnglerfishController.AnglerState.Consuming + || __instance._currentState == AnglerfishController.AnglerState.Stunned) { return false; } if ((noiseMaker.GetNoiseOrigin() - __instance.transform.position).sqrMagnitude < __instance._pursueDistance * (double)__instance._pursueDistance) { - if (!(qsbAngler.targetTransform != noiseMaker.GetAttachedBody().transform)) + if (!(qsbAngler.TargetTransform != noiseMaker.GetAttachedBody().transform)) { return false; } - qsbAngler.targetTransform = noiseMaker.GetAttachedBody().transform; + qsbAngler.TargetTransform = noiseMaker.GetAttachedBody().transform; if (__instance._currentState == AnglerfishController.AnglerState.Chasing) { return false; @@ -289,7 +307,8 @@ namespace QSB.Anglerfish.Patches } else { - if (__instance._currentState != AnglerfishController.AnglerState.Lurking && __instance._currentState != AnglerfishController.AnglerState.Investigating) + if (__instance._currentState != AnglerfishController.AnglerState.Lurking + && __instance._currentState != AnglerfishController.AnglerState.Investigating) { return false; } @@ -317,7 +336,7 @@ namespace QSB.Anglerfish.Patches if (__instance._currentState == AnglerfishController.AnglerState.Consuming) { - if (qsbAngler.targetTransform.CompareTag("Player") || !caughtBody.CompareTag("Player")) + if (qsbAngler.TargetTransform.CompareTag("Player") || !caughtBody.CompareTag("Player")) { return false; } @@ -331,7 +350,7 @@ namespace QSB.Anglerfish.Patches return false; } - qsbAngler.targetTransform = caughtBody.transform; + qsbAngler.TargetTransform = caughtBody.transform; __instance._consumeStartTime = Time.time; __instance.ChangeState(AnglerfishController.AnglerState.Consuming); QSBEventManager.FireEvent(EventNames.QSBAnglerChangeState, qsbAngler); diff --git a/QSB/Anglerfish/TransformSync/AnglerTransformSync.cs b/QSB/Anglerfish/TransformSync/AnglerTransformSync.cs index 9111b376..5cc9384a 100644 --- a/QSB/Anglerfish/TransformSync/AnglerTransformSync.cs +++ b/QSB/Anglerfish/TransformSync/AnglerTransformSync.cs @@ -10,11 +10,13 @@ namespace QSB.Anglerfish.TransformSync { public override bool IsReady => QSBCore.WorldObjectsReady; public override bool UseInterpolation => true; - protected override OWRigidbody GetRigidbody() => _qsbAngler.AttachedObject._anglerBody; private QSBAngler _qsbAngler; private static readonly List _instances = new List(); + protected override OWRigidbody GetRigidbody() + => _qsbAngler.AttachedObject._anglerBody; + public override void Start() { _instances.Add(this); @@ -27,18 +29,18 @@ namespace QSB.Anglerfish.TransformSync base.OnDestroy(); } - public override float GetNetworkSendInterval() => 1 / 4f; + public override float GetNetworkSendInterval() + => 1 / 4f; protected override void Init() { _qsbAngler = QSBWorldSync.GetWorldFromId(_instances.IndexOf(this)); - _qsbAngler.transformSync = this; + _qsbAngler.TransformSync = this; base.Init(); SetReferenceTransform(_qsbAngler.AttachedObject._brambleBody.transform); } - protected override void OnRenderObject() { base.OnRenderObject(); diff --git a/QSB/Anglerfish/WorldObjects/QSBAngler.cs b/QSB/Anglerfish/WorldObjects/QSBAngler.cs index 361d23ea..48faf5fb 100644 --- a/QSB/Anglerfish/WorldObjects/QSBAngler.cs +++ b/QSB/Anglerfish/WorldObjects/QSBAngler.cs @@ -10,7 +10,11 @@ namespace QSB.Anglerfish.WorldObjects { public class QSBAngler : WorldObject { - public AnglerTransformSync transformSync; + public AnglerTransformSync TransformSync; + public Transform TargetTransform; + public Vector3 TargetVelocity { get; private set; } + + private Vector3 _lastTargetPosition; public override void Init(AnglerfishController attachedObject, int id) { @@ -27,14 +31,14 @@ namespace QSB.Anglerfish.WorldObjects { if (QSBCore.IsHost) { - QNetworkServer.Destroy(transformSync.gameObject); + QNetworkServer.Destroy(TransformSync.gameObject); } } public void TransferAuthority(uint id) { var conn = QNetworkServer.connections.First(x => x.GetPlayerId() == id); - var identity = transformSync.NetIdentity; + var identity = TransformSync.NetIdentity; if (identity.ClientAuthorityOwner == conn) { @@ -50,19 +54,14 @@ namespace QSB.Anglerfish.WorldObjects DebugLog.DebugWrite($"angler {ObjectId} - transferred authority to {id}"); } - - public Transform targetTransform; - public Vector3 TargetVelocity { get; private set; } - private Vector3 _lastTargetPosition; - public void FixedUpdate() { - if (targetTransform == null) + if (TargetTransform == null) { return; } - TargetVelocity = targetTransform.position - _lastTargetPosition; - _lastTargetPosition = targetTransform.position; + TargetVelocity = TargetTransform.position - _lastTargetPosition; + _lastTargetPosition = TargetTransform.position; } } }