public void Reset() { Profiler.LmpReferenceTime.Start(); Debug.Log($"[LMP]: KSP installed at {KspPath}"); Debug.Log($"[LMP]: LMP installed at {AssemblyPath}"); if (!SettingsSystem.CurrentSettings.DisclaimerAccepted && HighLogic.LoadedScene == GameScenes.MAINMENU) { Enabled = false; DisclaimerWindow.Singleton.Display = true; } if (!CompatibilityChecker.IsCompatible() || !InstallChecker.IsCorrectlyInstalled()) { Enabled = false; return; } SetupDirectoriesIfNeeded(); UniverseSyncCache.Singleton.ExpireCache(); NetworkMain.StartNetworkSystem(); //Register events needed to bootstrap the workers. GameEvents.onHideUI.Add(() => { ShowGui = false; }); GameEvents.onShowUI.Add(() => { ShowGui = true; }); SystemsHandler.KillAllSystems(); HandleCommandLineArgs(); Debug.Log($"[LMP]: LunaMultiPlayer {VersionInfo.FullVersionNumber} Initialized!"); }
public void Reset() { _mainThreadId = Thread.CurrentThread.ManagedThreadId; LunaLog.Log($"[LMP]: KSP installed at {Client.KspPath}"); LunaLog.Log($"[LMP]: LMP installed at {AssemblyPath}"); if (!SettingsSystem.CurrentSettings.DisclaimerAccepted && HighLogic.LoadedScene == GameScenes.MAINMENU) { Enabled = false; DisclaimerDialog.SpawnDialog(); } if (!CompatibilityChecker.IsCompatible() || !InstallChecker.IsCorrectlyInstalled()) { Enabled = false; return; } SetupDirectoriesIfNeeded(); UniverseSyncCache.ExpireCache(); NetworkMain.StartNetworkSystem(); //Register events needed to bootstrap the workers. GameEvents.onHideUI.Add(() => { ShowGui = false; }); GameEvents.onShowUI.Add(() => { ShowGui = true; }); SystemsHandler.KillAllSystems(); HandleCommandLineArgs(); LunaLog.Log($"[LMP]: LunaMultiPlayer {VersionInfo.FullVersionNumber} Initialized!"); LunaLog.ProcessLogMessages(); }
public void OnExit() { Quit = true; NetworkConnection.Disconnect("Quit game"); UniverseSyncCache.Stop(); SystemsHandler.KillAllSystems(); LunaLog.ProcessLogMessages(); }
public override void LateUpdate() { base.LateUpdate(); if (!Enabled) { return; } SystemsHandler.LateUpdate(); }
public void MainSystemLateUpdate() { var startClock = ProfilerData.LmpReferenceTime.ElapsedTicks; if (!Enabled) { return; } SystemsHandler.LateUpdate(); LunaProfiler.LateUpdateData.ReportTime(startClock); }
public override void FixedUpdate() { base.FixedUpdate(); var startClock = Profiler.LmpReferenceTime.ElapsedTicks; if (!Enabled) { return; } SystemsHandler.FixedUpdate(); Profiler.FixedUpdateData.ReportTime(startClock); }
private static void NetworkUpdate() { switch (SystemsContainer.Get <MainSystem>().NetworkState) { case ClientState.Disconnected: case ClientState.Connecting: //Kill all systems while disconnected/connecting SystemsHandler.KillAllSystems(); return; case ClientState.Connected: SystemsContainer.Get <HandshakeSystem>().Enabled = true; break; case ClientState.Handshaking: SystemsContainer.Get <MainSystem>().Status = "Connection successful, handshaking"; break; case ClientState.Authenticated: SystemsContainer.Get <PlayerConnectionSystem>().Enabled = true; SystemsContainer.Get <StatusSystem>().Enabled = true; SystemsContainer.Get <StatusSystem>().MessageSender.SendPlayerStatus(SystemsContainer.Get <StatusSystem>().MyPlayerStatus); SystemsContainer.Get <MainSystem>().NetworkState = ClientState.TimeSyncing; break; case ClientState.TimeSyncing: SystemsContainer.Get <MainSystem>().Status = "Handshaking successful, syncing server clock"; SystemsContainer.Get <TimeSyncerSystem>().Enabled = true; if (SystemsContainer.Get <TimeSyncerSystem>().Synced) { SystemsContainer.Get <MainSystem>().NetworkState = ClientState.TimeSynced; } else { SystemsContainer.Get <TimeSyncerSystem>().MessageSender.SendTimeSyncRequest(); } break; case ClientState.TimeSynced: LunaLog.Log("[LMP]: Time Synced!"); SystemsContainer.Get <KerbalSystem>().Enabled = true; NetworkSimpleMessageSender.SendKerbalsRequest(); SystemsContainer.Get <MainSystem>().NetworkState = ClientState.SyncingKerbals; break; case ClientState.SyncingKerbals: SystemsContainer.Get <MainSystem>().Status = "Syncing kerbals"; break; case ClientState.KerbalsSynced: SystemsContainer.Get <MainSystem>().Status = "Kerbals synced"; SystemsContainer.Get <SettingsSystem>().Enabled = true; NetworkSimpleMessageSender.SendSettingsRequest(); SystemsContainer.Get <MainSystem>().NetworkState = ClientState.SyncingSettings; break; case ClientState.SyncingSettings: SystemsContainer.Get <MainSystem>().Status = "Syncing settings"; break; case ClientState.SettingsSynced: SystemsContainer.Get <MainSystem>().Status = "Settings synced"; SystemsContainer.Get <WarpSystem>().Enabled = true; NetworkSimpleMessageSender.SendWarpSubspacesRequest(); SystemsContainer.Get <MainSystem>().NetworkState = ClientState.SyncingWarpsubspaces; break; case ClientState.SyncingWarpsubspaces: SystemsContainer.Get <MainSystem>().Status = "Syncing warp subspaces"; break; case ClientState.WarpsubspacesSynced: SystemsContainer.Get <MainSystem>().Status = "Warp subspaces synced"; SystemsContainer.Get <PlayerColorSystem>().Enabled = true; NetworkSimpleMessageSender.SendColorsRequest(); SystemsContainer.Get <MainSystem>().NetworkState = ClientState.SyncingColors; break; case ClientState.SyncingColors: SystemsContainer.Get <MainSystem>().Status = "Syncing player colors"; break; case ClientState.ColorsSynced: SystemsContainer.Get <MainSystem>().Status = "Player colors synced"; NetworkSimpleMessageSender.SendPlayersRequest(); SystemsContainer.Get <MainSystem>().NetworkState = ClientState.SyncingPlayers; break; case ClientState.SyncingPlayers: SystemsContainer.Get <MainSystem>().Status = "Syncing players"; break; case ClientState.PlayersSynced: SystemsContainer.Get <MainSystem>().Status = "Players synced"; SystemsContainer.Get <ScenarioSystem>().Enabled = true; NetworkSimpleMessageSender.SendScenariosRequest(); SystemsContainer.Get <MainSystem>().NetworkState = ClientState.SyncingScenarios; break; case ClientState.SyncingScenarios: SystemsContainer.Get <MainSystem>().Status = "Syncing scenarios"; break; case ClientState.ScneariosSynced: SystemsContainer.Get <MainSystem>().Status = "Scenarios synced"; SystemsContainer.Get <CraftLibrarySystem>().Enabled = true; NetworkSimpleMessageSender.SendCraftLibraryRequest(); SystemsContainer.Get <MainSystem>().NetworkState = ClientState.SyncingCraftlibrary; break; case ClientState.SyncingCraftlibrary: SystemsContainer.Get <MainSystem>().Status = "Syncing craft library"; break; case ClientState.CraftlibrarySynced: SystemsContainer.Get <MainSystem>().Status = "Craft library synced"; SystemsContainer.Get <ChatSystem>().Enabled = true; NetworkSimpleMessageSender.SendChatRequest(); SystemsContainer.Get <MainSystem>().NetworkState = ClientState.SyncingChat; break; case ClientState.SyncingChat: SystemsContainer.Get <MainSystem>().Status = "Syncing chat"; break; case ClientState.ChatSynced: SystemsContainer.Get <MainSystem>().Status = "Chat synced"; SystemsContainer.Get <LockSystem>().Enabled = true; NetworkSimpleMessageSender.SendLocksRequest(); SystemsContainer.Get <MainSystem>().NetworkState = ClientState.SyncingLocks; break; case ClientState.SyncingLocks: SystemsContainer.Get <MainSystem>().Status = "Syncing locks"; break; case ClientState.LocksSynced: SystemsContainer.Get <MainSystem>().Status = "Locks synced"; SystemsContainer.Get <AdminSystem>().Enabled = true; NetworkSimpleMessageSender.SendAdminsRequest(); SystemsContainer.Get <MainSystem>().NetworkState = ClientState.SyncingAdmins; break; case ClientState.SyncingAdmins: SystemsContainer.Get <MainSystem>().Status = "Syncing admins"; break; case ClientState.AdminsSynced: SystemsContainer.Get <MainSystem>().Status = "Admins synced"; SystemsContainer.Get <VesselLockSystem>().Enabled = true; SystemsContainer.Get <VesselPositionSystem>().Enabled = true; SystemsContainer.Get <VesselPositionAltSystem>().Enabled = true; SystemsContainer.Get <VesselFlightStateSystem>().Enabled = true; SystemsContainer.Get <VesselUpdateSystem>().Enabled = true; SystemsContainer.Get <VesselChangeSystem>().Enabled = true; SystemsContainer.Get <VesselProtoSystem>().Enabled = true; SystemsContainer.Get <VesselRemoveSystem>().Enabled = true; SystemsContainer.Get <VesselImmortalSystem>().Enabled = true; SystemsContainer.Get <VesselDockSystem>().Enabled = true; SystemsContainer.Get <VesselRangeSystem>().Enabled = true; NetworkSimpleMessageSender.SendVesselListRequest(); SystemsContainer.Get <MainSystem>().NetworkState = ClientState.SyncingVessels; break; case ClientState.SyncingVessels: SystemsContainer.Get <MainSystem>().Status = "Syncing vessels"; break; case ClientState.VesselsSynced: LunaLog.Log("[LMP]: Vessels Synced!"); SystemsContainer.Get <MainSystem>().Status = "Syncing universe time"; SystemsContainer.Get <MainSystem>().NetworkState = ClientState.TimeLocking; SystemsContainer.Get <FlagSystem>().Enabled = true; SystemsContainer.Get <KerbalReassignerSystem>().Enabled = true; SystemsContainer.Get <FlagSystem>().SendFlagList(); SystemsContainer.Get <PlayerColorSystem>().MessageSender.SendPlayerColorToServer(); break; case ClientState.TimeLocking: if (SystemsContainer.Get <TimeSyncerSystem>().Synced) { LunaLog.Log("[LMP]: Time Locked!"); SystemsContainer.Get <MainSystem>().Status = "Starting game"; SystemsContainer.Get <MainSystem>().NetworkState = ClientState.TimeLocked; SystemsContainer.Get <MainSystem>().StartGame = true; } break; case ClientState.TimeLocked: SystemsContainer.Get <MainSystem>().NetworkState = ClientState.Starting; break; case ClientState.Starting: LunaLog.Log("[LMP]: All systems up and running! Poyekhali!!"); if (HighLogic.LoadedScene == GameScenes.SPACECENTER) { SystemsContainer.Get <MainSystem>().Status = "Running"; SystemsContainer.Get <MotdSystem>().Enabled = true; SystemsContainer.Get <MainSystem>().DisplayDisconnectMessage = false; SystemsContainer.Get <MainSystem>().NetworkState = ClientState.Running; SystemsContainer.Get <AsteroidSystem>().Enabled = true; SystemsContainer.Get <ToolbarSystem>().Enabled = true; NetworkSimpleMessageSender.SendMotdRequest(); } break; case ClientState.Running: SystemsContainer.Get <MainSystem>().GameRunning = true; break; default: throw new ArgumentOutOfRangeException(); } if (SystemsContainer.Get <MotdSystem>().DisplayMotd&& HighLogic.LoadedScene != GameScenes.LOADING) { SystemsContainer.Get <MotdSystem>().DisplayMotd = false; SystemsContainer.Get <ScenarioSystem>().UpgradeTheAstronautComplexSoTheGameDoesntBugOut(); ScreenMessages.PostScreenMessage(SystemsContainer.Get <MotdSystem>().ServerMotd, 10f, ScreenMessageStyle.UPPER_CENTER); //Control locks will bug out the space centre sceen, so remove them before starting. NetworkMain.DeleteAllTheControlLocksSoTheSpaceCentreBugGoesAway(); } }
public override void Update() { switch (MainSystem.Singleton.NetworkState) { case ClientState.DISCONNECTED: case ClientState.CONNECTING: //Kill all systems while disconnected/connecting SystemsHandler.KillAllSystems(); return; case ClientState.CONNECTED: HandshakeSystem.Singleton.Enabled = true; break; case ClientState.HANDSHAKING: MainSystem.Singleton.Status = "Connection successful, handshaking"; break; case ClientState.AUTHENTICATED: PlayerConnectionSystem.Singleton.Enabled = true; StatusSystem.Singleton.Enabled = true; StatusSystem.Singleton.MessageSender.SendPlayerStatus(StatusSystem.Singleton.MyPlayerStatus); MainSystem.Singleton.NetworkState = ClientState.TIME_SYNCING; break; case ClientState.TIME_SYNCING: MainSystem.Singleton.Status = "Handshaking successful, syncing server clock"; TimeSyncerSystem.Singleton.Enabled = true; if (TimeSyncerSystem.Singleton.Synced) { MainSystem.Singleton.NetworkState = ClientState.TIME_SYNCED; } else { TimeSyncerSystem.Singleton.MessageSender.SendTimeSyncRequest(); } break; case ClientState.TIME_SYNCED: Debug.Log("[LMP]: Time Synced!"); KerbalSystem.Singleton.Enabled = true; NetworkSimpleMessageSender.SendKerbalsRequest(); MainSystem.Singleton.NetworkState = ClientState.SYNCING_KERBALS; break; case ClientState.SYNCING_KERBALS: MainSystem.Singleton.Status = "Syncing kerbals"; break; case ClientState.KERBALS_SYNCED: MainSystem.Singleton.Status = "Kerbals synced"; SettingsSystem.Singleton.Enabled = true; NetworkSimpleMessageSender.SendSettingsRequest(); MainSystem.Singleton.NetworkState = ClientState.SYNCING_SETTINGS; break; case ClientState.SYNCING_SETTINGS: MainSystem.Singleton.Status = "Syncing settings"; break; case ClientState.SETTINGS_SYNCED: MainSystem.Singleton.Status = "Settings synced"; WarpSystem.Singleton.Enabled = true; NetworkSimpleMessageSender.SendWarpSubspacesRequest(); MainSystem.Singleton.NetworkState = ClientState.SYNCING_WARPSUBSPACES; break; case ClientState.SYNCING_WARPSUBSPACES: MainSystem.Singleton.Status = "Syncing warp subspaces"; break; case ClientState.WARPSUBSPACES_SYNCED: MainSystem.Singleton.Status = "Warp subspaces synced"; PlayerColorSystem.Singleton.Enabled = true; NetworkSimpleMessageSender.SendColorsRequest(); MainSystem.Singleton.NetworkState = ClientState.SYNCING_COLORS; break; case ClientState.SYNCING_COLORS: MainSystem.Singleton.Status = "Syncing player colors"; break; case ClientState.COLORS_SYNCED: MainSystem.Singleton.Status = "Player colors synced"; NetworkSimpleMessageSender.SendPlayersRequest(); MainSystem.Singleton.NetworkState = ClientState.SYNCING_PLAYERS; break; case ClientState.SYNCING_PLAYERS: MainSystem.Singleton.Status = "Syncing players"; break; case ClientState.PLAYERS_SYNCED: MainSystem.Singleton.Status = "Players synced"; ScenarioSystem.Singleton.Enabled = true; NetworkSimpleMessageSender.SendScenariosRequest(); MainSystem.Singleton.NetworkState = ClientState.SYNCING_SCENARIOS; break; case ClientState.SYNCING_SCENARIOS: MainSystem.Singleton.Status = "Syncing scenarios"; break; case ClientState.SCNEARIOS_SYNCED: MainSystem.Singleton.Status = "Scenarios synced"; CraftLibrarySystem.Singleton.Enabled = true; NetworkSimpleMessageSender.SendCraftLibraryRequest(); MainSystem.Singleton.NetworkState = ClientState.SYNCING_CRAFTLIBRARY; break; case ClientState.SYNCING_CRAFTLIBRARY: MainSystem.Singleton.Status = "Syncing craft library"; break; case ClientState.CRAFTLIBRARY_SYNCED: MainSystem.Singleton.Status = "Craft library synced"; ChatSystem.Singleton.Enabled = true; NetworkSimpleMessageSender.SendChatRequest(); MainSystem.Singleton.NetworkState = ClientState.SYNCING_CHAT; break; case ClientState.SYNCING_CHAT: MainSystem.Singleton.Status = "Syncing chat"; break; case ClientState.CHAT_SYNCED: MainSystem.Singleton.Status = "Chat synced"; LockSystem.Singleton.Enabled = true; NetworkSimpleMessageSender.SendLocksRequest(); MainSystem.Singleton.NetworkState = ClientState.SYNCING_LOCKS; break; case ClientState.SYNCING_LOCKS: MainSystem.Singleton.Status = "Syncing locks"; break; case ClientState.LOCKS_SYNCED: MainSystem.Singleton.Status = "Locks synced"; AdminSystem.Singleton.Enabled = true; NetworkSimpleMessageSender.SendAdminsRequest(); MainSystem.Singleton.NetworkState = ClientState.SYNCING_ADMINS; break; case ClientState.SYNCING_ADMINS: MainSystem.Singleton.Status = "Syncing admins"; break; case ClientState.ADMINS_SYNCED: MainSystem.Singleton.Status = "Admins synced"; VesselCommon.EnableAllSystems = true; NetworkSimpleMessageSender.SendVesselListRequest(); MainSystem.Singleton.NetworkState = ClientState.SYNCING_VESSELS; break; case ClientState.SYNCING_VESSELS: MainSystem.Singleton.Status = "Syncing vessels"; break; case ClientState.VESSELS_SYNCED: Debug.Log("[LMP]: Vessels Synced!"); MainSystem.Singleton.Status = "Syncing universe time"; MainSystem.Singleton.NetworkState = ClientState.TIME_LOCKING; FlagSystem.Singleton.Enabled = true; KerbalReassignerSystem.Singleton.Enabled = true; FlagSystem.Singleton.SendFlagList(); PlayerColorSystem.Singleton.MessageSender.SendPlayerColorToServer(); break; case ClientState.TIME_LOCKING: if (TimeSyncerSystem.Singleton.Synced) { Debug.Log("[LMP]: Time Locked!"); MainSystem.Singleton.Status = "Starting game"; MainSystem.Singleton.NetworkState = ClientState.TIME_LOCKED; MainSystem.Singleton.StartGame = true; } break; case ClientState.TIME_LOCKED: MainSystem.Singleton.NetworkState = ClientState.STARTING; break; case ClientState.STARTING: Debug.Log("[LMP]: All systems up and running Poyekhali"); if (HighLogic.LoadedScene == GameScenes.SPACECENTER) { MainSystem.Singleton.Status = "Running"; MotdSystem.Singleton.Enabled = true; MainSystem.Singleton.DisplayDisconnectMessage = false; MainSystem.Singleton.NetworkState = ClientState.RUNNING; AsteroidSystem.Singleton.Enabled = true; ToolbarSystem.Singleton.Enabled = true; NetworkSimpleMessageSender.SendMotdRequest(); } break; case ClientState.RUNNING: MainSystem.Singleton.GameRunning = true; break; default: throw new ArgumentOutOfRangeException(); } if (MotdSystem.Singleton.DisplayMotd && (HighLogic.LoadedScene != GameScenes.LOADING)) { MotdSystem.Singleton.DisplayMotd = false; ScenarioSystem.Singleton.UpgradeTheAstronautComplexSoTheGameDoesntBugOut(); ScreenMessages.PostScreenMessage(MotdSystem.Singleton.ServerMotd, 10f, ScreenMessageStyle.UPPER_CENTER); //Control locks will bug out the space centre sceen, so remove them before starting. NetworkMain.DeleteAllTheControlLocksSoTheSpaceCentreBugGoesAway(); } }
public void OnExit() { Quit = true; NetworkConnection.Disconnect("Quit game"); SystemsHandler.KillAllSystems(); }
public override void Update() { base.Update(); var startClock = Profiler.LmpReferenceTime.ElapsedTicks; if (!Enabled) { return; } try { if (HighLogic.LoadedScene == GameScenes.MAINMENU) { if (!ModSystem.Singleton.DllListBuilt) { ModSystem.Singleton.DllListBuilt = true; ModSystem.Singleton.BuildDllFileList(); } if (!LmpSaveChecked) { LmpSaveChecked = true; SetupBlankGameIfNeeded(); } } HandleWindowEvents(); SystemsHandler.Update(); WindowsHandler.Update(); //Force quit if (ForceQuit) { ForceQuit = false; GameRunning = false; FireReset = true; StopGame(); } if (DisplayDisconnectMessage) { ShowDisconnectMessage(); } //Normal quit if (GameRunning) { if (HighLogic.LoadedScene == GameScenes.MAINMENU) { GameRunning = false; FireReset = true; ToolbarSystem.Singleton.Enabled = false; //Always disable toolbar in main menu NetworkConnection.Disconnect("Quit to main menu"); } if (HighLogic.CurrentGame.flagURL != SettingsSystem.CurrentSettings.SelectedFlag) { Debug.Log("[LMP]: Saving Selected flag"); SettingsSystem.CurrentSettings.SelectedFlag = HighLogic.CurrentGame.flagURL; SettingsSystem.Singleton.SaveSettings(); FlagSystem.Singleton.FlagChangeEvent = true; } // save every GeeASL from each body in FlightGlobals if ((HighLogic.LoadedScene == GameScenes.FLIGHT) && (BodiesGees.Count == 0)) { foreach (var body in FlightGlobals.Bodies) { BodiesGees.Add(body, body.GeeASL); } } //handle use of cheats if (!SettingsSystem.ServerSettings.AllowCheats) { CheatOptions.InfinitePropellant = false; CheatOptions.NoCrashDamage = false; foreach (var gravityEntry in BodiesGees) { gravityEntry.Key.GeeASL = gravityEntry.Value; } } if ((HighLogic.LoadedScene == GameScenes.FLIGHT) && FlightGlobals.ready) { HighLogic.CurrentGame.Parameters.Flight.CanLeaveToSpaceCenter = PauseMenu.canSaveAndExit == ClearToSaveStatus.CLEAR; } else { HighLogic.CurrentGame.Parameters.Flight.CanLeaveToSpaceCenter = true; } } if (FireReset) { FireReset = false; SystemsHandler.KillAllSystems(); } if (StartGame) { StartGame = false; StartGameNow(); } } catch (Exception e) { HandleException(e, "Main system- update"); } Profiler.UpdateData.ReportTime(startClock); }