diff --git a/QSB/Animation/NPC/Patches/SolanumPatches.cs b/QSB/Animation/NPC/Patches/SolanumPatches.cs index 4f243906..068097ae 100644 --- a/QSB/Animation/NPC/Patches/SolanumPatches.cs +++ b/QSB/Animation/NPC/Patches/SolanumPatches.cs @@ -80,7 +80,6 @@ namespace QSB.Animation.NPC.Patches case NomaiConversationManager.State.WatchingSky: if (__instance._playerInWatchVolume) { - DebugLog.DebugWrite($"{__instance._state} => WACHING PLAYER"); __instance._state = NomaiConversationManager.State.WatchingPlayer; __instance._solanumAnimController.StartWatchingPlayer(); } @@ -92,7 +91,6 @@ namespace QSB.Animation.NPC.Patches // player left watch zone if (!__instance._playerInWatchVolume) { - DebugLog.DebugWrite($"{__instance._state} => WATCHING SKY"); __instance._state = NomaiConversationManager.State.WatchingSky; __instance._solanumAnimController.StopWatchingPlayer(); } @@ -104,7 +102,6 @@ namespace QSB.Animation.NPC.Patches __instance._stoneCreationTimer -= Time.deltaTime; if (__instance._stoneCreationTimer <= 0f) { - DebugLog.DebugWrite($"{__instance._state} => CREATING STONES"); __instance._state = NomaiConversationManager.State.CreatingStones; __instance._solanumAnimController.PlayCreateWordStones(); } @@ -123,7 +120,6 @@ namespace QSB.Animation.NPC.Patches // raise cairns else if (__instance._solanumAnimController.IsPlayerLooking()) { - DebugLog.DebugWrite($"{__instance._state} => RAISING CAIRNS"); __instance._state = NomaiConversationManager.State.RaisingCairns; __instance._solanumAnimController.PlayRaiseCairns(); __instance._cairnAnimator.SetTrigger("Raise"); @@ -132,7 +128,6 @@ namespace QSB.Animation.NPC.Patches } else if (__instance._activeResponseText == null && __instance._hasValidSocketedStonePair) { - DebugLog.DebugWrite($"{__instance._state} => WRITING RESPONSE"); __instance._activeResponseText = __instance._pendingResponseText; __instance._pendingResponseText = null; __instance._state = NomaiConversationManager.State.WritingResponse; @@ -140,7 +135,6 @@ namespace QSB.Animation.NPC.Patches } else if (__instance._activeResponseText != null && (!__instance._hasValidSocketedStonePair || __instance._pendingResponseText != null)) { - DebugLog.DebugWrite($"{__instance._state} => ERASING RESPONSE"); __instance._state = NomaiConversationManager.State.ErasingResponse; __instance._solanumAnimController.StartWritingMessage(); } @@ -177,7 +171,6 @@ namespace QSB.Animation.NPC.Patches case NomaiConversationManager.State.CreatingStones: if (!__instance._solanumAnimController.isPerformingAction) { - DebugLog.DebugWrite($"{__instance._state} => WATCHING PLAYER"); __instance._state = NomaiConversationManager.State.WatchingPlayer; __instance._conversationStonesCreated = true; } @@ -186,7 +179,6 @@ namespace QSB.Animation.NPC.Patches case NomaiConversationManager.State.RaisingCairns: if (!__instance._solanumAnimController.isPerformingAction) { - DebugLog.DebugWrite($"{__instance._state} => WATCHING PLAYER"); __instance._state = NomaiConversationManager.State.WatchingPlayer; __instance._cairnRaised = true; __instance._stoneSocketATrigger.SetActivation(true); @@ -200,13 +192,11 @@ namespace QSB.Animation.NPC.Patches __instance._activeResponseText = null; if (__instance._pendingResponseText == null) { - DebugLog.DebugWrite($"{__instance._state} => WATCHING PLAYER"); __instance._state = NomaiConversationManager.State.WatchingPlayer; __instance._solanumAnimController.StopWritingMessage(false); } else { - DebugLog.DebugWrite($"{__instance._state} => WATCHING WRITING RESPONSE"); __instance._activeResponseText = __instance._pendingResponseText; __instance._pendingResponseText = null; __instance._state = NomaiConversationManager.State.WritingResponse; @@ -218,7 +208,6 @@ namespace QSB.Animation.NPC.Patches case NomaiConversationManager.State.WritingResponse: if (!__instance._solanumAnimController.isStartingWrite && !__instance._activeResponseText.IsAnimationPlaying()) { - DebugLog.DebugWrite($"{__instance._state} => WATCHING PLAYER"); __instance._state = NomaiConversationManager.State.WatchingPlayer; __instance._solanumAnimController.StopWritingMessage(true); } diff --git a/QSB/Animation/Player/AnimationSync.cs b/QSB/Animation/Player/AnimationSync.cs index 0766e86f..d6ef7908 100644 --- a/QSB/Animation/Player/AnimationSync.cs +++ b/QSB/Animation/Player/AnimationSync.cs @@ -155,7 +155,7 @@ namespace QSB.Animation.Player public void SetSuitState(bool state) { - if (!Player.PlayerStates.IsReady) + if (!Player.IsReady) { return; } diff --git a/QSB/Animation/Player/Events/ChangeAnimTypeEvent.cs b/QSB/Animation/Player/Events/ChangeAnimTypeEvent.cs index 3773c8fd..56709c2a 100644 --- a/QSB/Animation/Player/Events/ChangeAnimTypeEvent.cs +++ b/QSB/Animation/Player/Events/ChangeAnimTypeEvent.cs @@ -22,7 +22,7 @@ namespace QSB.Animation.Player.Events public override void OnReceiveRemote(bool server, EnumMessage message) { - if (!QSBCore.WorldObjectsReady || !QSBPlayerManager.GetPlayer(message.AboutId).PlayerStates.IsReady) + if (!QSBCore.WorldObjectsReady || !QSBPlayerManager.GetPlayer(message.AboutId).IsReady) { return; } diff --git a/QSB/Animation/Player/Events/PlayerSuitEvent.cs b/QSB/Animation/Player/Events/PlayerSuitEvent.cs index 410d1fa8..29e5ce95 100644 --- a/QSB/Animation/Player/Events/PlayerSuitEvent.cs +++ b/QSB/Animation/Player/Events/PlayerSuitEvent.cs @@ -32,9 +32,9 @@ namespace QSB.Animation.Player.Events public override void OnReceiveRemote(bool server, ToggleMessage message) { var player = QSBPlayerManager.GetPlayer(message.AboutId); - player.PlayerStates.SuitedUp = message.ToggleValue; + player.SuitedUp = message.ToggleValue; - if (!QSBCore.WorldObjectsReady || !player.PlayerStates.IsReady) + if (!QSBCore.WorldObjectsReady || !player.IsReady) { return; } @@ -46,7 +46,7 @@ namespace QSB.Animation.Player.Events public override void OnReceiveLocal(bool server, ToggleMessage message) { - QSBPlayerManager.LocalPlayer.PlayerStates.SuitedUp = message.ToggleValue; + QSBPlayerManager.LocalPlayer.SuitedUp = message.ToggleValue; var animator = QSBPlayerManager.LocalPlayer.AnimationSync; var type = message.ToggleValue ? AnimationType.PlayerSuited : AnimationType.PlayerUnsuited; animator.CurrentType = type; diff --git a/QSB/ClientServerStateSync/ClientStateManager.cs b/QSB/ClientServerStateSync/ClientStateManager.cs index 9dd487fd..a7e8fa08 100644 --- a/QSB/ClientServerStateSync/ClientStateManager.cs +++ b/QSB/ClientServerStateSync/ClientStateManager.cs @@ -29,7 +29,6 @@ namespace QSB.ClientServerStateSync return; } - DebugLog.DebugWrite($"CHANGE CLIENT STATE FROM {QSBPlayerManager.LocalPlayer.State} to {newState}"); QSBPlayerManager.LocalPlayer.State = newState; OnChangeState?.Invoke(newState); } @@ -46,29 +45,24 @@ namespace QSB.ClientServerStateSync switch (newScene) { case OWScene.TitleScreen: - DebugLog.DebugWrite($"SERVER LOAD TITLESCREEN"); newState = ClientState.InTitleScreen; break; case OWScene.Credits_Fast: - DebugLog.DebugWrite($"SERVER LOAD SHORT CREDITS"); newState = ClientState.WatchingShortCredits; break; case OWScene.Credits_Final: case OWScene.PostCreditsScene: - DebugLog.DebugWrite($"SERVER LOAD LONG CREDITS"); newState = ClientState.WatchingLongCredits; break; case OWScene.SolarSystem: if (oldScene == OWScene.SolarSystem) { // reloading scene - DebugLog.DebugWrite($"SERVER RELOAD SOLARSYSTEM"); newState = ClientState.WaitingForOthersToReadyInSolarSystem; } else { // loading in from title screen - DebugLog.DebugWrite($"SERVER LOAD SOLARSYSTEM"); newState = ClientState.AliveInSolarSystem; } break; @@ -85,22 +79,18 @@ namespace QSB.ClientServerStateSync switch (newScene) { case OWScene.TitleScreen: - DebugLog.DebugWrite($"CLIENT LOAD TITLESCREEN"); newState = ClientState.InTitleScreen; break; case OWScene.Credits_Fast: - DebugLog.DebugWrite($"CLIENT LOAD SHORT CREDITS"); newState = ClientState.WatchingShortCredits; break; case OWScene.Credits_Final: case OWScene.PostCreditsScene: - DebugLog.DebugWrite($"CLIENT LOAD LONG CREDITS"); newState = ClientState.WatchingLongCredits; break; case OWScene.SolarSystem: if (serverState == ServerState.WaitingForAllPlayersToDie) { - DebugLog.DebugWrite($"SEVER IN DEATH PHASE - WAIT"); newState = ClientState.WaitingForOthersToReadyInSolarSystem; break; } @@ -108,13 +98,11 @@ namespace QSB.ClientServerStateSync if (oldScene == OWScene.SolarSystem) { // reloading scene - DebugLog.DebugWrite($"CLIENT RELOAD SOLARSYSTEM"); newState = ClientState.WaitingForOthersToReadyInSolarSystem; } else { // loading in from title screen - DebugLog.DebugWrite($"CLIENT LOAD SOLARSYSTEM"); if (serverState == ServerState.WaitingForAllPlayersToReady) { newState = ClientState.WaitingForOthersToReadyInSolarSystem; @@ -171,32 +159,17 @@ namespace QSB.ClientServerStateSync private ClientState ForceGetCurrentState() { - DebugLog.DebugWrite($"ForceGetCurrentState"); var currentScene = LoadManager.GetCurrentScene(); - var lastScene = LoadManager.GetPreviousScene(); - switch (currentScene) + return currentScene switch { - case OWScene.TitleScreen: - DebugLog.DebugWrite($"- TitleScreen"); - return ClientState.InTitleScreen; - case OWScene.Credits_Fast: - DebugLog.DebugWrite($"- Short Credits"); - return ClientState.WatchingShortCredits; - case OWScene.Credits_Final: - case OWScene.PostCreditsScene: - DebugLog.DebugWrite($"- Long Credits"); - return ClientState.WatchingLongCredits; - case OWScene.SolarSystem: - DebugLog.DebugWrite($"- SolarSystem"); - return ClientState.AliveInSolarSystem; - case OWScene.EyeOfTheUniverse: - DebugLog.DebugWrite($"- Eye"); - return ClientState.AliveInEye; - default: - DebugLog.DebugWrite($"- Not Loaded"); - return ClientState.NotLoaded; - } + OWScene.TitleScreen => ClientState.InTitleScreen, + OWScene.Credits_Fast => ClientState.WatchingShortCredits, + OWScene.Credits_Final or OWScene.PostCreditsScene => ClientState.WatchingLongCredits, + OWScene.SolarSystem => ClientState.AliveInSolarSystem, + OWScene.EyeOfTheUniverse => ClientState.AliveInEye, + _ => ClientState.NotLoaded, + }; } } } diff --git a/QSB/ClientServerStateSync/ServerStateManager.cs b/QSB/ClientServerStateSync/ServerStateManager.cs index 85f323c7..f10594f2 100644 --- a/QSB/ClientServerStateSync/ServerStateManager.cs +++ b/QSB/ClientServerStateSync/ServerStateManager.cs @@ -54,17 +54,14 @@ namespace QSB.ClientServerStateSync case OWScene.Credits_Fast: case OWScene.Credits_Final: case OWScene.PostCreditsScene: - DebugLog.DebugWrite($"SERVER LOAD CREDITS"); QSBEventManager.FireEvent(EventNames.QSBServerState, ServerState.Credits); break; case OWScene.TitleScreen: - DebugLog.DebugWrite($"SERVER LOAD TITLE SCREEN"); QSBEventManager.FireEvent(EventNames.QSBServerState, ServerState.NotLoaded); break; case OWScene.SolarSystem: - DebugLog.DebugWrite($"SERVER LOAD SOLARSYSTEM"); if (oldScene == OWScene.SolarSystem) { QSBEventManager.FireEvent(EventNames.QSBServerState, ServerState.WaitingForAllPlayersToReady); @@ -77,7 +74,6 @@ namespace QSB.ClientServerStateSync break; case OWScene.EyeOfTheUniverse: - DebugLog.DebugWrite($"EYE"); QSBEventManager.FireEvent(EventNames.QSBServerState, ServerState.WaitingForAllPlayersToReady); break; @@ -98,21 +94,15 @@ namespace QSB.ClientServerStateSync private ServerState ForceGetCurrentState() { - DebugLog.DebugWrite($"ForceGetCurrentState"); - var currentScene = LoadManager.GetCurrentScene(); - var lastScene = LoadManager.GetPreviousScene(); switch (currentScene) { case OWScene.SolarSystem: - DebugLog.DebugWrite($"- SolarSystem"); return ServerState.InSolarSystem; case OWScene.EyeOfTheUniverse: - DebugLog.DebugWrite($"- Eye"); return ServerState.InEye; default: - DebugLog.DebugWrite($"- Not Loaded"); return ServerState.NotLoaded; } } diff --git a/QSB/Events/EventNames.cs b/QSB/Events/EventNames.cs index 768576e6..c5b946e2 100644 --- a/QSB/Events/EventNames.cs +++ b/QSB/Events/EventNames.cs @@ -98,5 +98,6 @@ public static string QSBMeteorSpecialImpact = "QSBMeteorSpecialImpact"; public static string QSBFragmentDamage = "QSBFragmentDamage"; public static string QSBFragmentResync = "QSBFragmentResync"; + public static string QSBLearnLaunchCodes = "QSBLearnLaunchCodes"; } } diff --git a/QSB/Events/EventType.cs b/QSB/Events/EventType.cs index 63ee9bf0..b95e63e4 100644 --- a/QSB/Events/EventType.cs +++ b/QSB/Events/EventType.cs @@ -8,6 +8,7 @@ DebugEvent, SatelliteProjector, SatelliteProjectorSnapshot, + LaunchCodes, /* * SERVER EVENTS diff --git a/QSB/Events/IQSBEvent.cs b/QSB/Events/IQSBEvent.cs index 63ad403b..ddac051f 100644 --- a/QSB/Events/IQSBEvent.cs +++ b/QSB/Events/IQSBEvent.cs @@ -2,6 +2,8 @@ { public interface IQSBEvent { + EventType Type { get; } + void SetupListener(); void CloseListener(); } diff --git a/QSB/Events/QSBEvent.cs b/QSB/Events/QSBEvent.cs index 18fe3523..f3663a30 100644 --- a/QSB/Events/QSBEvent.cs +++ b/QSB/Events/QSBEvent.cs @@ -1,6 +1,8 @@ using OWML.Common; +using QSB.ClientServerStateSync; using QSB.Messaging; using QSB.Player; +using QSB.Player.Events; using QSB.Player.TransformSync; using QSB.Utility; using QuantumUNET.Components; @@ -75,10 +77,24 @@ namespace QSB.Events if (PlayerTransformSync.LocalInstance == null || PlayerTransformSync.LocalInstance.GetComponent() == null) { - DebugLog.ToConsole($"Warning - Tried to handle message of type <{message.GetType().Name}> before localplayer was established.", MessageType.Warning); + DebugLog.ToConsole($"Warning - Tried to handle message of type <{GetType().Name}> before localplayer was established.", MessageType.Warning); return; } + if (QSBPlayerManager.PlayerExists(message.FromId)) + { + var player = QSBPlayerManager.GetPlayer(message.FromId); + + if (!player.IsReady + && player.PlayerId != LocalPlayerId + && (player.State is ClientState.AliveInSolarSystem or ClientState.AliveInEye or ClientState.DeadInSolarSystem) + && (message is not PlayerInformationEvent or PlayerReadyEvent)) + { + DebugLog.ToConsole($"Warning - Got message from player {message.FromId}, but they were not ready. Asking for state resync, just in case.", MessageType.Warning); + QSBEventManager.FireEvent(EventNames.QSBRequestStateResync); + } + } + try { if (message.FromId == QSBPlayerManager.LocalPlayerId || @@ -92,7 +108,7 @@ namespace QSB.Events } catch (Exception ex) { - DebugLog.ToConsole($"Error - Exception handling message {message.GetType().Name} : {ex}", MessageType.Error); + DebugLog.ToConsole($"Error - Exception handling message {GetType().Name} : {ex}", MessageType.Error); } } } diff --git a/QSB/Events/QSBEventManager.cs b/QSB/Events/QSBEventManager.cs index 4fb43a48..26757f2c 100644 --- a/QSB/Events/QSBEventManager.cs +++ b/QSB/Events/QSBEventManager.cs @@ -32,6 +32,9 @@ using QSB.Utility.Events; using System.Collections.Generic; using QSB.MeteorSync.Events; using QSB.RespawnSync.Events; +using System.Linq; +using HarmonyLib; +using System.Text; namespace QSB.Events { @@ -77,6 +80,7 @@ namespace QSB.Events new DebugEvent(), new SatelliteProjectorEvent(), new SatelliteProjectorSnapshotEvent(), + new LaunchCodesEvent(), // World Objects new ElevatorEvent(), new GeyserEvent(), @@ -129,6 +133,26 @@ namespace QSB.Events _eventList.ForEach(ev => ev.SetupListener()); + var duplicates = _eventList + .GroupBy(qsbEvent => qsbEvent.Type) + .Where(group => group.Count() > 1); + + if (duplicates.Count() != 0) + { + var totalSb = new StringBuilder(); + foreach (var group in duplicates) + { + totalSb.Append($"{group.Key}\r\n"); + foreach (var qsbEvent in group) + { + totalSb.Append($"- {qsbEvent.GetType().Name}\r\n"); + } + } + + DebugLog.ToConsole($"Error - These QSBEvents handle the same EventType!\r\n{totalSb}", MessageType.Error); + return; + } + Ready = true; DebugLog.DebugWrite("Event Manager ready.", MessageType.Success); diff --git a/QSB/Player/Events/LaunchCodesEvent.cs b/QSB/Player/Events/LaunchCodesEvent.cs new file mode 100644 index 00000000..50399fbe --- /dev/null +++ b/QSB/Player/Events/LaunchCodesEvent.cs @@ -0,0 +1,41 @@ +using QSB.Events; +using QSB.Messaging; +using QSB.Utility; + +namespace QSB.Player.Events +{ + internal class LaunchCodesEvent : QSBEvent + { + public override EventType Type => EventType.LaunchCodes; + + public override void SetupListener() => GlobalMessenger.AddListener(EventNames.QSBLearnLaunchCodes, Handler); + public override void CloseListener() => GlobalMessenger.RemoveListener(EventNames.QSBLearnLaunchCodes, Handler); + + private void Handler() => SendEvent(CreateMessage()); + + private PlayerMessage CreateMessage() => new() + { + AboutId = LocalPlayerId + }; + + public override void OnReceiveRemote(bool isHost, PlayerMessage message) + { + var flag = false; + if (!PlayerData._currentGameSave.PersistentConditionExists("LAUNCH_CODES_GIVEN")) + { + flag = true; + } + else if (PlayerData._currentGameSave.GetPersistentCondition("LAUNCH_CODES_GIVEN")) + { + flag = true; + } + + if (flag) + { + DialogueConditionManager.SharedInstance.SetConditionState("SCIENTIST_3", true); + PlayerData._currentGameSave.SetPersistentCondition("LAUNCH_CODES_GIVEN", true); + GlobalMessenger.FireEvent("LearnLaunchCodes"); + } + } + } +} diff --git a/QSB/Player/Events/PlayerInformationEvent.cs b/QSB/Player/Events/PlayerInformationEvent.cs index 8866348c..bd6c0c04 100644 --- a/QSB/Player/Events/PlayerInformationEvent.cs +++ b/QSB/Player/Events/PlayerInformationEvent.cs @@ -17,7 +17,13 @@ namespace QSB.Player.Events { AboutId = player.PlayerId, PlayerName = player.Name, - PlayerState = player.PlayerStates, + IsReady = player.IsReady, + FlashlightActive = player.FlashlightActive, + SuitedUp = player.SuitedUp, + ProbeLauncherEquipped = player.ProbeLauncherEquipped, + SignalscopeEquipped = player.SignalscopeEquipped, + TranslatorEquipped = player.TranslatorEquipped, + ProbeActive = player.ProbeActive, ClientState = player.State }; diff --git a/QSB/Player/Events/PlayerInformationMessage.cs b/QSB/Player/Events/PlayerInformationMessage.cs index 851a7b31..a088a33f 100644 --- a/QSB/Player/Events/PlayerInformationMessage.cs +++ b/QSB/Player/Events/PlayerInformationMessage.cs @@ -7,23 +7,26 @@ namespace QSB.Player.Events public class PlayerInformationMessage : PlayerMessage { public string PlayerName { get; set; } - public PlayerState PlayerState { get; set; } + public bool IsReady { get; set; } + public bool FlashlightActive { get; set; } + public bool SuitedUp { get; set; } + public bool ProbeLauncherEquipped { get; set; } + public bool SignalscopeEquipped { get; set; } + public bool TranslatorEquipped { get; set; } + public bool ProbeActive { get; set; } public ClientState ClientState { get; set; } public override void Deserialize(QNetworkReader reader) { base.Deserialize(reader); PlayerName = reader.ReadString(); - PlayerState = new PlayerState - { - IsReady = reader.ReadBoolean(), - FlashlightActive = reader.ReadBoolean(), - SuitedUp = reader.ReadBoolean(), - ProbeLauncherEquipped = reader.ReadBoolean(), - SignalscopeEquipped = reader.ReadBoolean(), - TranslatorEquipped = reader.ReadBoolean(), - ProbeActive = reader.ReadBoolean() - }; + IsReady = reader.ReadBoolean(); + FlashlightActive = reader.ReadBoolean(); + SuitedUp = reader.ReadBoolean(); + ProbeLauncherEquipped = reader.ReadBoolean(); + SignalscopeEquipped = reader.ReadBoolean(); + TranslatorEquipped = reader.ReadBoolean(); + ProbeActive = reader.ReadBoolean(); ClientState = (ClientState)reader.ReadInt32(); } @@ -31,13 +34,13 @@ namespace QSB.Player.Events { base.Serialize(writer); writer.Write(PlayerName); - writer.Write(PlayerState.IsReady); - writer.Write(PlayerState.FlashlightActive); - writer.Write(PlayerState.SuitedUp); - writer.Write(PlayerState.ProbeLauncherEquipped); - writer.Write(PlayerState.SignalscopeEquipped); - writer.Write(PlayerState.TranslatorEquipped); - writer.Write(PlayerState.ProbeActive); + writer.Write(IsReady); + writer.Write(FlashlightActive); + writer.Write(SuitedUp); + writer.Write(ProbeLauncherEquipped); + writer.Write(SignalscopeEquipped); + writer.Write(TranslatorEquipped); + writer.Write(ProbeActive); writer.Write((int)ClientState); } } diff --git a/QSB/Player/Events/PlayerJoinEvent.cs b/QSB/Player/Events/PlayerJoinEvent.cs index af1c939a..91a21d39 100644 --- a/QSB/Player/Events/PlayerJoinEvent.cs +++ b/QSB/Player/Events/PlayerJoinEvent.cs @@ -70,7 +70,7 @@ namespace QSB.Player.Events if (QSBSceneManager.IsInUniverse) { - QSBPlayerManager.LocalPlayer.PlayerStates.IsReady = 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 c10ba090..ef429883 100644 --- a/QSB/Player/Events/PlayerReadyEvent.cs +++ b/QSB/Player/Events/PlayerReadyEvent.cs @@ -35,7 +35,7 @@ namespace QSB.Player.Events private static void HandleServer(ToggleMessage message) { DebugLog.DebugWrite($"[SERVER] Get ready event from {message.FromId}", MessageType.Success); - QSBPlayerManager.GetPlayer(message.AboutId).PlayerStates.IsReady = message.ToggleValue; + QSBPlayerManager.GetPlayer(message.AboutId).IsReady = message.ToggleValue; QSBEventManager.FireEvent(EventNames.QSBPlayerInformation); } diff --git a/QSB/Player/Patches/PlayerPatches.cs b/QSB/Player/Patches/PlayerPatches.cs index 383ebaba..895ae5b0 100644 --- a/QSB/Player/Patches/PlayerPatches.cs +++ b/QSB/Player/Patches/PlayerPatches.cs @@ -1,4 +1,5 @@ using HarmonyLib; +using QSB.Events; using QSB.Patches; namespace QSB.Player.Patches @@ -21,6 +22,32 @@ namespace QSB.Player.Patches [HarmonyPrefix] [HarmonyPatch(typeof(PauseMenuManager), nameof(PauseMenuManager.OnExitToMainMenu))] public static void PauseMenuManager_OnExitToMainMenu() - => QSBPlayerManager.LocalPlayer.PlayerStates.IsReady = false; + => QSBPlayerManager.LocalPlayer.IsReady = false; + + [HarmonyPrefix] + [HarmonyPatch(typeof(PlayerData), nameof(PlayerData.LearnLaunchCodes))] + public static bool LearnLaunchCodes() + { + var flag = false; + if (!PlayerData._currentGameSave.PersistentConditionExists("LAUNCH_CODES_GIVEN")) + { + flag = true; + } + + else if (PlayerData._currentGameSave.GetPersistentCondition("LAUNCH_CODES_GIVEN")) + { + flag = true; + } + + if (flag) + { + DialogueConditionManager.SharedInstance.SetConditionState("SCIENTIST_3", true); + PlayerData._currentGameSave.SetPersistentCondition("LAUNCH_CODES_GIVEN", true); + GlobalMessenger.FireEvent("LearnLaunchCodes"); + QSBEventManager.FireEvent(EventNames.QSBLearnLaunchCodes); + } + + return false; + } } } diff --git a/QSB/Player/PlayerHUDMarker.cs b/QSB/Player/PlayerHUDMarker.cs index b0818d82..30f4d5a1 100644 --- a/QSB/Player/PlayerHUDMarker.cs +++ b/QSB/Player/PlayerHUDMarker.cs @@ -34,7 +34,7 @@ namespace QSB.Player Initialize(); } - if (!_isReady || !_player.PlayerStates.IsReady) + if (!_isReady || !_player.IsReady) { return; } diff --git a/QSB/Player/PlayerInfo.cs b/QSB/Player/PlayerInfo.cs index 6c64da03..4aa46991 100644 --- a/QSB/Player/PlayerInfo.cs +++ b/QSB/Player/PlayerInfo.cs @@ -3,6 +3,7 @@ using QSB.Animation.Player; using QSB.Animation.Player.Thrusters; using QSB.CampfireSync.WorldObjects; using QSB.ClientServerStateSync; +using QSB.Events; using QSB.ItemSync.WorldObjects.Items; using QSB.Player.TransformSync; using QSB.QuantumSync; @@ -22,7 +23,6 @@ namespace QSB.Player public uint PlayerId { get; } public string Name { get; set; } public PlayerHUDMarker HudMarker { get; set; } - public PlayerState PlayerStates { get; set; } = new PlayerState(); public PlayerTransformSync TransformSync { get; set; } // Body Objects @@ -30,10 +30,11 @@ namespace QSB.Player { get { - if (_camera == null && PlayerStates.IsReady) + if (_camera == null && IsReady) { DebugLog.ToConsole($"Warning - {PlayerId}.Camera is null!", MessageType.Warning); } + return _camera; } set @@ -42,6 +43,7 @@ namespace QSB.Player { DebugLog.ToConsole($"Warning - Setting {PlayerId}.Camera to null.", MessageType.Warning); } + _camera = value; } } @@ -52,7 +54,7 @@ namespace QSB.Player { get { - if (_body == null && PlayerStates.IsReady) + if (_body == null && IsReady) { DebugLog.ToConsole($"Warning - {PlayerId}.Body is null!", MessageType.Warning); } @@ -77,7 +79,18 @@ namespace QSB.Player // Tools public GameObject ProbeBody { get; set; } public QSBProbe Probe { get; set; } - public QSBFlashlight FlashLight => CameraBody?.GetComponentInChildren(); + public QSBFlashlight FlashLight + { + get + { + if (CameraBody == null) + { + return null; + } + + return CameraBody.GetComponentInChildren(); + } + } public QSBTool Signalscope => GetToolByType(ToolType.Signalscope); public QSBTool Translator => GetToolByType(ToolType.Translator); public QSBProbeLauncherTool ProbeLauncher => (QSBProbeLauncherTool)GetToolByType(ToolType.ProbeLauncher); @@ -105,11 +118,18 @@ namespace QSB.Player public JetpackAccelerationSync JetpackAcceleration { get; set; } // Misc + public bool IsReady { get; set; } public bool IsInMoon; // MOVE : move into PlayerStates? public bool IsInShrine; // MOVE : move into PlayerStates? public IQSBQuantumObject EntangledObject; public bool IsDead { get; set; } public ClientState State { get; set; } + public bool FlashlightActive { get; set; } + public bool SuitedUp { get; set; } + public bool ProbeLauncherEquipped { get; set; } + public bool SignalscopeEquipped { get; set; } + public bool TranslatorEquipped { get; set; } + public bool ProbeActive { get; set; } // Local only public PlayerProbeLauncher LocalProbeLauncher @@ -174,19 +194,35 @@ namespace QSB.Player CurrentCharacterDialogueTreeId = -1; } - public void UpdateStateObjects() + public void UpdateObjectsFromStates() { if (OWInput.GetInputMode() == InputMode.None) { return; } - FlashLight?.UpdateState(PlayerStates.FlashlightActive); - Translator?.ChangeEquipState(PlayerStates.TranslatorEquipped); - ProbeLauncher?.ChangeEquipState(PlayerStates.ProbeLauncherEquipped); - Signalscope?.ChangeEquipState(PlayerStates.SignalscopeEquipped); + FlashLight?.UpdateState(FlashlightActive); + Translator?.ChangeEquipState(TranslatorEquipped); + ProbeLauncher?.ChangeEquipState(ProbeLauncherEquipped); + Signalscope?.ChangeEquipState(SignalscopeEquipped); QSBCore.UnityEvents.RunWhen(() => QSBPlayerManager.GetSyncObject(PlayerId) != null, - () => QSBPlayerManager.GetSyncObject(PlayerId).SetSuitState(PlayerStates.SuitedUp)); + () => QSBPlayerManager.GetSyncObject(PlayerId).SetSuitState(SuitedUp)); + } + + public void UpdateStatesFromObjects() + { + if (Locator.GetFlashlight() == null || Locator.GetPlayerBody() == null) + { + FlashlightActive = false; + SuitedUp = false; + } + else + { + FlashlightActive = Locator.GetFlashlight()._flashlightOn; + SuitedUp = Locator.GetPlayerBody().GetComponent().IsWearingSuit(true); + } + + QSBEventManager.FireEvent(EventNames.QSBPlayerInformation); } private QSBTool GetToolByType(ToolType type) => CameraBody?.GetComponentsInChildren() diff --git a/QSB/Player/PlayerState.cs b/QSB/Player/PlayerState.cs deleted file mode 100644 index 0d0efb4a..00000000 --- a/QSB/Player/PlayerState.cs +++ /dev/null @@ -1,14 +0,0 @@ -namespace QSB.Player -{ - public class PlayerState - { - public bool IsReady { get; set; } - - public bool FlashlightActive { get; set; } - public bool SuitedUp { get; set; } - public bool ProbeLauncherEquipped { get; set; } - public bool SignalscopeEquipped { get; set; } - public bool TranslatorEquipped { get; set; } - public bool ProbeActive { get; set; } - } -} diff --git a/QSB/Player/QSBPlayerManager.cs b/QSB/Player/QSBPlayerManager.cs index 268aacfd..35fb95fb 100644 --- a/QSB/Player/QSBPlayerManager.cs +++ b/QSB/Player/QSBPlayerManager.cs @@ -82,10 +82,16 @@ namespace QSB.Player { var player = GetPlayer(message.AboutId); player.Name = message.PlayerName; - player.PlayerStates = message.PlayerState; - if (LocalPlayer.PlayerStates.IsReady) + player.IsReady = message.IsReady; + player.FlashlightActive = message.FlashlightActive; + player.SuitedUp = message.SuitedUp; + player.ProbeLauncherEquipped = message.ProbeLauncherEquipped; + player.SignalscopeEquipped = message.SignalscopeEquipped; + player.TranslatorEquipped = message.TranslatorEquipped; + player.ProbeActive = message.ProbeActive; + if (LocalPlayer.IsReady) { - player.UpdateStateObjects(); + player.UpdateObjectsFromStates(); } player.State = message.ClientState; @@ -172,7 +178,7 @@ namespace QSB.Player return null; } - return playerList.Where(x => x.PlayerStates.IsReady).OrderBy(x => Vector3.Distance(x.Body.transform.position, worldPoint)).FirstOrDefault(); + return playerList.Where(x => x.IsReady).OrderBy(x => Vector3.Distance(x.Body.transform.position, worldPoint)).FirstOrDefault(); } public static IEnumerable> GetPlayerCarryItems() diff --git a/QSB/Player/TransformSync/PlayerTransformSync.cs b/QSB/Player/TransformSync/PlayerTransformSync.cs index 6dbd20dc..df277665 100644 --- a/QSB/Player/TransformSync/PlayerTransformSync.cs +++ b/QSB/Player/TransformSync/PlayerTransformSync.cs @@ -60,12 +60,12 @@ namespace QSB.Player.TransformSync if (isInUniverse) { - Player.PlayerStates.IsReady = true; + Player.IsReady = true; QSBEventManager.FireEvent(EventNames.QSBPlayerReady, true); } else { - Player.PlayerStates.IsReady = false; + Player.IsReady = false; QSBEventManager.FireEvent(EventNames.QSBPlayerReady, false); } diff --git a/QSB/QSB.csproj b/QSB/QSB.csproj index 47c4ea7a..f987075b 100644 --- a/QSB/QSB.csproj +++ b/QSB/QSB.csproj @@ -91,7 +91,7 @@ - + diff --git a/QSB/RespawnSync/RespawnManager.cs b/QSB/RespawnSync/RespawnManager.cs index d0ec0688..3c4411fa 100644 --- a/QSB/RespawnSync/RespawnManager.cs +++ b/QSB/RespawnSync/RespawnManager.cs @@ -49,6 +49,7 @@ namespace QSB.RespawnSync private void Init(OWScene newScene, bool inUniverse) { QSBPlayerManager.ShowAllPlayers(); + QSBPlayerManager.LocalPlayer.UpdateStatesFromObjects(); QSBPlayerManager.PlayerList.ForEach(x => x.IsDead = false); _playersPendingRespawn.Clear(); @@ -99,7 +100,6 @@ namespace QSB.RespawnSync public void TriggerRespawnMap() { - DebugLog.DebugWrite($"TRIGGER RESPAWN MAP"); QSBPatchManager.DoPatchType(QSBPatchTypes.RespawnTime); QSBCore.UnityEvents.FireOnNextUpdate(() => GlobalMessenger.FireEvent("TriggerObservatoryMap")); } diff --git a/QSB/StatueSync/Events/StartStatueEvent.cs b/QSB/StatueSync/Events/StartStatueEvent.cs index 614cb689..6f39404a 100644 --- a/QSB/StatueSync/Events/StartStatueEvent.cs +++ b/QSB/StatueSync/Events/StartStatueEvent.cs @@ -1,5 +1,6 @@ using QSB.ClientServerStateSync; using QSB.Events; +using QSB.Utility; using UnityEngine; namespace QSB.StatueSync.Events @@ -27,6 +28,8 @@ namespace QSB.StatueSync.Events public override void OnReceiveLocal(bool server, StartStatueMessage message) { + DebugLog.DebugWrite($"OnReceiveLocal StartStatueEvent"); + if (!QSBCore.IsHost) { return; @@ -36,6 +39,9 @@ namespace QSB.StatueSync.Events } public override void OnReceiveRemote(bool server, StartStatueMessage message) - => StatueManager.Instance.BeginSequence(message.PlayerPosition, message.PlayerRotation, message.CameraDegrees); + { + DebugLog.DebugWrite($"OnReceiveRemote StartStatueEvent"); + StatueManager.Instance.BeginSequence(message.PlayerPosition, message.PlayerRotation, message.CameraDegrees); + } } } diff --git a/QSB/StatueSync/StatueManager.cs b/QSB/StatueSync/StatueManager.cs index c19718c4..966d79df 100644 --- a/QSB/StatueSync/StatueManager.cs +++ b/QSB/StatueSync/StatueManager.cs @@ -1,4 +1,5 @@ using QSB.Player; +using QSB.Utility; using System.Collections; using UnityEngine; @@ -12,14 +13,22 @@ namespace QSB.StatueSync private void Awake() { Instance = this; - QSBSceneManager.OnUniverseSceneLoaded += (OWScene oldScene, OWScene newScene) => QSBPlayerManager.ShowAllPlayers(); + QSBSceneManager.OnUniverseSceneLoaded += OnUniverseSceneLoaded; } private void OnDestroy() - => QSBSceneManager.OnUniverseSceneLoaded -= (OWScene oldScene, OWScene newScene) => QSBPlayerManager.ShowAllPlayers(); + => QSBSceneManager.OnUniverseSceneLoaded -= OnUniverseSceneLoaded; + + private void OnUniverseSceneLoaded(OWScene oldScene, OWScene newScene) + { + QSBPlayerManager.ShowAllPlayers(); + QSBPlayerManager.LocalPlayer.UpdateStatesFromObjects(); + } public void BeginSequence(Vector3 position, Quaternion rotation, float cameraDegrees) - => StartCoroutine(BeginRemoteUplinkSequence(position, rotation, cameraDegrees)); + { + StartCoroutine(BeginRemoteUplinkSequence(position, rotation, cameraDegrees)); + } private IEnumerator BeginRemoteUplinkSequence(Vector3 position, Quaternion rotation, float cameraDegrees) { diff --git a/QSB/Syncs/IntermediaryTransform.cs b/QSB/Syncs/IntermediaryTransform.cs index 48e02708..6da80eeb 100644 --- a/QSB/Syncs/IntermediaryTransform.cs +++ b/QSB/Syncs/IntermediaryTransform.cs @@ -1,4 +1,6 @@ using OWML.Common; +using QSB.ClientServerStateSync; +using QSB.Player; using QSB.Utility; using UnityEngine; @@ -57,7 +59,11 @@ namespace QSB.Syncs { if (_referenceTransform == null) { - DebugLog.ToConsole($"Error - _referenceTransform has not been set for {_attachedTransform.name}", MessageType.Error); + if (QSBPlayerManager.LocalPlayer.State is ClientState.AliveInEye or ClientState.AliveInSolarSystem or ClientState.DeadInSolarSystem) + { + DebugLog.ToConsole($"Error - _referenceTransform has not been set for {_attachedTransform.name}", MessageType.Error); + } + return; } @@ -72,7 +78,11 @@ namespace QSB.Syncs { if (_referenceTransform == null) { - DebugLog.ToConsole($"Error - _referenceTransform has not been set for {_attachedTransform.name}", MessageType.Error); + if (QSBPlayerManager.LocalPlayer.State is ClientState.AliveInEye or ClientState.AliveInSolarSystem or ClientState.DeadInSolarSystem) + { + DebugLog.ToConsole($"Error - _referenceTransform has not been set for {_attachedTransform.name}", MessageType.Error); + } + return; } @@ -98,7 +108,11 @@ namespace QSB.Syncs { if (_referenceTransform == null) { - DebugLog.ToConsole($"Error - _referenceTransform has not been set for {_attachedTransform.name}", MessageType.Error); + if (QSBPlayerManager.LocalPlayer.State is ClientState.AliveInEye or ClientState.AliveInSolarSystem or ClientState.DeadInSolarSystem) + { + DebugLog.ToConsole($"Error - _referenceTransform has not been set for {_attachedTransform.name}", MessageType.Error); + } + return Vector3.zero; } @@ -112,7 +126,11 @@ namespace QSB.Syncs { if (_referenceTransform == null) { - DebugLog.ToConsole($"Error - _referenceTransform has not been set for {_attachedTransform.name}", MessageType.Error); + if (QSBPlayerManager.LocalPlayer.State is ClientState.AliveInEye or ClientState.AliveInSolarSystem or ClientState.DeadInSolarSystem) + { + DebugLog.ToConsole($"Error - _referenceTransform has not been set for {_attachedTransform.name}", MessageType.Error); + } + return Quaternion.identity; } diff --git a/QSB/Syncs/Sectored/BaseSectoredSync.cs b/QSB/Syncs/Sectored/BaseSectoredSync.cs index 031666b9..846d0804 100644 --- a/QSB/Syncs/Sectored/BaseSectoredSync.cs +++ b/QSB/Syncs/Sectored/BaseSectoredSync.cs @@ -121,7 +121,7 @@ namespace QSB.Syncs.Sectored { writer.Write(-1); } - else if (!Player.PlayerStates.IsReady) + else if (!Player.IsReady) { writer.Write(-1); } diff --git a/QSB/Syncs/SyncBase.cs b/QSB/Syncs/SyncBase.cs index 4215809a..48b3914b 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.PlayerStates.IsReady + && Player.IsReady && NetId.Value != uint.MaxValue && NetId.Value != 0U && WorldObjectManager.AllReady; diff --git a/QSB/TimeSync/Patches/TimePatches.cs b/QSB/TimeSync/Patches/TimePatches.cs index 7b43dd11..4db5bc36 100644 --- a/QSB/TimeSync/Patches/TimePatches.cs +++ b/QSB/TimeSync/Patches/TimePatches.cs @@ -1,5 +1,6 @@ using HarmonyLib; using QSB.Patches; +using QSB.Utility; namespace QSB.TimeSync.Patches { @@ -11,8 +12,10 @@ namespace QSB.TimeSync.Patches [HarmonyPrefix] [HarmonyPatch(typeof(PlayerCameraEffectController), nameof(PlayerCameraEffectController.OnStartOfTimeLoop))] public static bool PlayerCameraEffectController_OnStartOfTimeLoop() - => false; - + { + DebugLog.DebugWrite($"OnStartOfTimeLoop"); + return false; + } [HarmonyPrefix] [HarmonyPatch(typeof(OWTime), nameof(OWTime.Pause))] public static bool StopPausing() diff --git a/QSB/Tools/FlashlightTool/Events/PlayerFlashlightEvent.cs b/QSB/Tools/FlashlightTool/Events/PlayerFlashlightEvent.cs index d91e6dbc..204ca6d2 100644 --- a/QSB/Tools/FlashlightTool/Events/PlayerFlashlightEvent.cs +++ b/QSB/Tools/FlashlightTool/Events/PlayerFlashlightEvent.cs @@ -32,11 +32,11 @@ namespace QSB.Tools.FlashlightTool.Events public override void OnReceiveRemote(bool server, ToggleMessage message) { var player = QSBPlayerManager.GetPlayer(message.AboutId); - player.PlayerStates.FlashlightActive = message.ToggleValue; + player.FlashlightActive = message.ToggleValue; player.FlashLight?.UpdateState(message.ToggleValue); } public override void OnReceiveLocal(bool server, ToggleMessage message) => - QSBPlayerManager.LocalPlayer.PlayerStates.FlashlightActive = message.ToggleValue; + QSBPlayerManager.LocalPlayer.FlashlightActive = message.ToggleValue; } } \ No newline at end of file diff --git a/QSB/Tools/ProbeLauncherTool/Events/EquipProbeLauncherEvent.cs b/QSB/Tools/ProbeLauncherTool/Events/EquipProbeLauncherEvent.cs index b198acf9..4ed6606a 100644 --- a/QSB/Tools/ProbeLauncherTool/Events/EquipProbeLauncherEvent.cs +++ b/QSB/Tools/ProbeLauncherTool/Events/EquipProbeLauncherEvent.cs @@ -66,11 +66,11 @@ namespace QSB.Tools.ProbeLauncherTool.Events public override void OnReceiveRemote(bool server, ToggleMessage message) { var player = QSBPlayerManager.GetPlayer(message.AboutId); - player.PlayerStates.ProbeLauncherEquipped = message.ToggleValue; + player.ProbeLauncherEquipped = message.ToggleValue; player.ProbeLauncher?.ChangeEquipState(message.ToggleValue); } public override void OnReceiveLocal(bool server, ToggleMessage message) => - QSBPlayerManager.LocalPlayer.PlayerStates.ProbeLauncherEquipped = message.ToggleValue; + QSBPlayerManager.LocalPlayer.ProbeLauncherEquipped = message.ToggleValue; } } \ No newline at end of file diff --git a/QSB/Tools/ProbeTool/Events/PlayerProbeEvent.cs b/QSB/Tools/ProbeTool/Events/PlayerProbeEvent.cs index fae21b5e..28225ab1 100644 --- a/QSB/Tools/ProbeTool/Events/PlayerProbeEvent.cs +++ b/QSB/Tools/ProbeTool/Events/PlayerProbeEvent.cs @@ -25,7 +25,7 @@ namespace QSB.Tools.ProbeTool.Events public override void OnReceiveRemote(bool server, EnumMessage message) { var player = QSBPlayerManager.GetPlayer(message.AboutId); - if (!player.PlayerStates.IsReady || player.Probe == null) + if (!player.IsReady || player.Probe == null) { return; } diff --git a/QSB/Tools/ProbeTool/Events/ProbeStartRetrieveEvent.cs b/QSB/Tools/ProbeTool/Events/ProbeStartRetrieveEvent.cs index c696a2cb..f5a39be4 100644 --- a/QSB/Tools/ProbeTool/Events/ProbeStartRetrieveEvent.cs +++ b/QSB/Tools/ProbeTool/Events/ProbeStartRetrieveEvent.cs @@ -25,7 +25,7 @@ namespace QSB.Tools.ProbeTool.Events public override void OnReceiveRemote(bool server, FloatMessage message) { var player = QSBPlayerManager.GetPlayer(message.AboutId); - if (!player.PlayerStates.IsReady || player.Probe == null) + if (!player.IsReady || player.Probe == null) { return; } diff --git a/QSB/Tools/SignalscopeTool/Events/PlayerSignalscopeEvent.cs b/QSB/Tools/SignalscopeTool/Events/PlayerSignalscopeEvent.cs index 08c96e8d..166dd357 100644 --- a/QSB/Tools/SignalscopeTool/Events/PlayerSignalscopeEvent.cs +++ b/QSB/Tools/SignalscopeTool/Events/PlayerSignalscopeEvent.cs @@ -32,11 +32,11 @@ namespace QSB.Tools.SignalscopeTool.Events public override void OnReceiveRemote(bool server, ToggleMessage message) { var player = QSBPlayerManager.GetPlayer(message.AboutId); - player.PlayerStates.SignalscopeEquipped = message.ToggleValue; + player.SignalscopeEquipped = message.ToggleValue; player.Signalscope?.ChangeEquipState(message.ToggleValue); } public override void OnReceiveLocal(bool server, ToggleMessage message) => - QSBPlayerManager.LocalPlayer.PlayerStates.SignalscopeEquipped = message.ToggleValue; + QSBPlayerManager.LocalPlayer.SignalscopeEquipped = message.ToggleValue; } } \ No newline at end of file diff --git a/QSB/Tools/TranslatorTool/Events/PlayerTranslatorEvent.cs b/QSB/Tools/TranslatorTool/Events/PlayerTranslatorEvent.cs index 30cac533..53b5788d 100644 --- a/QSB/Tools/TranslatorTool/Events/PlayerTranslatorEvent.cs +++ b/QSB/Tools/TranslatorTool/Events/PlayerTranslatorEvent.cs @@ -32,11 +32,11 @@ namespace QSB.Tools.TranslatorTool.Events public override void OnReceiveRemote(bool server, ToggleMessage message) { var player = QSBPlayerManager.GetPlayer(message.AboutId); - player.PlayerStates.TranslatorEquipped = message.ToggleValue; + player.TranslatorEquipped = message.ToggleValue; player.Translator?.ChangeEquipState(message.ToggleValue); } public override void OnReceiveLocal(bool server, ToggleMessage message) => - QSBPlayerManager.LocalPlayer.PlayerStates.TranslatorEquipped = message.ToggleValue; + QSBPlayerManager.LocalPlayer.TranslatorEquipped = message.ToggleValue; } } \ No newline at end of file diff --git a/QSB/Utility/DebugGUI.cs b/QSB/Utility/DebugGUI.cs index 91262b5a..5033b9ce 100644 --- a/QSB/Utility/DebugGUI.cs +++ b/QSB/Utility/DebugGUI.cs @@ -3,10 +3,16 @@ using QSB.ClientServerStateSync; using QSB.OrbSync.TransformSync; using QSB.Player; using QSB.QuantumSync; +using QSB.ShipSync; +using QSB.ShipSync.TransformSync; +using QSB.ShipSync.WorldObjects; using QSB.Syncs; using QSB.TimeSync; using QSB.WorldSync; +using System.ComponentModel; using System.Linq; +using System.Runtime.InteropServices; +using System.Runtime.Serialization; using UnityEngine; namespace QSB.Utility @@ -60,6 +66,13 @@ namespace QSB.Utility GUI.Label(new Rect(x, currentOffset, FixedWidth, 20f), text, guiStyle); } + private void WriteLine(int collumnID, string text, Color color) + { + guiStyle.normal.textColor = color; + WriteLine(collumnID, text); + guiStyle.normal.textColor = Color.white; + } + public void OnGUI() { if (!QSBCore.DebugMode) @@ -94,10 +107,13 @@ namespace QSB.Utility } else if (currentState != WakeUpSync.State.Loaded && currentState != WakeUpSync.State.NotLoaded && reason == null) { - WriteLine(1, $"Reason : NULL"); + WriteLine(1, $"Reason : NULL", Color.red); } + WriteLine(1, $"Time Difference : {WakeUpSync.LocalInstance.GetTimeDifference()}"); 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()}"); } #endregion @@ -106,41 +122,91 @@ namespace QSB.Utility WriteLine(2, $"Player data :"); foreach (var player in QSBPlayerManager.PlayerList) { + if (player == null) + { + WriteLine(2, $"NULL PLAYER", Color.red); + continue; + } + WriteLine(2, $"{player.PlayerId}.{player.Name}"); WriteLine(2, $"State : {player.State}"); WriteLine(2, $"Dead : {player.IsDead}"); WriteLine(2, $"Visible : {player.Visible}"); + WriteLine(2, $"Ready : {player.IsReady}"); + WriteLine(2, $"Suited Up : {player.SuitedUp}"); - if (player.PlayerStates.IsReady && QSBCore.WorldObjectsReady) + if (player.IsReady && QSBCore.WorldObjectsReady) { var networkTransform = player.TransformSync; var referenceSector = networkTransform.ReferenceSector; var referenceTransform = networkTransform.ReferenceTransform; var parent = networkTransform.AttachedObject?.transform.parent; - var intermediary = networkTransform.GetValue("_intermediaryTransform"); - var interTransform = intermediary.GetReferenceTransform(); - WriteLine(2, $" - L.Pos : {networkTransform.transform.localPosition}"); - WriteLine(2, $" - Ref. Sector : {(referenceSector == null ? "NULL" : referenceSector.Name)}"); - WriteLine(2, $" - Ref. Transform : {(referenceTransform == null ? "NULL" : referenceTransform.name)}"); - WriteLine(2, $" - Inter. Ref. Transform : {(interTransform == null ? "NULL" : interTransform.name)}"); - WriteLine(2, $" - Parent : {(parent == null ? "NULL" : parent.name)}"); - - /* - var probeSync = SyncBase.GetPlayers(player); - if (probeSync != default) - { - var probeSector = probeSync.ReferenceSector; - GUI.Label(new Rect(420, offset2, 400f, 20f), $" - Probe Sector : {(probeSector == null ? "NULL" : probeSector.Name)}", guiStyle); - offset2 += _debugLineSpacing; - } - */ + WriteLine(2, $" - Ref. Sector : {(referenceSector == null ? "NULL" : referenceSector.Name)}", referenceSector == null ? Color.red : Color.white); + WriteLine(2, $" - Ref. Transform : {(referenceTransform == null ? "NULL" : referenceTransform.name)}", referenceTransform == null ? Color.red : Color.white); + WriteLine(2, $" - Parent : {(parent == null ? "NULL" : parent.name)}", parent == null ? Color.red : Color.white); } } #endregion + #region Column3 - Ship data + + WriteLine(3, $"Current Flyer : {ShipManager.Instance.CurrentFlyer}"); + if (ShipTransformSync.LocalInstance != null) + { + var instance = ShipTransformSync.LocalInstance; + if (QSBCore.IsHost) + { + WriteLine(3, $"Current Owner : {instance.NetIdentity.ClientAuthorityOwner.GetPlayerId()}"); + } + var sector = instance.ReferenceSector; + WriteLine(3, $"Ref. Sector : {(sector != null ? sector.Name : "NULL")}", sector == null ? Color.red : Color.white); + var transform = instance.ReferenceTransform; + WriteLine(3, $"Ref. Transform : {(transform != null ? transform.name : "NULL")}", transform == null ? Color.red : Color.white); + } + else + { + WriteLine(3, $"ShipTransformSync.LocalInstance is null.", Color.red); + } + + WriteLine(3, $"QSBShipComponent"); + foreach (var component in QSBWorldSync.GetWorldObjects()) + { + var attachedObject = component.AttachedObject; + if (attachedObject == null) + { + WriteLine(3, $"- {component.ObjectId} NULL ATTACHEDOBJECT", Color.red); + } + else + { + WriteLine(3, $"- {component.AttachedObject.name} RepairFraction:{component.AttachedObject._repairFraction}"); + } + } + + WriteLine(3, $"QSBShipHull"); + foreach (var hull in QSBWorldSync.GetWorldObjects()) + { + var attachedObject = hull.AttachedObject; + if (attachedObject == null) +{ + WriteLine(3, $"- {hull.ObjectId} NULL ATTACHEDOBJECT", Color.red); + } + else + { + WriteLine(3, $"- {hull.AttachedObject.name}, Integrity:{hull.AttachedObject.integrity}"); + } + } + #endregion + + #region Column4 - Quantum Object Possesion foreach (var player in QSBPlayerManager.PlayerList) { + if (player == null) + { + WriteLine(4, $"- NULL PLAYER", Color.red); + continue; + } + WriteLine(4, $"- {player.PlayerId}.{player.Name}"); var allQuantumObjects = QSBWorldSync.GetWorldObjects(); var ownedQuantumObjects = allQuantumObjects.Where(x => x.ControllingPlayer == player.PlayerId); @@ -148,9 +214,17 @@ namespace QSB.Utility foreach (var quantumObject in ownedQuantumObjects) { var qsbObj = quantumObject as IWorldObject; - WriteLine(4, $"{qsbObj.Name} ({qsbObj.ObjectId})"); + if (qsbObj == null) + { + WriteLine(4, $"NULL QSBOBJ", Color.red); + } + else + { + WriteLine(4, $"{qsbObj.Name} ({qsbObj.ObjectId})"); + } } } + #endregion } } } \ No newline at end of file diff --git a/QSB/Utility/Popcron.Gizmos/GizmosInstance.cs b/QSB/Utility/Popcron.Gizmos/GizmosInstance.cs index 46a94d19..399aa204 100644 --- a/QSB/Utility/Popcron.Gizmos/GizmosInstance.cs +++ b/QSB/Utility/Popcron.Gizmos/GizmosInstance.cs @@ -87,7 +87,6 @@ namespace Popcron //instance = new GameObject(typeof(GizmosInstance).FullName).AddComponent(); //instance.gameObject.hideFlags = HideFlags.HideInHierarchy | HideFlags.HideInInspector; instance = Locator.GetPlayerCamera().gameObject.AddComponent(); - DebugLog.DebugWrite("CREATE GIZMOS INSTANCE!"); } } diff --git a/QSB/WorldSync/WorldObjectManager.cs b/QSB/WorldSync/WorldObjectManager.cs index 66614e8c..f619787b 100644 --- a/QSB/WorldSync/WorldObjectManager.cs +++ b/QSB/WorldSync/WorldObjectManager.cs @@ -44,13 +44,13 @@ namespace QSB.WorldSync return; } - if (QSBPlayerManager.LocalPlayer.PlayerStates.IsReady) + if (QSBPlayerManager.LocalPlayer.IsReady) { DoRebuild(scene); return; } - QSBCore.UnityEvents.RunWhen(() => QSBPlayerManager.LocalPlayer.PlayerStates.IsReady, () => DoRebuild(scene)); + QSBCore.UnityEvents.RunWhen(() => QSBPlayerManager.LocalPlayer.IsReady, () => DoRebuild(scene)); } private static void DoRebuild(OWScene scene)