From 8da9a62b3844017729d091c3d5ddc7218bd47c95 Mon Sep 17 00:00:00 2001 From: Mister_Nebula <41904486+misternebula@users.noreply.github.com> Date: Sat, 4 Dec 2021 23:24:26 +0000 Subject: [PATCH 01/30] yes --- QSB/Menus/IMenuAPI.cs | 6 +-- QSB/Menus/MenuManager.cs | 110 ++++++++++++++++++++++++++++++--------- 2 files changed, 88 insertions(+), 28 deletions(-) diff --git a/QSB/Menus/IMenuAPI.cs b/QSB/Menus/IMenuAPI.cs index c30510f0..1d308537 100644 --- a/QSB/Menus/IMenuAPI.cs +++ b/QSB/Menus/IMenuAPI.cs @@ -6,9 +6,9 @@ namespace QSB.Menus public interface IMenuAPI { // Title screen - GameObject TitleScreen_MakeMenuOpenButton(string name, Menu menuToOpen); - GameObject TitleScreen_MakeSceneLoadButton(string name, SubmitActionLoadScene.LoadableScenes sceneToLoad, PopupMenu confirmPopup = null); - Button TitleScreen_MakeSimpleButton(string name); + GameObject TitleScreen_MakeMenuOpenButton(string name, int index, Menu menuToOpen); + GameObject TitleScreen_MakeSceneLoadButton(string name, int index, SubmitActionLoadScene.LoadableScenes sceneToLoad, PopupMenu confirmPopup = null); + Button TitleScreen_MakeSimpleButton(string name, int index); // Pause menu GameObject PauseMenu_MakeMenuOpenButton(string name, Menu menuToOpen, Menu customMenu = null); GameObject PauseMenu_MakeSceneLoadButton(string name, SubmitActionLoadScene.LoadableScenes sceneToLoad, PopupMenu confirmPopup = null, Menu customMenu = null); diff --git a/QSB/Menus/MenuManager.cs b/QSB/Menus/MenuManager.cs index 7ac927ca..729f744c 100644 --- a/QSB/Menus/MenuManager.cs +++ b/QSB/Menus/MenuManager.cs @@ -1,4 +1,5 @@ using QSB.Player; +using QSB.Utility; using System.Linq; using UnityEngine; using UnityEngine.Networking; @@ -12,11 +13,21 @@ namespace QSB.Menus private IMenuAPI MenuApi => QSBCore.MenuApi; private PopupMenu PopupMenu; + private PopupMenu InfoPopup; + private bool _addedPauseLock; + private Button HostButton; private GameObject ClientButton; private Button DisconnectButton; - private PopupMenu InfoPopup; - private bool _addedPauseLock; + private Button JoinMultiplayerGame; + + private GameObject ResumeGameButton; + private GameObject NewGameButton; + + private const int _JoinGameIndex = 1; + private const int _HostButtonIndex = 2; + private const int _ClientButtonIndex = 3; + private const int _DisconnectIndex = 2; public void Start() { @@ -81,6 +92,16 @@ namespace QSB.Menus InfoPopup.OnDeactivateMenu += OnCloseInfoPopup; } + private void SetButtonActive(Button button, bool active) + => SetButtonActive(button.gameObject, active); + + private void SetButtonActive(GameObject button, bool active) + { + DebugLog.DebugWrite($"Set {button.name} to {active}"); + button.SetActive(active); + button.GetComponent().alpha = active ? 1 : 0; + } + private void InitPauseMenus() { CreateCommonPopups(); @@ -97,13 +118,11 @@ namespace QSB.Menus { ClientButton.SetActive(false); HostButton.gameObject.SetActive(false); - DisconnectButton.gameObject.SetActive(true); - DisconnectButton.GetComponent().alpha = 1f; + SetButtonActive(DisconnectButton, true); } else { - DisconnectButton.gameObject.SetActive(false); - DisconnectButton.GetComponent().alpha = 1f; + SetButtonActive(DisconnectButton, false); } OnConnected(); @@ -113,25 +132,45 @@ namespace QSB.Menus { CreateCommonPopups(); - HostButton = MenuApi.TitleScreen_MakeSimpleButton("MULTIPLAYER (HOST)"); + HostButton = MenuApi.TitleScreen_MakeSimpleButton("MULTIPLAYER (HOST)", _HostButtonIndex); HostButton.onClick.AddListener(Host); - ClientButton = MenuApi.TitleScreen_MakeMenuOpenButton("MULTIPLAYER (CONNECT)", PopupMenu); + ClientButton = MenuApi.TitleScreen_MakeMenuOpenButton("MULTIPLAYER (CONNECT)", _ClientButtonIndex, PopupMenu); - DisconnectButton = MenuApi.TitleScreen_MakeSimpleButton("DISCONNECT"); + DisconnectButton = MenuApi.TitleScreen_MakeSimpleButton("DISCONNECT", _DisconnectIndex); DisconnectButton.onClick.AddListener(Disconnect); + JoinMultiplayerGame = MenuApi.TitleScreen_MakeSimpleButton("JOIN MULTIPLAYER GAME", _JoinGameIndex); + JoinMultiplayerGame.onClick.AddListener(Join); + + ResumeGameButton = GameObject.Find("MainMenuLayoutGroup/Button-ResumeGame"); + NewGameButton = GameObject.Find("MainMenuLayoutGroup/Button-NewGame"); + if (QSBCore.IsInMultiplayer) { ClientButton.SetActive(false); HostButton.gameObject.SetActive(false); - DisconnectButton.gameObject.SetActive(true); - DisconnectButton.GetComponent().alpha = 1f; + SetButtonActive(DisconnectButton, true); + + if (QSBCore.IsHost) + { + SetButtonActive(JoinMultiplayerGame, false); + SetButtonActive(ResumeGameButton, true); + SetButtonActive(NewGameButton, true); + } + else + { + SetButtonActive(JoinMultiplayerGame, true); + SetButtonActive(ResumeGameButton, false); + SetButtonActive(NewGameButton, false); + } } else { - DisconnectButton.gameObject.SetActive(false); - DisconnectButton.GetComponent().alpha = 1f; + SetButtonActive(DisconnectButton, false); + SetButtonActive(JoinMultiplayerGame, false); + SetButtonActive(ResumeGameButton, true); + SetButtonActive(NewGameButton, true); } OnConnected(); @@ -156,21 +195,35 @@ namespace QSB.Menus } } + private void Join() + { + DebugLog.DebugWrite($"Join"); + } + private void Disconnect() { QSBNetworkManager.Instance.StopHost(); - DisconnectButton.gameObject.SetActive(false); - ClientButton.SetActive(true); - HostButton.gameObject.SetActive(true); + SetButtonActive(DisconnectButton.gameObject, false); + SetButtonActive(JoinMultiplayerGame, false); + SetButtonActive(ClientButton, true); + SetButtonActive(HostButton, true); } private void Host() { - QSBNetworkManager.Instance.StartHost(); - DisconnectButton.gameObject.SetActive(true); - DisconnectButton.GetComponent().alpha = 1f; - ClientButton.SetActive(false); - HostButton.gameObject.SetActive(false); + DebugLog.DebugWrite($"Host"); + + if (QSBNetworkManager.Instance.StartHost() != null) + { + SetButtonActive(DisconnectButton, true); + SetButtonActive(JoinMultiplayerGame, false); + SetButtonActive(ClientButton, false); + SetButtonActive(HostButton, false); + } + else + { + OpenInfoPopup($"Failed to start server.", "OK"); + } } private void Connect() @@ -178,10 +231,17 @@ namespace QSB.Menus QSBNetworkManager.Instance.networkAddress = string.Concat((PopupMenu as PopupInputMenu).GetInputText().Where(c => !char.IsWhiteSpace(c))); QSBNetworkManager.Instance.StartClient(); DisconnectButton.transform.GetChild(0).GetChild(1).GetComponent().text = "CONNECTING... (STOP)"; - DisconnectButton.gameObject.SetActive(true); - DisconnectButton.GetComponent().alpha = 1f; - ClientButton.SetActive(false); - HostButton.gameObject.SetActive(false); + + SetButtonActive(DisconnectButton, true); + SetButtonActive(JoinMultiplayerGame, true); + SetButtonActive(ClientButton, false); + SetButtonActive(HostButton, false); + + if (QSBSceneManager.CurrentScene == OWScene.TitleScreen) + { + SetButtonActive(ResumeGameButton, false); + SetButtonActive(NewGameButton, false); + } } private void OnConnected() From 7bbe2953f911e9f2a6127cc8ce6dd88842076119 Mon Sep 17 00:00:00 2001 From: Mister_Nebula <41904486+misternebula@users.noreply.github.com> Date: Sun, 5 Dec 2021 10:23:36 +0000 Subject: [PATCH 02/30] Update IMenuAPI.cs --- QSB/Menus/IMenuAPI.cs | 10 +++++++++- 1 file changed, 9 insertions(+), 1 deletion(-) diff --git a/QSB/Menus/IMenuAPI.cs b/QSB/Menus/IMenuAPI.cs index 1d308537..edb0a932 100644 --- a/QSB/Menus/IMenuAPI.cs +++ b/QSB/Menus/IMenuAPI.cs @@ -1,4 +1,5 @@ -using UnityEngine; +using System; +using UnityEngine; using UnityEngine.UI; namespace QSB.Menus @@ -6,6 +7,13 @@ namespace QSB.Menus public interface IMenuAPI { // Title screen + [Obsolete] + GameObject TitleScreen_MakeMenuOpenButton(string name, Menu menuToOpen); + [Obsolete] + GameObject TitleScreen_MakeSceneLoadButton(string name, SubmitActionLoadScene.LoadableScenes sceneToLoad, PopupMenu confirmPopup = null); + [Obsolete] + Button TitleScreen_MakeSimpleButton(string name); + GameObject TitleScreen_MakeMenuOpenButton(string name, int index, Menu menuToOpen); GameObject TitleScreen_MakeSceneLoadButton(string name, int index, SubmitActionLoadScene.LoadableScenes sceneToLoad, PopupMenu confirmPopup = null); Button TitleScreen_MakeSimpleButton(string name, int index); From b52abafe241af8d102bbbba4c4c14ad391e19348 Mon Sep 17 00:00:00 2001 From: Mister_Nebula <41904486+misternebula@users.noreply.github.com> Date: Sun, 5 Dec 2021 11:00:18 +0000 Subject: [PATCH 03/30] pain --- QSB/Menus/MenuManager.cs | 34 ++++++++++------------------------ 1 file changed, 10 insertions(+), 24 deletions(-) diff --git a/QSB/Menus/MenuManager.cs b/QSB/Menus/MenuManager.cs index 729f744c..4326caad 100644 --- a/QSB/Menus/MenuManager.cs +++ b/QSB/Menus/MenuManager.cs @@ -19,15 +19,12 @@ namespace QSB.Menus private Button HostButton; private GameObject ClientButton; private Button DisconnectButton; - private Button JoinMultiplayerGame; private GameObject ResumeGameButton; private GameObject NewGameButton; - private const int _JoinGameIndex = 1; - private const int _HostButtonIndex = 2; - private const int _ClientButtonIndex = 3; - private const int _DisconnectIndex = 2; + private const int _ClientButtonIndex = 2; + private const int _DisconnectIndex = 3; public void Start() { @@ -97,6 +94,11 @@ namespace QSB.Menus private void SetButtonActive(GameObject button, bool active) { + if (button == null) + { + return; + } + DebugLog.DebugWrite($"Set {button.name} to {active}"); button.SetActive(active); button.GetComponent().alpha = active ? 1 : 0; @@ -109,8 +111,6 @@ namespace QSB.Menus HostButton = MenuApi.PauseMenu_MakeSimpleButton("MULTIPLAYER (HOST)"); HostButton.onClick.AddListener(Host); - ClientButton = MenuApi.PauseMenu_MakeMenuOpenButton("MULTIPLAYER (CONNECT)", PopupMenu); - DisconnectButton = MenuApi.PauseMenu_MakeSimpleButton("DISCONNECT"); DisconnectButton.onClick.AddListener(Disconnect); @@ -132,35 +132,26 @@ namespace QSB.Menus { CreateCommonPopups(); - HostButton = MenuApi.TitleScreen_MakeSimpleButton("MULTIPLAYER (HOST)", _HostButtonIndex); - HostButton.onClick.AddListener(Host); - ClientButton = MenuApi.TitleScreen_MakeMenuOpenButton("MULTIPLAYER (CONNECT)", _ClientButtonIndex, PopupMenu); DisconnectButton = MenuApi.TitleScreen_MakeSimpleButton("DISCONNECT", _DisconnectIndex); DisconnectButton.onClick.AddListener(Disconnect); - JoinMultiplayerGame = MenuApi.TitleScreen_MakeSimpleButton("JOIN MULTIPLAYER GAME", _JoinGameIndex); - JoinMultiplayerGame.onClick.AddListener(Join); - ResumeGameButton = GameObject.Find("MainMenuLayoutGroup/Button-ResumeGame"); NewGameButton = GameObject.Find("MainMenuLayoutGroup/Button-NewGame"); if (QSBCore.IsInMultiplayer) { ClientButton.SetActive(false); - HostButton.gameObject.SetActive(false); SetButtonActive(DisconnectButton, true); if (QSBCore.IsHost) { - SetButtonActive(JoinMultiplayerGame, false); SetButtonActive(ResumeGameButton, true); SetButtonActive(NewGameButton, true); } else { - SetButtonActive(JoinMultiplayerGame, true); SetButtonActive(ResumeGameButton, false); SetButtonActive(NewGameButton, false); } @@ -168,7 +159,6 @@ namespace QSB.Menus else { SetButtonActive(DisconnectButton, false); - SetButtonActive(JoinMultiplayerGame, false); SetButtonActive(ResumeGameButton, true); SetButtonActive(NewGameButton, true); } @@ -204,7 +194,6 @@ namespace QSB.Menus { QSBNetworkManager.Instance.StopHost(); SetButtonActive(DisconnectButton.gameObject, false); - SetButtonActive(JoinMultiplayerGame, false); SetButtonActive(ClientButton, true); SetButtonActive(HostButton, true); } @@ -216,7 +205,6 @@ namespace QSB.Menus if (QSBNetworkManager.Instance.StartHost() != null) { SetButtonActive(DisconnectButton, true); - SetButtonActive(JoinMultiplayerGame, false); SetButtonActive(ClientButton, false); SetButtonActive(HostButton, false); } @@ -233,9 +221,7 @@ namespace QSB.Menus DisconnectButton.transform.GetChild(0).GetChild(1).GetComponent().text = "CONNECTING... (STOP)"; SetButtonActive(DisconnectButton, true); - SetButtonActive(JoinMultiplayerGame, true); SetButtonActive(ClientButton, false); - SetButtonActive(HostButton, false); if (QSBSceneManager.CurrentScene == OWScene.TitleScreen) { @@ -266,7 +252,7 @@ namespace QSB.Menus DisconnectButton.gameObject.SetActive(false); ClientButton.SetActive(true); - HostButton.gameObject.SetActive(true); + HostButton?.gameObject.SetActive(true); } private void OnDisconnected(NetworkError error) @@ -285,7 +271,7 @@ namespace QSB.Menus DisconnectButton.gameObject.SetActive(false); ClientButton.SetActive(true); - HostButton.gameObject.SetActive(true); + HostButton?.gameObject.SetActive(true); } private void OnClientError(NetworkError error) @@ -303,7 +289,7 @@ namespace QSB.Menus text = "Internal QNet client error!\r\nDNS Faliure. Address was invalid or could not be resolved."; DisconnectButton.gameObject.SetActive(false); ClientButton.SetActive(true); - HostButton.gameObject.SetActive(true); + HostButton?.gameObject.SetActive(true); break; default: text = $"Internal QNet client error!\n\nNetworkError:{error}"; From 8a571e37e5063024589b4d442bf447fa5f8b5183 Mon Sep 17 00:00:00 2001 From: Mister_Nebula <41904486+misternebula@users.noreply.github.com> Date: Sun, 5 Dec 2021 14:06:15 +0000 Subject: [PATCH 04/30] fix errors in statue and respawn managers --- QSB/RespawnSync/RespawnManager.cs | 6 ++++++ QSB/StatueSync/StatueManager.cs | 8 ++++++++ 2 files changed, 14 insertions(+) diff --git a/QSB/RespawnSync/RespawnManager.cs b/QSB/RespawnSync/RespawnManager.cs index 917b681d..a2f26748 100644 --- a/QSB/RespawnSync/RespawnManager.cs +++ b/QSB/RespawnSync/RespawnManager.cs @@ -56,6 +56,12 @@ namespace QSB.RespawnSync return; } + if (PlayerTransformSync.LocalInstance == null) + { + DebugLog.ToConsole($"Error - Tried to init when PlayerTransformSync.LocalInstance was null!", OWML.Common.MessageType.Error); + return; + } + QSBPlayerManager.ShowAllPlayers(); QSBPlayerManager.LocalPlayer.UpdateStatesFromObjects(); QSBPlayerManager.PlayerList.ForEach(x => x.IsDead = false); diff --git a/QSB/StatueSync/StatueManager.cs b/QSB/StatueSync/StatueManager.cs index 6ee6ebee..62ed255c 100644 --- a/QSB/StatueSync/StatueManager.cs +++ b/QSB/StatueSync/StatueManager.cs @@ -1,4 +1,6 @@ using QSB.Player; +using QSB.Player.TransformSync; +using QSB.Utility; using System.Collections; using UnityEngine; @@ -25,6 +27,12 @@ namespace QSB.StatueSync return; } + if (PlayerTransformSync.LocalInstance == null) + { + DebugLog.ToConsole($"Error - Tried to run OnUniverseSceneLoaded when PlayerTransformSync.LocalInstance was null!", OWML.Common.MessageType.Error); + return; + } + QSBPlayerManager.ShowAllPlayers(); QSBPlayerManager.LocalPlayer.UpdateStatesFromObjects(); } From d75136bbc38f9ca0fcf88c68f262da06e6c600b5 Mon Sep 17 00:00:00 2001 From: Mister_Nebula <41904486+misternebula@users.noreply.github.com> Date: Sun, 5 Dec 2021 14:06:43 +0000 Subject: [PATCH 05/30] sync loop count and frequencies --- QSB/Events/EventNames.cs | 2 + QSB/Events/QSBEventManager.cs | 3 + QSB/Menus/MenuManager.cs | 98 ++++++++++++++++---- QSB/SaveSync/Events/GameStateEvent.cs | 50 ++++++++++ QSB/SaveSync/Events/GameStateMessage.cs | 58 ++++++++++++ QSB/SaveSync/Events/RequestGameStateEvent.cs | 32 +++++++ 6 files changed, 225 insertions(+), 18 deletions(-) create mode 100644 QSB/SaveSync/Events/GameStateEvent.cs create mode 100644 QSB/SaveSync/Events/GameStateMessage.cs create mode 100644 QSB/SaveSync/Events/RequestGameStateEvent.cs diff --git a/QSB/Events/EventNames.cs b/QSB/Events/EventNames.cs index b37d2b4e..c19be58f 100644 --- a/QSB/Events/EventNames.cs +++ b/QSB/Events/EventNames.cs @@ -102,5 +102,7 @@ public const string QSBSatelliteRepaired = nameof(QSBSatelliteRepairTick); public const string QSBAuthorityQueue = nameof(QSBAuthorityQueue); public const string QSBJellyfishRising = nameof(QSBJellyfishRising); + public const string QSBRequestGameDetails = nameof(QSBRequestGameDetails); + public const string QSBGameDetails = nameof(QSBGameDetails); } } diff --git a/QSB/Events/QSBEventManager.cs b/QSB/Events/QSBEventManager.cs index 7a8cfe40..05c134e8 100644 --- a/QSB/Events/QSBEventManager.cs +++ b/QSB/Events/QSBEventManager.cs @@ -20,6 +20,7 @@ using QSB.QuantumSync.Events; using QSB.RespawnSync.Events; using QSB.RoastingSync.Events; using QSB.SatelliteSync.Events; +using QSB.SaveSync.Events; using QSB.ShipSync.Events; using QSB.ShipSync.Events.Component; using QSB.ShipSync.Events.Hull; @@ -82,6 +83,8 @@ namespace QSB.Events new SatelliteProjectorEvent(), new SatelliteProjectorSnapshotEvent(), new LaunchCodesEvent(), + new RequestGameStateEvent(), + new GameStateEvent(), // World Objects new ElevatorEvent(), new GeyserEvent(), diff --git a/QSB/Menus/MenuManager.cs b/QSB/Menus/MenuManager.cs index 4326caad..18646a82 100644 --- a/QSB/Menus/MenuManager.cs +++ b/QSB/Menus/MenuManager.cs @@ -1,6 +1,9 @@ -using QSB.Player; +using QSB.Events; +using QSB.Player; +using QSB.Player.TransformSync; using QSB.Utility; using System.Linq; +using System.Text; using UnityEngine; using UnityEngine.Networking; using UnityEngine.UI; @@ -15,6 +18,8 @@ namespace QSB.Menus private PopupMenu PopupMenu; private PopupMenu InfoPopup; private bool _addedPauseLock; + private StringBuilder _nowLoadingSB; + protected Text _loadingText; private Button HostButton; private GameObject ClientButton; @@ -50,6 +55,50 @@ namespace QSB.Menus } } + private void ResetStringBuilder() + { + if (_nowLoadingSB == null) + { + _nowLoadingSB = new StringBuilder(); + return; + } + _nowLoadingSB.Length = 0; + } + + private void Update() + { + if ((LoadManager.GetLoadingScene() == OWScene.SolarSystem || LoadManager.GetLoadingScene() == OWScene.EyeOfTheUniverse) && _loadingText != null) + { + var num = LoadManager.GetAsyncLoadProgress(); + num = num < 0.1f + ? Mathf.InverseLerp(0f, 0.1f, num) * 0.9f + : 0.9f + (Mathf.InverseLerp(0.1f, 1f, num) * 0.1f); + ResetStringBuilder(); + _nowLoadingSB.Append(UITextLibrary.GetString(UITextType.LoadingMessage)); + _nowLoadingSB.Append(num.ToString("P0")); + _loadingText.text = _nowLoadingSB.ToString(); + } + } + + public void JoinGame(bool inEye, bool inSolarSystem) + { + DebugLog.DebugWrite($"Join game ineye:{inEye} inSolarSystem:{inSolarSystem}"); + if (inEye) + { + LoadManager.LoadSceneAsync(OWScene.EyeOfTheUniverse, true, LoadManager.FadeType.ToBlack, 1f, false); + Locator.GetMenuInputModule().DisableInputs(); + } + else if (inSolarSystem) + { + LoadManager.LoadSceneAsync(OWScene.SolarSystem, true, LoadManager.FadeType.ToBlack, 1f, false); + Locator.GetMenuInputModule().DisableInputs(); + } + else + { + DebugLog.DebugWrite("tried to join game that wasnt in solar system or eye??"); + } + } + private void OpenInfoPopup(string message, string buttonText) { InfoPopup.SetUpPopup(message, InputLibrary.menuConfirm, InputLibrary.cancel, new ScreenPrompt(buttonText), null, true, false); @@ -90,7 +139,7 @@ namespace QSB.Menus } private void SetButtonActive(Button button, bool active) - => SetButtonActive(button.gameObject, active); + => SetButtonActive(button?.gameObject, active); private void SetButtonActive(GameObject button, bool active) { @@ -99,7 +148,6 @@ namespace QSB.Menus return; } - DebugLog.DebugWrite($"Set {button.name} to {active}"); button.SetActive(active); button.GetComponent().alpha = active ? 1 : 0; } @@ -116,12 +164,12 @@ namespace QSB.Menus if (QSBCore.IsInMultiplayer) { - ClientButton.SetActive(false); - HostButton.gameObject.SetActive(false); + SetButtonActive(HostButton, false); SetButtonActive(DisconnectButton, true); } else { + SetButtonActive(HostButton, true); SetButtonActive(DisconnectButton, false); } @@ -136,6 +184,7 @@ namespace QSB.Menus DisconnectButton = MenuApi.TitleScreen_MakeSimpleButton("DISCONNECT", _DisconnectIndex); DisconnectButton.onClick.AddListener(Disconnect); + _loadingText = DisconnectButton.transform.GetChild(0).GetChild(1).GetComponent(); ResumeGameButton = GameObject.Find("MainMenuLayoutGroup/Button-ResumeGame"); NewGameButton = GameObject.Find("MainMenuLayoutGroup/Button-NewGame"); @@ -147,7 +196,7 @@ namespace QSB.Menus if (QSBCore.IsHost) { - SetButtonActive(ResumeGameButton, true); + SetButtonActive(ResumeGameButton, StandaloneProfileManager.SharedInstance.currentProfileGameSave.loopCount > 1); SetButtonActive(NewGameButton, true); } else @@ -159,7 +208,7 @@ namespace QSB.Menus else { SetButtonActive(DisconnectButton, false); - SetButtonActive(ResumeGameButton, true); + SetButtonActive(ResumeGameButton, StandaloneProfileManager.SharedInstance.currentProfileGameSave.loopCount > 1); SetButtonActive(NewGameButton, true); } @@ -185,11 +234,6 @@ namespace QSB.Menus } } - private void Join() - { - DebugLog.DebugWrite($"Join"); - } - private void Disconnect() { QSBNetworkManager.Instance.StopHost(); @@ -232,10 +276,23 @@ namespace QSB.Menus private void OnConnected() { + DebugLog.DebugWrite($"ON CONNECTED"); + var text = QSBCore.IsHost ? "STOP HOSTING" : "DISCONNECT"; DisconnectButton.transform.GetChild(0).GetChild(1).GetComponent().text = text; + + if (QSBCore.IsHost || !QSBCore.IsInMultiplayer) + { + return; + } + + QSBCore.UnityEvents.RunWhen(() => QSBEventManager.Ready && PlayerTransformSync.LocalInstance != null, () => + { + DebugLog.DebugWrite($"requesting game details"); + QSBEventManager.FireEvent(EventNames.QSBRequestGameDetails); + }); } public void OnKicked(KickReason reason) @@ -269,9 +326,11 @@ namespace QSB.Menus }; OpenInfoPopup(text, "OK"); - DisconnectButton.gameObject.SetActive(false); - ClientButton.SetActive(true); - HostButton?.gameObject.SetActive(true); + SetButtonActive(DisconnectButton, false); + SetButtonActive(ClientButton, true); + SetButtonActive(HostButton, true); + SetButtonActive(ResumeGameButton, StandaloneProfileManager.SharedInstance.currentProfileGameSave.loopCount > 1); + SetButtonActive(NewGameButton, true); } private void OnClientError(NetworkError error) @@ -287,9 +346,12 @@ namespace QSB.Menus { case NetworkError.DNSFailure: text = "Internal QNet client error!\r\nDNS Faliure. Address was invalid or could not be resolved."; - DisconnectButton.gameObject.SetActive(false); - ClientButton.SetActive(true); - HostButton?.gameObject.SetActive(true); + DebugLog.DebugWrite($"dns failure"); + SetButtonActive(DisconnectButton, false); + SetButtonActive(ClientButton, true); + SetButtonActive(HostButton, true); + SetButtonActive(ResumeGameButton, StandaloneProfileManager.SharedInstance.currentProfileGameSave.loopCount > 1); + SetButtonActive(NewGameButton, true); break; default: text = $"Internal QNet client error!\n\nNetworkError:{error}"; diff --git a/QSB/SaveSync/Events/GameStateEvent.cs b/QSB/SaveSync/Events/GameStateEvent.cs new file mode 100644 index 00000000..93087989 --- /dev/null +++ b/QSB/SaveSync/Events/GameStateEvent.cs @@ -0,0 +1,50 @@ +using QSB.Events; +using QSB.Menus; +using QSB.Utility; +using System; +using System.Linq; + +namespace QSB.SaveSync.Events +{ + // only to be sent from host + internal class GameStateEvent : QSBEvent + { + public override bool RequireWorldObjectsReady => false; + + public override void SetupListener() => GlobalMessenger.AddListener(EventNames.QSBGameDetails, Handler); + public override void CloseListener() => GlobalMessenger.RemoveListener(EventNames.QSBGameDetails, Handler); + + private void Handler() => SendEvent(CreateMessage()); + + private GameStateMessage CreateMessage() => new() + { + AboutId = LocalPlayerId, + InSolarSystem = QSBSceneManager.CurrentScene == OWScene.SolarSystem, + InEye = QSBSceneManager.CurrentScene == OWScene.EyeOfTheUniverse, + LoopCount = StandaloneProfileManager.SharedInstance.currentProfileGameSave.loopCount, + KnownFrequencies = StandaloneProfileManager.SharedInstance.currentProfileGameSave.knownFrequencies + }; + + public override void OnReceiveRemote(bool isHost, GameStateMessage message) + { + var gameSave = StandaloneProfileManager.SharedInstance.currentProfileGameSave; + DebugLog.DebugWrite($"loopcount:{message.LoopCount}"); + gameSave.loopCount = message.LoopCount; + for (var i = 0; i < message.KnownFrequencies.Length; i++) + { + DebugLog.DebugWrite($"knowsFrequency{i}:{message.KnownFrequencies[i]}"); + } + gameSave.knownFrequencies = message.KnownFrequencies; + + PlayerData.SaveCurrentGame(); + + DebugLog.DebugWrite($"inEye:{message.InEye}"); + DebugLog.DebugWrite($"inSolarSystem:{message.InSolarSystem}"); + if (message.InEye != (QSBSceneManager.CurrentScene == OWScene.EyeOfTheUniverse) + || message.InSolarSystem != (QSBSceneManager.CurrentScene == OWScene.SolarSystem)) + { + MenuManager.Instance.JoinGame(message.InEye, message.InSolarSystem); + } + } + } +} diff --git a/QSB/SaveSync/Events/GameStateMessage.cs b/QSB/SaveSync/Events/GameStateMessage.cs new file mode 100644 index 00000000..030f9339 --- /dev/null +++ b/QSB/SaveSync/Events/GameStateMessage.cs @@ -0,0 +1,58 @@ +using QSB.Messaging; +using QSB.Utility; +using QuantumUNET.Transport; +using System; + +namespace QSB.SaveSync.Events +{ + internal class GameStateMessage : PlayerMessage + { + public bool InSolarSystem { get; set; } + public bool InEye { get; set; } + public int LoopCount { get; set; } + public bool[] KnownFrequencies { get; set; } + + public override void Deserialize(QNetworkReader reader) + { + base.Deserialize(reader); + // in solarsystem + InSolarSystem = reader.ReadBoolean(); + + // in eye + InEye = reader.ReadBoolean(); + + // Loop count + LoopCount = reader.ReadInt32(); + + // Known Frequencies + var frequenciesLength = reader.ReadInt32(); + var knownFrequencies = KnownFrequencies; + Array.Resize(ref knownFrequencies, frequenciesLength); + KnownFrequencies = knownFrequencies; + for (var i = 0; i < frequenciesLength; i++) + { + KnownFrequencies[i] = reader.ReadBoolean(); + } + } + + public override void Serialize(QNetworkWriter writer) + { + base.Serialize(writer); + // in solarsystem + writer.Write(InSolarSystem); + + // in eye + writer.Write(InEye); + + // Loop count + writer.Write(LoopCount); + + // Known frequencies + writer.Write(KnownFrequencies.Length); + foreach (var item in KnownFrequencies) + { + writer.Write(item); + } + } + } +} diff --git a/QSB/SaveSync/Events/RequestGameStateEvent.cs b/QSB/SaveSync/Events/RequestGameStateEvent.cs new file mode 100644 index 00000000..930768a4 --- /dev/null +++ b/QSB/SaveSync/Events/RequestGameStateEvent.cs @@ -0,0 +1,32 @@ +using QSB.Events; +using QSB.Messaging; +using QSB.Utility; +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace QSB.SaveSync.Events +{ + internal class RequestGameStateEvent : QSBEvent + { + public override bool RequireWorldObjectsReady => false; + + public override void SetupListener() => GlobalMessenger.AddListener(EventNames.QSBRequestGameDetails, Handler); + public override void CloseListener() => GlobalMessenger.RemoveListener(EventNames.QSBRequestGameDetails, Handler); + + private void Handler() => SendEvent(CreateMessage()); + + private PlayerMessage CreateMessage() => new() + { + AboutId = LocalPlayerId, + OnlySendToHost = true + }; + + public override void OnReceiveRemote(bool isHost, PlayerMessage message) + { + QSBEventManager.FireEvent(EventNames.QSBGameDetails); + } + } +} From c17ea7607f8889e67c53515d19ba50edd8f036cf Mon Sep 17 00:00:00 2001 From: Mister_Nebula <41904486+misternebula@users.noreply.github.com> Date: Sun, 5 Dec 2021 23:32:01 +0000 Subject: [PATCH 06/30] add error catch to serialize --- QuantumUNET/QNetworkServer.cs | 11 ++++++++++- 1 file changed, 10 insertions(+), 1 deletion(-) diff --git a/QuantumUNET/QNetworkServer.cs b/QuantumUNET/QNetworkServer.cs index 13551272..3e436b9c 100644 --- a/QuantumUNET/QNetworkServer.cs +++ b/QuantumUNET/QNetworkServer.cs @@ -1257,7 +1257,16 @@ namespace QuantumUNET if (handlers.ContainsKey(msgType) && m_LocalConnection != null) { var writer = new QNetworkWriter(); - msg.Serialize(writer); + try + { + msg.Serialize(writer); + } + catch (Exception ex) + { + QLog.Error($"Error serializing msgId:{msgType} - {ex}"); + return false; + } + var reader = new QNetworkReader(writer); m_LocalConnection.InvokeHandler(msgType, reader, channelId); result = true; From 73b83d22f6282a82104e3165e2a904dd72a277a2 Mon Sep 17 00:00:00 2001 From: Mister_Nebula <41904486+misternebula@users.noreply.github.com> Date: Sun, 5 Dec 2021 23:32:19 +0000 Subject: [PATCH 07/30] add timeloop debug gui --- QSB/Utility/DebugGUI.cs | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/QSB/Utility/DebugGUI.cs b/QSB/Utility/DebugGUI.cs index e124ecec..525c6df5 100644 --- a/QSB/Utility/DebugGUI.cs +++ b/QSB/Utility/DebugGUI.cs @@ -112,6 +112,12 @@ namespace QSB.Utility WriteLine(1, $"Timescale : {OWTime.GetTimeScale()}"); WriteLine(1, $"Time Remaining : {Mathf.Floor(TimeLoop.GetSecondsRemaining() / 60f)}:{Mathf.Round(TimeLoop.GetSecondsRemaining() % 60f * 100f / 100f)}"); WriteLine(1, $"Loop Count : {TimeLoop.GetLoopCount()}"); + WriteLine(1, $"TimeLoop Initialized : {TimeLoop._initialized}"); + if (TimeLoop._initialized) + { + WriteLine(1, $"TimeLoop IsTimeFlowing : {TimeLoop.IsTimeFlowing()}"); + WriteLine(1, $"TimeLoop IsTimeLoopEnabled : {TimeLoop.IsTimeLoopEnabled()}"); + } } #endregion From 81e1f113a99ca8104d5038527074c0dac494469b Mon Sep 17 00:00:00 2001 From: Mister_Nebula <41904486+misternebula@users.noreply.github.com> Date: Sun, 5 Dec 2021 23:33:24 +0000 Subject: [PATCH 08/30] dont draw lines --- QSB/debugsettings.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/QSB/debugsettings.json b/QSB/debugsettings.json index c125ec65..c6d0afb9 100644 --- a/QSB/debugsettings.json +++ b/QSB/debugsettings.json @@ -1,6 +1,6 @@ { "debugMode": true, - "drawLines": true, + "drawLines": false, "showQuantumVisibilityObjects": false, "showQuantumDebugBoxes": false, "avoidTimeSync": false, From bcec680235e5b9eb823a94228bfb22c604d32183 Mon Sep 17 00:00:00 2001 From: Mister_Nebula <41904486+misternebula@users.noreply.github.com> Date: Sun, 5 Dec 2021 23:34:06 +0000 Subject: [PATCH 09/30] add ToId and SendToSpecific --- QSB/Events/QSBEvent.cs | 5 +++++ QSB/Messaging/PlayerMessage.cs | 21 +++++++++++++++++++++ 2 files changed, 26 insertions(+) diff --git a/QSB/Events/QSBEvent.cs b/QSB/Events/QSBEvent.cs index 5194bf7c..93aed4ce 100644 --- a/QSB/Events/QSBEvent.cs +++ b/QSB/Events/QSBEvent.cs @@ -75,6 +75,11 @@ namespace QSB.Events return; } + if (message.SendToSpecific && message.ToId != LocalPlayerId) + { + return; + } + if (PlayerTransformSync.LocalInstance == null || PlayerTransformSync.LocalInstance.GetComponent() == null) { DebugLog.ToConsole($"Warning - Tried to handle message of type <{GetType().Name}> before localplayer was established.", MessageType.Warning); diff --git a/QSB/Messaging/PlayerMessage.cs b/QSB/Messaging/PlayerMessage.cs index dc22a948..e3262711 100644 --- a/QSB/Messaging/PlayerMessage.cs +++ b/QSB/Messaging/PlayerMessage.cs @@ -15,6 +15,17 @@ namespace QSB.Messaging /// public uint AboutId { get; set; } + /// + /// The Player ID that this message is for + /// (only used if SendToSpecific is set) + /// + public uint ToId { get; set; } + + /// + /// when this message is only being sent to ToId + /// + public bool SendToSpecific { get; set; } + /// /// If true, only send this message to the host of the current session /// (OnReceiveLocal/Remote is not called on any other client) @@ -26,6 +37,11 @@ namespace QSB.Messaging FromId = reader.ReadUInt32(); AboutId = reader.ReadUInt32(); OnlySendToHost = reader.ReadBoolean(); + SendToSpecific = reader.ReadBoolean(); + if (SendToSpecific) + { + ToId = reader.ReadUInt32(); + } } public override void Serialize(QNetworkWriter writer) @@ -33,6 +49,11 @@ namespace QSB.Messaging writer.Write(FromId); writer.Write(AboutId); writer.Write(OnlySendToHost); + writer.Write(SendToSpecific); + if (SendToSpecific) + { + writer.Write(ToId); + } } } } \ No newline at end of file From 5b15d26bea7b2bc871c31a7eb0c7025b40091788 Mon Sep 17 00:00:00 2001 From: Mister_Nebula <41904486+misternebula@users.noreply.github.com> Date: Sun, 5 Dec 2021 23:34:49 +0000 Subject: [PATCH 10/30] cleanup requestgamestateevent --- QSB/SaveSync/Events/RequestGameStateEvent.cs | 5 +---- 1 file changed, 1 insertion(+), 4 deletions(-) diff --git a/QSB/SaveSync/Events/RequestGameStateEvent.cs b/QSB/SaveSync/Events/RequestGameStateEvent.cs index 930768a4..d732f96d 100644 --- a/QSB/SaveSync/Events/RequestGameStateEvent.cs +++ b/QSB/SaveSync/Events/RequestGameStateEvent.cs @@ -24,9 +24,6 @@ namespace QSB.SaveSync.Events OnlySendToHost = true }; - public override void OnReceiveRemote(bool isHost, PlayerMessage message) - { - QSBEventManager.FireEvent(EventNames.QSBGameDetails); - } + public override void OnReceiveRemote(bool isHost, PlayerMessage message) => QSBEventManager.FireEvent(EventNames.QSBGameDetails, message.FromId); } } From 61e43cec21f5bac7948c9ec5ad8be430ab505bb7 Mon Sep 17 00:00:00 2001 From: Mister_Nebula <41904486+misternebula@users.noreply.github.com> Date: Sun, 5 Dec 2021 23:35:33 +0000 Subject: [PATCH 11/30] add KnownSignals --- QSB/SaveSync/Events/GameStateEvent.cs | 22 +++++++++++++++------- QSB/SaveSync/Events/GameStateMessage.cs | 20 ++++++++++++++++++++ 2 files changed, 35 insertions(+), 7 deletions(-) diff --git a/QSB/SaveSync/Events/GameStateEvent.cs b/QSB/SaveSync/Events/GameStateEvent.cs index 93087989..98ce0427 100644 --- a/QSB/SaveSync/Events/GameStateEvent.cs +++ b/QSB/SaveSync/Events/GameStateEvent.cs @@ -1,8 +1,6 @@ using QSB.Events; using QSB.Menus; using QSB.Utility; -using System; -using System.Linq; namespace QSB.SaveSync.Events { @@ -11,18 +9,20 @@ namespace QSB.SaveSync.Events { public override bool RequireWorldObjectsReady => false; - public override void SetupListener() => GlobalMessenger.AddListener(EventNames.QSBGameDetails, Handler); - public override void CloseListener() => GlobalMessenger.RemoveListener(EventNames.QSBGameDetails, Handler); + public override void SetupListener() => GlobalMessenger.AddListener(EventNames.QSBGameDetails, Handler); + public override void CloseListener() => GlobalMessenger.RemoveListener(EventNames.QSBGameDetails, Handler); - private void Handler() => SendEvent(CreateMessage()); + private void Handler(uint toId) => SendEvent(CreateMessage(toId)); - private GameStateMessage CreateMessage() => new() + private GameStateMessage CreateMessage(uint toId) => new() { AboutId = LocalPlayerId, + ToId = toId, InSolarSystem = QSBSceneManager.CurrentScene == OWScene.SolarSystem, InEye = QSBSceneManager.CurrentScene == OWScene.EyeOfTheUniverse, LoopCount = StandaloneProfileManager.SharedInstance.currentProfileGameSave.loopCount, - KnownFrequencies = StandaloneProfileManager.SharedInstance.currentProfileGameSave.knownFrequencies + KnownFrequencies = StandaloneProfileManager.SharedInstance.currentProfileGameSave.knownFrequencies, + KnownSignals = StandaloneProfileManager.SharedInstance.currentProfileGameSave.knownSignals }; public override void OnReceiveRemote(bool isHost, GameStateMessage message) @@ -34,8 +34,16 @@ namespace QSB.SaveSync.Events { DebugLog.DebugWrite($"knowsFrequency{i}:{message.KnownFrequencies[i]}"); } + gameSave.knownFrequencies = message.KnownFrequencies; + foreach (var item in message.KnownSignals) + { + DebugLog.DebugWrite($"knowsSignal {item.Key}:{item.Value}"); + } + + gameSave.knownSignals = message.KnownSignals; + PlayerData.SaveCurrentGame(); DebugLog.DebugWrite($"inEye:{message.InEye}"); diff --git a/QSB/SaveSync/Events/GameStateMessage.cs b/QSB/SaveSync/Events/GameStateMessage.cs index 030f9339..bb986919 100644 --- a/QSB/SaveSync/Events/GameStateMessage.cs +++ b/QSB/SaveSync/Events/GameStateMessage.cs @@ -2,6 +2,7 @@ using QSB.Utility; using QuantumUNET.Transport; using System; +using System.Collections.Generic; namespace QSB.SaveSync.Events { @@ -11,6 +12,7 @@ namespace QSB.SaveSync.Events public bool InEye { get; set; } public int LoopCount { get; set; } public bool[] KnownFrequencies { get; set; } + public Dictionary KnownSignals { get; set; } = new(); public override void Deserialize(QNetworkReader reader) { @@ -33,6 +35,16 @@ namespace QSB.SaveSync.Events { KnownFrequencies[i] = reader.ReadBoolean(); } + + // Known signals + var signalsLength = reader.ReadInt32(); + KnownSignals.Clear(); + for (var i = 0; i < signalsLength; i++) + { + var key = reader.ReadInt32(); + var value = reader.ReadBoolean(); + KnownSignals.Add(key, value); + } } public override void Serialize(QNetworkWriter writer) @@ -53,6 +65,14 @@ namespace QSB.SaveSync.Events { writer.Write(item); } + + // Known signals + writer.Write(KnownSignals.Count); + foreach (var item in KnownSignals) + { + writer.Write(item.Key); + writer.Write(item.Value); + } } } } From 4a7cc859fbf8394e205a3c5173381acce0e19764 Mon Sep 17 00:00:00 2001 From: Mister_Nebula <41904486+misternebula@users.noreply.github.com> Date: Tue, 7 Dec 2021 13:35:03 +0000 Subject: [PATCH 12/30] add dlc install check --- QSB/Menus/MenuManager.cs | 5 +++-- QSB/Player/Events/PlayerJoinEvent.cs | 14 ++++++++++++-- QSB/Player/Events/PlayerJoinMessage.cs | 3 +++ QSB/Player/KickReason.cs | 3 ++- QSB/QSBCore.cs | 1 + 5 files changed, 21 insertions(+), 5 deletions(-) diff --git a/QSB/Menus/MenuManager.cs b/QSB/Menus/MenuManager.cs index 18646a82..9ef1054f 100644 --- a/QSB/Menus/MenuManager.cs +++ b/QSB/Menus/MenuManager.cs @@ -156,7 +156,7 @@ namespace QSB.Menus { CreateCommonPopups(); - HostButton = MenuApi.PauseMenu_MakeSimpleButton("MULTIPLAYER (HOST)"); + HostButton = MenuApi.PauseMenu_MakeSimpleButton("OPEN TO MULTIPLAYER"); HostButton.onClick.AddListener(Host); DisconnectButton = MenuApi.PauseMenu_MakeSimpleButton("DISCONNECT"); @@ -180,7 +180,7 @@ namespace QSB.Menus { CreateCommonPopups(); - ClientButton = MenuApi.TitleScreen_MakeMenuOpenButton("MULTIPLAYER (CONNECT)", _ClientButtonIndex, PopupMenu); + ClientButton = MenuApi.TitleScreen_MakeMenuOpenButton("CONNECT TO MULTIPLAYER", _ClientButtonIndex, PopupMenu); DisconnectButton = MenuApi.TitleScreen_MakeSimpleButton("DISCONNECT", _DisconnectIndex); DisconnectButton.onClick.AddListener(Disconnect); @@ -302,6 +302,7 @@ namespace QSB.Menus KickReason.QSBVersionNotMatching => "Server refused connection as QSB version does not match.", KickReason.GameVersionNotMatching => "Server refused connection as Outer Wilds version does not match.", KickReason.GamePlatformNotMatching => "Server refused connection as Outer Wilds platform does not match. (Steam/Epic)", + KickReason.DLCNotMatching => "Server refused connection as DLC installation state does not match.", KickReason.None => "Kicked from server. No reason given.", _ => $"Kicked from server. KickReason:{reason}", }; diff --git a/QSB/Player/Events/PlayerJoinEvent.cs b/QSB/Player/Events/PlayerJoinEvent.cs index f6f3b239..d0177a15 100644 --- a/QSB/Player/Events/PlayerJoinEvent.cs +++ b/QSB/Player/Events/PlayerJoinEvent.cs @@ -19,7 +19,8 @@ namespace QSB.Player.Events PlayerName = name, QSBVersion = QSBCore.QSBVersion, GameVersion = QSBCore.GameVersion, - Platform = QSBCore.Platform + Platform = QSBCore.Platform, + DlcInstalled = QSBCore.DLCInstalled }; public override void OnReceiveRemote(bool server, PlayerJoinMessage message) @@ -51,6 +52,15 @@ namespace QSB.Player.Events if (server) { DebugLog.ToConsole($"Error - Client {message.PlayerName} connecting with wrong game platform. (Client:{message.Platform}, Server:{QSBCore.Platform})", MessageType.Error); + QSBEventManager.FireEvent(EventNames.QSBPlayerKick, message.AboutId, KickReason.DLCNotMatching); + } + } + + if (message.DlcInstalled != QSBCore.DLCInstalled) + { + if (server) + { + DebugLog.ToConsole($"Error - Client {message.PlayerName} connecting with wrong DLC installation state. (Client:{message.DlcInstalled}, Server:{QSBCore.DLCInstalled})", MessageType.Error); QSBEventManager.FireEvent(EventNames.QSBPlayerKick, message.AboutId, KickReason.GamePlatformNotMatching); } } @@ -58,7 +68,7 @@ namespace QSB.Player.Events var player = QSBPlayerManager.GetPlayer(message.AboutId); player.Name = message.PlayerName; DebugLog.ToAll($"{player.Name} joined!", MessageType.Info); - DebugLog.DebugWrite($"{player.Name} joined. id:{player.PlayerId}, qsbVersion:{message.QSBVersion}, gameVersion:{message.GameVersion}, platform:{message.Platform}", MessageType.Info); + DebugLog.DebugWrite($"{player.Name} joined. id:{player.PlayerId}, qsbVersion:{message.QSBVersion}, gameVersion:{message.GameVersion}, platform:{message.Platform}. dlcInstalled:{message.DlcInstalled}", MessageType.Info); } public override void OnReceiveLocal(bool server, PlayerJoinMessage message) diff --git a/QSB/Player/Events/PlayerJoinMessage.cs b/QSB/Player/Events/PlayerJoinMessage.cs index a07f5f4d..a965cf20 100644 --- a/QSB/Player/Events/PlayerJoinMessage.cs +++ b/QSB/Player/Events/PlayerJoinMessage.cs @@ -9,6 +9,7 @@ namespace QSB.Player.Events public string QSBVersion { get; set; } public string GameVersion { get; set; } public GamePlatform Platform { get; set; } + public bool DlcInstalled { get; set; } public override void Deserialize(QNetworkReader reader) { @@ -17,6 +18,7 @@ namespace QSB.Player.Events QSBVersion = reader.ReadString(); GameVersion = reader.ReadString(); Platform = (GamePlatform)reader.ReadInt32(); + DlcInstalled = reader.ReadBoolean(); } public override void Serialize(QNetworkWriter writer) @@ -26,6 +28,7 @@ namespace QSB.Player.Events writer.Write(QSBVersion); writer.Write(GameVersion); writer.Write((int)Platform); + writer.Write(DlcInstalled); } } } \ No newline at end of file diff --git a/QSB/Player/KickReason.cs b/QSB/Player/KickReason.cs index d02b4159..5b44b066 100644 --- a/QSB/Player/KickReason.cs +++ b/QSB/Player/KickReason.cs @@ -5,6 +5,7 @@ None, QSBVersionNotMatching, GameVersionNotMatching, - GamePlatformNotMatching + GamePlatformNotMatching, + DLCNotMatching } } diff --git a/QSB/QSBCore.cs b/QSB/QSBCore.cs index 746cddda..1de470f5 100644 --- a/QSB/QSBCore.cs +++ b/QSB/QSBCore.cs @@ -79,6 +79,7 @@ namespace QSB public static GamePlatform Platform => typeof(Achievements).Assembly.GetTypes().Any(x => x.Name == "EpicEntitlementRetriever") ? GamePlatform.Epic : GamePlatform.Steam; + public static bool DLCInstalled => EntitlementsManager.IsDlcOwned() == EntitlementsManager.AsyncOwnershipStatus.Owned; public static IMenuAPI MenuApi { get; private set; } private static DebugSettings DebugSettings { get; set; } = new DebugSettings(); From 5600bd0d2f19520bdd56f1ea5ae912f86ce4bab4 Mon Sep 17 00:00:00 2001 From: Mister_Nebula <41904486+misternebula@users.noreply.github.com> Date: Tue, 7 Dec 2021 15:47:46 +0000 Subject: [PATCH 13/30] update for dev changes --- QSB/Events/QSBEvent.cs | 5 ----- QSB/SaveSync/Events/GameStateEvent.cs | 2 +- 2 files changed, 1 insertion(+), 6 deletions(-) diff --git a/QSB/Events/QSBEvent.cs b/QSB/Events/QSBEvent.cs index d593bdbb..c2df5ffa 100644 --- a/QSB/Events/QSBEvent.cs +++ b/QSB/Events/QSBEvent.cs @@ -85,11 +85,6 @@ namespace QSB.Events return; } - if (message.SendToSpecific && message.ToId != LocalPlayerId) - { - return; - } - if (PlayerTransformSync.LocalInstance == null || PlayerTransformSync.LocalInstance.GetComponent() == null) { DebugLog.ToConsole($"Warning - Tried to handle message of type <{GetType().Name}> before localplayer was established.", MessageType.Warning); diff --git a/QSB/SaveSync/Events/GameStateEvent.cs b/QSB/SaveSync/Events/GameStateEvent.cs index 98ce0427..9b2b1990 100644 --- a/QSB/SaveSync/Events/GameStateEvent.cs +++ b/QSB/SaveSync/Events/GameStateEvent.cs @@ -17,7 +17,7 @@ namespace QSB.SaveSync.Events private GameStateMessage CreateMessage(uint toId) => new() { AboutId = LocalPlayerId, - ToId = toId, + ForId = toId, InSolarSystem = QSBSceneManager.CurrentScene == OWScene.SolarSystem, InEye = QSBSceneManager.CurrentScene == OWScene.EyeOfTheUniverse, LoopCount = StandaloneProfileManager.SharedInstance.currentProfileGameSave.loopCount, From 554c2bb2dd40776f34433f50e6073bff0b0b1651 Mon Sep 17 00:00:00 2001 From: Mister_Nebula <41904486+misternebula@users.noreply.github.com> Date: Tue, 7 Dec 2021 15:56:08 +0000 Subject: [PATCH 14/30] cleanup --- QSB/Anglerfish/Patches/AnglerPatches.cs | 78 +++++++++---------- QSB/Animation/Player/CrouchSync.cs | 4 +- .../Player/Events/AnimationTriggerEvent.cs | 1 - .../Player/Events/ChangeAnimTypeEvent.cs | 1 - .../Player/Events/PlayerSuitEvent.cs | 1 - QSB/AuthoritySync/AuthorityManager.cs | 8 +- QSB/AuthoritySync/AuthorityQueueEvent.cs | 1 - QSB/ElevatorSync/WorldObjects/QSBElevator.cs | 2 +- QSB/Events/QSBEvent.cs | 4 +- QSB/Events/QSBEventManager.cs | 4 +- .../TransformSync/JellyfishTransformSync.cs | 4 +- QSB/Messaging/MessageHandler.cs | 2 +- QSB/Messaging/PlayerMessage.cs | 2 +- QSB/OrbSync/Events/OrbUserEvent.cs | 4 +- QSB/Patches/QSBPatchManager.cs | 8 +- QSB/QSBCore.cs | 6 +- QSB/QSBNetworkManager.cs | 6 +- .../Events/MoonStateChangeEvent.cs | 1 - .../QSBMultiStateQuantumObject.cs | 6 +- .../WorldObjects/QSBQuantumObject.cs | 2 +- QSB/SaveSync/Events/GameStateMessage.cs | 1 - QSB/SaveSync/Events/RequestGameStateEvent.cs | 6 -- QSB/ShipSync/Patches/ShipPatches.cs | 2 +- .../Transforms/UnsectoredTransformSync.cs | 3 +- QSB/Utility/DebugGUI.cs | 3 - QSB/Utility/VariableSync/VariableReference.cs | 2 +- QSB/WorldSync/QSBWorldSync.cs | 8 +- QSB/WorldSync/WorldObjectManager.cs | 6 +- QuantumUNET/QNetworkScene.cs | 2 +- 29 files changed, 79 insertions(+), 99 deletions(-) diff --git a/QSB/Anglerfish/Patches/AnglerPatches.cs b/QSB/Anglerfish/Patches/AnglerPatches.cs index 205acec2..df477667 100644 --- a/QSB/Anglerfish/Patches/AnglerPatches.cs +++ b/QSB/Anglerfish/Patches/AnglerPatches.cs @@ -189,54 +189,54 @@ namespace QSB.Anglerfish.Patches __instance.ApplyDrag(1f); return false; case AnglerfishController.AnglerState.Investigating: - { - var targetPos = __instance._brambleBody.transform.TransformPoint(__instance._localDisturbancePos); - __instance.RotateTowardsTarget(targetPos, __instance._turnSpeed, __instance._turnSpeed); - if (!__instance._turningInPlace) { - __instance.MoveTowardsTarget(targetPos, __instance._investigateSpeed, __instance._acceleration); - return false; + var targetPos = __instance._brambleBody.transform.TransformPoint(__instance._localDisturbancePos); + __instance.RotateTowardsTarget(targetPos, __instance._turnSpeed, __instance._turnSpeed); + if (!__instance._turningInPlace) + { + __instance.MoveTowardsTarget(targetPos, __instance._investigateSpeed, __instance._acceleration); + return false; + } + break; } - break; - } case AnglerfishController.AnglerState.Chasing: - { - var velocity = qsbAngler.TargetVelocity; - var normalized = velocity.normalized; - var from = __instance._anglerBody.GetPosition() + __instance.transform.TransformDirection(__instance._mouthOffset) - qsbAngler.TargetTransform.position; - var magnitude = velocity.magnitude; - var num = Vector3.Angle(from, normalized); - var num2 = magnitude * 2f; - var d = num2; - if (num < 90f) { - var magnitude2 = from.magnitude; - var num3 = magnitude2 * Mathf.Sin(num * 0.017453292f); - var num4 = magnitude2 * Mathf.Cos(num * 0.017453292f); - var magnitude3 = __instance._anglerBody.GetVelocity().magnitude; - var num5 = num4 / Mathf.Max(magnitude, 0.0001f); - var num6 = num3 / Mathf.Max(magnitude3, 0.0001f); - var num7 = num5 / num6; - if (num7 <= 1f) + var velocity = qsbAngler.TargetVelocity; + var normalized = velocity.normalized; + var from = __instance._anglerBody.GetPosition() + __instance.transform.TransformDirection(__instance._mouthOffset) - qsbAngler.TargetTransform.position; + var magnitude = velocity.magnitude; + var num = Vector3.Angle(from, normalized); + var num2 = magnitude * 2f; + var d = num2; + if (num < 90f) { - var t = Mathf.Clamp01(num7); - d = Mathf.Lerp(num2, num4, t); + var magnitude2 = from.magnitude; + var num3 = magnitude2 * Mathf.Sin(num * 0.017453292f); + var num4 = magnitude2 * Mathf.Cos(num * 0.017453292f); + var magnitude3 = __instance._anglerBody.GetVelocity().magnitude; + var num5 = num4 / Mathf.Max(magnitude, 0.0001f); + var num6 = num3 / Mathf.Max(magnitude3, 0.0001f); + var num7 = num5 / num6; + if (num7 <= 1f) + { + var t = Mathf.Clamp01(num7); + d = Mathf.Lerp(num2, num4, t); + } + else + { + var num8 = Mathf.InverseLerp(1f, 4f, num7); + d = Mathf.Lerp(num4, 0f, num8 * num8); + } } - else + __instance._targetPos = qsbAngler.TargetTransform.position + normalized * d; + __instance.RotateTowardsTarget(__instance._targetPos, __instance._turnSpeed, __instance._quickTurnSpeed); + if (!__instance._turningInPlace) { - var num8 = Mathf.InverseLerp(1f, 4f, num7); - d = Mathf.Lerp(num4, 0f, num8 * num8); + __instance.MoveTowardsTarget(__instance._targetPos, __instance._chaseSpeed, __instance._acceleration); + return false; } + break; } - __instance._targetPos = qsbAngler.TargetTransform.position + normalized * d; - __instance.RotateTowardsTarget(__instance._targetPos, __instance._turnSpeed, __instance._quickTurnSpeed); - if (!__instance._turningInPlace) - { - __instance.MoveTowardsTarget(__instance._targetPos, __instance._chaseSpeed, __instance._acceleration); - return false; - } - break; - } case AnglerfishController.AnglerState.Consuming: __instance.ApplyDrag(1f); return false; diff --git a/QSB/Animation/Player/CrouchSync.cs b/QSB/Animation/Player/CrouchSync.cs index dabcf039..faee97d3 100644 --- a/QSB/Animation/Player/CrouchSync.cs +++ b/QSB/Animation/Player/CrouchSync.cs @@ -1,8 +1,6 @@ -using QSB.Utility; -using QSB.Utility.VariableSync; +using QSB.Utility.VariableSync; using QuantumUNET; using UnityEngine; -using UnityEngine.Networking; namespace QSB.Animation.Player { diff --git a/QSB/Animation/Player/Events/AnimationTriggerEvent.cs b/QSB/Animation/Player/Events/AnimationTriggerEvent.cs index ddc85992..951311ba 100644 --- a/QSB/Animation/Player/Events/AnimationTriggerEvent.cs +++ b/QSB/Animation/Player/Events/AnimationTriggerEvent.cs @@ -1,6 +1,5 @@ using QSB.Events; using QSB.Player; -using QSB.WorldSync; namespace QSB.Animation.Player.Events { diff --git a/QSB/Animation/Player/Events/ChangeAnimTypeEvent.cs b/QSB/Animation/Player/Events/ChangeAnimTypeEvent.cs index d20ae6df..3fbf03fe 100644 --- a/QSB/Animation/Player/Events/ChangeAnimTypeEvent.cs +++ b/QSB/Animation/Player/Events/ChangeAnimTypeEvent.cs @@ -2,7 +2,6 @@ using QSB.Instruments; using QSB.Messaging; using QSB.Player; -using QSB.WorldSync; namespace QSB.Animation.Player.Events { diff --git a/QSB/Animation/Player/Events/PlayerSuitEvent.cs b/QSB/Animation/Player/Events/PlayerSuitEvent.cs index 1c67c151..329adb0a 100644 --- a/QSB/Animation/Player/Events/PlayerSuitEvent.cs +++ b/QSB/Animation/Player/Events/PlayerSuitEvent.cs @@ -1,7 +1,6 @@ using QSB.Events; using QSB.Messaging; using QSB.Player; -using QSB.WorldSync; namespace QSB.Animation.Player.Events { diff --git a/QSB/AuthoritySync/AuthorityManager.cs b/QSB/AuthoritySync/AuthorityManager.cs index 1b93fbde..b2b3ce25 100644 --- a/QSB/AuthoritySync/AuthorityManager.cs +++ b/QSB/AuthoritySync/AuthorityManager.cs @@ -1,9 +1,9 @@ -using System.Collections.Generic; -using System.Linq; -using QSB.Events; +using QSB.Events; using QSB.Utility; using QuantumUNET; using QuantumUNET.Components; +using System.Collections.Generic; +using System.Linq; namespace QSB.AuthoritySync { @@ -72,7 +72,7 @@ namespace QSB.AuthoritySync } // DebugLog.DebugWrite($"{identity.NetId}:{identity.gameObject.name} - " - // + $"set authority to {id}"); + // + $"set authority to {id}"); } #endregion diff --git a/QSB/AuthoritySync/AuthorityQueueEvent.cs b/QSB/AuthoritySync/AuthorityQueueEvent.cs index d949dc6f..5d51bbaf 100644 --- a/QSB/AuthoritySync/AuthorityQueueEvent.cs +++ b/QSB/AuthoritySync/AuthorityQueueEvent.cs @@ -1,5 +1,4 @@ using QSB.Events; -using QSB.WorldSync; using QuantumUNET.Components; namespace QSB.AuthoritySync diff --git a/QSB/ElevatorSync/WorldObjects/QSBElevator.cs b/QSB/ElevatorSync/WorldObjects/QSBElevator.cs index f322af7a..e62e73dc 100644 --- a/QSB/ElevatorSync/WorldObjects/QSBElevator.cs +++ b/QSB/ElevatorSync/WorldObjects/QSBElevator.cs @@ -40,7 +40,7 @@ namespace QSB.ElevatorSync.WorldObjects if (_elevatorTrigger.IsTrackingObject(Locator.GetPlayerDetector())) { SetDirection(isGoingUp); - + AttachedObject._attachPoint.AttachPlayer(); if (Locator.GetPlayerSuit().IsWearingSuit(true) && Locator.GetPlayerSuit().IsTrainingSuit()) diff --git a/QSB/Events/QSBEvent.cs b/QSB/Events/QSBEvent.cs index c2df5ffa..8a59d500 100644 --- a/QSB/Events/QSBEvent.cs +++ b/QSB/Events/QSBEvent.cs @@ -1,5 +1,4 @@ -using System; -using OWML.Common; +using OWML.Common; using QSB.ClientServerStateSync; using QSB.Messaging; using QSB.Player; @@ -8,6 +7,7 @@ using QSB.Player.TransformSync; using QSB.Utility; using QSB.WorldSync; using QuantumUNET.Components; +using System; namespace QSB.Events { diff --git a/QSB/Events/QSBEventManager.cs b/QSB/Events/QSBEventManager.cs index 75fc5b78..17b2cf47 100644 --- a/QSB/Events/QSBEventManager.cs +++ b/QSB/Events/QSBEventManager.cs @@ -1,5 +1,4 @@ -using System.Collections.Generic; -using OWML.Common; +using OWML.Common; using QSB.Anglerfish.Events; using QSB.Animation.NPC.Events; using QSB.Animation.Player.Events; @@ -36,6 +35,7 @@ using QSB.Tools.TranslatorTool.TranslationSync.Events; using QSB.Utility; using QSB.Utility.Events; using QSB.ZeroGCaveSync.Events; +using System.Collections.Generic; namespace QSB.Events { diff --git a/QSB/JellyfishSync/TransformSync/JellyfishTransformSync.cs b/QSB/JellyfishSync/TransformSync/JellyfishTransformSync.cs index d343fea2..f14aa1cd 100644 --- a/QSB/JellyfishSync/TransformSync/JellyfishTransformSync.cs +++ b/QSB/JellyfishSync/TransformSync/JellyfishTransformSync.cs @@ -1,10 +1,10 @@ -using System.Collections.Generic; -using QSB.JellyfishSync.WorldObjects; +using QSB.JellyfishSync.WorldObjects; using QSB.Syncs; using QSB.Syncs.Unsectored.Rigidbodies; using QSB.Utility; using QSB.WorldSync; using QuantumUNET.Transport; +using System.Collections.Generic; using UnityEngine; namespace QSB.JellyfishSync.TransformSync diff --git a/QSB/Messaging/MessageHandler.cs b/QSB/Messaging/MessageHandler.cs index 545f6607..496a8f16 100644 --- a/QSB/Messaging/MessageHandler.cs +++ b/QSB/Messaging/MessageHandler.cs @@ -16,7 +16,7 @@ namespace QSB.Messaging public MessageHandler(int msgType) { - + _eventType = (short)(msgType + QMsgType.Highest + 1); if (_eventType >= short.MaxValue) { diff --git a/QSB/Messaging/PlayerMessage.cs b/QSB/Messaging/PlayerMessage.cs index 4c7e595f..b14eb553 100644 --- a/QSB/Messaging/PlayerMessage.cs +++ b/QSB/Messaging/PlayerMessage.cs @@ -17,7 +17,7 @@ namespace QSB.Messaging /// /// If true, only send this message to the host of the current session - /// /// (OnReceiveLocal/Remote is not called on any other client) + /// (OnReceiveLocal/Remote is not called on any other client) /// public bool OnlySendToHost { get; set; } diff --git a/QSB/OrbSync/Events/OrbUserEvent.cs b/QSB/OrbSync/Events/OrbUserEvent.cs index 5770d85f..3d7ea18a 100644 --- a/QSB/OrbSync/Events/OrbUserEvent.cs +++ b/QSB/OrbSync/Events/OrbUserEvent.cs @@ -1,11 +1,11 @@ -using System.Linq; -using OWML.Common; +using OWML.Common; using QSB.AuthoritySync; using QSB.Events; using QSB.OrbSync.TransformSync; using QSB.Utility; using QSB.WorldSync; using QSB.WorldSync.Events; +using System.Linq; namespace QSB.OrbSync.Events { diff --git a/QSB/Patches/QSBPatchManager.cs b/QSB/Patches/QSBPatchManager.cs index 9712fdb5..f336f6c9 100644 --- a/QSB/Patches/QSBPatchManager.cs +++ b/QSB/Patches/QSBPatchManager.cs @@ -1,7 +1,4 @@ -using System; -using System.Collections.Generic; -using System.Linq; -using HarmonyLib; +using HarmonyLib; using OWML.Common; using QSB.Anglerfish.Patches; using QSB.Animation.NPC.Patches; @@ -31,6 +28,9 @@ using QSB.Tools.SignalscopeTool.FrequencySync.Patches; using QSB.Tools.TranslatorTool.TranslationSync.Patches; using QSB.Utility; using QSB.ZeroGCaveSync.Patches; +using System; +using System.Collections.Generic; +using System.Linq; namespace QSB.Patches { diff --git a/QSB/QSBCore.cs b/QSB/QSBCore.cs index 1de470f5..4a7e70f8 100644 --- a/QSB/QSBCore.cs +++ b/QSB/QSBCore.cs @@ -1,5 +1,4 @@ -using System.Linq; -using OWML.Common; +using OWML.Common; using OWML.ModHelper; using OWML.ModHelper.Input; using QSB.Anglerfish; @@ -18,7 +17,6 @@ using QSB.MeteorSync; using QSB.OrbSync; using QSB.Patches; using QSB.Player; -using QSB.Player.TransformSync; using QSB.PoolSync; using QSB.QuantumSync; using QSB.RespawnSync; @@ -30,10 +28,10 @@ using QSB.TimeSync; using QSB.Tools.ProbeLauncherTool; using QSB.Tools.TranslatorTool.TranslationSync; using QSB.Utility; -using QSB.WorldSync; using QSB.ZeroGCaveSync; using QuantumUNET; using QuantumUNET.Components; +using System.Linq; using UnityEngine; /* diff --git a/QSB/QSBNetworkManager.cs b/QSB/QSBNetworkManager.cs index 6abaab80..22650e78 100644 --- a/QSB/QSBNetworkManager.cs +++ b/QSB/QSBNetworkManager.cs @@ -1,6 +1,4 @@ -using System; -using System.Linq; -using OWML.Common; +using OWML.Common; using OWML.Utils; using QSB.AuthoritySync; using QSB.ClientServerStateSync; @@ -17,6 +15,8 @@ using QSB.Utility; using QSB.WorldSync; using QuantumUNET; using QuantumUNET.Components; +using System; +using System.Linq; using UnityEngine; using UnityEngine.Networking; diff --git a/QSB/QuantumSync/Events/MoonStateChangeEvent.cs b/QSB/QuantumSync/Events/MoonStateChangeEvent.cs index b4332b6b..6f2c82a3 100644 --- a/QSB/QuantumSync/Events/MoonStateChangeEvent.cs +++ b/QSB/QuantumSync/Events/MoonStateChangeEvent.cs @@ -2,7 +2,6 @@ using QSB.Events; using System.Linq; using System.Reflection; -using QSB.WorldSync; using UnityEngine; namespace QSB.QuantumSync.Events diff --git a/QSB/QuantumSync/WorldObjects/QSBMultiStateQuantumObject.cs b/QSB/QuantumSync/WorldObjects/QSBMultiStateQuantumObject.cs index a35c019c..5bb22d7e 100644 --- a/QSB/QuantumSync/WorldObjects/QSBMultiStateQuantumObject.cs +++ b/QSB/QuantumSync/WorldObjects/QSBMultiStateQuantumObject.cs @@ -1,7 +1,7 @@ -using System.Collections.Generic; -using System.Linq; -using QSB.Utility; +using QSB.Utility; using QSB.WorldSync; +using System.Collections.Generic; +using System.Linq; using UnityEngine.UI; namespace QSB.QuantumSync.WorldObjects diff --git a/QSB/QuantumSync/WorldObjects/QSBQuantumObject.cs b/QSB/QuantumSync/WorldObjects/QSBQuantumObject.cs index 8005135a..87c42343 100644 --- a/QSB/QuantumSync/WorldObjects/QSBQuantumObject.cs +++ b/QSB/QuantumSync/WorldObjects/QSBQuantumObject.cs @@ -112,7 +112,7 @@ namespace QSB.QuantumSync.WorldObjects } } - public List GetVisibilityTrackers() + public List GetVisibilityTrackers() => AttachedObject?._visibilityTrackers == null ? new() : AttachedObject._visibilityTrackers.Select(x => (ShapeVisibilityTracker)x).ToList(); diff --git a/QSB/SaveSync/Events/GameStateMessage.cs b/QSB/SaveSync/Events/GameStateMessage.cs index bb986919..1315df1d 100644 --- a/QSB/SaveSync/Events/GameStateMessage.cs +++ b/QSB/SaveSync/Events/GameStateMessage.cs @@ -1,5 +1,4 @@ using QSB.Messaging; -using QSB.Utility; using QuantumUNET.Transport; using System; using System.Collections.Generic; diff --git a/QSB/SaveSync/Events/RequestGameStateEvent.cs b/QSB/SaveSync/Events/RequestGameStateEvent.cs index d732f96d..94f78312 100644 --- a/QSB/SaveSync/Events/RequestGameStateEvent.cs +++ b/QSB/SaveSync/Events/RequestGameStateEvent.cs @@ -1,11 +1,5 @@ using QSB.Events; using QSB.Messaging; -using QSB.Utility; -using System; -using System.Collections.Generic; -using System.Linq; -using System.Text; -using System.Threading.Tasks; namespace QSB.SaveSync.Events { diff --git a/QSB/ShipSync/Patches/ShipPatches.cs b/QSB/ShipSync/Patches/ShipPatches.cs index 9d786168..663dc505 100644 --- a/QSB/ShipSync/Patches/ShipPatches.cs +++ b/QSB/ShipSync/Patches/ShipPatches.cs @@ -3,8 +3,8 @@ using OWML.Utils; using QSB.Events; using QSB.Patches; using QSB.Utility; -using System; using QSB.WorldSync; +using System; using UnityEngine; namespace QSB.ShipSync.Patches diff --git a/QSB/Syncs/Unsectored/Transforms/UnsectoredTransformSync.cs b/QSB/Syncs/Unsectored/Transforms/UnsectoredTransformSync.cs index 867952c9..36709e64 100644 --- a/QSB/Syncs/Unsectored/Transforms/UnsectoredTransformSync.cs +++ b/QSB/Syncs/Unsectored/Transforms/UnsectoredTransformSync.cs @@ -1,5 +1,4 @@ -using OWML.Common; -using QSB.Utility; +using QSB.Utility; using QSB.WorldSync; using QuantumUNET.Transport; using UnityEngine; diff --git a/QSB/Utility/DebugGUI.cs b/QSB/Utility/DebugGUI.cs index 525c6df5..16cb8656 100644 --- a/QSB/Utility/DebugGUI.cs +++ b/QSB/Utility/DebugGUI.cs @@ -1,9 +1,7 @@ using QSB.ClientServerStateSync; using QSB.OrbSync.TransformSync; -using QSB.OrbSync.WorldObjects; using QSB.Player; using QSB.QuantumSync; -using QSB.QuantumSync.WorldObjects; using QSB.ShipSync; using QSB.ShipSync.TransformSync; using QSB.ShipSync.WorldObjects; @@ -11,7 +9,6 @@ using QSB.TimeSync; using QSB.WorldSync; using System.Linq; using UnityEngine; -using UnityEngine.Assertions.Must; namespace QSB.Utility { diff --git a/QSB/Utility/VariableSync/VariableReference.cs b/QSB/Utility/VariableSync/VariableReference.cs index f2343bb5..d57f8fbc 100644 --- a/QSB/Utility/VariableSync/VariableReference.cs +++ b/QSB/Utility/VariableSync/VariableReference.cs @@ -26,7 +26,7 @@ namespace QSB.Utility.VariableSync { DebugLog.ToConsole($"Warning - Getter is null!", OWML.Common.MessageType.Warning); } - + return default; } } diff --git a/QSB/WorldSync/QSBWorldSync.cs b/QSB/WorldSync/QSBWorldSync.cs index 5342543f..13348a41 100644 --- a/QSB/WorldSync/QSBWorldSync.cs +++ b/QSB/WorldSync/QSBWorldSync.cs @@ -1,10 +1,10 @@ -using System; -using System.Collections.Generic; -using System.Linq; -using OWML.Common; +using OWML.Common; using QSB.OrbSync.TransformSync; using QSB.OrbSync.WorldObjects; using QSB.Utility; +using System; +using System.Collections.Generic; +using System.Linq; using UnityEngine; namespace QSB.WorldSync diff --git a/QSB/WorldSync/WorldObjectManager.cs b/QSB/WorldSync/WorldObjectManager.cs index e5c081b7..2c0d1f99 100644 --- a/QSB/WorldSync/WorldObjectManager.cs +++ b/QSB/WorldSync/WorldObjectManager.cs @@ -1,8 +1,8 @@ -using System; -using System.Collections.Generic; -using OWML.Common; +using OWML.Common; using QSB.Player; using QSB.Utility; +using System; +using System.Collections.Generic; using UnityEngine; namespace QSB.WorldSync diff --git a/QuantumUNET/QNetworkScene.cs b/QuantumUNET/QNetworkScene.cs index 102eed16..032bf292 100644 --- a/QuantumUNET/QNetworkScene.cs +++ b/QuantumUNET/QNetworkScene.cs @@ -1,6 +1,6 @@ using QuantumUNET.Components; -using System.Collections.Generic; using QuantumUNET.Messages; +using System.Collections.Generic; using UnityEngine; namespace QuantumUNET From 478628bdb8a4f5f1ebe37f2fa429b7453215446f Mon Sep 17 00:00:00 2001 From: Mister_Nebula <41904486+misternebula@users.noreply.github.com> Date: Wed, 8 Dec 2021 10:48:11 +0000 Subject: [PATCH 15/30] pain. pain. pain. --- QSB/Menus/MenuManager.cs | 93 ++++++++++++++++++++++++---------------- 1 file changed, 55 insertions(+), 38 deletions(-) diff --git a/QSB/Menus/MenuManager.cs b/QSB/Menus/MenuManager.cs index 9ef1054f..96aa24a7 100644 --- a/QSB/Menus/MenuManager.cs +++ b/QSB/Menus/MenuManager.cs @@ -15,18 +15,23 @@ namespace QSB.Menus public static MenuManager Instance; private IMenuAPI MenuApi => QSBCore.MenuApi; - private PopupMenu PopupMenu; + + private PopupMenu IPPopup; private PopupMenu InfoPopup; private bool _addedPauseLock; + + // Pause menu only + private Button HostButton; + private GameObject QuitButton; + private GameObject DisconnectButton; + private PopupMenu DisconnectPopup; private StringBuilder _nowLoadingSB; protected Text _loadingText; - private Button HostButton; - private GameObject ClientButton; - private Button DisconnectButton; - + // title screen only private GameObject ResumeGameButton; private GameObject NewGameButton; + private GameObject ClientButton; private const int _ClientButtonIndex = 2; private const int _DisconnectIndex = 3; @@ -67,7 +72,9 @@ namespace QSB.Menus private void Update() { - if ((LoadManager.GetLoadingScene() == OWScene.SolarSystem || LoadManager.GetLoadingScene() == OWScene.EyeOfTheUniverse) && _loadingText != null) + if (QSBCore.IsInMultiplayer + && (LoadManager.GetLoadingScene() == OWScene.SolarSystem || LoadManager.GetLoadingScene() == OWScene.EyeOfTheUniverse) + && _loadingText != null) { var num = LoadManager.GetAsyncLoadProgress(); num = num < 0.1f @@ -82,7 +89,6 @@ namespace QSB.Menus public void JoinGame(bool inEye, bool inSolarSystem) { - DebugLog.DebugWrite($"Join game ineye:{inEye} inSolarSystem:{inSolarSystem}"); if (inEye) { LoadManager.LoadSceneAsync(OWScene.EyeOfTheUniverse, true, LoadManager.FadeType.ToBlack, 1f, false); @@ -131,8 +137,8 @@ namespace QSB.Menus private void CreateCommonPopups() { - PopupMenu = MenuApi.MakeInputFieldPopup("IP Address", "IP Address", "Connect", "Cancel"); - PopupMenu.OnPopupConfirm += Connect; + IPPopup = MenuApi.MakeInputFieldPopup("IP Address", "IP Address", "Connect", "Cancel"); + IPPopup.OnPopupConfirm += Connect; InfoPopup = MenuApi.MakeInfoPopup("", ""); InfoPopup.OnDeactivateMenu += OnCloseInfoPopup; @@ -145,6 +151,7 @@ namespace QSB.Menus { if (button == null) { + DebugLog.DebugWrite($"Warning - Tried to set button to {active}, but it was null.", OWML.Common.MessageType.Warning); return; } @@ -159,40 +166,51 @@ namespace QSB.Menus HostButton = MenuApi.PauseMenu_MakeSimpleButton("OPEN TO MULTIPLAYER"); HostButton.onClick.AddListener(Host); - DisconnectButton = MenuApi.PauseMenu_MakeSimpleButton("DISCONNECT"); - DisconnectButton.onClick.AddListener(Disconnect); + DisconnectPopup = MenuApi.MakeTwoChoicePopup("Are you sure you want to disconnect?\r\nThis will send you back to the main menu.", "YES", "NO"); + DisconnectPopup.OnPopupConfirm += Disconnect; + + DisconnectButton = MenuApi.PauseMenu_MakeMenuOpenButton("DISCONNECT", DisconnectPopup); + + QuitButton = Resources.FindObjectsOfTypeAll().First(x => x.name == "Button-ExitToMainMenu").gameObject; if (QSBCore.IsInMultiplayer) { SetButtonActive(HostButton, false); SetButtonActive(DisconnectButton, true); + SetButtonActive(QuitButton, false); } else { SetButtonActive(HostButton, true); SetButtonActive(DisconnectButton, false); + SetButtonActive(QuitButton, true); } - OnConnected(); + var text = QSBCore.IsHost + ? "STOP HOSTING" + : "DISCONNECT"; + DisconnectButton.transform.GetChild(0).GetChild(1).GetComponent().text = text; + + var popupText = QSBCore.IsHost + ? "Are you sure you want to stop hosting?\r\nThis will disconnect all clients and send everyone back to the main menu." + : "Are you sure you want to disconnect?\r\nThis will send you back to the main menu."; + DisconnectPopup._labelText.text = popupText; } private void MakeTitleMenus() { CreateCommonPopups(); - ClientButton = MenuApi.TitleScreen_MakeMenuOpenButton("CONNECT TO MULTIPLAYER", _ClientButtonIndex, PopupMenu); + ClientButton = MenuApi.TitleScreen_MakeMenuOpenButton("CONNECT TO MULTIPLAYER", _ClientButtonIndex, IPPopup); - DisconnectButton = MenuApi.TitleScreen_MakeSimpleButton("DISCONNECT", _DisconnectIndex); - DisconnectButton.onClick.AddListener(Disconnect); - _loadingText = DisconnectButton.transform.GetChild(0).GetChild(1).GetComponent(); + _loadingText = ClientButton.transform.GetChild(0).GetChild(1).GetComponent(); ResumeGameButton = GameObject.Find("MainMenuLayoutGroup/Button-ResumeGame"); NewGameButton = GameObject.Find("MainMenuLayoutGroup/Button-NewGame"); if (QSBCore.IsInMultiplayer) { - ClientButton.SetActive(false); - SetButtonActive(DisconnectButton, true); + SetButtonActive(ClientButton, false); if (QSBCore.IsHost) { @@ -207,13 +225,11 @@ namespace QSB.Menus } else { - SetButtonActive(DisconnectButton, false); + SetButtonActive(ClientButton, true); SetButtonActive(ResumeGameButton, StandaloneProfileManager.SharedInstance.currentProfileGameSave.loopCount > 1); SetButtonActive(NewGameButton, true); } - OnConnected(); - if (QSBCore.SkipTitleScreen) { Application.runInBackground = true; @@ -238,34 +254,42 @@ namespace QSB.Menus { QSBNetworkManager.Instance.StopHost(); SetButtonActive(DisconnectButton.gameObject, false); - SetButtonActive(ClientButton, true); - SetButtonActive(HostButton, true); + + Locator.GetSceneMenuManager().pauseMenu._pauseMenu.EnableMenu(false); + Locator.GetSceneMenuManager().pauseMenu._isPaused = false; + + OWInput.RestorePreviousInputs(); + + LoadManager.LoadScene(OWScene.TitleScreen, LoadManager.FadeType.ToBlack, 2f, true); } private void Host() { - DebugLog.DebugWrite($"Host"); - if (QSBNetworkManager.Instance.StartHost() != null) { SetButtonActive(DisconnectButton, true); - SetButtonActive(ClientButton, false); SetButtonActive(HostButton, false); } else { OpenInfoPopup($"Failed to start server.", "OK"); } + + var text = QSBCore.IsHost + ? "STOP HOSTING" + : "DISCONNECT"; + DisconnectButton.transform.GetChild(0).GetChild(1).GetComponent().text = text; + + var popupText = QSBCore.IsHost + ? "Are you sure you want to stop hosting?\r\nThis will disconnect all clients and send everyone back to the main menu." + : "Are you sure you want to disconnect?\r\nThis will send you back to the main menu."; + DisconnectPopup._labelText.text = popupText; } private void Connect() { - QSBNetworkManager.Instance.networkAddress = string.Concat((PopupMenu as PopupInputMenu).GetInputText().Where(c => !char.IsWhiteSpace(c))); + QSBNetworkManager.Instance.networkAddress = string.Concat((IPPopup as PopupInputMenu).GetInputText().Where(c => !char.IsWhiteSpace(c))); QSBNetworkManager.Instance.StartClient(); - DisconnectButton.transform.GetChild(0).GetChild(1).GetComponent().text = "CONNECTING... (STOP)"; - - SetButtonActive(DisconnectButton, true); - SetButtonActive(ClientButton, false); if (QSBSceneManager.CurrentScene == OWScene.TitleScreen) { @@ -276,13 +300,6 @@ namespace QSB.Menus private void OnConnected() { - DebugLog.DebugWrite($"ON CONNECTED"); - - var text = QSBCore.IsHost - ? "STOP HOSTING" - : "DISCONNECT"; - DisconnectButton.transform.GetChild(0).GetChild(1).GetComponent().text = text; - if (QSBCore.IsHost || !QSBCore.IsInMultiplayer) { return; From 557941399f41ebcd2fed4e56662c101cf1e958a0 Mon Sep 17 00:00:00 2001 From: Mister_Nebula <41904486+misternebula@users.noreply.github.com> Date: Wed, 8 Dec 2021 10:57:00 +0000 Subject: [PATCH 16/30] quit back to main menu on error/disconnect/kick --- QSB/Menus/MenuManager.cs | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/QSB/Menus/MenuManager.cs b/QSB/Menus/MenuManager.cs index 96aa24a7..73308e3d 100644 --- a/QSB/Menus/MenuManager.cs +++ b/QSB/Menus/MenuManager.cs @@ -133,6 +133,11 @@ namespace QSB.Menus OWTime.Unpause(OWTime.PauseType.System); OWInput.RestorePreviousInputs(); + + if (QSBSceneManager.IsInUniverse) + { + LoadManager.LoadScene(OWScene.TitleScreen, LoadManager.FadeType.ToBlack, 2f, true); + } } private void CreateCommonPopups() @@ -307,7 +312,6 @@ namespace QSB.Menus QSBCore.UnityEvents.RunWhen(() => QSBEventManager.Ready && PlayerTransformSync.LocalInstance != null, () => { - DebugLog.DebugWrite($"requesting game details"); QSBEventManager.FireEvent(EventNames.QSBRequestGameDetails); }); } From 849bea21ce83abceb4eaf634ad0667555aa30ea7 Mon Sep 17 00:00:00 2001 From: Mister_Nebula <41904486+misternebula@users.noreply.github.com> Date: Wed, 8 Dec 2021 10:59:36 +0000 Subject: [PATCH 17/30] hide quit button --- QSB/Menus/MenuManager.cs | 14 +++++++++++--- 1 file changed, 11 insertions(+), 3 deletions(-) diff --git a/QSB/Menus/MenuManager.cs b/QSB/Menus/MenuManager.cs index 73308e3d..b34e525a 100644 --- a/QSB/Menus/MenuManager.cs +++ b/QSB/Menus/MenuManager.cs @@ -301,6 +301,11 @@ namespace QSB.Menus SetButtonActive(ResumeGameButton, false); SetButtonActive(NewGameButton, false); } + + if (QSBSceneManager.IsInUniverse) + { + SetButtonActive(QuitButton, false); + } } private void OnConnected() @@ -329,9 +334,10 @@ namespace QSB.Menus }; OpenInfoPopup(text, "OK"); - DisconnectButton.gameObject.SetActive(false); - ClientButton.SetActive(true); - HostButton?.gameObject.SetActive(true); + SetButtonActive(DisconnectButton, false); + SetButtonActive(ClientButton, true); + SetButtonActive(HostButton, true); + SetButtonActive(QuitButton, true); } private void OnDisconnected(NetworkError error) @@ -350,6 +356,7 @@ namespace QSB.Menus SetButtonActive(DisconnectButton, false); SetButtonActive(ClientButton, true); + SetButtonActive(QuitButton, true); SetButtonActive(HostButton, true); SetButtonActive(ResumeGameButton, StandaloneProfileManager.SharedInstance.currentProfileGameSave.loopCount > 1); SetButtonActive(NewGameButton, true); @@ -374,6 +381,7 @@ namespace QSB.Menus SetButtonActive(HostButton, true); SetButtonActive(ResumeGameButton, StandaloneProfileManager.SharedInstance.currentProfileGameSave.loopCount > 1); SetButtonActive(NewGameButton, true); + SetButtonActive(QuitButton, true); break; default: text = $"Internal QNet client error!\n\nNetworkError:{error}"; From 0e0c51e37100ee53e7a85be91999632f7f3773b3 Mon Sep 17 00:00:00 2001 From: Mister_Nebula <41904486+misternebula@users.noreply.github.com> Date: Wed, 8 Dec 2021 11:01:47 +0000 Subject: [PATCH 18/30] remove logs --- QSB/SaveSync/Events/GameStateEvent.cs | 14 -------------- 1 file changed, 14 deletions(-) diff --git a/QSB/SaveSync/Events/GameStateEvent.cs b/QSB/SaveSync/Events/GameStateEvent.cs index 9b2b1990..903da031 100644 --- a/QSB/SaveSync/Events/GameStateEvent.cs +++ b/QSB/SaveSync/Events/GameStateEvent.cs @@ -28,26 +28,12 @@ namespace QSB.SaveSync.Events public override void OnReceiveRemote(bool isHost, GameStateMessage message) { var gameSave = StandaloneProfileManager.SharedInstance.currentProfileGameSave; - DebugLog.DebugWrite($"loopcount:{message.LoopCount}"); gameSave.loopCount = message.LoopCount; - for (var i = 0; i < message.KnownFrequencies.Length; i++) - { - DebugLog.DebugWrite($"knowsFrequency{i}:{message.KnownFrequencies[i]}"); - } - gameSave.knownFrequencies = message.KnownFrequencies; - - foreach (var item in message.KnownSignals) - { - DebugLog.DebugWrite($"knowsSignal {item.Key}:{item.Value}"); - } - gameSave.knownSignals = message.KnownSignals; PlayerData.SaveCurrentGame(); - DebugLog.DebugWrite($"inEye:{message.InEye}"); - DebugLog.DebugWrite($"inSolarSystem:{message.InSolarSystem}"); if (message.InEye != (QSBSceneManager.CurrentScene == OWScene.EyeOfTheUniverse) || message.InSolarSystem != (QSBSceneManager.CurrentScene == OWScene.SolarSystem)) { From e163a2a69f529a993afa74b2e344758bce865d17 Mon Sep 17 00:00:00 2001 From: Mister_Nebula <41904486+misternebula@users.noreply.github.com> Date: Fri, 10 Dec 2021 14:54:51 +0000 Subject: [PATCH 19/30] some error catchers --- QSB/Animation/Player/AnimationSync.cs | 43 ++++++++++++++++++++------- QSB/Player/PlayerInfo.cs | 27 +++++++++++++++-- 2 files changed, 58 insertions(+), 12 deletions(-) diff --git a/QSB/Animation/Player/AnimationSync.cs b/QSB/Animation/Player/AnimationSync.cs index d6ef7908..abd85265 100644 --- a/QSB/Animation/Player/AnimationSync.cs +++ b/QSB/Animation/Player/AnimationSync.cs @@ -223,25 +223,48 @@ namespace QSB.Animation.Player break; } - InvisibleAnimator.runtimeAnimatorController = controller; - VisibleAnimator.runtimeAnimatorController = controller; + if (InvisibleAnimator == null) + { + DebugLog.ToConsole($"Error - InvisibleAnimator is null. ({PlayerId})", MessageType.Error); + } + else + { + InvisibleAnimator.runtimeAnimatorController = controller; + } + + if (VisibleAnimator == null) + { + DebugLog.ToConsole($"Error - VisibleAnimator is null. ({PlayerId})", MessageType.Error); + } + else + { + VisibleAnimator.runtimeAnimatorController = controller; + } + if (type is not AnimationType.PlayerSuited and not AnimationType.PlayerUnsuited) { - VisibleAnimator.SetTrigger("Playing"); - InvisibleAnimator.SetTrigger("Playing"); + VisibleAnimator?.SetTrigger("Playing"); + InvisibleAnimator?.SetTrigger("Playing"); } else { // Avoids "jumping" when exiting instrument and putting on suit - VisibleAnimator.SetTrigger("Grounded"); - InvisibleAnimator.SetTrigger("Grounded"); + VisibleAnimator?.SetTrigger("Grounded"); + InvisibleAnimator?.SetTrigger("Grounded"); } - NetworkAnimator.animator = InvisibleAnimator; // Probably not needed. - Mirror.RebuildFloatParams(); - for (var i = 0; i < InvisibleAnimator.parameterCount; i++) + if (NetworkAnimator == null) { - NetworkAnimator.SetParameterAutoSend(i, true); + DebugLog.ToConsole($"Error - NetworkAnimator is null. ({PlayerId})", MessageType.Error); + } + else + { + NetworkAnimator.animator = InvisibleAnimator; // Probably not needed. + Mirror.RebuildFloatParams(); + for (var i = 0; i < InvisibleAnimator?.parameterCount; i++) + { + NetworkAnimator.SetParameterAutoSend(i, true); + } } } } diff --git a/QSB/Player/PlayerInfo.cs b/QSB/Player/PlayerInfo.cs index 1b51d7a8..9507350d 100644 --- a/QSB/Player/PlayerInfo.cs +++ b/QSB/Player/PlayerInfo.cs @@ -225,7 +225,30 @@ namespace QSB.Player QSBEventManager.FireEvent(EventNames.QSBPlayerInformation); } - private QSBTool GetToolByType(ToolType type) => CameraBody?.GetComponentsInChildren() - .FirstOrDefault(x => x.Type == type); + private QSBTool GetToolByType(ToolType type) + { + if (CameraBody == null) + { + DebugLog.ToConsole($"Warning - Tried to GetToolByType({type}) on player {PlayerId}, but CameraBody was null.", MessageType.Warning); + return null; + } + + var tools = CameraBody.GetComponentsInChildren(); + + if (tools == null || tools.Length == 0) + { + DebugLog.ToConsole($"Warning - Couldn't find any QSBTools for player {PlayerId}.", MessageType.Warning); + return null; + } + + var tool = tools.FirstOrDefault(x => x.Type == type); + + if (tool == null) + { + DebugLog.ToConsole($"Warning - No tool found on player {PlayerId} matching ToolType {type}.", MessageType.Warning); + } + + return tool; + } } } \ No newline at end of file From 2ab553069e4b17a276575aa0002ef389c35a980b Mon Sep 17 00:00:00 2001 From: Mister_Nebula <41904486+misternebula@users.noreply.github.com> Date: Fri, 10 Dec 2021 21:12:01 +0000 Subject: [PATCH 20/30] idk what this breaks????? --- QSB/Syncs/SyncBase.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/QSB/Syncs/SyncBase.cs b/QSB/Syncs/SyncBase.cs index 1a25d7d8..8b7a4aee 100644 --- a/QSB/Syncs/SyncBase.cs +++ b/QSB/Syncs/SyncBase.cs @@ -73,7 +73,7 @@ namespace QSB.Syncs public PlayerInfo Player => QSBPlayerManager.GetPlayer(PlayerId); private bool _baseIsReady => QSBPlayerManager.PlayerExists(PlayerId) && Player != null - // && Player.IsReady + && Player.IsReady && NetId.Value != uint.MaxValue && NetId.Value != 0U && WorldObjectManager.AllObjectsAdded; From f6114f1f4f51507b13bf80423e4af56ccc5d8815 Mon Sep 17 00:00:00 2001 From: Mister_Nebula <41904486+misternebula@users.noreply.github.com> Date: Fri, 10 Dec 2021 21:12:11 +0000 Subject: [PATCH 21/30] remove sector sync error log --- QSB/SectorSync/SectorSync.cs | 1 - 1 file changed, 1 deletion(-) diff --git a/QSB/SectorSync/SectorSync.cs b/QSB/SectorSync/SectorSync.cs index ed1f9895..09ca9ec9 100644 --- a/QSB/SectorSync/SectorSync.cs +++ b/QSB/SectorSync/SectorSync.cs @@ -127,7 +127,6 @@ namespace QSB.SectorSync if (_sectorDetector == null || _attachedOWRigidbody == null || _targetType == TargetType.None) { IsReady = false; - DebugLog.ToConsole($"Error - SectorSync is no longer ready. Detector Null : {_sectorDetector == null}, OWRigidbody Null : {_attachedOWRigidbody == null}, None TargetType : {_targetType == TargetType.None}", MessageType.Error); return null; } From f502e4ee73a235bd843c4fa7c6437c63708d7e80 Mon Sep 17 00:00:00 2001 From: Mister_Nebula <41904486+misternebula@users.noreply.github.com> Date: Fri, 10 Dec 2021 21:12:27 +0000 Subject: [PATCH 22/30] dont update objects from states if player is not ready --- QSB/Player/QSBPlayerManager.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/QSB/Player/QSBPlayerManager.cs b/QSB/Player/QSBPlayerManager.cs index 35fb95fb..542deca6 100644 --- a/QSB/Player/QSBPlayerManager.cs +++ b/QSB/Player/QSBPlayerManager.cs @@ -89,7 +89,7 @@ namespace QSB.Player player.SignalscopeEquipped = message.SignalscopeEquipped; player.TranslatorEquipped = message.TranslatorEquipped; player.ProbeActive = message.ProbeActive; - if (LocalPlayer.IsReady) + if (LocalPlayer.IsReady && player.IsReady) { player.UpdateObjectsFromStates(); } From 916056c6057e0771b93257299ae42e1a498286ba Mon Sep 17 00:00:00 2001 From: Mister_Nebula <41904486+misternebula@users.noreply.github.com> Date: Fri, 10 Dec 2021 22:13:39 +0000 Subject: [PATCH 23/30] aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa --- .../TransformSync/AnglerTransformSync.cs | 1 + QSB/Animation/Player/AnimationSync.cs | 42 ++++++++++++++++--- .../Player/Events/AnimationTriggerEvent.cs | 5 +++ .../TransformSync/JellyfishTransformSync.cs | 1 + .../TransformSync/NomaiOrbTransformSync.cs | 2 + QSB/Player/Events/PlayerJoinEvent.cs | 1 + QSB/Player/Events/PlayerReadyEvent.cs | 4 +- QSB/Player/PlayerInfo.cs | 6 +-- QSB/Player/QSBPlayerManager.cs | 1 + .../TransformSync/PlayerTransformSync.cs | 23 ++++++++-- .../TransformSync/ShipTransformSync.cs | 2 + QSB/Syncs/SyncBase.cs | 26 +++++++++--- QSB/TimeSync/WakeUpSync.cs | 6 +++ .../TransformSync/PlayerProbeSync.cs | 1 + 14 files changed, 100 insertions(+), 21 deletions(-) diff --git a/QSB/Anglerfish/TransformSync/AnglerTransformSync.cs b/QSB/Anglerfish/TransformSync/AnglerTransformSync.cs index 3df7db00..01d874e0 100644 --- a/QSB/Anglerfish/TransformSync/AnglerTransformSync.cs +++ b/QSB/Anglerfish/TransformSync/AnglerTransformSync.cs @@ -11,6 +11,7 @@ namespace QSB.Anglerfish.TransformSync { public override bool IsReady => WorldObjectManager.AllObjectsAdded; public override bool UseInterpolation => false; + public override bool IsPlayerObject => false; private QSBAngler _qsbAngler; private static readonly List _instances = new(); diff --git a/QSB/Animation/Player/AnimationSync.cs b/QSB/Animation/Player/AnimationSync.cs index abd85265..fd12e7b9 100644 --- a/QSB/Animation/Player/AnimationSync.cs +++ b/QSB/Animation/Player/AnimationSync.cs @@ -187,19 +187,45 @@ namespace QSB.Animation.Player DebugLog.ToConsole($"Error - Suited controller is null. ({PlayerId})", MessageType.Error); } + if (_unsuitedGraphics == null) + { + DebugLog.ToConsole($"Warning - _unsuitedGraphics is null! ({PlayerId})", MessageType.Warning); + } + + if (_suitedGraphics == null) + { + DebugLog.ToConsole($"Warning - _suitedGraphics is null! ({PlayerId})", MessageType.Warning); + } + RuntimeAnimatorController controller = default; switch (type) { case AnimationType.PlayerSuited: controller = _suitedAnimController; - _unsuitedGraphics?.SetActive(false); - _suitedGraphics?.SetActive(true); + if (_unsuitedGraphics != null) + { + _unsuitedGraphics?.SetActive(false); + } + + if (_suitedGraphics != null) + { + _suitedGraphics?.SetActive(true); + } + break; case AnimationType.PlayerUnsuited: controller = _unsuitedAnimController; - _unsuitedGraphics?.SetActive(true); - _suitedGraphics?.SetActive(false); + if (_unsuitedGraphics != null) + { + _unsuitedGraphics?.SetActive(true); + } + + if (_suitedGraphics != null) + { + _suitedGraphics?.SetActive(false); + } + break; case AnimationType.Chert: @@ -257,11 +283,15 @@ namespace QSB.Animation.Player { DebugLog.ToConsole($"Error - NetworkAnimator is null. ({PlayerId})", MessageType.Error); } - else + else if (Mirror == null) + { + DebugLog.ToConsole($"Error - Mirror is null. ({PlayerId})", MessageType.Error); + } + else if (InvisibleAnimator != null) { NetworkAnimator.animator = InvisibleAnimator; // Probably not needed. Mirror.RebuildFloatParams(); - for (var i = 0; i < InvisibleAnimator?.parameterCount; i++) + for (var i = 0; i < InvisibleAnimator.parameterCount; i++) { NetworkAnimator.SetParameterAutoSend(i, true); } diff --git a/QSB/Animation/Player/Events/AnimationTriggerEvent.cs b/QSB/Animation/Player/Events/AnimationTriggerEvent.cs index 951311ba..4aac7220 100644 --- a/QSB/Animation/Player/Events/AnimationTriggerEvent.cs +++ b/QSB/Animation/Player/Events/AnimationTriggerEvent.cs @@ -27,6 +27,11 @@ namespace QSB.Animation.Player.Events return; } + if (animationSync.VisibleAnimator == null) + { + return; + } + animationSync.VisibleAnimator.SetTrigger(message.Name); } } diff --git a/QSB/JellyfishSync/TransformSync/JellyfishTransformSync.cs b/QSB/JellyfishSync/TransformSync/JellyfishTransformSync.cs index f14aa1cd..ca493cee 100644 --- a/QSB/JellyfishSync/TransformSync/JellyfishTransformSync.cs +++ b/QSB/JellyfishSync/TransformSync/JellyfishTransformSync.cs @@ -13,6 +13,7 @@ namespace QSB.JellyfishSync.TransformSync { public override bool IsReady => WorldObjectManager.AllObjectsAdded; public override bool UseInterpolation => false; + public override bool IsPlayerObject => false; private QSBJellyfish _qsbJellyfish; private static readonly List _instances = new(); diff --git a/QSB/OrbSync/TransformSync/NomaiOrbTransformSync.cs b/QSB/OrbSync/TransformSync/NomaiOrbTransformSync.cs index aacb5eb8..600e6a8c 100644 --- a/QSB/OrbSync/TransformSync/NomaiOrbTransformSync.cs +++ b/QSB/OrbSync/TransformSync/NomaiOrbTransformSync.cs @@ -11,6 +11,8 @@ namespace QSB.OrbSync.TransformSync { public static List OrbTransformSyncs = new(); + public override bool IsPlayerObject => false; + private int _index => OrbTransformSyncs.IndexOf(this); public override void OnStartClient() => OrbTransformSyncs.Add(this); diff --git a/QSB/Player/Events/PlayerJoinEvent.cs b/QSB/Player/Events/PlayerJoinEvent.cs index d0177a15..56d68060 100644 --- a/QSB/Player/Events/PlayerJoinEvent.cs +++ b/QSB/Player/Events/PlayerJoinEvent.cs @@ -80,6 +80,7 @@ namespace QSB.Player.Events if (QSBSceneManager.IsInUniverse) { + DebugLog.DebugWrite($"Joined! SENDING READY = TRUE"); QSBPlayerManager.LocalPlayer.IsReady = true; QSBEventManager.FireEvent(EventNames.QSBPlayerReady, true); } diff --git a/QSB/Player/Events/PlayerReadyEvent.cs b/QSB/Player/Events/PlayerReadyEvent.cs index 8da97c2c..9cbfc962 100644 --- a/QSB/Player/Events/PlayerReadyEvent.cs +++ b/QSB/Player/Events/PlayerReadyEvent.cs @@ -34,14 +34,14 @@ namespace QSB.Player.Events private static void HandleServer(ToggleMessage message) { - DebugLog.DebugWrite($"[SERVER] Get ready event from {message.FromId}", MessageType.Success); + DebugLog.DebugWrite($"[SERVER] Get ready event from {message.FromId} (ready = {message.ToggleValue})", MessageType.Success); QSBPlayerManager.GetPlayer(message.AboutId).IsReady = message.ToggleValue; QSBEventManager.FireEvent(EventNames.QSBPlayerInformation); } private void HandleClient(ToggleMessage message) { - DebugLog.DebugWrite($"[CLIENT] Get ready event from {message.FromId}", MessageType.Success); + DebugLog.DebugWrite($"[CLIENT] Get ready event from {message.FromId} (ready = {message.ToggleValue})", MessageType.Success); if (!QSBPlayerManager.PlayerExists(message.FromId)) { DebugLog.ToConsole( diff --git a/QSB/Player/PlayerInfo.cs b/QSB/Player/PlayerInfo.cs index 9507350d..b37444f4 100644 --- a/QSB/Player/PlayerInfo.cs +++ b/QSB/Player/PlayerInfo.cs @@ -142,7 +142,7 @@ namespace QSB.Player return null; } - return CameraBody.transform.Find("ProbeLauncher").GetComponent(); + return CameraBody?.transform.Find("ProbeLauncher").GetComponent(); } } @@ -170,7 +170,7 @@ namespace QSB.Player return null; } - return CameraBody.transform.Find("Signalscope").GetComponent(); + return CameraBody?.transform.Find("Signalscope").GetComponent(); } } @@ -184,7 +184,7 @@ namespace QSB.Player return null; } - return CameraBody.transform.Find("NomaiTranslatorProp").GetComponent(); + return CameraBody?.transform.Find("NomaiTranslatorProp").GetComponent(); } } diff --git a/QSB/Player/QSBPlayerManager.cs b/QSB/Player/QSBPlayerManager.cs index 542deca6..c34272e9 100644 --- a/QSB/Player/QSBPlayerManager.cs +++ b/QSB/Player/QSBPlayerManager.cs @@ -91,6 +91,7 @@ namespace QSB.Player player.ProbeActive = message.ProbeActive; if (LocalPlayer.IsReady && player.IsReady) { + DebugLog.DebugWrite($"{player.PlayerId} UpdateObjectsFromStates player.IsReady:{player.IsReady}, camerabody null :{player.CameraBody == null}"); player.UpdateObjectsFromStates(); } diff --git a/QSB/Player/TransformSync/PlayerTransformSync.cs b/QSB/Player/TransformSync/PlayerTransformSync.cs index e82cfac7..6f670f44 100644 --- a/QSB/Player/TransformSync/PlayerTransformSync.cs +++ b/QSB/Player/TransformSync/PlayerTransformSync.cs @@ -17,6 +17,8 @@ namespace QSB.Player.TransformSync { static PlayerTransformSync() => AnimControllerPatch.Init(); + public override bool IsPlayerObject => true; + private Transform _visibleCameraRoot; private Transform _networkCameraRoot => gameObject.transform.GetChild(0); @@ -58,13 +60,16 @@ namespace QSB.Player.TransformSync base.OnSceneLoaded(oldScene, newScene, isInUniverse); } - if (isInUniverse) + if (isInUniverse && !_isInitialized) { - Player.IsReady = true; - QSBEventManager.FireEvent(EventNames.QSBPlayerReady, true); + DebugLog.DebugWrite($"Is in universe, but is not initialized! SENDING READY = FALSE"); + Player.IsReady = false; + QSBEventManager.FireEvent(EventNames.QSBPlayerReady, false); } - else + + if (!isInUniverse) { + DebugLog.DebugWrite($"Is not in universe! SENDING READY = FALSE"); Player.IsReady = false; QSBEventManager.FireEvent(EventNames.QSBPlayerReady, false); } @@ -72,6 +77,16 @@ namespace QSB.Player.TransformSync base.OnSceneLoaded(oldScene, newScene, isInUniverse); } + protected override void Init() + { + base.Init(); + + DebugLog.DebugWrite($"Init! SENDING READY = TRUE"); + + Player.IsReady = true; + QSBEventManager.FireEvent(EventNames.QSBPlayerReady, true); + } + protected override void OnDestroy() { // TODO : Maybe move this to a leave event...? Would ensure everything could finish up before removing the player diff --git a/QSB/ShipSync/TransformSync/ShipTransformSync.cs b/QSB/ShipSync/TransformSync/ShipTransformSync.cs index d5f910ed..9921365d 100644 --- a/QSB/ShipSync/TransformSync/ShipTransformSync.cs +++ b/QSB/ShipSync/TransformSync/ShipTransformSync.cs @@ -10,6 +10,8 @@ namespace QSB.ShipSync.TransformSync { public static ShipTransformSync LocalInstance { get; private set; } + public override bool IsPlayerObject => false; + private const int ForcePositionAfterUpdates = 50; private int _updateCount; diff --git a/QSB/Syncs/SyncBase.cs b/QSB/Syncs/SyncBase.cs index 8b7a4aee..291651b0 100644 --- a/QSB/Syncs/SyncBase.cs +++ b/QSB/Syncs/SyncBase.cs @@ -58,6 +58,11 @@ namespace QSB.Syncs { get { + if (!IsPlayerObject) + { + return uint.MaxValue; + } + if (NetIdentity == null) { DebugLog.ToConsole($"Error - Trying to get PlayerId with null NetIdentity! Type:{GetType().Name} GrandType:{GetType().GetType().Name}", MessageType.Error); @@ -71,9 +76,10 @@ namespace QSB.Syncs } public PlayerInfo Player => QSBPlayerManager.GetPlayer(PlayerId); - private bool _baseIsReady => QSBPlayerManager.PlayerExists(PlayerId) - && Player != null - && Player.IsReady + private bool _baseIsReady + => (!IsPlayerObject || QSBPlayerManager.PlayerExists(PlayerId)) + && (!IsPlayerObject || Player != null) + && (!IsPlayerObject || Player.IsReady) && NetId.Value != uint.MaxValue && NetId.Value != 0U && WorldObjectManager.AllObjectsAdded; @@ -82,6 +88,7 @@ namespace QSB.Syncs public abstract bool IgnoreDisabledAttachedObject { get; } public abstract bool IgnoreNullReferenceTransform { get; } public abstract bool ShouldReparentAttachedObject { get; } + public abstract bool IsPlayerObject { get; } public Component AttachedObject { get; set; } public Transform ReferenceTransform { get; set; } @@ -99,16 +106,23 @@ namespace QSB.Syncs public virtual void Start() { - var lowestBound = QSBWorldSync.GetUnityObjects() + if (IsPlayerObject) + { + var lowestBound = QSBWorldSync.GetUnityObjects() .Where(x => x.NetId.Value <= NetId.Value).OrderBy(x => x.NetId.Value).Last(); - NetIdentity.SetRootIdentity(lowestBound.NetIdentity); + NetIdentity.SetRootIdentity(lowestBound.NetIdentity); + } DontDestroyOnLoad(gameObject); QSBSceneManager.OnSceneLoaded += OnSceneLoaded; if (Player == null) { - DebugLog.ToConsole($"Error - Player in start of {LogName} was null!", MessageType.Error); + if (IsPlayerObject) + { + DebugLog.ToConsole($"Error - Player in start of {LogName} was null!", MessageType.Error); + } + return; } diff --git a/QSB/TimeSync/WakeUpSync.cs b/QSB/TimeSync/WakeUpSync.cs index c3ff6069..db66dc42 100644 --- a/QSB/TimeSync/WakeUpSync.cs +++ b/QSB/TimeSync/WakeUpSync.cs @@ -153,6 +153,12 @@ namespace QSB.TimeSync var myTime = Time.timeSinceLevelLoad; var diff = myTime - _serverTime; + if (ServerStateManager.Instance.GetServerState() is not ServerState.InSolarSystem and not ServerState.InEye) + { + DebugLog.ToConsole($"nah serverstate:{ServerStateManager.Instance.GetServerState()} (Target:{_serverTime} Current:{Time.timeSinceLevelLoad})"); + return; + } + if (diff > PauseOrFastForwardThreshold) { StartPausing(PauseReason.TooFarAhead); diff --git a/QSB/Tools/ProbeTool/TransformSync/PlayerProbeSync.cs b/QSB/Tools/ProbeTool/TransformSync/PlayerProbeSync.cs index 7eb63bd3..d2ea936b 100644 --- a/QSB/Tools/ProbeTool/TransformSync/PlayerProbeSync.cs +++ b/QSB/Tools/ProbeTool/TransformSync/PlayerProbeSync.cs @@ -15,6 +15,7 @@ namespace QSB.Tools.ProbeTool.TransformSync protected override float DistanceLeeway => 10f; public override bool UseInterpolation => true; public override bool IgnoreDisabledAttachedObject => true; + public override bool IsPlayerObject => true; public static PlayerProbeSync LocalInstance { get; private set; } From 7c1f9ac3a60e0ecc045846f571f4310e5b632765 Mon Sep 17 00:00:00 2001 From: Mister_Nebula <41904486+misternebula@users.noreply.github.com> Date: Sat, 11 Dec 2021 10:50:17 +0000 Subject: [PATCH 24/30] me me stupid --- QSB/Player/QSBPlayerManager.cs | 2 +- QSB/Syncs/SyncBase.cs | 93 ++++++++++++----------------- QSB/WorldSync/WorldObjectManager.cs | 12 +--- 3 files changed, 41 insertions(+), 66 deletions(-) diff --git a/QSB/Player/QSBPlayerManager.cs b/QSB/Player/QSBPlayerManager.cs index c34272e9..927804f8 100644 --- a/QSB/Player/QSBPlayerManager.cs +++ b/QSB/Player/QSBPlayerManager.cs @@ -179,7 +179,7 @@ namespace QSB.Player return null; } - return playerList.Where(x => x.IsReady).OrderBy(x => Vector3.Distance(x.Body.transform.position, worldPoint)).FirstOrDefault(); + return playerList.Where(x => x.IsReady && x.Body != null).OrderBy(x => Vector3.Distance(x.Body.transform.position, worldPoint)).FirstOrDefault(); } public static IEnumerable> GetPlayerCarryItems() diff --git a/QSB/Syncs/SyncBase.cs b/QSB/Syncs/SyncBase.cs index 291651b0..5409c977 100644 --- a/QSB/Syncs/SyncBase.cs +++ b/QSB/Syncs/SyncBase.cs @@ -18,28 +18,6 @@ namespace QSB.Syncs public abstract class SyncBase : QNetworkTransform { - private static readonly Dictionary> _storedTransformSyncs = new(); - - public static T GetPlayers(PlayerInfo player) - where T : SyncBase - { - var dictOfOwnedSyncs = _storedTransformSyncs[player.PlayerId]; - var wantedSync = dictOfOwnedSyncs[typeof(T)]; - if (wantedSync == default) - { - DebugLog.ToConsole($"Error - _storedTransformSyncs does not contain type:{typeof(T)} under player {player.PlayerId}. Attempting to find manually...", MessageType.Error); - var allSyncs = QSBWorldSync.GetUnityObjects(); - wantedSync = allSyncs.First(x => x.Player == player); - if (wantedSync == default) - { - DebugLog.ToConsole($"Error - Could not find type:{typeof(T)} for player {player.PlayerId} manually!", MessageType.Error); - return default; - } - } - - return (T)wantedSync; - } - public uint AttachedNetId { get @@ -76,13 +54,43 @@ namespace QSB.Syncs } public PlayerInfo Player => QSBPlayerManager.GetPlayer(PlayerId); - private bool _baseIsReady - => (!IsPlayerObject || QSBPlayerManager.PlayerExists(PlayerId)) - && (!IsPlayerObject || Player != null) - && (!IsPlayerObject || Player.IsReady) - && NetId.Value != uint.MaxValue - && NetId.Value != 0U - && WorldObjectManager.AllObjectsAdded; + + private bool _baseIsReady + { + get + { + if (NetId.Value is uint.MaxValue or 0U) + { + return false; + } + + if (!WorldObjectManager.AllObjectsAdded) + { + return false; + } + + if (IsPlayerObject) + { + if (!QSBPlayerManager.PlayerExists(PlayerId)) + { + return false; + } + + if (Player == null) + { + return false; + } + + if (!Player.IsReady && !IsLocalPlayer) + { + return false; + } + } + + return true; + } + } + public abstract bool IsReady { get; } public abstract bool UseInterpolation { get; } public abstract bool IgnoreDisabledAttachedObject { get; } @@ -115,24 +123,6 @@ namespace QSB.Syncs DontDestroyOnLoad(gameObject); QSBSceneManager.OnSceneLoaded += OnSceneLoaded; - - if (Player == null) - { - if (IsPlayerObject) - { - DebugLog.ToConsole($"Error - Player in start of {LogName} was null!", MessageType.Error); - } - - return; - } - - if (!_storedTransformSyncs.ContainsKey(PlayerId)) - { - _storedTransformSyncs.Add(PlayerId, new Dictionary()); - } - - var playerDict = _storedTransformSyncs[PlayerId]; - playerDict[GetType()] = this; } protected virtual void OnDestroy() @@ -146,14 +136,6 @@ namespace QSB.Syncs } QSBSceneManager.OnSceneLoaded -= OnSceneLoaded; - - if (!QSBPlayerManager.PlayerExists(PlayerId)) - { - return; - } - - var playerDict = _storedTransformSyncs[PlayerId]; - playerDict.Remove(GetType()); } protected virtual void Init() @@ -182,7 +164,6 @@ namespace QSB.Syncs { if (!_isInitialized && IsReady && _baseIsReady) { - try { Init(); diff --git a/QSB/WorldSync/WorldObjectManager.cs b/QSB/WorldSync/WorldObjectManager.cs index 2c0d1f99..76394646 100644 --- a/QSB/WorldSync/WorldObjectManager.cs +++ b/QSB/WorldSync/WorldObjectManager.cs @@ -49,25 +49,19 @@ namespace QSB.WorldSync { if (!QSBNetworkManager.Instance.IsReady) { - DebugLog.ToConsole($"Warning - Tried to rebuild WorldObjects when Network Manager not ready!", OWML.Common.MessageType.Warning); + DebugLog.ToConsole($"Warning - Tried to rebuild WorldObjects when Network Manager not ready! Building when ready...", MessageType.Warning); QSBCore.UnityEvents.RunWhen(() => QSBNetworkManager.Instance.IsReady, () => Rebuild(scene)); return; } if (QSBPlayerManager.LocalPlayerId == uint.MaxValue) { - DebugLog.ToConsole($"Warning - Tried to rebuild WorldObjects when LocalPlayer is not ready!", OWML.Common.MessageType.Warning); + DebugLog.ToConsole($"Warning - Tried to rebuild WorldObjects when LocalPlayer is not ready! Building when ready...", MessageType.Warning); QSBCore.UnityEvents.RunWhen(() => QSBPlayerManager.LocalPlayerId != uint.MaxValue, () => Rebuild(scene)); return; } - if (QSBPlayerManager.LocalPlayer.IsReady) - { - DoRebuild(scene); - return; - } - - QSBCore.UnityEvents.RunWhen(() => QSBPlayerManager.LocalPlayer.IsReady, () => DoRebuild(scene)); + DoRebuild(scene); } private static void DoRebuild(OWScene scene) From 72938b4c7cbd78775273f16719320932b8c08caa Mon Sep 17 00:00:00 2001 From: Mister_Nebula <41904486+misternebula@users.noreply.github.com> Date: Sat, 11 Dec 2021 11:47:07 +0000 Subject: [PATCH 25/30] removed logs --- QSB/Inputs/QSBInputManager.cs | 1 - QSB/Player/Events/PlayerJoinEvent.cs | 1 - QSB/Player/PlayerHUDMarker.cs | 1 - QSB/Player/QSBPlayerManager.cs | 1 - QSB/Player/TransformSync/PlayerTransformSync.cs | 4 ---- QSB/StatueSync/Events/StartStatueEvent.cs | 10 +++++++--- QSB/TimeSync/WakeUpSync.cs | 9 --------- 7 files changed, 7 insertions(+), 20 deletions(-) diff --git a/QSB/Inputs/QSBInputManager.cs b/QSB/Inputs/QSBInputManager.cs index 840ffeb0..dcf06a1b 100644 --- a/QSB/Inputs/QSBInputManager.cs +++ b/QSB/Inputs/QSBInputManager.cs @@ -58,7 +58,6 @@ namespace QSB.Inputs public void SetInputsEnabled(bool enabled) { - DebugLog.DebugWrite($"INPUTS ENABLED? : {enabled}"); InputsEnabled = enabled; } } diff --git a/QSB/Player/Events/PlayerJoinEvent.cs b/QSB/Player/Events/PlayerJoinEvent.cs index 56d68060..d0177a15 100644 --- a/QSB/Player/Events/PlayerJoinEvent.cs +++ b/QSB/Player/Events/PlayerJoinEvent.cs @@ -80,7 +80,6 @@ namespace QSB.Player.Events if (QSBSceneManager.IsInUniverse) { - DebugLog.DebugWrite($"Joined! SENDING READY = TRUE"); QSBPlayerManager.LocalPlayer.IsReady = true; QSBEventManager.FireEvent(EventNames.QSBPlayerReady, true); } diff --git a/QSB/Player/PlayerHUDMarker.cs b/QSB/Player/PlayerHUDMarker.cs index 30f4d5a1..0e411f5f 100644 --- a/QSB/Player/PlayerHUDMarker.cs +++ b/QSB/Player/PlayerHUDMarker.cs @@ -21,7 +21,6 @@ namespace QSB.Player public void Init(PlayerInfo player) { - DebugLog.DebugWrite($"Init {player.PlayerId} name:{player.Name}"); _player = player; _player.HudMarker = this; _needsInitializing = true; diff --git a/QSB/Player/QSBPlayerManager.cs b/QSB/Player/QSBPlayerManager.cs index 927804f8..6895a1da 100644 --- a/QSB/Player/QSBPlayerManager.cs +++ b/QSB/Player/QSBPlayerManager.cs @@ -91,7 +91,6 @@ namespace QSB.Player player.ProbeActive = message.ProbeActive; if (LocalPlayer.IsReady && player.IsReady) { - DebugLog.DebugWrite($"{player.PlayerId} UpdateObjectsFromStates player.IsReady:{player.IsReady}, camerabody null :{player.CameraBody == null}"); player.UpdateObjectsFromStates(); } diff --git a/QSB/Player/TransformSync/PlayerTransformSync.cs b/QSB/Player/TransformSync/PlayerTransformSync.cs index 6f670f44..8c90ead7 100644 --- a/QSB/Player/TransformSync/PlayerTransformSync.cs +++ b/QSB/Player/TransformSync/PlayerTransformSync.cs @@ -62,14 +62,12 @@ namespace QSB.Player.TransformSync if (isInUniverse && !_isInitialized) { - DebugLog.DebugWrite($"Is in universe, but is not initialized! SENDING READY = FALSE"); Player.IsReady = false; QSBEventManager.FireEvent(EventNames.QSBPlayerReady, false); } if (!isInUniverse) { - DebugLog.DebugWrite($"Is not in universe! SENDING READY = FALSE"); Player.IsReady = false; QSBEventManager.FireEvent(EventNames.QSBPlayerReady, false); } @@ -81,8 +79,6 @@ namespace QSB.Player.TransformSync { base.Init(); - DebugLog.DebugWrite($"Init! SENDING READY = TRUE"); - Player.IsReady = true; QSBEventManager.FireEvent(EventNames.QSBPlayerReady, true); } diff --git a/QSB/StatueSync/Events/StartStatueEvent.cs b/QSB/StatueSync/Events/StartStatueEvent.cs index f9e95ecc..c0df8d01 100644 --- a/QSB/StatueSync/Events/StartStatueEvent.cs +++ b/QSB/StatueSync/Events/StartStatueEvent.cs @@ -28,8 +28,6 @@ namespace QSB.StatueSync.Events public override void OnReceiveLocal(bool server, StartStatueMessage message) { - DebugLog.DebugWrite($"OnReceiveLocal StartStatueEvent"); - if (!QSBCore.IsHost) { return; @@ -40,8 +38,14 @@ namespace QSB.StatueSync.Events public override void OnReceiveRemote(bool server, StartStatueMessage message) { - DebugLog.DebugWrite($"OnReceiveRemote StartStatueEvent"); StatueManager.Instance.BeginSequence(message.PlayerPosition, message.PlayerRotation, message.CameraDegrees); + + if (!QSBCore.IsHost) + { + return; + } + + QSBEventManager.FireEvent(EventNames.QSBServerState, ServerState.InStatueCutscene); } } } diff --git a/QSB/TimeSync/WakeUpSync.cs b/QSB/TimeSync/WakeUpSync.cs index db66dc42..bac9d9d9 100644 --- a/QSB/TimeSync/WakeUpSync.cs +++ b/QSB/TimeSync/WakeUpSync.cs @@ -278,7 +278,6 @@ namespace QSB.TimeSync { if (CurrentState != State.Pausing) { - DebugLog.DebugWrite($"Wait for other clients to be ready"); StartPausing(PauseReason.WaitingForAllPlayersToBeReady); } } @@ -287,7 +286,6 @@ namespace QSB.TimeSync { if (clientState == ClientState.AliveInSolarSystem && serverState == ServerState.InSolarSystem) { - DebugLog.DebugWrite($"start of new loop!"); ResetTimeScale(); } } @@ -352,13 +350,11 @@ namespace QSB.TimeSync if (serverState == ServerState.NotLoaded && CurrentState != State.Pausing && QSBSceneManager.IsInUniverse) { - DebugLog.DebugWrite($"Server Not Loaded"); StartPausing(PauseReason.ServerNotStarted); } if (serverState == ServerState.WaitingForAllPlayersToReady && CurrentState != State.Pausing && clientState == ClientState.WaitingForOthersToReadyInSolarSystem) { - DebugLog.DebugWrite($"Awaiting Play Confirmation"); StartPausing(PauseReason.WaitingForAllPlayersToBeReady); } @@ -369,7 +365,6 @@ namespace QSB.TimeSync if (serverState == ServerState.WaitingForAllPlayersToDie && clientState == ClientState.WaitingForOthersToReadyInSolarSystem) { - DebugLog.DebugWrite($"Wait for others to load new scene"); StartPausing(PauseReason.WaitingForAllPlayersToBeReady); } @@ -379,7 +374,6 @@ namespace QSB.TimeSync { if (serverState != ServerState.NotLoaded) { - DebugLog.DebugWrite($"Server started!"); ResetTimeScale(); } } @@ -388,7 +382,6 @@ namespace QSB.TimeSync { if (clientState == ClientState.AliveInSolarSystem && serverState == ServerState.InSolarSystem) { - DebugLog.DebugWrite($"start of new loop!"); ResetTimeScale(); } } @@ -397,7 +390,6 @@ namespace QSB.TimeSync { if (Time.timeSinceLevelLoad <= _serverTime) { - DebugLog.DebugWrite($"Done pausing to match time!"); ResetTimeScale(); } } @@ -406,7 +398,6 @@ namespace QSB.TimeSync { if (Time.timeSinceLevelLoad >= _serverTime) { - DebugLog.DebugWrite($"Done fast-forwarding to match time!"); ResetTimeScale(); } } From accef60619708fbdc1ad8a62837ed45ebd31ff3b Mon Sep 17 00:00:00 2001 From: Mister_Nebula <41904486+misternebula@users.noreply.github.com> Date: Sat, 11 Dec 2021 11:47:21 +0000 Subject: [PATCH 26/30] add _waitingForEvent --- QSB/Player/Events/PlayerInformationEvent.cs | 2 +- QSB/Player/Events/RequestStateResyncEvent.cs | 25 +++++++++++++++++++- 2 files changed, 25 insertions(+), 2 deletions(-) diff --git a/QSB/Player/Events/PlayerInformationEvent.cs b/QSB/Player/Events/PlayerInformationEvent.cs index 3ba248fb..5dda07bc 100644 --- a/QSB/Player/Events/PlayerInformationEvent.cs +++ b/QSB/Player/Events/PlayerInformationEvent.cs @@ -29,7 +29,7 @@ namespace QSB.Player.Events public override void OnReceiveRemote(bool server, PlayerInformationMessage message) { - DebugLog.DebugWrite($"Received playerstate of player ID {message.AboutId}", MessageType.Info); + RequestStateResyncEvent._waitingForEvent = false; if (QSBPlayerManager.PlayerExists(message.AboutId)) { QSBPlayerManager.HandleFullStateMessage(message); diff --git a/QSB/Player/Events/RequestStateResyncEvent.cs b/QSB/Player/Events/RequestStateResyncEvent.cs index fabfa614..f7b7e654 100644 --- a/QSB/Player/Events/RequestStateResyncEvent.cs +++ b/QSB/Player/Events/RequestStateResyncEvent.cs @@ -16,18 +16,41 @@ namespace QSB.Player.Events // Can be sent by any client (including host) to signal they want latest worldobject, player, and server infomation public class RequestStateResyncEvent : QSBEvent { + public static bool _waitingForEvent; + public override bool RequireWorldObjectsReady => false; public override void SetupListener() => GlobalMessenger.AddListener(EventNames.QSBRequestStateResync, Handler); public override void CloseListener() => GlobalMessenger.RemoveListener(EventNames.QSBRequestStateResync, Handler); - private void Handler() => SendEvent(CreateMessage()); + private void Handler() + { + if (_waitingForEvent) + { + return; + } + + _waitingForEvent = true; + SendEvent(CreateMessage()); + } private PlayerMessage CreateMessage() => new() { AboutId = LocalPlayerId }; + public override void OnReceiveLocal(bool isHost, PlayerMessage message) + { + QSBCore.UnityEvents.FireInNUpdates(() => + { + if (_waitingForEvent) + { + DebugLog.ToConsole($"Did not receive PlayerInformationEvent in time. Setting _waitingForEvent to false.", OWML.Common.MessageType.Info); + _waitingForEvent = false; + } + }, 60); + } + public override void OnReceiveRemote(bool isHost, PlayerMessage message) { // send response only to the requesting client From 65ec923e33a12099eadc79e7530708829545b472 Mon Sep 17 00:00:00 2001 From: Mister_Nebula <41904486+misternebula@users.noreply.github.com> Date: Sat, 11 Dec 2021 11:47:37 +0000 Subject: [PATCH 27/30] fix check for messages recieved from not ready player --- QSB/Events/QSBEvent.cs | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/QSB/Events/QSBEvent.cs b/QSB/Events/QSBEvent.cs index 8a59d500..dde34852 100644 --- a/QSB/Events/QSBEvent.cs +++ b/QSB/Events/QSBEvent.cs @@ -98,9 +98,9 @@ namespace QSB.Events if (!player.IsReady && player.PlayerId != LocalPlayerId && player.State is ClientState.AliveInSolarSystem or ClientState.AliveInEye or ClientState.DeadInSolarSystem - && this is not PlayerInformationEvent or PlayerReadyEvent) + && this is not PlayerInformationEvent and not PlayerReadyEvent and not RequestStateResyncEvent) { - DebugLog.ToConsole($"Warning - Got message from player {message.FromId}, but they were not ready. Asking for state resync, just in case.", MessageType.Warning); + DebugLog.ToConsole($"Warning - Got message (type:{GetType().Name}) from player {message.FromId}, but they were not ready. Asking for state resync, just in case.", MessageType.Warning); QSBEventManager.FireEvent(EventNames.QSBRequestStateResync); } } From d9e250d19161f8f7c0ed8b74dff2cce64c042470 Mon Sep 17 00:00:00 2001 From: Mister_Nebula <41904486+misternebula@users.noreply.github.com> Date: Sat, 11 Dec 2021 20:06:02 +0000 Subject: [PATCH 28/30] help --- QSB/Animation/Player/AnimationSync.cs | 22 ++++++++++++++++++---- QSB/Events/QSBEvent.cs | 6 +++++- QSB/Player/PlayerInfo.cs | 6 ++++++ QSB/TimeSync/WakeUpSync.cs | 6 ------ 4 files changed, 29 insertions(+), 11 deletions(-) diff --git a/QSB/Animation/Player/AnimationSync.cs b/QSB/Animation/Player/AnimationSync.cs index fd12e7b9..806b80df 100644 --- a/QSB/Animation/Player/AnimationSync.cs +++ b/QSB/Animation/Player/AnimationSync.cs @@ -269,14 +269,28 @@ namespace QSB.Animation.Player if (type is not AnimationType.PlayerSuited and not AnimationType.PlayerUnsuited) { - VisibleAnimator?.SetTrigger("Playing"); - InvisibleAnimator?.SetTrigger("Playing"); + if (VisibleAnimator != null) + { + VisibleAnimator.SetTrigger("Playing"); + } + + if (InvisibleAnimator != null) + { + InvisibleAnimator.SetTrigger("Playing"); + } } else { // Avoids "jumping" when exiting instrument and putting on suit - VisibleAnimator?.SetTrigger("Grounded"); - InvisibleAnimator?.SetTrigger("Grounded"); + if (VisibleAnimator != null) + { + VisibleAnimator.SetTrigger("Grounded"); + } + + if (InvisibleAnimator != null) + { + InvisibleAnimator.SetTrigger("Grounded"); + } } if (NetworkAnimator == null) diff --git a/QSB/Events/QSBEvent.cs b/QSB/Events/QSBEvent.cs index dde34852..8352f616 100644 --- a/QSB/Events/QSBEvent.cs +++ b/QSB/Events/QSBEvent.cs @@ -1,5 +1,6 @@ using OWML.Common; using QSB.ClientServerStateSync; +using QSB.ClientServerStateSync.Events; using QSB.Messaging; using QSB.Player; using QSB.Player.Events; @@ -98,7 +99,10 @@ namespace QSB.Events if (!player.IsReady && player.PlayerId != LocalPlayerId && player.State is ClientState.AliveInSolarSystem or ClientState.AliveInEye or ClientState.DeadInSolarSystem - && this is not PlayerInformationEvent and not PlayerReadyEvent and not RequestStateResyncEvent) + && this is not PlayerInformationEvent + and not PlayerReadyEvent + and not RequestStateResyncEvent + and not ServerStateEvent) { DebugLog.ToConsole($"Warning - Got message (type:{GetType().Name}) from player {message.FromId}, but they were not ready. Asking for state resync, just in case.", MessageType.Warning); QSBEventManager.FireEvent(EventNames.QSBRequestStateResync); diff --git a/QSB/Player/PlayerInfo.cs b/QSB/Player/PlayerInfo.cs index b37444f4..da426922 100644 --- a/QSB/Player/PlayerInfo.cs +++ b/QSB/Player/PlayerInfo.cs @@ -197,6 +197,12 @@ namespace QSB.Player public void UpdateObjectsFromStates() { if (OWInput.GetInputMode() == InputMode.None) + { + // ? why is this here lmao + return; + } + + if (CameraBody == null) { return; } diff --git a/QSB/TimeSync/WakeUpSync.cs b/QSB/TimeSync/WakeUpSync.cs index bac9d9d9..4cc99d05 100644 --- a/QSB/TimeSync/WakeUpSync.cs +++ b/QSB/TimeSync/WakeUpSync.cs @@ -155,7 +155,6 @@ namespace QSB.TimeSync if (ServerStateManager.Instance.GetServerState() is not ServerState.InSolarSystem and not ServerState.InEye) { - DebugLog.ToConsole($"nah serverstate:{ServerStateManager.Instance.GetServerState()} (Target:{_serverTime} Current:{Time.timeSinceLevelLoad})"); return; } @@ -358,11 +357,6 @@ namespace QSB.TimeSync StartPausing(PauseReason.WaitingForAllPlayersToBeReady); } - if (serverState == ServerState.InSolarSystem && (clientState == ClientState.WaitingForOthersToReadyInSolarSystem || clientState == ClientState.WaitingForOthersToDieInSolarSystem)) - { - DebugLog.DebugWrite($"Server is still running game normally, but this player has died from an accepted death!", MessageType.Warning); - } - if (serverState == ServerState.WaitingForAllPlayersToDie && clientState == ClientState.WaitingForOthersToReadyInSolarSystem) { StartPausing(PauseReason.WaitingForAllPlayersToBeReady); From 1aa99df228e97388d326ad720f1f887d3616f15e Mon Sep 17 00:00:00 2001 From: Mister_Nebula <41904486+misternebula@users.noreply.github.com> Date: Sun, 12 Dec 2021 00:00:24 +0000 Subject: [PATCH 29/30] fix ready event lol --- QSB/Player/Events/PlayerReadyEvent.cs | 2 ++ 1 file changed, 2 insertions(+) diff --git a/QSB/Player/Events/PlayerReadyEvent.cs b/QSB/Player/Events/PlayerReadyEvent.cs index 9cbfc962..2bc21ad5 100644 --- a/QSB/Player/Events/PlayerReadyEvent.cs +++ b/QSB/Player/Events/PlayerReadyEvent.cs @@ -49,6 +49,8 @@ namespace QSB.Player.Events MessageType.Error); return; } + + QSBPlayerManager.GetPlayer(message.AboutId).IsReady = message.ToggleValue; } } } \ No newline at end of file From 6f5a8d75313ae682e9bc4fdb4244f21f28a1ff13 Mon Sep 17 00:00:00 2001 From: Mister_Nebula <41904486+misternebula@users.noreply.github.com> Date: Sun, 12 Dec 2021 00:00:46 +0000 Subject: [PATCH 30/30] add launchcodesgiven sync --- QSB/SaveSync/Events/GameStateEvent.cs | 3 +++ QSB/SaveSync/Events/GameStateMessage.cs | 17 +++-------------- 2 files changed, 6 insertions(+), 14 deletions(-) diff --git a/QSB/SaveSync/Events/GameStateEvent.cs b/QSB/SaveSync/Events/GameStateEvent.cs index 903da031..b8b257fc 100644 --- a/QSB/SaveSync/Events/GameStateEvent.cs +++ b/QSB/SaveSync/Events/GameStateEvent.cs @@ -20,6 +20,7 @@ namespace QSB.SaveSync.Events ForId = toId, InSolarSystem = QSBSceneManager.CurrentScene == OWScene.SolarSystem, InEye = QSBSceneManager.CurrentScene == OWScene.EyeOfTheUniverse, + LaunchCodesGiven = PlayerData.KnowsLaunchCodes(), LoopCount = StandaloneProfileManager.SharedInstance.currentProfileGameSave.loopCount, KnownFrequencies = StandaloneProfileManager.SharedInstance.currentProfileGameSave.knownFrequencies, KnownSignals = StandaloneProfileManager.SharedInstance.currentProfileGameSave.knownSignals @@ -32,6 +33,8 @@ namespace QSB.SaveSync.Events gameSave.knownFrequencies = message.KnownFrequencies; gameSave.knownSignals = message.KnownSignals; + PlayerData.SetPersistentCondition("LAUNCH_CODES_GIVEN", message.LaunchCodesGiven); + PlayerData.SaveCurrentGame(); if (message.InEye != (QSBSceneManager.CurrentScene == OWScene.EyeOfTheUniverse) diff --git a/QSB/SaveSync/Events/GameStateMessage.cs b/QSB/SaveSync/Events/GameStateMessage.cs index 1315df1d..74755a57 100644 --- a/QSB/SaveSync/Events/GameStateMessage.cs +++ b/QSB/SaveSync/Events/GameStateMessage.cs @@ -9,6 +9,7 @@ namespace QSB.SaveSync.Events { public bool InSolarSystem { get; set; } public bool InEye { get; set; } + public bool LaunchCodesGiven { get; set; } public int LoopCount { get; set; } public bool[] KnownFrequencies { get; set; } public Dictionary KnownSignals { get; set; } = new(); @@ -16,16 +17,11 @@ namespace QSB.SaveSync.Events public override void Deserialize(QNetworkReader reader) { base.Deserialize(reader); - // in solarsystem InSolarSystem = reader.ReadBoolean(); - - // in eye InEye = reader.ReadBoolean(); - - // Loop count + LaunchCodesGiven = reader.ReadBoolean(); LoopCount = reader.ReadInt32(); - // Known Frequencies var frequenciesLength = reader.ReadInt32(); var knownFrequencies = KnownFrequencies; Array.Resize(ref knownFrequencies, frequenciesLength); @@ -35,7 +31,6 @@ namespace QSB.SaveSync.Events KnownFrequencies[i] = reader.ReadBoolean(); } - // Known signals var signalsLength = reader.ReadInt32(); KnownSignals.Clear(); for (var i = 0; i < signalsLength; i++) @@ -49,23 +44,17 @@ namespace QSB.SaveSync.Events public override void Serialize(QNetworkWriter writer) { base.Serialize(writer); - // in solarsystem writer.Write(InSolarSystem); - - // in eye writer.Write(InEye); - - // Loop count + writer.Write(LaunchCodesGiven); writer.Write(LoopCount); - // Known frequencies writer.Write(KnownFrequencies.Length); foreach (var item in KnownFrequencies) { writer.Write(item); } - // Known signals writer.Write(KnownSignals.Count); foreach (var item in KnownSignals) {