using OWML.ModHelper.Events; using QSB.Messaging; using UnityEngine; namespace QSB { public class WakeUpSync : MonoBehaviour { public static bool IsServer; private MessageHandler _wakeUpHandler; private void Start() { DebugLog.Screen("Start WakeUpSync"); GlobalMessenger.AddListener("WakeUp", OnWakeUp); _wakeUpHandler = new MessageHandler(); _wakeUpHandler.OnClientReceiveMessage += OnClientReceiveMessage; } private void OnWakeUp() { DebugLog.Screen("Sending wakeup to all my friends"); if (IsServer) { _wakeUpHandler.SendToAll(new WakeUpMessage()); } } private void OnClientReceiveMessage(WakeUpMessage message) { if (IsServer) { return; } // I copied all of this from my AutoResume mod, since that already wakes up the player instantly. // There must be a simpler way to do this though, I just couldn't find it. // Skip wake up animation. var cameraEffectController = FindObjectOfType(); cameraEffectController.OpenEyes(0, true); cameraEffectController.SetValue("_wakeLength", 0f); cameraEffectController.SetValue("_waitForWakeInput", false); // Skip wake up prompt. LateInitializerManager.pauseOnInitialization = false; Locator.GetPauseCommandListener().RemovePauseCommandLock(); Locator.GetPromptManager().RemoveScreenPrompt(cameraEffectController.GetValue("_wakePrompt")); OWTime.Unpause(OWTime.PauseType.Sleeping); cameraEffectController.Invoke("WakeUp"); // Enable all inputs immediately. OWInput.ChangeInputMode(InputMode.Character); typeof(OWInput).SetValue("_inputFadeFraction", 0f); GlobalMessenger.FireEvent("TakeFirstFlashbackSnapshot"); } } }