From ed39bacc954cce37c93f8d78611018f2b5d7114c Mon Sep 17 00:00:00 2001 From: Mister_Nebula <41904486+misternebula@users.noreply.github.com> Date: Sun, 18 Apr 2021 22:54:57 +0100 Subject: [PATCH 01/12] Update PlayerProbeSync.cs --- .../TransformSync/PlayerProbeSync.cs | 31 ------------------- 1 file changed, 31 deletions(-) diff --git a/QSB/ProbeSync/TransformSync/PlayerProbeSync.cs b/QSB/ProbeSync/TransformSync/PlayerProbeSync.cs index 473e7840..4c84a0cc 100644 --- a/QSB/ProbeSync/TransformSync/PlayerProbeSync.cs +++ b/QSB/ProbeSync/TransformSync/PlayerProbeSync.cs @@ -56,37 +56,6 @@ namespace QSB.ProbeSync.TransformSync _disabledSocket = socket; } - /* - protected override void UpdateTransform() - { - base.UpdateTransform(); - if (Player == null) - { - DebugLog.ToConsole($"Player is null for {AttachedNetId}!", MessageType.Error); - return; - } - if (_disabledSocket == null) - { - DebugLog.ToConsole($"DisabledSocket is null for {PlayerId}! (ProbeLauncher null? : {Player.ProbeLauncher == null})", MessageType.Error); - return; - } - if (Player.PlayerStates.ProbeActive || ReferenceSector?.AttachedObject == null) - { - return; - } - if (HasAuthority) - { - transform.position = ReferenceSector.Transform.InverseTransformPoint(_disabledSocket.position); - return; - } - if (SyncedTransform.position == Vector3.zero) - { - return; - } - SyncedTransform.localPosition = ReferenceSector.Transform.InverseTransformPoint(_disabledSocket.position); - } - */ - public override bool IsReady => Locator.GetProbe() != null && Player != null && QSBPlayerManager.PlayerExists(Player.PlayerId) From f0b6c8add7bb6532d0e30f3153948850e5f10e5a Mon Sep 17 00:00:00 2001 From: Mister_Nebula <41904486+misternebula@users.noreply.github.com> Date: Sun, 18 Apr 2021 22:59:42 +0100 Subject: [PATCH 02/12] turn leeway into abstract, give each transformsync it's own value --- QSB/Player/TransformSync/PlayerCameraSync.cs | 2 ++ QSB/Player/TransformSync/PlayerTransformSync.cs | 2 ++ QSB/ProbeSync/TransformSync/PlayerProbeSync.cs | 12 +----------- .../TransformSync/RoastingStickTransformSync.cs | 2 ++ QSB/ShipSync/TransformSync/ShipTransformSync.cs | 2 ++ QSB/TransformSync/SyncObjectTransformSync.cs | 2 +- 6 files changed, 10 insertions(+), 12 deletions(-) diff --git a/QSB/Player/TransformSync/PlayerCameraSync.cs b/QSB/Player/TransformSync/PlayerCameraSync.cs index 1f2ef804..4a101a4c 100644 --- a/QSB/Player/TransformSync/PlayerCameraSync.cs +++ b/QSB/Player/TransformSync/PlayerCameraSync.cs @@ -8,6 +8,8 @@ namespace QSB.Player.TransformSync { public class PlayerCameraSync : SyncObjectTransformSync { + public override float DistanceLeeway => 5f; + protected override Transform InitLocalTransform() { SectorSync.SetSectorDetector(Locator.GetPlayerSectorDetector()); diff --git a/QSB/Player/TransformSync/PlayerTransformSync.cs b/QSB/Player/TransformSync/PlayerTransformSync.cs index c09c64af..871747a8 100644 --- a/QSB/Player/TransformSync/PlayerTransformSync.cs +++ b/QSB/Player/TransformSync/PlayerTransformSync.cs @@ -9,6 +9,8 @@ namespace QSB.Player.TransformSync { public static PlayerTransformSync LocalInstance { get; private set; } + public override float DistanceLeeway => 5f; + static PlayerTransformSync() => AnimControllerPatch.Init(); public override void OnStartLocalPlayer() diff --git a/QSB/ProbeSync/TransformSync/PlayerProbeSync.cs b/QSB/ProbeSync/TransformSync/PlayerProbeSync.cs index 4c84a0cc..7a23303e 100644 --- a/QSB/ProbeSync/TransformSync/PlayerProbeSync.cs +++ b/QSB/ProbeSync/TransformSync/PlayerProbeSync.cs @@ -9,7 +9,7 @@ namespace QSB.ProbeSync.TransformSync { public class PlayerProbeSync : SyncObjectTransformSync { - private Transform _disabledSocket; + public override float DistanceLeeway => 20f; private Transform GetProbe() => Locator.GetProbe().transform.Find("CameraPivot").Find("Geometry"); @@ -19,7 +19,6 @@ namespace QSB.ProbeSync.TransformSync SectorSync.SetSectorDetector(Locator.GetProbe().GetSectorDetector()); var body = GetProbe(); - SetSocket(Player.CameraBody.transform); Player.ProbeBody = body.gameObject; return body; @@ -42,20 +41,11 @@ namespace QSB.ProbeSync.TransformSync PlayerToolsManager.CreateProbe(body, Player); - QSBCore.UnityEvents.RunWhen( - () => Player.ProbeLauncher != null, - () => SetSocket(Player.ProbeLauncher.ToolGameObject.transform)); Player.ProbeBody = body.gameObject; return body; } - private void SetSocket(Transform socket) - { - DebugLog.DebugWrite($"Set DisabledSocket of id:{PlayerId}."); - _disabledSocket = socket; - } - public override bool IsReady => Locator.GetProbe() != null && Player != null && QSBPlayerManager.PlayerExists(Player.PlayerId) diff --git a/QSB/RoastingSync/TransformSync/RoastingStickTransformSync.cs b/QSB/RoastingSync/TransformSync/RoastingStickTransformSync.cs index f6493b22..8b8216de 100644 --- a/QSB/RoastingSync/TransformSync/RoastingStickTransformSync.cs +++ b/QSB/RoastingSync/TransformSync/RoastingStickTransformSync.cs @@ -9,6 +9,8 @@ namespace QSB.RoastingSync.TransformSync { internal class RoastingStickTransformSync : SyncObjectTransformSync { + public override float DistanceLeeway => 5f; + private Transform _stickTip; private Transform _networkStickTip => gameObject.transform.GetChild(0); private const float SmoothTime = 0.1f; diff --git a/QSB/ShipSync/TransformSync/ShipTransformSync.cs b/QSB/ShipSync/TransformSync/ShipTransformSync.cs index ecfa47be..a7de7faa 100644 --- a/QSB/ShipSync/TransformSync/ShipTransformSync.cs +++ b/QSB/ShipSync/TransformSync/ShipTransformSync.cs @@ -6,6 +6,8 @@ namespace QSB.ShipSync.TransformSync { public class ShipTransformSync : SyncObjectTransformSync { + public override float DistanceLeeway => 20f; + private Transform GetShipModel() => Locator.GetShipTransform(); protected override Transform InitLocalTransform() diff --git a/QSB/TransformSync/SyncObjectTransformSync.cs b/QSB/TransformSync/SyncObjectTransformSync.cs index 4c49d0b2..b2c789df 100644 --- a/QSB/TransformSync/SyncObjectTransformSync.cs +++ b/QSB/TransformSync/SyncObjectTransformSync.cs @@ -20,7 +20,7 @@ namespace QSB.TransformSync public SectorSync.SectorSync SectorSync { get; private set; } private const float SmoothTime = 0.1f; - private const float DistanceLeeway = 5f; + public abstract float DistanceLeeway { get; } private bool _isInitialized; private Vector3 _positionSmoothVelocity; private Quaternion _rotationSmoothVelocity; From d6eebd5136671e70146e28a86ef817a2ad7e9b75 Mon Sep 17 00:00:00 2001 From: Mister_Nebula <41904486+misternebula@users.noreply.github.com> Date: Tue, 20 Apr 2021 08:36:07 +0100 Subject: [PATCH 03/12] stuffz --- QSB/Animation/AnimationSync.cs | 17 +++--- QSB/Instruments/QSBCamera/CameraManager.cs | 2 +- QSB/Player/TransformSync/PlayerCameraSync.cs | 8 +-- .../TransformSync/PlayerTransformSync.cs | 10 --- .../TransformSync/PlayerProbeSync.cs | 5 ++ QSB/QSBCore.cs | 11 +++- QSB/SectorSync/WorldObjects/QSBSector.cs | 6 ++ QSB/TransformSync/SyncObjectTransformSync.cs | 61 +++++++++++++++++-- QSB/Utility/Extensions.cs | 3 + 9 files changed, 91 insertions(+), 32 deletions(-) diff --git a/QSB/Animation/AnimationSync.cs b/QSB/Animation/AnimationSync.cs index d1d0fb4e..8f84e828 100644 --- a/QSB/Animation/AnimationSync.cs +++ b/QSB/Animation/AnimationSync.cs @@ -12,7 +12,6 @@ namespace QSB.Animation public class AnimationSync : PlayerSyncObject { private Animator _anim; - private Animator _bodyAnim; private QNetworkAnimator _netAnim; private RuntimeAnimatorController _suitedAnimController; @@ -30,7 +29,7 @@ namespace QSB.Animation public AnimatorMirror Mirror { get; private set; } public AnimationType CurrentType { get; set; } - public Animator VisibleAnimator => _bodyAnim; + public Animator VisibleAnimator { get; private set; } protected void Awake() { @@ -73,15 +72,15 @@ namespace QSB.Animation LoadControllers(); } _netAnim.enabled = true; - _bodyAnim = body.GetComponent(); + VisibleAnimator = body.GetComponent(); Mirror = body.gameObject.AddComponent(); if (IsLocalPlayer) { - Mirror.Init(_bodyAnim, _anim); + Mirror.Init(VisibleAnimator, _anim); } else { - Mirror.Init(_anim, _bodyAnim); + Mirror.Init(_anim, VisibleAnimator); } for (var i = 0; i < _anim.parameterCount; i++) @@ -138,7 +137,7 @@ namespace QSB.Animation private void InitCrouchSync() { _crouchSync = gameObject.AddComponent(); - _crouchSync.Init(this, _playerController, _bodyAnim); + _crouchSync.Init(this, _playerController, VisibleAnimator); } private void OnJump() => _netAnim.SetTrigger("Jump"); @@ -228,16 +227,16 @@ namespace QSB.Animation break; } _anim.runtimeAnimatorController = controller; - _bodyAnim.runtimeAnimatorController = controller; + VisibleAnimator.runtimeAnimatorController = controller; if (type != AnimationType.PlayerSuited && type != AnimationType.PlayerUnsuited) { - _bodyAnim.SetTrigger("Playing"); + VisibleAnimator.SetTrigger("Playing"); _anim.SetTrigger("Playing"); } else { // Avoids "jumping" when exiting instrument and putting on suit - _bodyAnim.SetTrigger("Grounded"); + VisibleAnimator.SetTrigger("Grounded"); _anim.SetTrigger("Grounded"); } _netAnim.animator = _anim; // Probably not needed. diff --git a/QSB/Instruments/QSBCamera/CameraManager.cs b/QSB/Instruments/QSBCamera/CameraManager.cs index 7d1dd60c..adecb00b 100644 --- a/QSB/Instruments/QSBCamera/CameraManager.cs +++ b/QSB/Instruments/QSBCamera/CameraManager.cs @@ -38,7 +38,7 @@ namespace QSB.Instruments.QSBCamera _cameraObj.transform.localPosition = new Vector3(0, 0, -5f); _cameraObj.transform.localRotation = Quaternion.Euler(0, 0, 0); _camera = _cameraObj.AddComponent(); - _camera.cullingMask = Locator.GetPlayerCamera().mainCamera.cullingMask & ~(1 << 27) | (1 << 22); + _camera.cullingMask = (Locator.GetPlayerCamera().mainCamera.cullingMask & ~(1 << 27)) | (1 << 22); _camera.clearFlags = CameraClearFlags.Color; _camera.backgroundColor = Color.black; _camera.fieldOfView = 90f; diff --git a/QSB/Player/TransformSync/PlayerCameraSync.cs b/QSB/Player/TransformSync/PlayerCameraSync.cs index 4a101a4c..3ba7665b 100644 --- a/QSB/Player/TransformSync/PlayerCameraSync.cs +++ b/QSB/Player/TransformSync/PlayerCameraSync.cs @@ -44,13 +44,9 @@ namespace QSB.Player.TransformSync return body.transform; } - private void OnRenderObject() + private new void OnRenderObject() { - if (!QSBCore.HasWokenUp || !Player.PlayerStates.IsReady || !QSBCore.DebugMode || !QSBCore.ShowLinesInDebug) - { - return; - } - Popcron.Gizmos.Frustum(Player.Camera); + // Stop base from running } public override bool IsReady => Locator.GetPlayerTransform() != null diff --git a/QSB/Player/TransformSync/PlayerTransformSync.cs b/QSB/Player/TransformSync/PlayerTransformSync.cs index 871747a8..44c3f79b 100644 --- a/QSB/Player/TransformSync/PlayerTransformSync.cs +++ b/QSB/Player/TransformSync/PlayerTransformSync.cs @@ -60,16 +60,6 @@ namespace QSB.Player.TransformSync return body; } - private void OnRenderObject() - { - if (!QSBCore.HasWokenUp || !Player.PlayerStates.IsReady || !QSBCore.DebugMode || !QSBCore.ShowLinesInDebug) - { - return; - } - Popcron.Gizmos.Line(ReferenceSector.Position, Player.Body.transform.position, Color.blue, true); - Popcron.Gizmos.Sphere(ReferenceSector.Position, 5f, Color.cyan); - } - public override bool IsReady => Locator.GetPlayerTransform() != null && Player != null && QSBPlayerManager.PlayerExists(Player.PlayerId) diff --git a/QSB/ProbeSync/TransformSync/PlayerProbeSync.cs b/QSB/ProbeSync/TransformSync/PlayerProbeSync.cs index 7a23303e..1d5c749a 100644 --- a/QSB/ProbeSync/TransformSync/PlayerProbeSync.cs +++ b/QSB/ProbeSync/TransformSync/PlayerProbeSync.cs @@ -9,8 +9,13 @@ namespace QSB.ProbeSync.TransformSync { public class PlayerProbeSync : SyncObjectTransformSync { + public static PlayerProbeSync LocalInstance { get; private set; } + public override float DistanceLeeway => 20f; + public override void OnStartAuthority() + => LocalInstance = this; + private Transform GetProbe() => Locator.GetProbe().transform.Find("CameraPivot").Find("Geometry"); diff --git a/QSB/QSBCore.cs b/QSB/QSBCore.cs index eb3b97eb..edf435ae 100644 --- a/QSB/QSBCore.cs +++ b/QSB/QSBCore.cs @@ -11,6 +11,7 @@ using QSB.Patches; using QSB.Player; using QSB.Player.TransformSync; using QSB.PoolSync; +using QSB.ProbeSync.TransformSync; using QSB.QuantumSync; using QSB.QuantumSync.WorldObjects; using QSB.SectorSync; @@ -151,7 +152,7 @@ namespace QSB var sector = PlayerTransformSync.LocalInstance.ReferenceSector; var text = sector == null ? "NULL SECTOR" - : $"{sector.AttachedObject.name} : {sector.IsFakeSector}"; + : $"name:{sector.AttachedObject.name} fake:{sector.IsFakeSector}"; GUI.Label(new Rect(420, offset3, 400f, 20f), $"- {text}"); offset3 += _debugLineSpacing; @@ -181,6 +182,14 @@ namespace QSB GUI.Label(new Rect(220, offset, 200f, 20f), $" - {player.PlayerId} : {tracker.GetType().GetMethod("IsInFrustum", BindingFlags.NonPublic | BindingFlags.Instance).Invoke(tracker, new object[] { player.Camera.GetFrustumPlanes() })}"); offset += _debugLineSpacing; } + GUI.Label(new Rect(220, offset, 200f, 20f), $"Probe sector :"); + offset += _debugLineSpacing; + sector = PlayerProbeSync.LocalInstance.ReferenceSector; + text = sector == null + ? "NULL SECTOR" + : $"name:{sector.AttachedObject.name} fake:{sector.IsFakeSector}"; + GUI.Label(new Rect(220, offset, 400f, 20f), $"- {text}"); + offset += _debugLineSpacing; if (SocketedObjToDebug == -1) { diff --git a/QSB/SectorSync/WorldObjects/QSBSector.cs b/QSB/SectorSync/WorldObjects/QSBSector.cs index 4c15839a..573153d2 100644 --- a/QSB/SectorSync/WorldObjects/QSBSector.cs +++ b/QSB/SectorSync/WorldObjects/QSBSector.cs @@ -45,10 +45,16 @@ namespace QSB.SectorSync.WorldObjects return false; } + if (Name == "Satellite_Body") // TODO : make a more rigourous system to not sync to fast-moving sectors + { + return false; + } + if (Type == Sector.Name.Ship) { return false; } + if (AttachedObject.name == "Sector_Shuttle" || AttachedObject.name == "Sector_NomaiShuttleInterior") { if (QSBSceneManager.CurrentScene == OWScene.SolarSystem) diff --git a/QSB/TransformSync/SyncObjectTransformSync.cs b/QSB/TransformSync/SyncObjectTransformSync.cs index b2c789df..3597aa79 100644 --- a/QSB/TransformSync/SyncObjectTransformSync.cs +++ b/QSB/TransformSync/SyncObjectTransformSync.cs @@ -3,6 +3,7 @@ using QSB.Player; using QSB.Player.TransformSync; using QSB.SectorSync.WorldObjects; using QSB.Utility; +using System.Collections.Generic; using System.Linq; using UnityEngine; @@ -20,12 +21,14 @@ namespace QSB.TransformSync public SectorSync.SectorSync SectorSync { get; private set; } private const float SmoothTime = 0.1f; + private const int DebugSavePosAmount = 75; public abstract float DistanceLeeway { get; } private bool _isInitialized; private Vector3 _positionSmoothVelocity; private Quaternion _rotationSmoothVelocity; private bool _isVisible; private float _previousDistance; + private Queue> _previousPositionRotationData = new Queue>(); protected override void Start() { @@ -72,11 +75,31 @@ namespace QSB.TransformSync return; } + _previousPositionRotationData.Enqueue(new KeyValuePair(transform.position, transform.rotation)); + + if (_previousPositionRotationData.Count >= DebugSavePosAmount) + { + _previousPositionRotationData.Dequeue(); + } + + for (var i = 0; i < _previousPositionRotationData.Count; i++) + { + var item = _previousPositionRotationData.ElementAt(i); // TODO : warning - O(n) not O(1) - maybe use array for O(1)? + + var targetPos = ReferenceSector.Transform.TransformPoint(item.Key); + var targetRot = ReferenceSector.Transform.TransformRotation(item.Value); + + Popcron.Gizmos.Cube(targetPos, targetRot, Vector3.one / 2, new Color(1f, 0f, 0f, 1f - ((float)i).Map(0f, DebugSavePosAmount - 1, 1f, 0f))); + + if (i > 0) + { + var prevItem = _previousPositionRotationData.ElementAt(i - 1); + var prevItemTargetPos = ReferenceSector.Transform.TransformPoint(prevItem.Key); + Popcron.Gizmos.Line(prevItemTargetPos, targetPos, Color.yellow); + } + } + Popcron.Gizmos.Cube(SyncedTransform.position, SyncedTransform.rotation, Vector3.one / 2, Color.green); - Popcron.Gizmos.Cube(transform.position, transform.rotation, Vector3.one / 2, Color.red); - Popcron.Gizmos.Line(SyncedTransform.position, transform.position, Color.magenta); - Popcron.Gizmos.Cube(ReferenceSector.Position, ReferenceSector.Transform.rotation, Vector3.one, Color.cyan); - Popcron.Gizmos.Line(SyncedTransform.position, ReferenceSector.Position, Color.blue); } public void Update() @@ -107,22 +130,44 @@ namespace QSB.TransformSync protected virtual void UpdateTransform() { + var referenceSectorAtStart = ReferenceSector; + if (HasAuthority) // If this script is attached to the client's own body on the client's side. { + var previousPosition = transform.position; if (ReferenceSector == null || ReferenceSector.AttachedObject == null) { DebugLog.ToConsole($"Error - ReferenceSector has null value for {Player.PlayerId}.{GetType().Name}", MessageType.Error); return; } transform.position = ReferenceSector.Transform.InverseTransformPoint(SyncedTransform.position); + if (transform.position == Vector3.zero) + { + DebugLog.ToConsole($"Error - {PlayerId}.{SyncedTransform.name} locally at (0, 0, 0)!", MessageType.Error); + } transform.rotation = ReferenceSector.Transform.InverseTransformRotation(SyncedTransform.rotation); + + var distance = Vector3.Distance(previousPosition, transform.position); + if (distance > _previousDistance + DistanceLeeway) + { + DebugLog.ToConsole($"Warning - {PlayerId}.{SyncedTransform.name} moved too far! Distance:{distance}, previous:{_previousDistance}, leeway:{DistanceLeeway}", MessageType.Warning); + } + _previousDistance = distance; + + if (referenceSectorAtStart != ReferenceSector) + { + DebugLog.ToConsole($"Warning - Reference for {PlayerId}.{SyncedTransform.name} changed while running UpdateTransform()!", MessageType.Warning); + } + return; } // If this script is attached to any other body, eg the representations of other players - if (SyncedTransform.position == Vector3.zero) + if (SyncedTransform.position == Vector3.zero || SyncedTransform.localPosition == Vector3.zero) { + DebugLog.ToConsole($"Error - {PlayerId}.{SyncedTransform.name} at (0, 0, 0)!", MessageType.Error); Hide(); + return; } else { @@ -131,6 +176,11 @@ namespace QSB.TransformSync SyncedTransform.localPosition = SmartSmoothDamp(SyncedTransform.localPosition, transform.position); SyncedTransform.localRotation = QuaternionHelper.SmoothDamp(SyncedTransform.localRotation, transform.rotation, ref _rotationSmoothVelocity, SmoothTime); + + if (referenceSectorAtStart != ReferenceSector) + { + DebugLog.ToConsole($"Warning - Reference for {PlayerId}.{SyncedTransform.name} changed while running UpdateTransform()!", MessageType.Warning); + } } private Vector3 SmartSmoothDamp(Vector3 currentPosition, Vector3 targetPosition) @@ -152,6 +202,7 @@ namespace QSB.TransformSync { return; } + DebugLog.DebugWrite($"{PlayerId}.{SyncedTransform.name} from:{(ReferenceSector == null ? "NULL" : ReferenceSector.Name)} to:{sector.Name}"); _positionSmoothVelocity = Vector3.zero; ReferenceSector = sector; if (!HasAuthority) diff --git a/QSB/Utility/Extensions.cs b/QSB/Utility/Extensions.cs index 0f2f5659..6ff474cf 100644 --- a/QSB/Utility/Extensions.cs +++ b/QSB/Utility/Extensions.cs @@ -23,6 +23,9 @@ namespace QSB.Utility } } + public static Quaternion TransformRotation(this Transform transform, Quaternion localRotation) + => transform.rotation * localRotation; + public static GameObject InstantiateInactive(this GameObject original) { original.SetActive(false); From 702b637cf56c9d517e44fc204820ee1469a42b33 Mon Sep 17 00:00:00 2001 From: Mister_Nebula <41904486+misternebula@users.noreply.github.com> Date: Wed, 21 Apr 2021 11:02:17 +0100 Subject: [PATCH 04/12] redo *everything* --- QSB/Events/EventNames.cs | 1 - QSB/Events/EventType.cs | 1 - QSB/Events/QSBEventManager.cs | 1 - QSB/Player/Events/PlayerSectorEvent.cs | 46 -- QSB/Player/Events/PlayerStatesRequestEvent.cs | 5 - .../Events/ServerSendPlayerStatesEvent.cs | 7 +- QSB/Player/PlayerInfo.cs | 2 + QSB/Player/TransformSync/PlayerCameraSync.cs | 17 +- .../TransformSync/PlayerTransformSync.cs | 21 +- .../TransformSync/PlayerProbeSync.cs | 13 +- QSB/QSB.csproj | 3 +- QSB/QSBCore.cs | 39 +- QSB/QSBNetworkManager.cs | 3 +- .../RoastingStickTransformSync.cs | 14 +- QSB/SectorSync/QSBSectorManager.cs | 26 +- QSB/SectorSync/SectorSync.cs | 38 +- QSB/SectorSync/WorldObjects/QSBSector.cs | 5 - .../TransformSync/ShipTransformSync.cs | 12 +- QSB/TransformSync/QSBNetworkTransform.cs | 170 +++++++ QSB/TransformSync/SyncObjectTransformSync.cs | 234 --------- QSB/Utility/DebugActions.cs | 23 - QuantumUNET/Components/QNetworkTransform.cs | 479 ++++-------------- .../Components/QNetworkTransformChild.cs | 128 +---- 23 files changed, 392 insertions(+), 896 deletions(-) delete mode 100644 QSB/Player/Events/PlayerSectorEvent.cs create mode 100644 QSB/TransformSync/QSBNetworkTransform.cs delete mode 100644 QSB/TransformSync/SyncObjectTransformSync.cs diff --git a/QSB/Events/EventNames.cs b/QSB/Events/EventNames.cs index e2662b3f..51ba7e39 100644 --- a/QSB/Events/EventNames.cs +++ b/QSB/Events/EventNames.cs @@ -28,7 +28,6 @@ public static string QSBPlayerDeath = "QSBPlayerDeath"; public static string QSBPlayerJoin = "QSBPlayerJoin"; public static string QSBPlayerReady = "QSBPlayerReady"; - public static string QSBSectorChange = "QSBSectorChange"; public static string QSBPlayerStatesRequest = "QSBPlayerStatesRequest"; public static string QSBServerTime = "QSBServerTime"; public static string QSBStartLift = "QSBStartLift"; diff --git a/QSB/Events/EventType.cs b/QSB/Events/EventType.cs index 1847116d..2569bb9a 100644 --- a/QSB/Events/EventType.cs +++ b/QSB/Events/EventType.cs @@ -13,7 +13,6 @@ SuitActiveChange, PlayerJoin, PlayerDeath, - PlayerSectorChange, PlayerReady, ProbeActiveChange, Elevator, diff --git a/QSB/Events/QSBEventManager.cs b/QSB/Events/QSBEventManager.cs index fbb51fc5..c060fff5 100644 --- a/QSB/Events/QSBEventManager.cs +++ b/QSB/Events/QSBEventManager.cs @@ -41,7 +41,6 @@ namespace QSB.Events new PlayerTranslatorEvent(), new PlayerProbeLauncherEvent(), new PlayerProbeEvent(), - new PlayerSectorEvent(), new PlayerDeathEvent(), new PlayerStatesRequestEvent(), new ServerSendPlayerStatesEvent(), diff --git a/QSB/Player/Events/PlayerSectorEvent.cs b/QSB/Player/Events/PlayerSectorEvent.cs deleted file mode 100644 index 654102d5..00000000 --- a/QSB/Player/Events/PlayerSectorEvent.cs +++ /dev/null @@ -1,46 +0,0 @@ -using OWML.Common; -using QSB.Events; -using QSB.SectorSync.WorldObjects; -using QSB.TransformSync; -using QSB.Utility; -using QSB.WorldSync; -using QSB.WorldSync.Events; - -namespace QSB.Player.Events -{ - public class PlayerSectorEvent : QSBEvent - { - public override EventType Type => EventType.PlayerSectorChange; - - public override void SetupListener() => GlobalMessenger.AddListener(EventNames.QSBSectorChange, Handler); - public override void CloseListener() => GlobalMessenger.RemoveListener(EventNames.QSBSectorChange, Handler); - - private void Handler(uint netId, QSBSector sector) => SendEvent(CreateMessage(netId, sector)); - - private WorldObjectMessage CreateMessage(uint netId, QSBSector sector) => new WorldObjectMessage - { - AboutId = netId, - ObjectId = sector.ObjectId - }; - - public override void OnReceiveRemote(bool server, WorldObjectMessage message) - { - if (!QSBSceneManager.IsInUniverse) - { - return; - } - var sector = QSBWorldSync.GetWorldFromId(message.ObjectId); - - if (sector == null) - { - DebugLog.ToConsole($"Sector with index id {message.ObjectId} not found!", MessageType.Warning); - return; - } - - var transformSync = QSBPlayerManager.GetSyncObject(message.AboutId); - - QSBCore.UnityEvents.RunWhen(() => transformSync?.SyncedTransform != null, - () => transformSync?.SetReferenceSector(sector)); - } - } -} \ No newline at end of file diff --git a/QSB/Player/Events/PlayerStatesRequestEvent.cs b/QSB/Player/Events/PlayerStatesRequestEvent.cs index 6071b19d..613fea71 100644 --- a/QSB/Player/Events/PlayerStatesRequestEvent.cs +++ b/QSB/Player/Events/PlayerStatesRequestEvent.cs @@ -31,11 +31,6 @@ namespace QSB.Player.Events { DebugLog.DebugWrite($"Get state request from {message.FromId} - isServer?{server}"); QSBEventManager.FireEvent(EventNames.QSBServerSendPlayerStates); - foreach (var item in QSBPlayerManager.GetSyncObjects() - .Where(x => x != null && x.IsReady && x.ReferenceSector != null)) - { - QSBEventManager.FireEvent(EventNames.QSBSectorChange, item.NetId.Value, item.ReferenceSector); - } if (!server) { diff --git a/QSB/Player/Events/ServerSendPlayerStatesEvent.cs b/QSB/Player/Events/ServerSendPlayerStatesEvent.cs index 4378aa23..43491dd6 100644 --- a/QSB/Player/Events/ServerSendPlayerStatesEvent.cs +++ b/QSB/Player/Events/ServerSendPlayerStatesEvent.cs @@ -31,9 +31,10 @@ namespace QSB.Player.Events public override void OnReceiveRemote(bool server, PlayerStateMessage message) { DebugLog.DebugWrite($"Received playerstate of player ID {message.AboutId}", MessageType.Info); - QSBCore.UnityEvents.RunWhen( - () => QSBPlayerManager.GetSyncObject(message.AboutId) != null, - () => QSBPlayerManager.HandleFullStateMessage(message)); + if (QSBPlayerManager.PlayerExists(message.AboutId)) + { + QSBPlayerManager.HandleFullStateMessage(message); + } } } } \ No newline at end of file diff --git a/QSB/Player/PlayerInfo.cs b/QSB/Player/PlayerInfo.cs index 8ed84bf3..98bfc3a9 100644 --- a/QSB/Player/PlayerInfo.cs +++ b/QSB/Player/PlayerInfo.cs @@ -1,5 +1,6 @@ using QSB.Animation; using QSB.CampfireSync.WorldObjects; +using QSB.Player.TransformSync; using QSB.ProbeSync; using QSB.QuantumSync; using QSB.RoastingSync; @@ -15,6 +16,7 @@ namespace QSB.Player public string Name { get; set; } public PlayerHUDMarker HudMarker { get; set; } public PlayerState PlayerStates { get; set; } = new PlayerState(); + public PlayerTransformSync TransformSync { get; set; } // Body Objects public OWCamera Camera { get; set; } diff --git a/QSB/Player/TransformSync/PlayerCameraSync.cs b/QSB/Player/TransformSync/PlayerCameraSync.cs index 3ba7665b..99cfdaf3 100644 --- a/QSB/Player/TransformSync/PlayerCameraSync.cs +++ b/QSB/Player/TransformSync/PlayerCameraSync.cs @@ -6,11 +6,9 @@ using UnityEngine; namespace QSB.Player.TransformSync { - public class PlayerCameraSync : SyncObjectTransformSync + public class PlayerCameraSync : QSBNetworkTransform { - public override float DistanceLeeway => 5f; - - protected override Transform InitLocalTransform() + protected override GameObject InitLocalTransform() { SectorSync.SetSectorDetector(Locator.GetPlayerSectorDetector()); var body = Locator.GetPlayerCamera().gameObject.transform; @@ -23,10 +21,10 @@ namespace QSB.Player.TransformSync DebugLog.DebugWrite("PlayerCameraSync init done - Request state!"); QSBEventManager.FireEvent(EventNames.QSBPlayerStatesRequest); - return body; + return body.gameObject; } - protected override Transform InitRemoteTransform() + protected override GameObject InitRemoteTransform() { var body = new GameObject("RemotePlayerCamera"); @@ -41,12 +39,7 @@ namespace QSB.Player.TransformSync Player.Camera = owcamera; Player.CameraBody = body; - return body.transform; - } - - private new void OnRenderObject() - { - // Stop base from running + return body; } public override bool IsReady => Locator.GetPlayerTransform() != null diff --git a/QSB/Player/TransformSync/PlayerTransformSync.cs b/QSB/Player/TransformSync/PlayerTransformSync.cs index 44c3f79b..56b3d3ce 100644 --- a/QSB/Player/TransformSync/PlayerTransformSync.cs +++ b/QSB/Player/TransformSync/PlayerTransformSync.cs @@ -5,21 +5,24 @@ using UnityEngine; namespace QSB.Player.TransformSync { - public class PlayerTransformSync : SyncObjectTransformSync + public class PlayerTransformSync : QSBNetworkTransform { public static PlayerTransformSync LocalInstance { get; private set; } - public override float DistanceLeeway => 5f; - static PlayerTransformSync() => AnimControllerPatch.Init(); public override void OnStartLocalPlayer() => LocalInstance = this; - protected override void OnDestroy() + public override void Start() + { + base.Start(); + Player.TransformSync = this; + } + + protected void OnDestroy() { QSBPlayerManager.OnRemovePlayer?.Invoke(PlayerId); - base.OnDestroy(); if (QSBPlayerManager.PlayerExists(PlayerId)) { Player.HudMarker?.Remove(); @@ -30,7 +33,7 @@ namespace QSB.Player.TransformSync private Transform GetPlayerModel() => Locator.GetPlayerTransform().Find("Traveller_HEA_Player_v2"); - protected override Transform InitLocalTransform() + protected override GameObject InitLocalTransform() { SectorSync.SetSectorDetector(Locator.GetPlayerSectorDetector()); var body = GetPlayerModel(); @@ -40,10 +43,10 @@ namespace QSB.Player.TransformSync Player.Body = body.gameObject; - return body; + return body.gameObject; } - protected override Transform InitRemoteTransform() + protected override GameObject InitRemoteTransform() { var body = Instantiate(GetPlayerModel()); @@ -57,7 +60,7 @@ namespace QSB.Player.TransformSync Player.Body = body.gameObject; - return body; + return body.gameObject; } public override bool IsReady => Locator.GetPlayerTransform() != null diff --git a/QSB/ProbeSync/TransformSync/PlayerProbeSync.cs b/QSB/ProbeSync/TransformSync/PlayerProbeSync.cs index 1d5c749a..64716d17 100644 --- a/QSB/ProbeSync/TransformSync/PlayerProbeSync.cs +++ b/QSB/ProbeSync/TransformSync/PlayerProbeSync.cs @@ -7,29 +7,26 @@ using UnityEngine; namespace QSB.ProbeSync.TransformSync { - public class PlayerProbeSync : SyncObjectTransformSync + public class PlayerProbeSync : QSBNetworkTransform { public static PlayerProbeSync LocalInstance { get; private set; } - - public override float DistanceLeeway => 20f; - public override void OnStartAuthority() => LocalInstance = this; private Transform GetProbe() => Locator.GetProbe().transform.Find("CameraPivot").Find("Geometry"); - protected override Transform InitLocalTransform() + protected override GameObject InitLocalTransform() { SectorSync.SetSectorDetector(Locator.GetProbe().GetSectorDetector()); var body = GetProbe(); Player.ProbeBody = body.gameObject; - return body; + return body.gameObject; } - protected override Transform InitRemoteTransform() + protected override GameObject InitRemoteTransform() { var probe = GetProbe(); @@ -48,7 +45,7 @@ namespace QSB.ProbeSync.TransformSync Player.ProbeBody = body.gameObject; - return body; + return body.gameObject; } public override bool IsReady => Locator.GetProbe() != null diff --git a/QSB/QSB.csproj b/QSB/QSB.csproj index 1ff41654..b79fd81c 100644 --- a/QSB/QSB.csproj +++ b/QSB/QSB.csproj @@ -231,6 +231,7 @@ + @@ -247,7 +248,6 @@ - @@ -262,7 +262,6 @@ - diff --git a/QSB/QSBCore.cs b/QSB/QSBCore.cs index edf435ae..9a6acaa9 100644 --- a/QSB/QSBCore.cs +++ b/QSB/QSBCore.cs @@ -17,6 +17,7 @@ using QSB.QuantumSync.WorldObjects; using QSB.SectorSync; using QSB.StatueSync; using QSB.TimeSync; +using QSB.TransformSync; using QSB.TranslationSync; using QSB.Utility; using QSB.WorldSync; @@ -147,14 +148,20 @@ namespace QSB } var offset3 = 10f; - GUI.Label(new Rect(420, offset3, 200f, 20f), $"Current synced sector :"); + GUI.Label(new Rect(420, offset3, 200f, 20f), $"Current sectors :"); offset3 += _debugLineSpacing; - var sector = PlayerTransformSync.LocalInstance.ReferenceSector; - var text = sector == null - ? "NULL SECTOR" - : $"name:{sector.AttachedObject.name} fake:{sector.IsFakeSector}"; - GUI.Label(new Rect(420, offset3, 400f, 20f), $"- {text}"); + foreach (var sec in PlayerTransformSync.LocalInstance.SectorSync.SectorList.OrderBy(s => SectorSync.SectorSync.CalculateSectorScore(s, Locator.GetPlayerTransform(), Locator.GetPlayerBody()))) + { + GUI.Label(new Rect(420, offset3, 400f, 20f), $"- {SectorSync.SectorSync.CalculateSectorScore(sec, Locator.GetPlayerTransform(), Locator.GetPlayerBody())} : {sec.Name}"); + offset3 += _debugLineSpacing; + } + GUI.Label(new Rect(420, offset3, 200f, 20f), $"Probe sectors :"); offset3 += _debugLineSpacing; + foreach (var sec in PlayerProbeSync.LocalInstance.SectorSync.SectorList.OrderBy(s => SectorSync.SectorSync.CalculateSectorScore(s, Locator.GetProbe().transform, Locator.GetProbe().GetOWRigidbody()))) + { + GUI.Label(new Rect(420, offset3, 400f, 20f), $"- {SectorSync.SectorSync.CalculateSectorScore(sec, Locator.GetProbe().transform, Locator.GetProbe().GetOWRigidbody())} : {sec.Name}"); + offset3 += _debugLineSpacing; + } var offset2 = 10f; GUI.Label(new Rect(620, offset2, 200f, 20f), $"Owned Objects :"); @@ -170,26 +177,16 @@ namespace QSB return; } - GUI.Label(new Rect(220, offset, 200f, 20f), $"QM Illuminated : {Locator.GetQuantumMoon().IsIlluminated()}"); + GUI.Label(new Rect(220, offset, 200f, 20f), $"Probe Active : {Locator.GetProbe().gameObject.activeInHierarchy}"); offset += _debugLineSpacing; - GUI.Label(new Rect(220, offset, 200f, 20f), $"Shrine player in dark? : {QuantumManager.Instance.Shrine.IsPlayerInDarkness()}"); + GUI.Label(new Rect(220, offset, 200f, 20f), $"Player positions :"); offset += _debugLineSpacing; - GUI.Label(new Rect(220, offset, 200f, 20f), $"QM Visible by :"); - offset += _debugLineSpacing; - var tracker = Locator.GetQuantumMoon().GetValue("_visibilityTracker"); - foreach (var player in QSBPlayerManager.GetPlayersWithCameras()) + foreach (var player in QSBPlayerManager.PlayerList) { - GUI.Label(new Rect(220, offset, 200f, 20f), $" - {player.PlayerId} : {tracker.GetType().GetMethod("IsInFrustum", BindingFlags.NonPublic | BindingFlags.Instance).Invoke(tracker, new object[] { player.Camera.GetFrustumPlanes() })}"); + var networkTransform = player.TransformSync; + GUI.Label(new Rect(220, offset, 400f, 20f), $"- {player.PlayerId} : world:{networkTransform.transform.position} local:{networkTransform.transform.localPosition}"); offset += _debugLineSpacing; } - GUI.Label(new Rect(220, offset, 200f, 20f), $"Probe sector :"); - offset += _debugLineSpacing; - sector = PlayerProbeSync.LocalInstance.ReferenceSector; - text = sector == null - ? "NULL SECTOR" - : $"name:{sector.AttachedObject.name} fake:{sector.IsFakeSector}"; - GUI.Label(new Rect(220, offset, 400f, 20f), $"- {text}"); - offset += _debugLineSpacing; if (SocketedObjToDebug == -1) { diff --git a/QSB/QSBNetworkManager.cs b/QSB/QSBNetworkManager.cs index a0fa5687..5cecf586 100644 --- a/QSB/QSBNetworkManager.cs +++ b/QSB/QSBNetworkManager.cs @@ -13,6 +13,7 @@ using QSB.ProbeSync.TransformSync; using QSB.RoastingSync.TransformSync; using QSB.ShipSync.TransformSync; using QSB.TimeSync; +using QSB.TransformSync; using QSB.Utility; using QSB.WorldSync; using QuantumUNET; @@ -104,8 +105,6 @@ namespace QSB private void SetupNetworkTransform(GameObject go) { - var trans = go.AddComponent(); - trans.SyncRotationAxis = QNetworkTransform.AxisSyncMode.AxisXYZ; foreach (var item in go.GetComponents()) { var child = go.AddComponent(); diff --git a/QSB/RoastingSync/TransformSync/RoastingStickTransformSync.cs b/QSB/RoastingSync/TransformSync/RoastingStickTransformSync.cs index 8b8216de..214f4930 100644 --- a/QSB/RoastingSync/TransformSync/RoastingStickTransformSync.cs +++ b/QSB/RoastingSync/TransformSync/RoastingStickTransformSync.cs @@ -7,10 +7,8 @@ using UnityEngine; namespace QSB.RoastingSync.TransformSync { - internal class RoastingStickTransformSync : SyncObjectTransformSync + internal class RoastingStickTransformSync : QSBNetworkTransform { - public override float DistanceLeeway => 5f; - private Transform _stickTip; private Transform _networkStickTip => gameObject.transform.GetChild(0); private const float SmoothTime = 0.1f; @@ -20,15 +18,15 @@ namespace QSB.RoastingSync.TransformSync private Transform GetPivot() => Resources.FindObjectsOfTypeAll().First().transform.Find("Stick_Root/Stick_Pivot"); - protected override Transform InitLocalTransform() + protected override GameObject InitLocalTransform() { var pivot = GetPivot(); Player.RoastingStick = pivot.gameObject; _stickTip = pivot.Find("Stick_Tip"); - return pivot; + return pivot.gameObject; } - protected override Transform InitRemoteTransform() + protected override GameObject InitRemoteTransform() { var newPivot = Instantiate(GetPivot()); newPivot.parent = null; @@ -58,9 +56,10 @@ namespace QSB.RoastingSync.TransformSync Player.Marshmallow = newMarshmallow; mallowRoot.gameObject.SetActive(true); _stickTip = newPivot.Find("Stick_Tip"); - return newPivot; + return newPivot.gameObject; } + /* protected override void UpdateTransform() { base.UpdateTransform(); @@ -80,6 +79,7 @@ namespace QSB.RoastingSync.TransformSync _stickTip.localPosition = Vector3.SmoothDamp(_stickTip.localPosition, _networkStickTip.localPosition, ref _positionSmoothVelocity, SmoothTime); _stickTip.localRotation = QuaternionHelper.SmoothDamp(_stickTip.localRotation, _networkStickTip.localRotation, ref _rotationSmoothVelocity, SmoothTime); } + */ public override bool IsReady => Locator.GetPlayerTransform() != null && Player != null diff --git a/QSB/SectorSync/QSBSectorManager.cs b/QSB/SectorSync/QSBSectorManager.cs index 3178db04..62cc2067 100644 --- a/QSB/SectorSync/QSBSectorManager.cs +++ b/QSB/SectorSync/QSBSectorManager.cs @@ -2,6 +2,7 @@ using QSB.Events; using QSB.Player; using QSB.SectorSync.WorldObjects; +using QSB.TransformSync; using QSB.Utility; using QSB.WorldSync; using System.Collections.Generic; @@ -21,8 +22,17 @@ namespace QSB.SectorSync public void Invoke() { - QSBPlayerManager.GetSyncObjects() - .Where(x => x.HasAuthority).ToList().ForEach(CheckTransformSyncSector); + foreach (var sync in Resources.FindObjectsOfTypeAll()) // todo : cache these! + { + if (sync.AttachedObject == null) + { + continue; + } + if (sync.HasAuthority && sync.AttachedObject.activeInHierarchy) + { + CheckTransformSyncSector(sync); + } + } } public override void Awake() @@ -54,14 +64,14 @@ namespace QSB.SectorSync IsReady = QSBWorldSync.GetWorldObjects().Any(); } - private void CheckTransformSyncSector(TransformSync.SyncObjectTransformSync transformSync) + private void CheckTransformSyncSector(QSBNetworkTransform transformSync) { - var syncedTransform = transformSync.SyncedTransform; - if (syncedTransform == null || syncedTransform.position == Vector3.zero) + var syncedTransform = transformSync.AttachedObject; + if (syncedTransform == null || syncedTransform.transform.position == Vector3.zero) { return; } - var closestSector = transformSync.SectorSync.GetClosestSector(syncedTransform); + var closestSector = transformSync.SectorSync.GetClosestSector(syncedTransform.transform); if (closestSector == default(QSBSector)) { return; @@ -71,10 +81,6 @@ namespace QSB.SectorSync return; } transformSync.SetReferenceSector(closestSector); - SendSector(transformSync.NetId.Value, closestSector); } - - private void SendSector(uint id, QSBSector sector) => - QSBEventManager.FireEvent(EventNames.QSBSectorChange, id, sector); } } \ No newline at end of file diff --git a/QSB/SectorSync/SectorSync.cs b/QSB/SectorSync/SectorSync.cs index 6e8f2633..4dbf253c 100644 --- a/QSB/SectorSync/SectorSync.cs +++ b/QSB/SectorSync/SectorSync.cs @@ -1,4 +1,5 @@ using OWML.Common; +using OWML.Utils; using QSB.SectorSync.WorldObjects; using QSB.Utility; using QSB.WorldSync; @@ -12,6 +13,7 @@ namespace QSB.SectorSync { public List SectorList = new List(); + private OWRigidbody _attachedOWRigidbody; private SectorDetector _sectorDetector; private void OnDestroy() @@ -33,6 +35,12 @@ namespace QSB.SectorSync _sectorDetector = detector; _sectorDetector.OnEnterSector += AddSector; _sectorDetector.OnExitSector += RemoveSector; + + _attachedOWRigidbody = _sectorDetector.GetValue("_attachedRigidbody"); + if (_attachedOWRigidbody == null) + { + DebugLog.ToConsole($"Warning - OWRigidbody for {_sectorDetector.name} is null!", MessageType.Warning); + } } private void AddSector(Sector sector) @@ -94,9 +102,12 @@ namespace QSB.SectorSync { return default; } + //var ordered = activeNotNullNotBlacklisted + //.OrderBy(sector => Vector3.Distance(sector.Position, trans.position)) + //.ThenBy(sector => GetRelativeVelocity(sector, _attachedOWRigidbody)) + //.ThenBy(sector => GetRadius(sector)); var ordered = activeNotNullNotBlacklisted - .OrderBy(sector => Vector3.Distance(sector.Position, trans.position)) - .ThenBy(sector => GetRadius(sector)); + .OrderBy(sector => CalculateSectorScore(sector, trans, _attachedOWRigidbody)); if ( // if any fake sectors are *roughly* in the same place as other sectors - we want fake sectors to override other sectors @@ -111,7 +122,16 @@ namespace QSB.SectorSync return ordered.FirstOrDefault(); } - private float GetRadius(QSBSector sector) + public static float CalculateSectorScore(QSBSector sector, Transform trans, OWRigidbody rigidbody) + { + var distance = Vector3.Distance(sector.Position, trans.position); // want to be small + var radius = GetRadius(sector); // want to be small + var velocity = GetRelativeVelocity(sector, rigidbody); // want to be small + + return (distance * distance) + (radius * radius) + (velocity * velocity); + } + + public static float GetRadius(QSBSector sector) { if (sector == null) { @@ -128,5 +148,17 @@ namespace QSB.SectorSync } return 0f; } + + public static float GetRelativeVelocity(QSBSector sector, OWRigidbody rigidbody) + { + var sectorRigidBody = sector.AttachedObject.GetOWRigidbody(); + if (sectorRigidBody != null && rigidbody != null) + { + var relativeVelocity = sectorRigidBody.GetRelativeVelocity(rigidbody); + var relativeVelocityMagnitude = relativeVelocity.sqrMagnitude; // Remember this is squared for efficiency! + return relativeVelocityMagnitude; + } + return 0; + } } } \ No newline at end of file diff --git a/QSB/SectorSync/WorldObjects/QSBSector.cs b/QSB/SectorSync/WorldObjects/QSBSector.cs index 573153d2..fa0cd084 100644 --- a/QSB/SectorSync/WorldObjects/QSBSector.cs +++ b/QSB/SectorSync/WorldObjects/QSBSector.cs @@ -45,11 +45,6 @@ namespace QSB.SectorSync.WorldObjects return false; } - if (Name == "Satellite_Body") // TODO : make a more rigourous system to not sync to fast-moving sectors - { - return false; - } - if (Type == Sector.Name.Ship) { return false; diff --git a/QSB/ShipSync/TransformSync/ShipTransformSync.cs b/QSB/ShipSync/TransformSync/ShipTransformSync.cs index a7de7faa..af507bd7 100644 --- a/QSB/ShipSync/TransformSync/ShipTransformSync.cs +++ b/QSB/ShipSync/TransformSync/ShipTransformSync.cs @@ -4,19 +4,17 @@ using UnityEngine; namespace QSB.ShipSync.TransformSync { - public class ShipTransformSync : SyncObjectTransformSync + public class ShipTransformSync : QSBNetworkTransform { - public override float DistanceLeeway => 20f; - private Transform GetShipModel() => Locator.GetShipTransform(); - protected override Transform InitLocalTransform() + protected override GameObject InitLocalTransform() { SectorSync.SetSectorDetector(Locator.GetShipDetector().GetComponent()); - return GetShipModel().Find("Module_Cockpit/Geo_Cockpit/Cockpit_Geometry/Cockpit_Exterior"); + return GetShipModel().Find("Module_Cockpit/Geo_Cockpit/Cockpit_Geometry/Cockpit_Exterior").gameObject; } - protected override Transform InitRemoteTransform() + protected override GameObject InitRemoteTransform() { var shipModel = GetShipModel(); @@ -41,7 +39,7 @@ namespace QSB.ShipSync.TransformSync = landingGearRight.localPosition += Vector3.up * 3.762f; - return remoteTransform; + return remoteTransform.gameObject; } public override bool IsReady => GetShipModel() != null diff --git a/QSB/TransformSync/QSBNetworkTransform.cs b/QSB/TransformSync/QSBNetworkTransform.cs new file mode 100644 index 00000000..54d3ae43 --- /dev/null +++ b/QSB/TransformSync/QSBNetworkTransform.cs @@ -0,0 +1,170 @@ +using OWML.Common; +using QSB.Player; +using QSB.Player.TransformSync; +using QSB.SectorSync.WorldObjects; +using QSB.Utility; +using QSB.WorldSync; +using QuantumUNET.Components; +using QuantumUNET.Transport; +using System.Linq; +using UnityEngine; + +namespace QSB.TransformSync +{ + public abstract class QSBNetworkTransform : QNetworkTransform + { + public uint AttachedNetId => NetIdentity?.NetId.Value ?? uint.MaxValue; + public uint PlayerId => NetIdentity.RootIdentity?.NetId.Value ?? NetIdentity.NetId.Value; + public PlayerInfo Player => QSBPlayerManager.GetPlayer(PlayerId); + + public QSBSector ReferenceSector { get; set; } + public GameObject AttachedObject { get; set; } + public SectorSync.SectorSync SectorSync { get; private set; } + + public abstract bool IsReady { get; } + + protected abstract GameObject InitLocalTransform(); + protected abstract GameObject InitRemoteTransform(); + + private bool _isInitialized; + + public virtual void Start() + { + var lowestBound = Resources.FindObjectsOfTypeAll() + .Where(x => x.NetId.Value <= NetId.Value).OrderBy(x => x.NetId.Value).Last(); + NetIdentity.SetRootIdentity(lowestBound.NetIdentity); + + SectorSync = gameObject.AddComponent(); + + DontDestroyOnLoad(gameObject); + } + + protected void Init() + { + AttachedObject = HasAuthority ? InitLocalTransform() : InitRemoteTransform(); + SetReferenceSector(SectorSync.GetClosestSector(AttachedObject.transform)); + _isInitialized = true; + } + + public override void SerializeTransform(QNetworkWriter writer) + { + if (ReferenceSector != null) + { + writer.Write(ReferenceSector.ObjectId); + } + else + { + writer.Write(-1); + } + + writer.Write(transform.localPosition); + SerializeRotation(writer, transform.localRotation); + _prevPosition = transform.localPosition; + _prevRotation = transform.localRotation; + } + + public override void DeserializeTransform(QNetworkReader reader) + { + if (!QSBCore.HasWokenUp) + { + reader.ReadInt32(); + reader.ReadVector3(); + DeserializeRotation(reader); + return; + } + + var sectorId = reader.ReadInt32(); + var sector = sectorId == -1 + ? null + : QSBWorldSync.GetWorldFromId(sectorId); + + if (sector != ReferenceSector) + { + SetReferenceSector(sector); + } + + var localPosition = reader.ReadVector3(); + var localRotation = DeserializeRotation(reader); + + if (HasAuthority) + { + return; + } + + transform.localPosition = localPosition; + transform.localRotation = localRotation; + + if (transform.position == Vector3.zero) + { + DebugLog.ToConsole($"Warning - {PlayerId}.{GetType().Name} at (0,0,0)! - Given localPosition was {localPosition} at sector {sector?.Name}", MessageType.Warning); + } + } + + public override void Update() + { + if (!_isInitialized && IsReady) + { + DebugLog.ToConsole($"Warning - {PlayerId}.{GetType().Name} is not initialized and ready.", MessageType.Warning); + Init(); + } + else if (_isInitialized && !IsReady) + { + DebugLog.ToConsole($"Warning - {PlayerId}.{GetType().Name} is initialized and not ready.", MessageType.Warning); + _isInitialized = false; + return; + } + + if (!_isInitialized) + { + return; + } + + if (AttachedObject == null) + { + DebugLog.ToConsole($"Warning - AttachedObject {Player.PlayerId}.{GetType().Name} is null.", MessageType.Warning); + return; + } + + UpdateTransform(); + + base.Update(); + } + + protected virtual void UpdateTransform() + { + if (HasAuthority) + { + transform.position = AttachedObject.transform.position; + transform.rotation = AttachedObject.transform.rotation; + } + else + { + AttachedObject.transform.position = transform.position; + AttachedObject.transform.rotation = transform.rotation; + } + } + + public void SetReferenceSector(QSBSector sector) + { + if (ReferenceSector == sector) + { + return; + } + DebugLog.DebugWrite($"set sector of {PlayerId}.{GetType().Name} to {sector.Name}"); + ReferenceSector = sector; + transform.SetParent(sector.Transform, true); + } + + private void OnRenderObject() + { + if (!QSBCore.HasWokenUp || !QSBCore.DebugMode || !QSBCore.ShowLinesInDebug || !IsReady) + { + return; + } + + Popcron.Gizmos.Cube(transform.position, transform.rotation, Vector3.one / 2, Color.red); + Popcron.Gizmos.Cube(AttachedObject.transform.position, AttachedObject.transform.rotation, Vector3.one / 2, Color.green); + Popcron.Gizmos.Line(AttachedObject.transform.position, ReferenceSector.Transform.position, Color.cyan); + } + } +} diff --git a/QSB/TransformSync/SyncObjectTransformSync.cs b/QSB/TransformSync/SyncObjectTransformSync.cs deleted file mode 100644 index 3597aa79..00000000 --- a/QSB/TransformSync/SyncObjectTransformSync.cs +++ /dev/null @@ -1,234 +0,0 @@ -using OWML.Common; -using QSB.Player; -using QSB.Player.TransformSync; -using QSB.SectorSync.WorldObjects; -using QSB.Utility; -using System.Collections.Generic; -using System.Linq; -using UnityEngine; - -namespace QSB.TransformSync -{ - public abstract class SyncObjectTransformSync : PlayerSyncObject - { - public abstract bool IsReady { get; } - - protected abstract Transform InitLocalTransform(); - protected abstract Transform InitRemoteTransform(); - - public Transform SyncedTransform { get; private set; } - public QSBSector ReferenceSector { get; set; } - public SectorSync.SectorSync SectorSync { get; private set; } - - private const float SmoothTime = 0.1f; - private const int DebugSavePosAmount = 75; - public abstract float DistanceLeeway { get; } - private bool _isInitialized; - private Vector3 _positionSmoothVelocity; - private Quaternion _rotationSmoothVelocity; - private bool _isVisible; - private float _previousDistance; - private Queue> _previousPositionRotationData = new Queue>(); - - protected override void Start() - { - base.Start(); - var lowestBound = QSBPlayerManager.GetSyncObjects() - .Where(x => x.NetId.Value <= NetId.Value).OrderBy(x => x.NetId.Value).Last(); - NetIdentity.SetRootIdentity(lowestBound.NetIdentity); - - SectorSync = gameObject.AddComponent(); - - DontDestroyOnLoad(gameObject); - QSBSceneManager.OnSceneLoaded += OnSceneLoaded; - } - - protected override void OnDestroy() - { - base.OnDestroy(); - if (!HasAuthority && SyncedTransform != null) - { - Destroy(SyncedTransform.gameObject); - } - QSBSceneManager.OnSceneLoaded -= OnSceneLoaded; - if (SectorSync != null) - { - Destroy(SectorSync); - } - } - - private void OnSceneLoaded(OWScene scene, bool isInUniverse) => - _isInitialized = false; - - protected void Init() - { - SyncedTransform = HasAuthority ? InitLocalTransform() : InitRemoteTransform(); - SetReferenceSector(SectorSync.GetClosestSector(SyncedTransform)); - _isInitialized = true; - _isVisible = true; - } - - public void OnRenderObject() - { - if (!QSBCore.HasWokenUp || !QSBCore.DebugMode || !QSBCore.ShowLinesInDebug || !IsReady) - { - return; - } - - _previousPositionRotationData.Enqueue(new KeyValuePair(transform.position, transform.rotation)); - - if (_previousPositionRotationData.Count >= DebugSavePosAmount) - { - _previousPositionRotationData.Dequeue(); - } - - for (var i = 0; i < _previousPositionRotationData.Count; i++) - { - var item = _previousPositionRotationData.ElementAt(i); // TODO : warning - O(n) not O(1) - maybe use array for O(1)? - - var targetPos = ReferenceSector.Transform.TransformPoint(item.Key); - var targetRot = ReferenceSector.Transform.TransformRotation(item.Value); - - Popcron.Gizmos.Cube(targetPos, targetRot, Vector3.one / 2, new Color(1f, 0f, 0f, 1f - ((float)i).Map(0f, DebugSavePosAmount - 1, 1f, 0f))); - - if (i > 0) - { - var prevItem = _previousPositionRotationData.ElementAt(i - 1); - var prevItemTargetPos = ReferenceSector.Transform.TransformPoint(prevItem.Key); - Popcron.Gizmos.Line(prevItemTargetPos, targetPos, Color.yellow); - } - } - - Popcron.Gizmos.Cube(SyncedTransform.position, SyncedTransform.rotation, Vector3.one / 2, Color.green); - } - - public void Update() - { - if (!_isInitialized && IsReady) - { - Init(); - } - else if (_isInitialized && !IsReady) - { - _isInitialized = false; - return; - } - - if (!_isInitialized) - { - return; - } - - if (SyncedTransform == null) - { - DebugLog.ToConsole($"Warning - SyncedTransform {Player.PlayerId}.{GetType().Name} is null.", MessageType.Warning); - return; - } - - UpdateTransform(); - } - - protected virtual void UpdateTransform() - { - var referenceSectorAtStart = ReferenceSector; - - if (HasAuthority) // If this script is attached to the client's own body on the client's side. - { - var previousPosition = transform.position; - if (ReferenceSector == null || ReferenceSector.AttachedObject == null) - { - DebugLog.ToConsole($"Error - ReferenceSector has null value for {Player.PlayerId}.{GetType().Name}", MessageType.Error); - return; - } - transform.position = ReferenceSector.Transform.InverseTransformPoint(SyncedTransform.position); - if (transform.position == Vector3.zero) - { - DebugLog.ToConsole($"Error - {PlayerId}.{SyncedTransform.name} locally at (0, 0, 0)!", MessageType.Error); - } - transform.rotation = ReferenceSector.Transform.InverseTransformRotation(SyncedTransform.rotation); - - var distance = Vector3.Distance(previousPosition, transform.position); - if (distance > _previousDistance + DistanceLeeway) - { - DebugLog.ToConsole($"Warning - {PlayerId}.{SyncedTransform.name} moved too far! Distance:{distance}, previous:{_previousDistance}, leeway:{DistanceLeeway}", MessageType.Warning); - } - _previousDistance = distance; - - if (referenceSectorAtStart != ReferenceSector) - { - DebugLog.ToConsole($"Warning - Reference for {PlayerId}.{SyncedTransform.name} changed while running UpdateTransform()!", MessageType.Warning); - } - - return; - } - - // If this script is attached to any other body, eg the representations of other players - if (SyncedTransform.position == Vector3.zero || SyncedTransform.localPosition == Vector3.zero) - { - DebugLog.ToConsole($"Error - {PlayerId}.{SyncedTransform.name} at (0, 0, 0)!", MessageType.Error); - Hide(); - return; - } - else - { - Show(); - } - - SyncedTransform.localPosition = SmartSmoothDamp(SyncedTransform.localPosition, transform.position); - SyncedTransform.localRotation = QuaternionHelper.SmoothDamp(SyncedTransform.localRotation, transform.rotation, ref _rotationSmoothVelocity, SmoothTime); - - if (referenceSectorAtStart != ReferenceSector) - { - DebugLog.ToConsole($"Warning - Reference for {PlayerId}.{SyncedTransform.name} changed while running UpdateTransform()!", MessageType.Warning); - } - } - - private Vector3 SmartSmoothDamp(Vector3 currentPosition, Vector3 targetPosition) - { - var distance = Vector3.Distance(currentPosition, targetPosition); - if (distance > _previousDistance + DistanceLeeway) - { - // moved too far! assume sector sync warp / actual warp - _previousDistance = distance; - return targetPosition; - } - _previousDistance = distance; - return Vector3.SmoothDamp(currentPosition, targetPosition, ref _positionSmoothVelocity, SmoothTime); - } - - public void SetReferenceSector(QSBSector sector) - { - if (sector == ReferenceSector || sector == default(QSBSector)) - { - return; - } - DebugLog.DebugWrite($"{PlayerId}.{SyncedTransform.name} from:{(ReferenceSector == null ? "NULL" : ReferenceSector.Name)} to:{sector.Name}"); - _positionSmoothVelocity = Vector3.zero; - ReferenceSector = sector; - if (!HasAuthority) - { - SyncedTransform.SetParent(sector.Transform, true); - transform.position = sector.Transform.InverseTransformPoint(SyncedTransform.position); - transform.rotation = sector.Transform.InverseTransformRotation(SyncedTransform.rotation); - } - } - - private void Show() - { - if (!_isVisible) - { - SyncedTransform.gameObject.Show(); - _isVisible = true; - } - } - - private void Hide() - { - if (_isVisible) - { - SyncedTransform.gameObject.Hide(); - _isVisible = false; - } - } - } -} \ No newline at end of file diff --git a/QSB/Utility/DebugActions.cs b/QSB/Utility/DebugActions.cs index db350b41..717ba770 100644 --- a/QSB/Utility/DebugActions.cs +++ b/QSB/Utility/DebugActions.cs @@ -27,35 +27,12 @@ namespace QSB.Utility bridgeVolume.AddObjectToVolume(Locator.GetPlayerCameraDetector()); } - private void DebugWarpToPlayer(int index) - { - var allPlayers = QSBPlayerManager.PlayerList.Where(x => x != QSBPlayerManager.LocalPlayer).ToList(); - if (allPlayers.Count <= index) - { - return; - } - var player = allPlayers[index]; - var localPlayer = Locator.GetPlayerBody(); - localPlayer.WarpToPositionRotation(player.CameraBody.transform.position, player.CameraBody.transform.rotation); - var playerTransformSync = QSBPlayerManager.GetSyncObject(player.PlayerId); - var syncedRigidbody = playerTransformSync.ReferenceSector.AttachedObject.GetOWRigidbody(); - localPlayer.SetVelocity(syncedRigidbody.GetPointVelocity(player.Body.transform.position)); - } - public void Update() { if (!QSBCore.DebugMode) { return; } - if (Input.GetKeyDown(KeyCode.Keypad0)) - { - DebugWarpToPlayer(0); - } - if (Input.GetKeyDown(KeyCode.Keypad1)) - { - DebugWarpToPlayer(1); - } if (Input.GetKeyDown(KeyCode.Keypad7)) { GoToVessel(); diff --git a/QuantumUNET/Components/QNetworkTransform.cs b/QuantumUNET/Components/QNetworkTransform.cs index ecf8d697..c58baf72 100644 --- a/QuantumUNET/Components/QNetworkTransform.cs +++ b/QuantumUNET/Components/QNetworkTransform.cs @@ -9,22 +9,25 @@ namespace QuantumUNET.Components public class QNetworkTransform : QNetworkBehaviour { public float SendInterval { get; set; } = 0.1f; - public AxisSyncMode SyncRotationAxis { get; set; } = AxisSyncMode.AxisXYZ; - public CompressionSyncMode RotationSyncCompression { get; set; } = CompressionSyncMode.None; - public ClientMoveCallback3D clientMoveCallback3D { get; set; } public float LastSyncTime { get; private set; } + private float _lastClientSendTime; + protected Vector3 _prevPosition; + protected Quaternion _prevRotation; + private QNetworkWriter _localTransformWriter; + public void Awake() { - m_PrevPosition = transform.position; - m_PrevRotation = transform.rotation; + _prevPosition = transform.position; + _prevRotation = transform.rotation; if (LocalPlayerAuthority) { - m_LocalTransformWriter = new QNetworkWriter(); + _localTransformWriter = new QNetworkWriter(); } } - public override void OnStartServer() => LastSyncTime = 0f; + public override void OnStartServer() + => LastSyncTime = 0f; public override bool OnSerialize(QNetworkWriter writer, bool initialState) { @@ -37,21 +40,10 @@ namespace QuantumUNET.Components } writer.WritePackedUInt32(1U); } - SerializeModeTransform(writer); + SerializeTransform(writer); return true; } - private void SerializeModeTransform(QNetworkWriter writer) - { - writer.Write(transform.position); - if (SyncRotationAxis != AxisSyncMode.None) - { - SerializeRotation3D(writer, transform.rotation, SyncRotationAxis, RotationSyncCompression); - } - m_PrevPosition = transform.position; - m_PrevRotation = transform.rotation; - } - public override void OnDeserialize(QNetworkReader reader, bool initialState) { if (!IsServer || !QNetworkServer.localClientActive) @@ -63,116 +55,78 @@ namespace QuantumUNET.Components return; } } - UnserializeModeTransform(reader, initialState); + DeserializeTransform(reader); LastSyncTime = Time.time; } } - private void UnserializeModeTransform(QNetworkReader reader, bool initialState) + public virtual void SerializeTransform(QNetworkWriter writer) + { + writer.Write(transform.position); + SerializeRotation(writer, transform.rotation); + _prevPosition = transform.position; + _prevRotation = transform.rotation; + } + + public virtual void DeserializeTransform(QNetworkReader reader) { if (HasAuthority) { reader.ReadVector3(); - if (SyncRotationAxis != AxisSyncMode.None) - { - UnserializeRotation3D(reader, SyncRotationAxis, RotationSyncCompression); - } - } - else if (IsServer && clientMoveCallback3D != null) - { - var position = reader.ReadVector3(); - var zero = Vector3.zero; - var rotation = Quaternion.identity; - if (SyncRotationAxis != AxisSyncMode.None) - { - rotation = UnserializeRotation3D(reader, SyncRotationAxis, RotationSyncCompression); - } - if (clientMoveCallback3D(ref position, ref zero, ref rotation)) - { - transform.position = position; - if (SyncRotationAxis != AxisSyncMode.None) - { - transform.rotation = rotation; - } - } - } - else - { - transform.position = reader.ReadVector3(); - if (SyncRotationAxis != AxisSyncMode.None) - { - transform.rotation = UnserializeRotation3D(reader, SyncRotationAxis, RotationSyncCompression); - } + DeserializeRotation(reader); + return; } + transform.position = reader.ReadVector3(); + transform.rotation = DeserializeRotation(reader); } private void FixedUpdate() { - if (IsServer) + if (!IsServer) { - FixedUpdateServer(); + return; + } + + if (SyncVarDirtyBits != 0U) + { + return; + } + + if (!QNetworkServer.active) + { + return; + } + + if (GetNetworkSendInterval() != 0f && HasMoved()) + { + SetDirtyBit(1U); } } - private void FixedUpdateServer() + public virtual void Update() { - if (SyncVarDirtyBits == 0U) + if (!HasAuthority || !LocalPlayerAuthority) { - if (QNetworkServer.active) - { - if (IsServer) - { - if (GetNetworkSendInterval() != 0f) - { - if (HasMoved()) - { - SetDirtyBit(1U); - } - } - } - } + return; } - } - private void Update() - { - if (HasAuthority) + if (QNetworkServer.active) { - if (LocalPlayerAuthority) - { - if (!QNetworkServer.active) - { - if (Time.time - m_LastClientSendTime > GetNetworkSendInterval()) - { - SendTransform(); - m_LastClientSendTime = Time.time; - } - } - } + return; + } + + if (Time.time - _lastClientSendTime > GetNetworkSendInterval()) + { + SendTransform(); + _lastClientSendTime = Time.time; } } private bool HasMoved() { - var num = (transform.position - m_PrevPosition).magnitude; - bool result; - if (num > 1E-05f) - { - result = true; - } - else - { - num = Quaternion.Angle(transform.rotation, m_PrevRotation); - if (num > 1E-05f) - { - result = true; - } - else - { - result = num > 1E-05f; - } - } - return result; + var displacementMagnitude = (transform.position - _prevPosition).magnitude; + return displacementMagnitude > 1E-05f + || Quaternion.Angle(transform.rotation, _prevRotation) > 1E-05f; } [Client] @@ -180,13 +134,14 @@ namespace QuantumUNET.Components { if (HasMoved() && QClientScene.readyConnection != null) { - m_LocalTransformWriter.StartMessage(6); - m_LocalTransformWriter.Write(NetId); - SerializeModeTransform(m_LocalTransformWriter); - m_PrevPosition = transform.position; - m_PrevRotation = transform.rotation; - m_LocalTransformWriter.FinishMessage(); - QClientScene.readyConnection.SendWriter(m_LocalTransformWriter, GetNetworkChannel()); + _localTransformWriter.StartMessage(QMsgType.LocalPlayerTransform); + _localTransformWriter.Write(NetId); + SerializeTransform(_localTransformWriter); + _prevPosition = transform.position; + _prevRotation = transform.rotation; + _localTransformWriter.FinishMessage(); + + QClientScene.readyConnection.SendWriter(_localTransformWriter, GetNetworkChannel()); } } @@ -197,281 +152,63 @@ namespace QuantumUNET.Components if (gameObject == null) { QLog.Warning("Received NetworkTransform data for GameObject that doesn't exist"); + return; + } + + var component = gameObject.GetComponent(); + if (component == null) + { + QLog.Warning("HandleTransform null target"); + return; + } + + if (!component.LocalPlayerAuthority) + { + QLog.Warning("HandleTransform no localPlayerAuthority"); + return; + } + + if (netMsg.Connection.ClientOwnedObjects == null) + { + QLog.Warning("HandleTransform object not owned by connection"); + return; + } + + if (netMsg.Connection.ClientOwnedObjects.Contains(networkInstanceId)) + { + component.DeserializeTransform(netMsg.Reader); + component.LastSyncTime = Time.time; } else { - var component = gameObject.GetComponent(); - if (component == null) - { - QLog.Warning("HandleTransform null target"); - } - else if (!component.LocalPlayerAuthority) - { - QLog.Warning("HandleTransform no localPlayerAuthority"); - } - else if (netMsg.Connection.ClientOwnedObjects == null) - { - QLog.Warning("HandleTransform object not owned by connection"); - } - else if (netMsg.Connection.ClientOwnedObjects.Contains(networkInstanceId)) - { - component.UnserializeModeTransform(netMsg.Reader, false); - component.LastSyncTime = Time.time; - } - else - { - QLog.Warning( - $"HandleTransform netId:{networkInstanceId} is not for a valid player"); - } + QLog.Warning( + $"HandleTransform netId:{networkInstanceId} is not for a valid player"); } } - private static void WriteAngle(QNetworkWriter writer, float angle, CompressionSyncMode compression) + public static void SerializeRotation(QNetworkWriter writer, Quaternion rot) { - if (compression != CompressionSyncMode.None) - { - if (compression != CompressionSyncMode.Low) - { - if (compression == CompressionSyncMode.High) - { - writer.Write((short)angle); - } - } - else - { - writer.Write((short)angle); - } - } - else - { - writer.Write(angle); - } + writer.Write(rot.eulerAngles.x); + writer.Write(rot.eulerAngles.y); + writer.Write(rot.eulerAngles.z); } - private static float ReadAngle(QNetworkReader reader, CompressionSyncMode compression) + public static Quaternion DeserializeRotation(QNetworkReader reader) { - float result; - if (compression != CompressionSyncMode.None) - { - if (compression != CompressionSyncMode.Low) - { - if (compression != CompressionSyncMode.High) - { - result = 0f; - } - else - { - result = reader.ReadInt16(); - } - } - else - { - result = reader.ReadInt16(); - } - } - else - { - result = reader.ReadSingle(); - } - return result; + var rotation = Quaternion.identity; + var eulerAngles = Vector3.zero; + eulerAngles.Set(reader.ReadSingle(), reader.ReadSingle(), reader.ReadSingle()); + rotation.eulerAngles = eulerAngles; + return rotation; } - public static void SerializeVelocity3D(QNetworkWriter writer, Vector3 velocity, CompressionSyncMode compression) => - writer.Write(velocity); + public override int GetNetworkChannel() + => 1; - public static void SerializeRotation3D(QNetworkWriter writer, Quaternion rot, AxisSyncMode mode, CompressionSyncMode compression) - { - switch (mode) - { - case AxisSyncMode.AxisX: - WriteAngle(writer, rot.eulerAngles.x, compression); - break; + public override float GetNetworkSendInterval() + => SendInterval; - case AxisSyncMode.AxisY: - WriteAngle(writer, rot.eulerAngles.y, compression); - break; - - case AxisSyncMode.AxisZ: - WriteAngle(writer, rot.eulerAngles.z, compression); - break; - - case AxisSyncMode.AxisXY: - WriteAngle(writer, rot.eulerAngles.x, compression); - WriteAngle(writer, rot.eulerAngles.y, compression); - break; - - case AxisSyncMode.AxisXZ: - WriteAngle(writer, rot.eulerAngles.x, compression); - WriteAngle(writer, rot.eulerAngles.z, compression); - break; - - case AxisSyncMode.AxisYZ: - WriteAngle(writer, rot.eulerAngles.y, compression); - WriteAngle(writer, rot.eulerAngles.z, compression); - break; - - case AxisSyncMode.AxisXYZ: - WriteAngle(writer, rot.eulerAngles.x, compression); - WriteAngle(writer, rot.eulerAngles.y, compression); - WriteAngle(writer, rot.eulerAngles.z, compression); - break; - } - } - - public static void SerializeSpin3D(QNetworkWriter writer, Vector3 angularVelocity, AxisSyncMode mode, CompressionSyncMode compression) - { - switch (mode) - { - case AxisSyncMode.AxisX: - WriteAngle(writer, angularVelocity.x, compression); - break; - - case AxisSyncMode.AxisY: - WriteAngle(writer, angularVelocity.y, compression); - break; - - case AxisSyncMode.AxisZ: - WriteAngle(writer, angularVelocity.z, compression); - break; - - case AxisSyncMode.AxisXY: - WriteAngle(writer, angularVelocity.x, compression); - WriteAngle(writer, angularVelocity.y, compression); - break; - - case AxisSyncMode.AxisXZ: - WriteAngle(writer, angularVelocity.x, compression); - WriteAngle(writer, angularVelocity.z, compression); - break; - - case AxisSyncMode.AxisYZ: - WriteAngle(writer, angularVelocity.y, compression); - WriteAngle(writer, angularVelocity.z, compression); - break; - - case AxisSyncMode.AxisXYZ: - WriteAngle(writer, angularVelocity.x, compression); - WriteAngle(writer, angularVelocity.y, compression); - WriteAngle(writer, angularVelocity.z, compression); - break; - } - } - - public static Vector3 UnserializeVelocity3D(QNetworkReader reader, CompressionSyncMode compression) => reader.ReadVector3(); - - public static Quaternion UnserializeRotation3D(QNetworkReader reader, AxisSyncMode mode, CompressionSyncMode compression) - { - var identity = Quaternion.identity; - var zero = Vector3.zero; - switch (mode) - { - case AxisSyncMode.AxisX: - zero.Set(ReadAngle(reader, compression), 0f, 0f); - identity.eulerAngles = zero; - break; - - case AxisSyncMode.AxisY: - zero.Set(0f, ReadAngle(reader, compression), 0f); - identity.eulerAngles = zero; - break; - - case AxisSyncMode.AxisZ: - zero.Set(0f, 0f, ReadAngle(reader, compression)); - identity.eulerAngles = zero; - break; - - case AxisSyncMode.AxisXY: - zero.Set(ReadAngle(reader, compression), ReadAngle(reader, compression), 0f); - identity.eulerAngles = zero; - break; - - case AxisSyncMode.AxisXZ: - zero.Set(ReadAngle(reader, compression), 0f, ReadAngle(reader, compression)); - identity.eulerAngles = zero; - break; - - case AxisSyncMode.AxisYZ: - zero.Set(0f, ReadAngle(reader, compression), ReadAngle(reader, compression)); - identity.eulerAngles = zero; - break; - - case AxisSyncMode.AxisXYZ: - zero.Set(ReadAngle(reader, compression), ReadAngle(reader, compression), ReadAngle(reader, compression)); - identity.eulerAngles = zero; - break; - } - return identity; - } - - public static Vector3 UnserializeSpin3D(QNetworkReader reader, AxisSyncMode mode, CompressionSyncMode compression) - { - var zero = Vector3.zero; - switch (mode) - { - case AxisSyncMode.AxisX: - zero.Set(ReadAngle(reader, compression), 0f, 0f); - break; - - case AxisSyncMode.AxisY: - zero.Set(0f, ReadAngle(reader, compression), 0f); - break; - - case AxisSyncMode.AxisZ: - zero.Set(0f, 0f, ReadAngle(reader, compression)); - break; - - case AxisSyncMode.AxisXY: - zero.Set(ReadAngle(reader, compression), ReadAngle(reader, compression), 0f); - break; - - case AxisSyncMode.AxisXZ: - zero.Set(ReadAngle(reader, compression), 0f, ReadAngle(reader, compression)); - break; - - case AxisSyncMode.AxisYZ: - zero.Set(0f, ReadAngle(reader, compression), ReadAngle(reader, compression)); - break; - - case AxisSyncMode.AxisXYZ: - zero.Set(ReadAngle(reader, compression), ReadAngle(reader, compression), ReadAngle(reader, compression)); - break; - } - return zero; - } - - public override int GetNetworkChannel() => 1; - - public override float GetNetworkSendInterval() => SendInterval; - - public override void OnStartAuthority() => LastSyncTime = 0f; - - private float m_LastClientSendTime; - - private Vector3 m_PrevPosition; - - private Quaternion m_PrevRotation; - - private QNetworkWriter m_LocalTransformWriter; - - public enum AxisSyncMode - { - None, - AxisX, - AxisY, - AxisZ, - AxisXY, - AxisXZ, - AxisYZ, - AxisXYZ - } - - public enum CompressionSyncMode - { - None, - Low, - High - } - - public delegate bool ClientMoveCallback3D(ref Vector3 position, ref Vector3 velocity, ref Quaternion rotation); + public override void OnStartAuthority() + => LastSyncTime = 0f; } } \ No newline at end of file diff --git a/QuantumUNET/Components/QNetworkTransformChild.cs b/QuantumUNET/Components/QNetworkTransformChild.cs index c8d10f94..8db5a8b9 100644 --- a/QuantumUNET/Components/QNetworkTransformChild.cs +++ b/QuantumUNET/Components/QNetworkTransformChild.cs @@ -14,7 +14,6 @@ namespace QuantumUNET.Components set { m_Target = value; - OnValidate(); } } @@ -26,18 +25,6 @@ namespace QuantumUNET.Components set => m_SendInterval = value; } - public QNetworkTransform.AxisSyncMode SyncRotationAxis - { - get => m_SyncRotationAxis; - set => m_SyncRotationAxis = value; - } - - public QNetworkTransform.CompressionSyncMode RotationSyncCompression - { - get => m_RotationSyncCompression; - set => m_RotationSyncCompression = value; - } - public float MovementThreshold { get => m_MovementThreshold; @@ -56,89 +43,10 @@ namespace QuantumUNET.Components set => m_InterpolateMovement = value; } - public QNetworkTransform.ClientMoveCallback3D ClientMoveCallback3D - { - get => m_ClientMoveCallback3D; - set => m_ClientMoveCallback3D = value; - } - public float LastSyncTime { get; private set; } public Vector3 TargetSyncPosition => m_TargetSyncPosition; public Quaternion TargetSyncRotation3D => m_TargetSyncRotation3D; - private void OnValidate() - { - if (m_Target != null) - { - var parent = m_Target.parent; - if (parent == null) - { - Debug.LogError("NetworkTransformChild target cannot be the root transform."); - m_Target = null; - return; - } - while (parent.parent != null) - { - parent = parent.parent; - } - m_Root = parent.gameObject.GetComponent(); - if (m_Root == null) - { - Debug.LogError("NetworkTransformChild root must have NetworkTransform"); - m_Target = null; - return; - } - } - if (m_Root != null) - { - m_ChildIndex = uint.MaxValue; - var components = m_Root.GetComponents(); - var num = 0U; - while (num < (ulong)components.Length) - { - if (components[(int)(UIntPtr)num] == this) - { - m_ChildIndex = num; - break; - } - num += 1U; - } - if (m_ChildIndex == 4294967295U) - { - Debug.LogError("QNetworkTransformChild component must be a child in the same hierarchy"); - m_Target = null; - } - } - if (m_SendInterval < 0f) - { - m_SendInterval = 0f; - } - if (m_SyncRotationAxis < QNetworkTransform.AxisSyncMode.None || m_SyncRotationAxis > QNetworkTransform.AxisSyncMode.AxisXYZ) - { - m_SyncRotationAxis = QNetworkTransform.AxisSyncMode.None; - } - if (MovementThreshold < 0f) - { - MovementThreshold = 0f; - } - if (InterpolateRotation < 0f) - { - InterpolateRotation = 0.01f; - } - if (InterpolateRotation > 1f) - { - InterpolateRotation = 1f; - } - if (InterpolateMovement < 0f) - { - InterpolateMovement = 0.01f; - } - if (InterpolateMovement > 1f) - { - InterpolateMovement = 1f; - } - } - private void Awake() { m_PrevPosition = m_Target.localPosition; @@ -167,10 +75,7 @@ namespace QuantumUNET.Components private void SerializeModeTransform(QNetworkWriter writer) { writer.Write(m_Target.localPosition); - if (m_SyncRotationAxis != QNetworkTransform.AxisSyncMode.None) - { - QNetworkTransform.SerializeRotation3D(writer, m_Target.localRotation, SyncRotationAxis, RotationSyncCompression); - } + QNetworkTransform.SerializeRotation(writer, m_Target.localRotation); m_PrevPosition = m_Target.localPosition; m_PrevRotation = m_Target.localRotation; } @@ -197,36 +102,12 @@ namespace QuantumUNET.Components if (HasAuthority) { reader.ReadVector3(); - if (SyncRotationAxis != QNetworkTransform.AxisSyncMode.None) - { - QNetworkTransform.UnserializeRotation3D(reader, SyncRotationAxis, RotationSyncCompression); - } - } - else if (IsServer && m_ClientMoveCallback3D != null) - { - var targetSyncPosition = reader.ReadVector3(); - var zero = Vector3.zero; - var targetSyncRotation3D = Quaternion.identity; - if (SyncRotationAxis != QNetworkTransform.AxisSyncMode.None) - { - targetSyncRotation3D = QNetworkTransform.UnserializeRotation3D(reader, SyncRotationAxis, RotationSyncCompression); - } - if (m_ClientMoveCallback3D(ref targetSyncPosition, ref zero, ref targetSyncRotation3D)) - { - m_TargetSyncPosition = targetSyncPosition; - if (SyncRotationAxis != QNetworkTransform.AxisSyncMode.None) - { - m_TargetSyncRotation3D = targetSyncRotation3D; - } - } + QNetworkTransform.DeserializeRotation(reader); } else { m_TargetSyncPosition = reader.ReadVector3(); - if (SyncRotationAxis != QNetworkTransform.AxisSyncMode.None) - { - m_TargetSyncRotation3D = QNetworkTransform.UnserializeRotation3D(reader, SyncRotationAxis, RotationSyncCompression); - } + m_TargetSyncRotation3D = QNetworkTransform.DeserializeRotation(reader); } } @@ -404,12 +285,9 @@ namespace QuantumUNET.Components public uint m_ChildIndex; public QNetworkTransform m_Root; public float m_SendInterval = 0.1f; - public QNetworkTransform.AxisSyncMode m_SyncRotationAxis = QNetworkTransform.AxisSyncMode.AxisXYZ; - public QNetworkTransform.CompressionSyncMode m_RotationSyncCompression = QNetworkTransform.CompressionSyncMode.None; public float m_MovementThreshold = 0.001f; public float m_InterpolateRotation = 0.5f; public float m_InterpolateMovement = 0.5f; - public QNetworkTransform.ClientMoveCallback3D m_ClientMoveCallback3D; private Vector3 m_TargetSyncPosition; private Quaternion m_TargetSyncRotation3D; private float m_LastClientSendTime; From a55536c44478e389c6a8d0e4c5fb0a9b498f5290 Mon Sep 17 00:00:00 2001 From: Mister_Nebula <41904486+misternebula@users.noreply.github.com> Date: Wed, 21 Apr 2021 11:28:45 +0100 Subject: [PATCH 05/12] add interp --- QSB/TransformSync/QSBNetworkTransform.cs | 33 +++++++++++++++++++-- QuantumUNET/Components/QNetworkTransform.cs | 4 +-- 2 files changed, 33 insertions(+), 4 deletions(-) diff --git a/QSB/TransformSync/QSBNetworkTransform.cs b/QSB/TransformSync/QSBNetworkTransform.cs index 54d3ae43..b20abd37 100644 --- a/QSB/TransformSync/QSBNetworkTransform.cs +++ b/QSB/TransformSync/QSBNetworkTransform.cs @@ -27,6 +27,11 @@ namespace QSB.TransformSync protected abstract GameObject InitRemoteTransform(); private bool _isInitialized; + private const float SmoothTime = 0.1f; + private const float DistanceLeeway = 5f; + private float _previousDistance; + private Vector3 _positionSmoothVelocity; + private Quaternion _rotationSmoothVelocity; public virtual void Start() { @@ -139,11 +144,18 @@ namespace QSB.TransformSync } else { - AttachedObject.transform.position = transform.position; - AttachedObject.transform.rotation = transform.rotation; + AttachedObject.transform.localPosition = SmartSmoothDamp(AttachedObject.transform.localPosition, transform.localPosition); + AttachedObject.transform.localRotation = QuaternionHelper.SmoothDamp(AttachedObject.transform.localRotation, transform.localRotation, ref _rotationSmoothVelocity, SmoothTime); } } + public override bool HasMoved() + { + var displacementMagnitude = (transform.localPosition - _prevPosition).magnitude; + return displacementMagnitude > 1E-05f + || Quaternion.Angle(transform.localRotation, _prevRotation) > 1E-05f; + } + public void SetReferenceSector(QSBSector sector) { if (ReferenceSector == sector) @@ -153,6 +165,23 @@ namespace QSB.TransformSync DebugLog.DebugWrite($"set sector of {PlayerId}.{GetType().Name} to {sector.Name}"); ReferenceSector = sector; transform.SetParent(sector.Transform, true); + if (!HasAuthority) + { + AttachedObject.transform.SetParent(sector.Transform, true); + } + } + + private Vector3 SmartSmoothDamp(Vector3 currentPosition, Vector3 targetPosition) + { + var distance = Vector3.Distance(currentPosition, targetPosition); + if (distance > _previousDistance + DistanceLeeway) + { + // moved too far! assume sector sync warp / actual warp + _previousDistance = distance; + return targetPosition; + } + _previousDistance = distance; + return Vector3.SmoothDamp(currentPosition, targetPosition, ref _positionSmoothVelocity, SmoothTime); } private void OnRenderObject() diff --git a/QuantumUNET/Components/QNetworkTransform.cs b/QuantumUNET/Components/QNetworkTransform.cs index c58baf72..332a89a7 100644 --- a/QuantumUNET/Components/QNetworkTransform.cs +++ b/QuantumUNET/Components/QNetworkTransform.cs @@ -8,7 +8,7 @@ namespace QuantumUNET.Components { public class QNetworkTransform : QNetworkBehaviour { - public float SendInterval { get; set; } = 0.1f; + public float SendInterval { get; set; } = 0.05f; public float LastSyncTime { get; private set; } private float _lastClientSendTime; @@ -122,7 +122,7 @@ namespace QuantumUNET.Components } } - private bool HasMoved() + public virtual bool HasMoved() { var displacementMagnitude = (transform.position - _prevPosition).magnitude; return displacementMagnitude > 1E-05f From 78de7aab2594a6cc3753c6b3ec04e1eb79550cba Mon Sep 17 00:00:00 2001 From: Mister_Nebula <41904486+misternebula@users.noreply.github.com> Date: Wed, 21 Apr 2021 16:49:30 +0100 Subject: [PATCH 06/12] stuff --- QSB/ProbeSync/TransformSync/PlayerProbeSync.cs | 3 +++ QSB/TransformSync/QSBNetworkTransform.cs | 2 +- README.md | 2 ++ 3 files changed, 6 insertions(+), 1 deletion(-) diff --git a/QSB/ProbeSync/TransformSync/PlayerProbeSync.cs b/QSB/ProbeSync/TransformSync/PlayerProbeSync.cs index 64716d17..281c4d02 100644 --- a/QSB/ProbeSync/TransformSync/PlayerProbeSync.cs +++ b/QSB/ProbeSync/TransformSync/PlayerProbeSync.cs @@ -10,6 +10,9 @@ namespace QSB.ProbeSync.TransformSync public class PlayerProbeSync : QSBNetworkTransform { public static PlayerProbeSync LocalInstance { get; private set; } + + protected override float DistanceLeeway => 10f; + public override void OnStartAuthority() => LocalInstance = this; diff --git a/QSB/TransformSync/QSBNetworkTransform.cs b/QSB/TransformSync/QSBNetworkTransform.cs index b20abd37..0bfbf606 100644 --- a/QSB/TransformSync/QSBNetworkTransform.cs +++ b/QSB/TransformSync/QSBNetworkTransform.cs @@ -28,7 +28,7 @@ namespace QSB.TransformSync private bool _isInitialized; private const float SmoothTime = 0.1f; - private const float DistanceLeeway = 5f; + protected virtual float DistanceLeeway { get; } = 5f; private float _previousDistance; private Vector3 _positionSmoothVelocity; private Quaternion _rotationSmoothVelocity; diff --git a/README.md b/README.md index 22279b3e..c1694715 100644 --- a/README.md +++ b/README.md @@ -1,5 +1,7 @@ ![logo](unknown.png) +![GitHub](https://img.shields.io/github/license/misternebula/quantum-space-buddies) + Quantum Space Buddies (QSB) is a multiplayer mod for Outer Wilds. The mod uses the OWML mod loader and customized UNET code (internally referred to as QNet or QuantumUNET) for networking. ## License From 0b3571ef6ece81b2c5b58b9814831b20c9f7a70c Mon Sep 17 00:00:00 2001 From: Mister_Nebula <41904486+misternebula@users.noreply.github.com> Date: Wed, 21 Apr 2021 17:00:56 +0100 Subject: [PATCH 07/12] more badges --- README.md | 3 +++ 1 file changed, 3 insertions(+) diff --git a/README.md b/README.md index c1694715..06d7fa4f 100644 --- a/README.md +++ b/README.md @@ -1,6 +1,9 @@ ![logo](unknown.png) ![GitHub](https://img.shields.io/github/license/misternebula/quantum-space-buddies) +![GitHub release (latest by date)](https://img.shields.io/github/v/release/misternebula/quantum-space-buddies) +![GitHub all releases](https://img.shields.io/github/downloads/misternebula/quantum-space-buddies/total) +![GitHub last commit (branch)](https://img.shields.io/github/last-commit/misternebula/quantum-space-buddies/dev) Quantum Space Buddies (QSB) is a multiplayer mod for Outer Wilds. The mod uses the OWML mod loader and customized UNET code (internally referred to as QNet or QuantumUNET) for networking. From 4696442380214665366fb350cc116c5bdc7d1a21 Mon Sep 17 00:00:00 2001 From: Mister_Nebula <41904486+misternebula@users.noreply.github.com> Date: Wed, 21 Apr 2021 17:27:18 +0100 Subject: [PATCH 08/12] more badges --- README.md | 9 +++++---- 1 file changed, 5 insertions(+), 4 deletions(-) diff --git a/README.md b/README.md index 06d7fa4f..f06b8964 100644 --- a/README.md +++ b/README.md @@ -1,9 +1,10 @@ ![logo](unknown.png) -![GitHub](https://img.shields.io/github/license/misternebula/quantum-space-buddies) -![GitHub release (latest by date)](https://img.shields.io/github/v/release/misternebula/quantum-space-buddies) -![GitHub all releases](https://img.shields.io/github/downloads/misternebula/quantum-space-buddies/total) -![GitHub last commit (branch)](https://img.shields.io/github/last-commit/misternebula/quantum-space-buddies/dev) +![GitHub](https://img.shields.io/github/license/misternebula/quantum-space-buddies?style=flat-square) +![GitHub release (latest by date)](https://img.shields.io/github/v/release/misternebula/quantum-space-buddies?style=flat-square) +![GitHub Release Date](https://img.shields.io/github/release-date/misternebula/quantum-space-buddies?label=last%20release&style=flat-square) +![GitHub all releases](https://img.shields.io/github/downloads/misternebula/quantum-space-buddies/total?style=flat-square) +![GitHub last commit (branch)](https://img.shields.io/github/last-commit/misternebula/quantum-space-buddies/dev?label=last%20commit%20to%20dev&style=flat-square) Quantum Space Buddies (QSB) is a multiplayer mod for Outer Wilds. The mod uses the OWML mod loader and customized UNET code (internally referred to as QNet or QuantumUNET) for networking. From 4ecade9de4728e945e23be4d5750458106c50cd4 Mon Sep 17 00:00:00 2001 From: Mister_Nebula <41904486+misternebula@users.noreply.github.com> Date: Wed, 21 Apr 2021 17:43:45 +0100 Subject: [PATCH 09/12] Update README.md --- README.md | 43 ++++++++++++++++++++++++++++++------------- 1 file changed, 30 insertions(+), 13 deletions(-) diff --git a/README.md b/README.md index f06b8964..a2f820bd 100644 --- a/README.md +++ b/README.md @@ -62,19 +62,36 @@ QSB relies on exact orders of objects found using Resources.FindObjectsOfTypeAll **NomaiVR compatibility is currently not planned and likely will never happen, due to extensive changes needed to both mods for it to work.** ### What is currently synced? -QSB does not operate on a strict server-client relationship. Each player's game is left as a completely seperate game, and individual elemets are synced or patched so they can be controlled though network messages. Right now, the list of synced objects are : -- Geysers -- Elevators -- Nomai interface orbs -- Player animations -- Player tools -- Player ships -- Player probes -- NPC heads in conversations -- Ship log -- Discovering frequencies / signals -- Nomai text (Spirals + Computers) -- Picking up/dropping/socketing items + +| System / Mechanic | Synced? | +| :---: | :---: | +| Anglerfish | No | +| Brittle Hollow fragments | No | +| Campfires | Yes | +| Conversations with NPCs | Yes | +| Discovering signals/frequencies | Yes | +| Eye of the Universe ancient glade | No | +| Eye of the Universe instrument hunt | No | +| Eye of the Universe jam session | No | +| Eye of the Universe quantum lightning | No | +| Geysers | Yes | +| Items | Yes | +| Jellyfish | No | +| Marshmallow roasting | Yes | +| Meteors | No | +| Museum statue | Yes | +| NPC animations | Kind of | +| Nomai orbs | Yes | +| Nomai shuttle | Kind of | +| Orbital Probe Cannon (direction) | No | +| Player animation | Kind of | +| Player position | Yes | +| Player tools | Yes | +| Projection pools | Yes | +| Quantum objects | Yes | +| Ship log | Yes | +| Timber Hearth satellite | No | +| Tornadoes | No | QSB also changes some mechanics of the base game, to better fit a multiplayer experience. These include : - Adding dialogue boxes above NPC and player heads, so other players can "listen in" on conversations. From bc64d9f64b7e4a8c4c845be9226c77fc2c853989 Mon Sep 17 00:00:00 2001 From: Mister_Nebula <41904486+misternebula@users.noreply.github.com> Date: Wed, 21 Apr 2021 19:06:00 +0100 Subject: [PATCH 10/12] cleanup --- QSB/Player/Events/PlayerStatesRequestEvent.cs | 1 - .../Events/ServerSendPlayerStatesEvent.cs | 1 - QSB/QSBCore.cs | 17 +++-------------- QSB/QSBNetworkManager.cs | 1 - .../TransformSync/RoastingStickTransformSync.cs | 1 - QSB/SectorSync/QSBSectorManager.cs | 2 -- QSB/ShipSync/TransformSync/ShipTransformSync.cs | 2 ++ QSB/Utility/DebugActions.cs | 3 --- .../Components/QNetworkTransformChild.cs | 5 +---- 9 files changed, 6 insertions(+), 27 deletions(-) diff --git a/QSB/Player/Events/PlayerStatesRequestEvent.cs b/QSB/Player/Events/PlayerStatesRequestEvent.cs index 613fea71..e116587b 100644 --- a/QSB/Player/Events/PlayerStatesRequestEvent.cs +++ b/QSB/Player/Events/PlayerStatesRequestEvent.cs @@ -3,7 +3,6 @@ using QSB.CampfireSync.WorldObjects; using QSB.Events; using QSB.Messaging; using QSB.QuantumSync; -using QSB.TransformSync; using QSB.TranslationSync; using QSB.TranslationSync.WorldObjects; using QSB.Utility; diff --git a/QSB/Player/Events/ServerSendPlayerStatesEvent.cs b/QSB/Player/Events/ServerSendPlayerStatesEvent.cs index 43491dd6..4be1f9f8 100644 --- a/QSB/Player/Events/ServerSendPlayerStatesEvent.cs +++ b/QSB/Player/Events/ServerSendPlayerStatesEvent.cs @@ -1,6 +1,5 @@ using OWML.Common; using QSB.Events; -using QSB.TransformSync; using QSB.Utility; namespace QSB.Player.Events diff --git a/QSB/QSBCore.cs b/QSB/QSBCore.cs index 9a6acaa9..21563c28 100644 --- a/QSB/QSBCore.cs +++ b/QSB/QSBCore.cs @@ -17,7 +17,6 @@ using QSB.QuantumSync.WorldObjects; using QSB.SectorSync; using QSB.StatueSync; using QSB.TimeSync; -using QSB.TransformSync; using QSB.TranslationSync; using QSB.Utility; using QSB.WorldSync; @@ -148,20 +147,10 @@ namespace QSB } var offset3 = 10f; - GUI.Label(new Rect(420, offset3, 200f, 20f), $"Current sectors :"); + GUI.Label(new Rect(420, offset3, 200f, 20f), $"Current sector : {PlayerTransformSync.LocalInstance.ReferenceSector.Name}"); offset3 += _debugLineSpacing; - foreach (var sec in PlayerTransformSync.LocalInstance.SectorSync.SectorList.OrderBy(s => SectorSync.SectorSync.CalculateSectorScore(s, Locator.GetPlayerTransform(), Locator.GetPlayerBody()))) - { - GUI.Label(new Rect(420, offset3, 400f, 20f), $"- {SectorSync.SectorSync.CalculateSectorScore(sec, Locator.GetPlayerTransform(), Locator.GetPlayerBody())} : {sec.Name}"); - offset3 += _debugLineSpacing; - } - GUI.Label(new Rect(420, offset3, 200f, 20f), $"Probe sectors :"); + GUI.Label(new Rect(420, offset3, 200f, 20f), $"Probe sector : {PlayerProbeSync.LocalInstance.ReferenceSector.Name}"); offset3 += _debugLineSpacing; - foreach (var sec in PlayerProbeSync.LocalInstance.SectorSync.SectorList.OrderBy(s => SectorSync.SectorSync.CalculateSectorScore(s, Locator.GetProbe().transform, Locator.GetProbe().GetOWRigidbody()))) - { - GUI.Label(new Rect(420, offset3, 400f, 20f), $"- {SectorSync.SectorSync.CalculateSectorScore(sec, Locator.GetProbe().transform, Locator.GetProbe().GetOWRigidbody())} : {sec.Name}"); - offset3 += _debugLineSpacing; - } var offset2 = 10f; GUI.Label(new Rect(620, offset2, 200f, 20f), $"Owned Objects :"); @@ -184,7 +173,7 @@ namespace QSB foreach (var player in QSBPlayerManager.PlayerList) { var networkTransform = player.TransformSync; - GUI.Label(new Rect(220, offset, 400f, 20f), $"- {player.PlayerId} : world:{networkTransform.transform.position} local:{networkTransform.transform.localPosition}"); + GUI.Label(new Rect(220, offset, 400f, 20f), $"- {player.PlayerId} : {networkTransform.transform.localPosition} from {networkTransform.ReferenceSector.Name}"); offset += _debugLineSpacing; } diff --git a/QSB/QSBNetworkManager.cs b/QSB/QSBNetworkManager.cs index 5cecf586..c0e8c6f6 100644 --- a/QSB/QSBNetworkManager.cs +++ b/QSB/QSBNetworkManager.cs @@ -13,7 +13,6 @@ using QSB.ProbeSync.TransformSync; using QSB.RoastingSync.TransformSync; using QSB.ShipSync.TransformSync; using QSB.TimeSync; -using QSB.TransformSync; using QSB.Utility; using QSB.WorldSync; using QuantumUNET; diff --git a/QSB/RoastingSync/TransformSync/RoastingStickTransformSync.cs b/QSB/RoastingSync/TransformSync/RoastingStickTransformSync.cs index 214f4930..ae72c2b1 100644 --- a/QSB/RoastingSync/TransformSync/RoastingStickTransformSync.cs +++ b/QSB/RoastingSync/TransformSync/RoastingStickTransformSync.cs @@ -1,7 +1,6 @@ using OWML.Utils; using QSB.Player; using QSB.TransformSync; -using QSB.Utility; using System.Linq; using UnityEngine; diff --git a/QSB/SectorSync/QSBSectorManager.cs b/QSB/SectorSync/QSBSectorManager.cs index 62cc2067..12fbfba5 100644 --- a/QSB/SectorSync/QSBSectorManager.cs +++ b/QSB/SectorSync/QSBSectorManager.cs @@ -1,6 +1,4 @@ using OWML.Common; -using QSB.Events; -using QSB.Player; using QSB.SectorSync.WorldObjects; using QSB.TransformSync; using QSB.Utility; diff --git a/QSB/ShipSync/TransformSync/ShipTransformSync.cs b/QSB/ShipSync/TransformSync/ShipTransformSync.cs index af507bd7..4494835a 100644 --- a/QSB/ShipSync/TransformSync/ShipTransformSync.cs +++ b/QSB/ShipSync/TransformSync/ShipTransformSync.cs @@ -6,6 +6,8 @@ namespace QSB.ShipSync.TransformSync { public class ShipTransformSync : QSBNetworkTransform { + protected override float DistanceLeeway => 20f; + private Transform GetShipModel() => Locator.GetShipTransform(); protected override GameObject InitLocalTransform() diff --git a/QSB/Utility/DebugActions.cs b/QSB/Utility/DebugActions.cs index 717ba770..0cb5c1a5 100644 --- a/QSB/Utility/DebugActions.cs +++ b/QSB/Utility/DebugActions.cs @@ -1,7 +1,4 @@ using OWML.Utils; -using QSB.Player; -using QSB.Player.TransformSync; -using System.Linq; using UnityEngine; namespace QSB.Utility diff --git a/QuantumUNET/Components/QNetworkTransformChild.cs b/QuantumUNET/Components/QNetworkTransformChild.cs index 8db5a8b9..5c298d43 100644 --- a/QuantumUNET/Components/QNetworkTransformChild.cs +++ b/QuantumUNET/Components/QNetworkTransformChild.cs @@ -11,10 +11,7 @@ namespace QuantumUNET.Components public Transform Target { get => m_Target; - set - { - m_Target = value; - } + set => m_Target = value; } public uint ChildIndex => m_ChildIndex; From 0dc421c69da10951f67f474874276fad93262658 Mon Sep 17 00:00:00 2001 From: Mister_Nebula <41904486+misternebula@users.noreply.github.com> Date: Wed, 21 Apr 2021 19:29:14 +0100 Subject: [PATCH 11/12] Update QSBNetworkTransform.cs --- QSB/TransformSync/QSBNetworkTransform.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/QSB/TransformSync/QSBNetworkTransform.cs b/QSB/TransformSync/QSBNetworkTransform.cs index 0bfbf606..bf20cca7 100644 --- a/QSB/TransformSync/QSBNetworkTransform.cs +++ b/QSB/TransformSync/QSBNetworkTransform.cs @@ -162,12 +162,12 @@ namespace QSB.TransformSync { return; } - DebugLog.DebugWrite($"set sector of {PlayerId}.{GetType().Name} to {sector.Name}"); ReferenceSector = sector; transform.SetParent(sector.Transform, true); if (!HasAuthority) { AttachedObject.transform.SetParent(sector.Transform, true); + AttachedObject.transform.localScale = Vector3.one; // stop black hole weirdness? } } From 043be53a6a5a4789ae62aeace2b26e01d3301cf3 Mon Sep 17 00:00:00 2001 From: Mister_Nebula <41904486+misternebula@users.noreply.github.com> Date: Wed, 21 Apr 2021 22:26:12 +0100 Subject: [PATCH 12/12] fixes --- QSB/QSBCore.cs | 6 +++--- QSB/TransformSync/QSBNetworkTransform.cs | 6 ++++-- 2 files changed, 7 insertions(+), 5 deletions(-) diff --git a/QSB/QSBCore.cs b/QSB/QSBCore.cs index 21563c28..98bfe972 100644 --- a/QSB/QSBCore.cs +++ b/QSB/QSBCore.cs @@ -147,9 +147,9 @@ namespace QSB } var offset3 = 10f; - GUI.Label(new Rect(420, offset3, 200f, 20f), $"Current sector : {PlayerTransformSync.LocalInstance.ReferenceSector.Name}"); + GUI.Label(new Rect(420, offset3, 400f, 20f), $"Current sector : {PlayerTransformSync.LocalInstance.ReferenceSector.Name}"); offset3 += _debugLineSpacing; - GUI.Label(new Rect(420, offset3, 200f, 20f), $"Probe sector : {PlayerProbeSync.LocalInstance.ReferenceSector.Name}"); + GUI.Label(new Rect(420, offset3, 400f, 20f), $"Probe sector : {PlayerProbeSync.LocalInstance.ReferenceSector.Name}"); offset3 += _debugLineSpacing; var offset2 = 10f; @@ -170,7 +170,7 @@ namespace QSB offset += _debugLineSpacing; GUI.Label(new Rect(220, offset, 200f, 20f), $"Player positions :"); offset += _debugLineSpacing; - foreach (var player in QSBPlayerManager.PlayerList) + foreach (var player in QSBPlayerManager.PlayerList.Where(x => x.PlayerStates.IsReady)) { var networkTransform = player.TransformSync; GUI.Label(new Rect(220, offset, 400f, 20f), $"- {player.PlayerId} : {networkTransform.transform.localPosition} from {networkTransform.ReferenceSector.Name}"); diff --git a/QSB/TransformSync/QSBNetworkTransform.cs b/QSB/TransformSync/QSBNetworkTransform.cs index bf20cca7..e4390309 100644 --- a/QSB/TransformSync/QSBNetworkTransform.cs +++ b/QSB/TransformSync/QSBNetworkTransform.cs @@ -164,10 +164,12 @@ namespace QSB.TransformSync } ReferenceSector = sector; transform.SetParent(sector.Transform, true); - if (!HasAuthority) + if (!HasAuthority && AttachedObject != null) { AttachedObject.transform.SetParent(sector.Transform, true); - AttachedObject.transform.localScale = Vector3.one; // stop black hole weirdness? + AttachedObject.transform.localScale = GetType() == typeof(PlayerTransformSync) + ? Vector3.one / 10 + : Vector3.one; } }