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(); } }
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(); } }
private void NetworkUpdate() { switch (MainSystem.NetworkState) { case ClientState.DisconnectRequested: case ClientState.Disconnected: break; case ClientState.Connecting: ChangeRoutineExecutionInterval(RoutineExecution.Update, nameof(NetworkUpdate), 0); return; case ClientState.Connected: HandshakeSystem.Singleton.Enabled = true; MainSystem.Singleton.Status = "Connected"; MainSystem.NetworkState = ClientState.Handshaking; HandshakeSystem.Singleton.MessageSender.SendHandshakeRequest(); _lastStateTime = LunaComputerTime.UtcNow; break; case ClientState.Handshaking: MainSystem.Singleton.Status = "Waiting for handshake response"; if (ConnectionIsStuck(10000)) { MainSystem.NetworkState = ClientState.Connected; } break; case ClientState.Handshaked: MainSystem.Singleton.Status = "Handshaking successful"; SettingsSystem.Singleton.Enabled = true; MainSystem.NetworkState = ClientState.SyncingSettings; NetworkSimpleMessageSender.SendSettingsRequest(); _lastStateTime = LunaComputerTime.UtcNow; break; case ClientState.SyncingSettings: MainSystem.Singleton.Status = "Syncing settings"; if (ConnectionIsStuck()) { MainSystem.NetworkState = ClientState.Handshaked; } break; case ClientState.SettingsSynced: MainSystem.Singleton.Status = "Settings synced"; if (SettingsSystem.ValidateSettings()) { KerbalSystem.Singleton.Enabled = true; VesselProtoSystem.Singleton.Enabled = true; VesselSyncSystem.Singleton.Enabled = true; VesselSyncSystem.Singleton.MessageSender.SendVesselsSyncMsg(); MainSystem.NetworkState = ClientState.SyncingKerbals; NetworkSimpleMessageSender.SendKerbalsRequest(); _lastStateTime = LunaComputerTime.UtcNow; } break; case ClientState.SyncingKerbals: MainSystem.Singleton.Status = "Syncing kerbals"; if (ConnectionIsStuck(10000)) { MainSystem.NetworkState = ClientState.SettingsSynced; } break; case ClientState.KerbalsSynced: MainSystem.Singleton.Status = "Kerbals synced"; WarpSystem.Singleton.Enabled = true; MainSystem.NetworkState = ClientState.SyncingWarpsubspaces; NetworkSimpleMessageSender.SendWarpSubspacesRequest(); _lastStateTime = LunaComputerTime.UtcNow; break; case ClientState.SyncingWarpsubspaces: MainSystem.Singleton.Status = "Syncing warp subspaces"; if (ConnectionIsStuck()) { MainSystem.NetworkState = ClientState.KerbalsSynced; } break; case ClientState.WarpsubspacesSynced: MainSystem.Singleton.Status = "Warp subspaces synced"; PlayerColorSystem.Singleton.Enabled = true; MainSystem.NetworkState = ClientState.SyncingColors; NetworkSimpleMessageSender.SendColorsRequest(); _lastStateTime = LunaComputerTime.UtcNow; break; case ClientState.SyncingColors: MainSystem.Singleton.Status = "Syncing player colors"; if (ConnectionIsStuck()) { MainSystem.NetworkState = ClientState.WarpsubspacesSynced; } break; case ClientState.ColorsSynced: MainSystem.Singleton.Status = "Player colors synced"; FlagSystem.Singleton.Enabled = true; MainSystem.NetworkState = ClientState.SyncingFlags; NetworkSimpleMessageSender.SendFlagsRequest(); _lastStateTime = LunaComputerTime.UtcNow; break; case ClientState.SyncingFlags: MainSystem.Singleton.Status = "Syncing flags"; if (ConnectionIsStuck(10000)) { MainSystem.NetworkState = ClientState.ColorsSynced; } break; case ClientState.FlagsSynced: MainSystem.Singleton.Status = "Flags synced"; StatusSystem.Singleton.Enabled = true; PlayerConnectionSystem.Singleton.Enabled = true; MainSystem.NetworkState = ClientState.SyncingPlayers; NetworkSimpleMessageSender.SendPlayersRequest(); _lastStateTime = LunaComputerTime.UtcNow; break; case ClientState.SyncingPlayers: MainSystem.Singleton.Status = "Syncing players"; if (ConnectionIsStuck()) { MainSystem.NetworkState = ClientState.FlagsSynced; } break; case ClientState.PlayersSynced: MainSystem.Singleton.Status = "Players synced"; ScenarioSystem.Singleton.Enabled = true; MainSystem.NetworkState = ClientState.SyncingScenarios; NetworkSimpleMessageSender.SendScenariosRequest(); _lastStateTime = LunaComputerTime.UtcNow; break; case ClientState.SyncingScenarios: MainSystem.Singleton.Status = "Syncing scenarios"; if (ConnectionIsStuck(10000)) { MainSystem.NetworkState = ClientState.PlayersSynced; } break; case ClientState.ScenariosSynced: MainSystem.Singleton.Status = "Scenarios synced"; MainSystem.NetworkState = ClientState.SyncingLocks; LockSystem.Singleton.Enabled = true; LockSystem.Singleton.MessageSender.SendLocksRequest(); _lastStateTime = LunaComputerTime.UtcNow; break; case ClientState.SyncingLocks: MainSystem.Singleton.Status = "Syncing locks"; if (ConnectionIsStuck()) { MainSystem.NetworkState = ClientState.ScenariosSynced; } break; case ClientState.LocksSynced: MainSystem.Singleton.Status = "Starting"; MainSystem.Singleton.StartGame = true; MainSystem.NetworkState = ClientState.Starting; break; case ClientState.Starting: //Once we start the game we don't need to run this routine on every frame ChangeRoutineExecutionInterval(RoutineExecution.Update, nameof(NetworkUpdate), 1500); MainSystem.Singleton.Status = "Running"; CommonUtil.Reserve20Mb(); LunaLog.Log("[LMP]: All systems up and running. Поехали!"); if (HighLogic.LoadedScene == GameScenes.SPACECENTER) { MainSystem.NetworkState = ClientState.Running; NetworkMain.DeleteAllTheControlLocksSoTheSpaceCentreBugGoesAway(); } break; case ClientState.Running: break; default: throw new ArgumentOutOfRangeException(); } }