diff --git a/QSB/AssetBundles/qsb_network b/QSB/AssetBundles/qsb_network index 9b03b4b42..036ad7446 100644 Binary files a/QSB/AssetBundles/qsb_network and b/QSB/AssetBundles/qsb_network differ diff --git a/QSB/EchoesOfTheEye/RaftSync/TransformSync/RaftTransformSync.cs b/QSB/EchoesOfTheEye/RaftSync/TransformSync/RaftTransformSync.cs index f7a3d9ed1..8cb1c5795 100644 --- a/QSB/EchoesOfTheEye/RaftSync/TransformSync/RaftTransformSync.cs +++ b/QSB/EchoesOfTheEye/RaftSync/TransformSync/RaftTransformSync.cs @@ -11,10 +11,6 @@ namespace QSB.EchoesOfTheEye.RaftSync.TransformSync; public class RaftTransformSync : UnsectoredRigidbodySync, ILinkedNetworkBehaviour { private bool ShouldMovePlayer => - ( - Locator.GetPlayerController().GetGroundBody() == null || - Locator.GetPlayerController().GetGroundBody() == AttachedRigidbody - ) && Vector3.Distance(AttachedTransform.position, Locator.GetPlayerBody().GetPosition()) < 10; protected override bool UseInterpolation => !ShouldMovePlayer; diff --git a/QSB/Menus/MenuManager.cs b/QSB/Menus/MenuManager.cs index 2ef9e33b5..7d19164ad 100644 --- a/QSB/Menus/MenuManager.cs +++ b/QSB/Menus/MenuManager.cs @@ -438,8 +438,12 @@ private static void SetButtonActive(GameObject button, bool active) return; } + var titleAnimationController = QSBWorldSync.GetUnityObject()._gfxController; + + var activeAlpha = titleAnimationController.IsTitleAnimationComplete() ? 1 : 0; + button.SetActive(active); - button.GetComponent().alpha = active ? 1 : 0; + button.GetComponent().alpha = active ? activeAlpha : 0; } private void InitPauseMenus() diff --git a/QSB/Messaging/QSBMessageManager.cs b/QSB/Messaging/QSBMessageManager.cs index 2a96c406d..b85470cf5 100644 --- a/QSB/Messaging/QSBMessageManager.cs +++ b/QSB/Messaging/QSBMessageManager.cs @@ -52,7 +52,15 @@ private static void OnServerReceive(QSBMessage msg) } else { - msg.To.GetNetworkConnection().Send(msg); + var connection = msg.To.GetNetworkConnection(); + + if (connection == default) + { + DebugLog.ToConsole($"Warning - Tried to handle message from disconnected(?) player.", MessageType.Warning); + return; + } + + connection.Send(msg); } } diff --git a/QSB/QuantumSync/WorldObjects/QSBQuantumObject.cs b/QSB/QuantumSync/WorldObjects/QSBQuantumObject.cs index e59c954d8..3a2001548 100644 --- a/QSB/QuantumSync/WorldObjects/QSBQuantumObject.cs +++ b/QSB/QuantumSync/WorldObjects/QSBQuantumObject.cs @@ -14,9 +14,9 @@ namespace QSB.QuantumSync.WorldObjects; /// -/// TODO: just use OnSectorOccupantsUpdated instead of this shape bullshit -/// /// TODO: make it part of the ad-hoc owner interface +/// +/// TODO: make it so only players in the sector (which sector?) are checked for visibility /// internal abstract class QSBQuantumObject : WorldObject, IQSBQuantumObject where T : QuantumObject diff --git a/QSB/ShipSync/TransformSync/ShipTransformSync.cs b/QSB/ShipSync/TransformSync/ShipTransformSync.cs index 5bd46328f..d125079f0 100644 --- a/QSB/ShipSync/TransformSync/ShipTransformSync.cs +++ b/QSB/ShipSync/TransformSync/ShipTransformSync.cs @@ -1,3 +1,5 @@ +using QSB.HUD; +using QSB.Player; using QSB.Syncs.Sectored.Rigidbodies; using QSB.Utility; using UnityEngine; @@ -124,10 +126,7 @@ private static void SetVelocity(OWRigidbody @this, Vector3 newVelocity) private bool ShouldMovePlayer => - ( - Locator.GetPlayerController().GetGroundBody() == null || - Locator.GetPlayerController().GetGroundBody() == AttachedRigidbody - ) && - Vector3.Distance(AttachedTransform.position, Locator.GetPlayerBody().GetPosition()) < 100; + PlayerState.InZeroG() + && Vector3.Distance(AttachedTransform.position, Locator.GetPlayerBody().GetPosition()) < 100; protected override bool UseInterpolation => !ShouldMovePlayer; } diff --git a/QSB/TimeSync/Messages/ServerTimeMessage.cs b/QSB/TimeSync/Messages/ServerTimeMessage.cs index 043074a6a..23b8a990f 100644 --- a/QSB/TimeSync/Messages/ServerTimeMessage.cs +++ b/QSB/TimeSync/Messages/ServerTimeMessage.cs @@ -33,5 +33,5 @@ public override void Deserialize(NetworkReader reader) } public override void OnReceiveRemote() - => WakeUpSync.LocalInstance.OnClientReceiveMessage(ServerTime, LoopCount, SecondsRemaining); + => WakeUpSync.LocalInstance?.OnClientReceiveMessage(ServerTime, LoopCount, SecondsRemaining); } diff --git a/QSB/TimeSync/StopMeditation.cs b/QSB/TimeSync/StopMeditation.cs deleted file mode 100644 index 4187670db..000000000 --- a/QSB/TimeSync/StopMeditation.cs +++ /dev/null @@ -1,8 +0,0 @@ -using QSB.Utility; -using UnityEngine; - -namespace QSB.TimeSync; - -// TODO remove from unity project eventually -[UsedInUnityProject] -public class StopMeditation : MonoBehaviour { } diff --git a/QSB/TimeSync/WakeUpSync.cs b/QSB/TimeSync/WakeUpSync.cs index 264793973..ae2c0a3bc 100644 --- a/QSB/TimeSync/WakeUpSync.cs +++ b/QSB/TimeSync/WakeUpSync.cs @@ -16,11 +16,7 @@ namespace QSB.TimeSync; -/// -/// BUG: this runs on remote players = BAD! can we move this off of network player? -/// -[UsedInUnityProject] -public class WakeUpSync : NetworkBehaviour +public class WakeUpSync : MonoBehaviour, IAddComponentOnStart { public static WakeUpSync LocalInstance { get; private set; } @@ -41,8 +37,6 @@ public enum State { NotLoaded, Loaded, FastForwarding, Pausing } private int _serverLoopCount; private bool _hasWokenUp; - public override void OnStartLocalPlayer() => LocalInstance = this; - public void OnDisconnect() { OWTime.SetTimeScale(1f); @@ -60,11 +54,6 @@ public void OnDisconnect() public void Start() { - if (!isLocalPlayer) - { - return; - } - if (QSBSceneManager.IsInUniverse) { Init(); @@ -108,10 +97,12 @@ private void OnSceneLoaded(OWScene oldScene, OWScene newScene, bool isInUniverse _hasWokenUp = true; } + LocalInstance = this; Init(); } else { + LocalInstance = null; CurrentState = State.NotLoaded; } } @@ -120,7 +111,7 @@ private void Init() { new RequestStateResyncMessage().Send(); CurrentState = State.Loaded; - if (isServer) + if (QSBCore.IsHost) { SendServerTime(); } @@ -162,7 +153,7 @@ private void WakeUpOrSleep() return; } - if (PlayerData.LoadLoopCount() != _serverLoopCount && !isServer) + if (PlayerData.LoadLoopCount() != _serverLoopCount && !QSBCore.IsHost) { DebugLog.ToConsole($"Warning - ServerLoopCount is not the same as local loop count! local:{PlayerData.LoadLoopCount()} server:{_serverLoopCount}"); return; @@ -268,11 +259,11 @@ private void WakeUp() public void Update() { - if (isServer) + if (QSBCore.IsHost) { UpdateServer(); } - else if (isLocalPlayer && !QSBCore.DebugSettings.AvoidTimeSync) + else if (NetworkClient.active && QSBSceneManager.IsInUniverse && !QSBCore.DebugSettings.AvoidTimeSync) { UpdateClient(); } diff --git a/QSB/WorldSync/QSBWorldSync.cs b/QSB/WorldSync/QSBWorldSync.cs index aa4ceddb0..4305b2b99 100644 --- a/QSB/WorldSync/QSBWorldSync.cs +++ b/QSB/WorldSync/QSBWorldSync.cs @@ -23,7 +23,7 @@ public static class QSBWorldSync public static WorldObjectManager[] Managers; private static readonly Dictionary> _managerToBuiltObjects = new(); - public static readonly Dictionary ManagerHashes = new(); + public static readonly Dictionary ManagerHashes = new(); /// /// Set when all WorldObjectManagers have called Init() on all their objects (AKA all the objects are created) @@ -91,15 +91,16 @@ await manager.Try("building world objects", async () => foreach (var item in _managerToBuiltObjects) { var worldObjects = item.Value; - var hash = worldObjects.Select(x => x.GetType().Name).GetMD5Hash(); - ManagerHashes[item.Key] = hash; + var objects = worldObjects.Select(x => x.GetType().Name); + var hash = objects.GetMD5Hash(); + ManagerHashes[item.Key] = (hash, objects.Count()); } if (!QSBCore.IsHost) { foreach (var item in ManagerHashes) { - new WorldObjectsHashMessage(item.Key, item.Value).Send(); + new WorldObjectsHashMessage(item.Key, item.Value.hash, item.Value.count).Send(); } new RequestLinksMessage().Send(); diff --git a/QSB/WorldSync/WorldObjectsHashMessage.cs b/QSB/WorldSync/WorldObjectsHashMessage.cs index 2b8fc3799..482f782ac 100644 --- a/QSB/WorldSync/WorldObjectsHashMessage.cs +++ b/QSB/WorldSync/WorldObjectsHashMessage.cs @@ -8,21 +8,21 @@ namespace QSB.WorldSync; /// /// sends QSBWorldSync.WorldObjectsHash to the server for sanity checking /// -internal class WorldObjectsHashMessage : QSBMessage<(string managerName, string hash)> +internal class WorldObjectsHashMessage : QSBMessage<(string managerName, string hash, int count)> { - public WorldObjectsHashMessage(string managerName, string hash) : base((managerName, hash)) => To = 0; + public WorldObjectsHashMessage(string managerName, string hash, int count) : base((managerName, hash, count)) => To = 0; public override void OnReceiveRemote() { Delay.RunWhen(() => QSBWorldSync.AllObjectsAdded, () => { - var serverHash = QSBWorldSync.ManagerHashes[Data.managerName]; + var (hash, count) = QSBWorldSync.ManagerHashes[Data.managerName]; - if (serverHash != Data.hash) + if (hash != Data.hash) { // oh fuck oh no oh god - DebugLog.ToConsole($"Kicking {From} because their WorldObjects hash for {Data.managerName} is wrong. (server:{serverHash}, client:{Data.hash})", MessageType.Error); - new PlayerKickMessage(From, $"WorldObject hash error for {Data.managerName}. (Server:{serverHash}, Client:{Data.hash})").Send(); + DebugLog.ToConsole($"Kicking {From} because their WorldObjects hash for {Data.managerName} is wrong. (Server:{hash} count:{count}, Client:{Data.hash} count:{Data.count})", MessageType.Error); + new PlayerKickMessage(From, $"WorldObject hash error for {Data.managerName}. (Server:{hash} count:{count}, Client:{Data.hash}, count:{Data.count})").Send(); } }); } diff --git a/QSB/manifest.json b/QSB/manifest.json index 0e98a8df6..d95fa49b0 100644 --- a/QSB/manifest.json +++ b/QSB/manifest.json @@ -7,7 +7,7 @@ "body": "- Disable *all* other mods. (Can heavily affect performance)\n- Make sure you are not running any other network-intensive applications." }, "uniqueName": "Raicuparta.QuantumSpaceBuddies", - "version": "0.26.2", + "version": "0.26.3", "owmlVersion": "2.9.0", "dependencies": [ "_nebula.MenuFramework", "JohnCorby.VanillaFix" ], "pathsToPreserve": [ "debugsettings.json" ],