private void DrawContent(int windowID) { GUILayout.BeginVertical(); GUILayout.BeginHorizontal(); GUILayout.Label("Player name:"); string oldPlayerName = Settings.fetch.playerName; Settings.fetch.playerName = GUILayout.TextArea(Settings.fetch.playerName, textAreaStyle); if (Settings.fetch.playerName.Length > 32) { Settings.fetch.playerName = Settings.fetch.playerName.Substring(0, 32); } if (oldPlayerName != Settings.fetch.playerName) { renameEventHandled = false; } GUILayout.EndHorizontal(); GUILayout.BeginHorizontal(); //Draw add button string addMode = selectedSafe == -1 ? "Add" : "Edit"; addingServer = GUILayout.Toggle(addingServer, addMode, buttonStyle); if (addingServer && !addingServerSafe) { if (selected != -1) { //Load the existing server settings serverName = Settings.fetch.servers[selected].name; serverAddress = Settings.fetch.servers[selected].address; serverPort = Settings.fetch.servers[selected].port.ToString(); } } //Draw connect button if (NetworkWorker.fetch.state == DarkMultiPlayerCommon.ClientState.DISCONNECTED) { GUI.enabled = (selectedSafe != -1); if (GUILayout.Button("Connect", buttonStyle)) { connectEventHandled = false; } } else { if (GUILayout.Button("Disconnect", buttonStyle)) { disconnectEventHandled = false; } } //Draw remove button if (GUILayout.Button("Remove", buttonStyle)) { if (removeEventHandled == true) { removeEventHandled = false; } } GUI.enabled = true; OptionsWindow.fetch.display = GUILayout.Toggle(OptionsWindow.fetch.display, "Options", buttonStyle); GUILayout.EndHorizontal(); if (addingServerSafe) { GUILayout.BeginHorizontal(); GUILayout.Label("Name:"); serverName = GUILayout.TextArea(serverName, textAreaStyle); GUILayout.Label("Address:"); serverAddress = GUILayout.TextArea(serverAddress, textAreaStyle); GUILayout.Label("Port:"); serverPort = GUILayout.TextArea(serverPort, textAreaStyle); GUILayout.EndHorizontal(); if (GUILayout.Button(addMode + " server", buttonStyle)) { if (addEventHandled == true) { if (selected == -1) { addEntry = new ServerEntry(); addEntry.name = serverName; addEntry.address = serverAddress; addEntry.port = 6702; Int32.TryParse(serverPort, out addEntry.port); addEventHandled = false; } else { editEntry = new ServerEntry(); editEntry.name = serverName; editEntry.address = serverAddress; editEntry.port = 6702; Int32.TryParse(serverPort, out editEntry.port); editEventHandled = false; } } } } GUILayout.Label("Servers:"); if (Settings.fetch.servers.Count == 0) { GUILayout.Label("(None - Add a server first)"); } for (int serverPos = 0; serverPos < Settings.fetch.servers.Count; serverPos++) { bool thisSelected = GUILayout.Toggle(serverPos == selectedSafe, Settings.fetch.servers[serverPos].name, buttonStyle); if (selected == selectedSafe) { if (thisSelected) { if (selected != serverPos) { selected = serverPos; addingServer = false; } } else if (selected == serverPos) { selected = -1; addingServer = false; } } } GUILayout.FlexibleSpace(); //Draw status message GUILayout.Label(status, statusStyle); GUILayout.EndVertical(); }
public void LoadSettings() { //Read XML settings try { bool saveXMLAfterLoad = false; XmlDocument xmlDoc = new XmlDocument(); if (File.Exists(backupSettingsFile) && !File.Exists(settingsFile)) { DarkLog.Debug("Restoring player settings file!"); File.Copy(backupSettingsFile, settingsFile); } if (!File.Exists(settingsFile)) { xmlDoc.LoadXml(newXMLString()); playerName = DEFAULT_PLAYER_NAME; xmlDoc.Save(settingsFile); } if (!File.Exists(backupSettingsFile)) { DarkLog.Debug("Backing up player token and settings file!"); File.Copy(settingsFile, backupSettingsFile); } xmlDoc.Load(settingsFile); playerName = xmlDoc.SelectSingleNode("/settings/global/@username").Value; try { cacheSize = Int32.Parse(xmlDoc.SelectSingleNode("/settings/global/@cache-size").Value); } catch { DarkLog.Debug("Adding cache size to settings file"); saveXMLAfterLoad = true; cacheSize = DEFAULT_CACHE_SIZE; } try { disclaimerAccepted = Int32.Parse(xmlDoc.SelectSingleNode("/settings/global/@disclaimer").Value); } catch { DarkLog.Debug("Adding disclaimer to settings file"); saveXMLAfterLoad = true; } try { string floatArrayString = xmlDoc.SelectSingleNode("/settings/global/@player-color").Value; string[] floatArrayStringSplit = floatArrayString.Split(','); float redColor = float.Parse(floatArrayStringSplit[0].Trim()); float greenColor = float.Parse(floatArrayStringSplit[1].Trim()); float blueColor = float.Parse(floatArrayStringSplit[2].Trim()); //Bounds checking - Gotta check up on those players :) if (redColor < 0f) { redColor = 0f; } if (redColor > 1f) { redColor = 1f; } if (greenColor < 0f) { greenColor = 0f; } if (greenColor > 1f) { greenColor = 1f; } if (blueColor < 0f) { blueColor = 0f; } if (blueColor > 1f) { blueColor = 1f; } playerColor = new Color(redColor, greenColor, blueColor, 1f); } catch { DarkLog.Debug("Adding player color to settings file"); saveXMLAfterLoad = true; playerColor = PlayerColorWorker.GenerateRandomColor(); } try { chatKey = (KeyCode)Int32.Parse(xmlDoc.SelectSingleNode("/settings/global/@chat-key").Value); } catch { DarkLog.Debug("Adding chat key to settings file"); saveXMLAfterLoad = true; chatKey = KeyCode.BackQuote; } try { screenshotKey = (KeyCode)Int32.Parse(xmlDoc.SelectSingleNode("/settings/global/@screenshot-key").Value); } catch { DarkLog.Debug("Adding screenshot key to settings file"); saveXMLAfterLoad = true; chatKey = KeyCode.F8; } try { selectedFlag = xmlDoc.SelectSingleNode("/settings/global/@selected-flag").Value; } catch { DarkLog.Debug("Adding selected flag to settings file"); saveXMLAfterLoad = true; selectedFlag = "Squad/Flags/default"; } try { compressionEnabled = Boolean.Parse(xmlDoc.SelectSingleNode("/settings/global/@compression").Value); } catch { DarkLog.Debug("Adding compression flag to settings file"); compressionEnabled = true; } try { revertEnabled = Boolean.Parse(xmlDoc.SelectSingleNode("/settings/global/@revert").Value); } catch { DarkLog.Debug("Adding revert flag to settings file"); revertEnabled = true; } try { toolbarType = (DMPToolbarType)Int32.Parse(xmlDoc.SelectSingleNode("/settings/global/@toolbar").Value); } catch { DarkLog.Debug("Adding toolbar flag to settings file"); toolbarType = DMPToolbarType.BLIZZY_IF_INSTALLED; } XmlNodeList serverNodeList = xmlDoc.GetElementsByTagName("server"); servers = new List <ServerEntry>(); foreach (XmlNode xmlNode in serverNodeList) { ServerEntry newServer = new ServerEntry(); newServer.name = xmlNode.Attributes["name"].Value; newServer.address = xmlNode.Attributes["address"].Value; Int32.TryParse(xmlNode.Attributes["port"].Value, out newServer.port); servers.Add(newServer); } if (saveXMLAfterLoad) { SaveSettings(); } } catch (Exception e) { DarkLog.Debug("XML Exception: " + e); } //Read player token try { //Restore backup if needed if (File.Exists(backupPublicKeyFile) && File.Exists(backupPrivateKeyFile) && (!File.Exists(publicKeyFile) || !File.Exists(privateKeyFile))) { DarkLog.Debug("Restoring backed up keypair!"); File.Copy(backupPublicKeyFile, publicKeyFile, true); File.Copy(backupPrivateKeyFile, privateKeyFile, true); } //Load or create token file if (File.Exists(privateKeyFile) && File.Exists(publicKeyFile)) { playerPublicKey = File.ReadAllText(publicKeyFile); playerPrivateKey = File.ReadAllText(privateKeyFile); } else { DarkLog.Debug("Creating new keypair!"); GenerateNewKeypair(); } //Save backup token file if needed if (!File.Exists(backupPublicKeyFile) || !File.Exists(backupPrivateKeyFile)) { DarkLog.Debug("Backing up keypair"); File.Copy(publicKeyFile, backupPublicKeyFile, true); File.Copy(privateKeyFile, backupPrivateKeyFile, true); } } catch { DarkLog.Debug("Error processing keypair, creating new keypair"); GenerateNewKeypair(); DarkLog.Debug("Backing up keypair"); File.Copy(publicKeyFile, backupPublicKeyFile, true); File.Copy(privateKeyFile, backupPrivateKeyFile, true); } }
private void HandleCommandLineArgs() { bool nextLineIsAddress = false; bool valid = false; string address = null; int port = 6702; foreach (string commandLineArg in Environment.GetCommandLineArgs()) { //Supporting IPv6 is FUN! if (nextLineIsAddress) { valid = true; nextLineIsAddress = false; if (commandLineArg.Contains("dmp://")) { if (commandLineArg.Contains("[") && commandLineArg.Contains("]")) { //IPv6 literal address = commandLineArg.Substring("dmp://[".Length); address = address.Substring(0, address.LastIndexOf("]", StringComparison.Ordinal)); if (commandLineArg.Contains("]:")) { //With port string portString = commandLineArg.Substring(commandLineArg.LastIndexOf("]:", StringComparison.Ordinal) + 1); if (!Int32.TryParse(portString, out port)) { valid = false; } } } else { //IPv4 literal or hostname if (commandLineArg.Substring("dmp://".Length).Contains(":")) { //With port address = commandLineArg.Substring("dmp://".Length); address = address.Substring(0, address.LastIndexOf(":", StringComparison.Ordinal)); string portString = commandLineArg.Substring(commandLineArg.LastIndexOf(":", StringComparison.Ordinal) + 1); if (!Int32.TryParse(portString, out port)) { valid = false; } } else { //Without port address = commandLineArg.Substring("dmp://".Length); } } } else { valid = false; } } if (commandLineArg == "-dmp") { nextLineIsAddress = true; } } if (valid) { commandLineConnect = new ServerEntry(); commandLineConnect.address = address; commandLineConnect.port = port; DarkLog.Debug("Connecting via command line to: " + address + ", port: " + port); } }
public void Update() { profiler.Report("KSP", kspTime, kspMemory); DarkLog.Update(); ByteRecycler.GarbageCollect(50, 100); Recycler <VesselUpdate> .GarbageCollect(50, 100); long profilerStartTime = profiler.GetCurrentTime; long profilerStartMemory = profiler.GetCurrentMemory; lastClockTicks = DateTime.UtcNow.Ticks; lastRealTimeSinceStartup = Time.realtimeSinceStartup; if (warnDuplicateInstall && HighLogic.LoadedScene == GameScenes.MAINMENU) { warnDuplicateInstall = false; string message = "Please remove the duplicate install of DarkMultiPlayer."; PopupDialog.SpawnPopupDialog(new Vector2(0.5f, 0.5f), new Vector2(0.5f, 0.5f), "InstallChecker", "Incorrect Install Detected", message, "OK", true, HighLogic.UISkin); } if (modDisabled) { return; } try { if (HighLogic.LoadedScene == GameScenes.MAINMENU) { if (!dmpSaveChecked) { dmpSaveChecked = true; SetupBlankGameIfNeeded(); } } if (HighLogic.LoadedScene == GameScenes.SPACECENTER && PSystemSetup.Instance != null && Time.timeSinceLevelLoad > 1f) { if (PSystemSetup.Instance.SpaceCenterFacilities.Length != facilitiesAdded) { facilitiesAdded = PSystemSetup.Instance.SpaceCenterFacilities.Length; foreach (PSystemSetup.SpaceCenterFacility spaceCenterFacility in PSystemSetup.Instance.SpaceCenterFacilities) { foreach (PSystemSetup.SpaceCenterFacility.SpawnPoint spawnPoint in spaceCenterFacility.spawnPoints) { if (spawnPoint.latitude != 0 && spawnPoint.longitude != 0 && spawnPoint.altitude != 0) { DarkLog.Debug("Adding facility spawn point: " + spaceCenterFacility.name + ":" + spawnPoint.name); SafetyBubble.RegisterLocation(spawnPoint.latitude, spawnPoint.longitude, spawnPoint.altitude, spaceCenterFacility.hostBody.name); DarkLog.Debug("LLA: [" + spawnPoint.latitude + ", " + spawnPoint.longitude + ", " + spawnPoint.altitude + "]"); } } } } if (PSystemSetup.Instance.LaunchSites.Count != modSitesAdded) { modSitesAdded = PSystemSetup.Instance.LaunchSites.Count; foreach (LaunchSite launchSite in PSystemSetup.Instance.LaunchSites) { foreach (LaunchSite.SpawnPoint spawnPoint in launchSite.spawnPoints) { if (spawnPoint.latitude != 0 && spawnPoint.longitude != 0 && spawnPoint.altitude != 0) { DarkLog.Debug("Adding mod spawn point: " + launchSite.name + ":" + spawnPoint.name); SafetyBubble.RegisterLocation(spawnPoint.latitude, spawnPoint.longitude, spawnPoint.altitude, launchSite.Body.name); DarkLog.Debug("LLA: [" + spawnPoint.latitude + ", " + spawnPoint.longitude + ", " + spawnPoint.altitude + "]"); } } } } if (PSystemSetup.Instance.StockLaunchSites.Length != stockSitesAdded) { stockSitesAdded = PSystemSetup.Instance.StockLaunchSites.Length; foreach (LaunchSite launchSite in PSystemSetup.Instance.StockLaunchSites) { foreach (LaunchSite.SpawnPoint spawnPoint in launchSite.spawnPoints) { if (spawnPoint.latitude != 0 && spawnPoint.longitude != 0 && spawnPoint.altitude != 0) { DarkLog.Debug("Adding stock spawn point: " + launchSite.name + ":" + spawnPoint.name); SafetyBubble.RegisterLocation(spawnPoint.latitude, spawnPoint.longitude, spawnPoint.altitude, launchSite.Body.name); DarkLog.Debug("LLA: [" + spawnPoint.latitude + ", " + spawnPoint.longitude + ", " + spawnPoint.altitude + "]"); } } } } } //Handle GUI events if (!connectionWindow.renameEventHandled) { dmpSettings.SaveSettings(); connectionWindow.renameEventHandled = true; } if (!connectionWindow.addEventHandled) { dmpSettings.servers.Add(connectionWindow.addEntry); connectionWindow.addEntry = null; dmpSettings.SaveSettings(); connectionWindow.addingServer = false; connectionWindow.addEventHandled = true; } if (!connectionWindow.editEventHandled) { dmpSettings.servers[connectionWindow.selected].name = connectionWindow.editEntry.name; dmpSettings.servers[connectionWindow.selected].address = connectionWindow.editEntry.address; dmpSettings.servers[connectionWindow.selected].port = connectionWindow.editEntry.port; connectionWindow.editEntry = null; dmpSettings.SaveSettings(); connectionWindow.addingServer = false; connectionWindow.editEventHandled = true; } if (!connectionWindow.removeEventHandled) { dmpSettings.servers.RemoveAt(connectionWindow.selected); connectionWindow.selected = -1; dmpSettings.SaveSettings(); connectionWindow.removeEventHandled = true; } if (!connectionWindow.connectEventHandled) { connectionWindow.connectEventHandled = true; ConnectToServer(dmpSettings.servers[connectionWindow.selected].address, dmpSettings.servers[connectionWindow.selected].port); } if (commandLineConnect != null && HighLogic.LoadedScene == GameScenes.MAINMENU && Time.timeSinceLevelLoad > 1f) { ConnectToServer(commandLineConnect.address, commandLineConnect.port); commandLineConnect = null; } if (!connectionWindow.disconnectEventHandled) { connectionWindow.disconnectEventHandled = true; if (dmpGame != null) { if (dmpGame.networkWorker.state == ClientState.CONNECTING) { dmpGame.networkWorker.Disconnect("Cancelled connection to server"); } else { dmpGame.networkWorker.SendDisconnect("Quit during initial sync"); } dmpGame.Stop(); dmpGame = null; } } connectionWindow.Update(); serverListConnection.Update(); serversWindow.Update(); modWindow.Update(); optionsWindow.Update(); universeConverterWindow.Update(); profiler.Update(); dmpModInterface.Update(); if (dmpGame != null) { foreach (NamedAction updateAction in dmpGame.updateEvent) { #if !DEBUG try { #endif long profilerUpdateStartTime = profiler.GetCurrentTime; long profilerUpdateStartMemory = profiler.GetCurrentMemory; updateAction.action(); profiler.Report(updateAction.name, profilerUpdateStartTime, profilerUpdateStartMemory); #if !DEBUG } catch (Exception e) { DarkLog.Debug("Threw in UpdateEvent, exception: " + e); if (dmpGame.networkWorker.state != ClientState.RUNNING) { if (dmpGame.networkWorker.state != ClientState.DISCONNECTED) { dmpGame.networkWorker.SendDisconnect("Unhandled error while syncing!"); } else { dmpGame.networkWorker.Disconnect("Unhandled error while syncing!"); } } } #endif } } //Force quit if (dmpGame != null && dmpGame.forceQuit) { dmpGame.forceQuit = false; dmpGame.Stop(); dmpGame = null; StopGame(); } if (displayDisconnectMessage) { if (HighLogic.LoadedScene != GameScenes.MAINMENU) { if ((Client.realtimeSinceStartup - lastDisconnectMessageCheck) > 1f) { lastDisconnectMessageCheck = Client.realtimeSinceStartup; if (disconnectMessage != null) { disconnectMessage.duration = 0; } disconnectMessage = ScreenMessages.PostScreenMessage("You have been disconnected!", 2f, ScreenMessageStyle.UPPER_CENTER); } } else { displayDisconnectMessage = false; } } //Normal quit if (dmpGame != null && dmpGame.running) { if (!dmpGame.playerStatusWindow.disconnectEventHandled) { dmpGame.playerStatusWindow.disconnectEventHandled = true; dmpGame.forceQuit = true; dmpGame.scenarioWorker.SendScenarioModules(true); // Send scenario modules before disconnecting dmpGame.networkWorker.SendDisconnect("Quit"); } if (dmpGame.screenshotWorker.uploadScreenshot) { dmpGame.screenshotWorker.uploadScreenshot = false; StartCoroutine(UploadScreenshot()); } if (HighLogic.CurrentGame.flagURL != dmpSettings.selectedFlag) { DarkLog.Debug("Saving selected flag"); dmpSettings.selectedFlag = HighLogic.CurrentGame.flagURL; dmpSettings.SaveSettings(); dmpGame.flagSyncer.flagChangeEvent = true; } // save every GeeASL from each body in FlightGlobals if (HighLogic.LoadedScene == GameScenes.FLIGHT && bodiesGees.Count == 0) { foreach (CelestialBody body in FlightGlobals.fetch.bodies) { bodiesGees.Add(body, body.GeeASL); } } //handle use of cheats if (!dmpGame.serverAllowCheats) { CheatOptions.InfinitePropellant = false; CheatOptions.NoCrashDamage = false; CheatOptions.IgnoreAgencyMindsetOnContracts = false; CheatOptions.IgnoreMaxTemperature = false; CheatOptions.InfiniteElectricity = false; CheatOptions.NoCrashDamage = false; CheatOptions.UnbreakableJoints = false; foreach (KeyValuePair <CelestialBody, double> gravityEntry in bodiesGees) { gravityEntry.Key.GeeASL = gravityEntry.Value; } } if (HighLogic.LoadedScene == GameScenes.FLIGHT && FlightGlobals.ready) { HighLogic.CurrentGame.Parameters.Flight.CanLeaveToSpaceCenter = !dmpGame.vesselWorker.isSpectating && dmpSettings.revertEnabled || (PauseMenu.canSaveAndExit == ClearToSaveStatus.CLEAR); } else { HighLogic.CurrentGame.Parameters.Flight.CanLeaveToSpaceCenter = true; } if (HighLogic.LoadedScene == GameScenes.MAINMENU) { dmpGame.networkWorker.SendDisconnect("Quit to main menu"); dmpGame.Stop(); dmpGame = null; } } if (dmpGame != null && dmpGame.startGame) { dmpGame.startGame = false; StartGame(); } } catch (Exception e) { if (dmpGame != null) { DarkLog.Debug("Threw in Update, state " + dmpGame.networkWorker.state.ToString() + ", exception: " + e); if (dmpGame.networkWorker.state != ClientState.RUNNING) { if (dmpGame.networkWorker.state != ClientState.DISCONNECTED) { dmpGame.networkWorker.SendDisconnect("Unhandled error while syncing!"); } else { dmpGame.networkWorker.Disconnect("Unhandled error while syncing!"); } } } else { DarkLog.Debug("Threw in Update, state NO_NETWORKWORKER, exception: " + e); } } DarkLog.Update(); profiler.Report("Update", profilerStartTime, profilerStartMemory); kspTime = profiler.GetCurrentTime; kspMemory = profiler.GetCurrentMemory; }
public void LoadOldSettings() { //Read XML settings try { XmlDocument xmlDoc = new XmlDocument(); if (File.Exists(backupOldSettingsFile) && !File.Exists(oldSettingsFile)) { DarkLog.Debug("[Settings]: Restoring old player settings file!"); File.Move(backupOldSettingsFile, oldSettingsFile); } xmlDoc.Load(oldSettingsFile); playerName = xmlDoc.SelectSingleNode("/settings/global/@username").Value; cacheSize = int.Parse(xmlDoc.SelectSingleNode("/settings/global/@cache-size").Value); disclaimerAccepted = Int32.Parse(xmlDoc.SelectSingleNode("/settings/global/@disclaimer").Value); string floatArrayString = xmlDoc.SelectSingleNode("/settings/global/@player-color").Value; string[] floatArrayStringSplit = floatArrayString.Split(','); float redColor = float.Parse(floatArrayStringSplit[0].Trim()); float greenColor = float.Parse(floatArrayStringSplit[1].Trim()); float blueColor = float.Parse(floatArrayStringSplit[2].Trim()); //Bounds checking - Gotta check up on those players :) if (redColor < 0f) { redColor = 0f; } if (redColor > 1f) { redColor = 1f; } if (greenColor < 0f) { greenColor = 0f; } if (greenColor > 1f) { greenColor = 1f; } if (blueColor < 0f) { blueColor = 0f; } if (blueColor > 1f) { blueColor = 1f; } playerColor = new Color(redColor, greenColor, blueColor, 1f); chatKey = (KeyCode)Int32.Parse(xmlDoc.SelectSingleNode("/settings/global/@chat-key").Value); screenshotKey = (KeyCode)Int32.Parse(xmlDoc.SelectSingleNode("/settings/global/@screenshot-key").Value); selectedFlag = xmlDoc.SelectSingleNode("/settings/global/@selected-flag").Value; compressionEnabled = Boolean.Parse(xmlDoc.SelectSingleNode("/settings/global/@compression").Value); revertEnabled = Boolean.Parse(xmlDoc.SelectSingleNode("/settings/global/@revert").Value); toolbarType = (DMPToolbarType)Int32.Parse(xmlDoc.SelectSingleNode("/settings/global/@toolbar").Value); XmlNodeList serverNodeList = xmlDoc.GetElementsByTagName("server"); servers.Clear(); foreach (XmlNode xmlNode in serverNodeList) { ServerEntry newServer = new ServerEntry(); newServer.name = xmlNode.Attributes["name"].Value; newServer.address = xmlNode.Attributes["address"].Value; Int32.TryParse(xmlNode.Attributes["port"].Value, out newServer.port); servers.Add(newServer); } SaveSettings(); } catch (Exception e) { DarkLog.Debug("Error loading old settings: " + e); } }
public void Update() { long startClock = Profiler.DMPReferenceTime.ElapsedTicks; lastClockTicks = DateTime.UtcNow.Ticks; lastRealTimeSinceStartup = Time.realtimeSinceStartup; DarkLog.Update(); if (modDisabled) { return; } try { if (HighLogic.LoadedScene == GameScenes.MAINMENU) { if (!modWorker.dllListBuilt) { modWorker.dllListBuilt = true; modWorker.BuildDllFileList(); } if (!dmpSaveChecked) { dmpSaveChecked = true; SetupBlankGameIfNeeded(); } } //Handle GUI events if (!connectionWindow.renameEventHandled) { dmpSettings.SaveSettings(); connectionWindow.renameEventHandled = true; } if (!connectionWindow.addEventHandled) { dmpSettings.servers.Add(connectionWindow.addEntry); connectionWindow.addEntry = null; dmpSettings.SaveSettings(); connectionWindow.addingServer = false; connectionWindow.addEventHandled = true; } if (!connectionWindow.editEventHandled) { dmpSettings.servers[connectionWindow.selected].name = connectionWindow.editEntry.name; dmpSettings.servers[connectionWindow.selected].address = connectionWindow.editEntry.address; dmpSettings.servers[connectionWindow.selected].port = connectionWindow.editEntry.port; connectionWindow.editEntry = null; dmpSettings.SaveSettings(); connectionWindow.addingServer = false; connectionWindow.editEventHandled = true; } if (!connectionWindow.removeEventHandled) { dmpSettings.servers.RemoveAt(connectionWindow.selected); connectionWindow.selected = -1; dmpSettings.SaveSettings(); connectionWindow.removeEventHandled = true; } if (!connectionWindow.connectEventHandled) { connectionWindow.connectEventHandled = true; dmpGame = new DMPGame(dmpSettings, universeSyncCache, modWorker, connectionWindow, dmpModInterface, toolbarSupport, optionsWindow); dmpGame.networkWorker.ConnectToServer(dmpSettings.servers[connectionWindow.selected].address, dmpSettings.servers[connectionWindow.selected].port); } if (commandLineConnect != null && HighLogic.LoadedScene == GameScenes.MAINMENU && Time.timeSinceLevelLoad > 1f) { dmpGame = new DMPGame(dmpSettings, universeSyncCache, modWorker, connectionWindow, dmpModInterface, toolbarSupport, optionsWindow); dmpGame.networkWorker.ConnectToServer(commandLineConnect.address, commandLineConnect.port); commandLineConnect = null; } if (!connectionWindow.disconnectEventHandled) { connectionWindow.disconnectEventHandled = true; if (dmpGame != null) { if (dmpGame.networkWorker.state == ClientState.CONNECTING) { dmpGame.networkWorker.Disconnect("Cancelled connection to server"); } else { dmpGame.networkWorker.SendDisconnect("Quit during initial sync"); } dmpGame.Stop(); dmpGame = null; } } connectionWindow.Update(); modWindow.Update(); optionsWindow.Update(); universeConverterWindow.Update(); dmpModInterface.Update(); if (dmpGame != null) { foreach (Action updateAction in dmpGame.updateEvent) { try { updateAction(); } catch (Exception e) { DarkLog.Debug("Threw in UpdateEvent, exception: " + e); if (dmpGame.networkWorker.state != ClientState.RUNNING) { if (dmpGame.networkWorker.state != ClientState.DISCONNECTED) { dmpGame.networkWorker.SendDisconnect("Unhandled error while syncing!"); } else { dmpGame.networkWorker.Disconnect("Unhandled error while syncing!"); } } } } } //Force quit if (dmpGame != null && dmpGame.forceQuit) { dmpGame.forceQuit = false; dmpGame.Stop(); dmpGame = null; StopGame(); } if (displayDisconnectMessage) { if (HighLogic.LoadedScene != GameScenes.MAINMENU) { if ((Client.realtimeSinceStartup - lastDisconnectMessageCheck) > 1f) { lastDisconnectMessageCheck = Client.realtimeSinceStartup; if (disconnectMessage != null) { disconnectMessage.duration = 0; } disconnectMessage = ScreenMessages.PostScreenMessage("You have been disconnected!", 2f, ScreenMessageStyle.UPPER_CENTER); } } else { displayDisconnectMessage = false; } } //Normal quit if (dmpGame != null && dmpGame.running) { if (!dmpGame.playerStatusWindow.disconnectEventHandled) { dmpGame.playerStatusWindow.disconnectEventHandled = true; dmpGame.forceQuit = true; dmpGame.scenarioWorker.SendScenarioModules(true); // Send scenario modules before disconnecting dmpGame.networkWorker.SendDisconnect("Quit"); } if (dmpGame.screenshotWorker.uploadScreenshot) { dmpGame.screenshotWorker.uploadScreenshot = false; StartCoroutine(UploadScreenshot()); } if (HighLogic.CurrentGame.flagURL != dmpSettings.selectedFlag) { DarkLog.Debug("Saving selected flag"); dmpSettings.selectedFlag = HighLogic.CurrentGame.flagURL; dmpSettings.SaveSettings(); dmpGame.flagSyncer.flagChangeEvent = true; } // save every GeeASL from each body in FlightGlobals if (HighLogic.LoadedScene == GameScenes.FLIGHT && bodiesGees.Count == 0) { foreach (CelestialBody body in FlightGlobals.fetch.bodies) { bodiesGees.Add(body, body.GeeASL); } } //handle use of cheats if (!dmpGame.serverAllowCheats) { CheatOptions.InfinitePropellant = false; CheatOptions.NoCrashDamage = false; CheatOptions.IgnoreAgencyMindsetOnContracts = false; CheatOptions.IgnoreMaxTemperature = false; CheatOptions.InfiniteElectricity = false; CheatOptions.NoCrashDamage = false; CheatOptions.UnbreakableJoints = false; foreach (KeyValuePair <CelestialBody, double> gravityEntry in bodiesGees) { gravityEntry.Key.GeeASL = gravityEntry.Value; } } if (HighLogic.LoadedScene == GameScenes.FLIGHT && FlightGlobals.ready) { HighLogic.CurrentGame.Parameters.Flight.CanLeaveToSpaceCenter = !dmpGame.vesselWorker.isSpectating && dmpSettings.revertEnabled || (PauseMenu.canSaveAndExit == ClearToSaveStatus.CLEAR); } else { HighLogic.CurrentGame.Parameters.Flight.CanLeaveToSpaceCenter = true; } if (HighLogic.LoadedScene == GameScenes.MAINMENU) { dmpGame.networkWorker.SendDisconnect("Quit to main menu"); dmpGame.Stop(); dmpGame = null; } } if (dmpGame != null && dmpGame.startGame) { dmpGame.startGame = false; StartGame(); } } catch (Exception e) { if (dmpGame != null) { DarkLog.Debug("Threw in Update, state " + dmpGame.networkWorker.state.ToString() + ", exception: " + e); if (dmpGame.networkWorker.state != ClientState.RUNNING) { if (dmpGame.networkWorker.state != ClientState.DISCONNECTED) { dmpGame.networkWorker.SendDisconnect("Unhandled error while syncing!"); } else { dmpGame.networkWorker.Disconnect("Unhandled error while syncing!"); } } } else { DarkLog.Debug("Threw in Update, state NO_NETWORKWORKER, exception: " + e); } } Profiler.updateData.ReportTime(startClock); }
public void LoadSettings() { //Read XML settings try { bool saveXMLAfterLoad = false; XmlDocument xmlDoc = new XmlDocument(); if (!File.Exists(settingsFile)) { xmlDoc.LoadXml(newXMLString()); playerName = DEFAULT_PLAYER_NAME; xmlDoc.Save(settingsFile); } xmlDoc.Load(settingsFile); playerName = xmlDoc.SelectSingleNode("/settings/global/@username").Value; try { cacheSize = Int32.Parse(xmlDoc.SelectSingleNode("/settings/global/@cache-size").Value); } catch { DarkLog.Debug("Adding cache size to settings file"); saveXMLAfterLoad = true; cacheSize = DEFAULT_CACHE_SIZE; } XmlNodeList serverNodeList = xmlDoc.GetElementsByTagName("server"); servers = new List<ServerEntry>(); foreach (XmlNode xmlNode in serverNodeList) { ServerEntry newServer = new ServerEntry(); newServer.name = xmlNode.Attributes["name"].Value; newServer.address = xmlNode.Attributes["address"].Value; Int32.TryParse(xmlNode.Attributes["port"].Value, out newServer.port); servers.Add(newServer); } if (saveXMLAfterLoad) { SaveSettings(); } } catch (Exception e) { DarkLog.Debug("XML Exception: " + e); } //Read player token try { if (File.Exists(tokenFile)) { using (StreamReader sr = new StreamReader(tokenFile)) { playerGuid = new Guid(sr.ReadLine()); } } else { DarkLog.Debug("Creating new token file."); using (StreamWriter sw = new StreamWriter(tokenFile)) { playerGuid = Guid.NewGuid(); sw.WriteLine(playerGuid.ToString()); } } } catch { DarkLog.Debug("Error processing token, creating new token file."); playerGuid = Guid.NewGuid(); if (File.Exists(tokenFile)) { File.Move(tokenFile, tokenFile + ".bak"); } using (StreamWriter sw = new StreamWriter(tokenFile)) { sw.WriteLine(playerGuid.ToString()); } } }
public void Update() { long startClock = Profiler.DMPReferenceTime.ElapsedTicks; DarkLog.Update(); if (modDisabled) { return; } if (incorrectlyInstalled) { if (!displayedIncorrectMessage) { displayedIncorrectMessage = true; IncorrectInstallWindow.Enable(); } return; } try { if (HighLogic.LoadedScene == GameScenes.MAINMENU) { if (!ModWorker.fetch.dllListBuilt) { ModWorker.fetch.dllListBuilt = true; ModWorker.fetch.BuildDllFileList(); } if (!dmpSaveChecked) { dmpSaveChecked = true; SetupBlankGameIfNeeded(); } } //Handle GUI events if (!PlayerStatusWindow.fetch.disconnectEventHandled) { PlayerStatusWindow.fetch.disconnectEventHandled = true; forceQuit = true; NetworkWorker.fetch.SendDisconnect("Quit"); } if (!ConnectionWindow.fetch.renameEventHandled) { PlayerStatusWorker.fetch.myPlayerStatus.playerName = Settings.fetch.playerName; Settings.fetch.SaveSettings(); ConnectionWindow.fetch.renameEventHandled = true; } if (!ConnectionWindow.fetch.addEventHandled) { Settings.fetch.servers.Add(ConnectionWindow.fetch.addEntry); ConnectionWindow.fetch.addEntry = null; Settings.fetch.SaveSettings(); ConnectionWindow.fetch.addingServer = false; ConnectionWindow.fetch.addEventHandled = true; } if (!ConnectionWindow.fetch.editEventHandled) { Settings.fetch.servers[ConnectionWindow.fetch.selected].name = ConnectionWindow.fetch.editEntry.name; Settings.fetch.servers[ConnectionWindow.fetch.selected].address = ConnectionWindow.fetch.editEntry.address; Settings.fetch.servers[ConnectionWindow.fetch.selected].port = ConnectionWindow.fetch.editEntry.port; ConnectionWindow.fetch.editEntry = null; Settings.fetch.SaveSettings(); ConnectionWindow.fetch.addingServer = false; ConnectionWindow.fetch.editEventHandled = true; } if (!ConnectionWindow.fetch.removeEventHandled) { Settings.fetch.servers.RemoveAt(ConnectionWindow.fetch.selected); ConnectionWindow.fetch.selected = -1; Settings.fetch.SaveSettings(); ConnectionWindow.fetch.removeEventHandled = true; } if (!ConnectionWindow.fetch.connectEventHandled) { ConnectionWindow.fetch.connectEventHandled = true; NetworkWorker.fetch.ConnectToServer(Settings.fetch.servers[ConnectionWindow.fetch.selected].address, Settings.fetch.servers[ConnectionWindow.fetch.selected].port); } if (commandLineConnect != null && HighLogic.LoadedScene == GameScenes.MAINMENU && Time.timeSinceLevelLoad > 1f) { NetworkWorker.fetch.ConnectToServer(commandLineConnect.address, commandLineConnect.port); commandLineConnect = null; } if (!ConnectionWindow.fetch.disconnectEventHandled) { ConnectionWindow.fetch.disconnectEventHandled = true; gameRunning = false; fireReset = true; if (NetworkWorker.fetch.state == ClientState.CONNECTING) { NetworkWorker.fetch.Disconnect("Cancelled connection to server"); } else { NetworkWorker.fetch.SendDisconnect("Quit during initial sync"); } } foreach (Action updateAction in updateEvent) { try { updateAction(); } catch (Exception e) { DarkLog.Debug("Threw in UpdateEvent, exception: " + e); if (NetworkWorker.fetch.state != ClientState.RUNNING) { if (NetworkWorker.fetch.state != ClientState.DISCONNECTED) { NetworkWorker.fetch.SendDisconnect("Unhandled error while syncing!"); } else { NetworkWorker.fetch.Disconnect("Unhandled error while syncing!"); } } } } //Force quit if (forceQuit) { forceQuit = false; gameRunning = false; fireReset = true; StopGame(); } if (displayDisconnectMessage) { if (HighLogic.LoadedScene != GameScenes.MAINMENU) { if ((UnityEngine.Time.realtimeSinceStartup - lastDisconnectMessageCheck) > 1f) { lastDisconnectMessageCheck = UnityEngine.Time.realtimeSinceStartup; if (disconnectMessage != null) { disconnectMessage.duration = 0; } disconnectMessage = ScreenMessages.PostScreenMessage("You have been disconnected!", 2f, ScreenMessageStyle.UPPER_CENTER); } } else { displayDisconnectMessage = false; } } //Normal quit if (gameRunning) { if (HighLogic.LoadedScene == GameScenes.MAINMENU) { gameRunning = false; fireReset = true; NetworkWorker.fetch.SendDisconnect("Quit to main menu"); } if (ScreenshotWorker.fetch.uploadScreenshot) { ScreenshotWorker.fetch.uploadScreenshot = false; StartCoroutine(UploadScreenshot()); } if (HighLogic.CurrentGame.flagURL != Settings.fetch.selectedFlag) { DarkLog.Debug("Saving selected flag"); Settings.fetch.selectedFlag = HighLogic.CurrentGame.flagURL; Settings.fetch.SaveSettings(); FlagSyncer.fetch.flagChangeEvent = true; } // save every GeeASL from each body in FlightGlobals if (HighLogic.LoadedScene == GameScenes.FLIGHT && bodiesGees.Count == 0) { foreach (CelestialBody body in FlightGlobals.fetch.bodies) { bodiesGees.Add(body, body.GeeASL); } } //handle use of cheats if (!serverAllowCheats) { CheatOptions.InfiniteFuel = false; CheatOptions.InfiniteEVAFuel = false; CheatOptions.InfiniteRCS = false; CheatOptions.NoCrashDamage = false; foreach (KeyValuePair<CelestialBody, double> 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; FireResetEvent(); } if (startGame) { startGame = false; StartGame(); } } catch (Exception e) { DarkLog.Debug("Threw in Update, state " + NetworkWorker.fetch.state.ToString() + ", exception" + e); if (NetworkWorker.fetch.state != ClientState.RUNNING) { if (NetworkWorker.fetch.state != ClientState.DISCONNECTED) { NetworkWorker.fetch.SendDisconnect("Unhandled error while syncing!"); } else { NetworkWorker.fetch.Disconnect("Unhandled error while syncing!"); } } } Profiler.updateData.ReportTime(startClock); }
public void Update() { long startClock = Profiler.DMPReferenceTime.ElapsedTicks; DarkLog.Update(); if (modDisabled) { return; } try { if (HighLogic.LoadedScene == GameScenes.MAINMENU) { if (!ModWorker.fetch.dllListBuilt) { ModWorker.fetch.dllListBuilt = true; ModWorker.fetch.BuildDllFileList(); } if (!dmpSaveChecked) { dmpSaveChecked = true; SetupBlankGameIfNeeded(); } } //Handle GUI events if (!PlayerStatusWindow.fetch.disconnectEventHandled) { PlayerStatusWindow.fetch.disconnectEventHandled = true; forceQuit = true; ScenarioWorker.fetch.SendScenarioModules(true); // Send scenario modules before disconnecting NetworkWorker.fetch.SendDisconnect("Quit"); } if (!ConnectionWindow.fetch.renameEventHandled) { PlayerStatusWorker.fetch.myPlayerStatus.playerName = Settings.fetch.playerName; Settings.fetch.SaveSettings(); ConnectionWindow.fetch.renameEventHandled = true; } if (!ConnectionWindow.fetch.addEventHandled) { Settings.fetch.servers.Add(ConnectionWindow.fetch.addEntry); ConnectionWindow.fetch.addEntry = null; Settings.fetch.SaveSettings(); ConnectionWindow.fetch.addingServer = false; ConnectionWindow.fetch.addEventHandled = true; } if (!ConnectionWindow.fetch.editEventHandled) { Settings.fetch.servers[ConnectionWindow.fetch.selected].name = ConnectionWindow.fetch.editEntry.name; Settings.fetch.servers[ConnectionWindow.fetch.selected].address = ConnectionWindow.fetch.editEntry.address; Settings.fetch.servers[ConnectionWindow.fetch.selected].port = ConnectionWindow.fetch.editEntry.port; ConnectionWindow.fetch.editEntry = null; Settings.fetch.SaveSettings(); ConnectionWindow.fetch.addingServer = false; ConnectionWindow.fetch.editEventHandled = true; } if (!ConnectionWindow.fetch.removeEventHandled) { Settings.fetch.servers.RemoveAt(ConnectionWindow.fetch.selected); ConnectionWindow.fetch.selected = -1; Settings.fetch.SaveSettings(); ConnectionWindow.fetch.removeEventHandled = true; } if (!ConnectionWindow.fetch.connectEventHandled) { ConnectionWindow.fetch.connectEventHandled = true; NetworkWorker.fetch.ConnectToServer(Settings.fetch.servers[ConnectionWindow.fetch.selected].address, Settings.fetch.servers[ConnectionWindow.fetch.selected].port); } if (commandLineConnect != null && HighLogic.LoadedScene == GameScenes.MAINMENU && Time.timeSinceLevelLoad > 1f) { NetworkWorker.fetch.ConnectToServer(commandLineConnect.address, commandLineConnect.port); commandLineConnect = null; } if (!ConnectionWindow.fetch.disconnectEventHandled) { ConnectionWindow.fetch.disconnectEventHandled = true; gameRunning = false; fireReset = true; if (NetworkWorker.fetch.state == ClientState.CONNECTING) { NetworkWorker.fetch.Disconnect("Cancelled connection to server"); } else { NetworkWorker.fetch.SendDisconnect("Quit during initial sync"); } } foreach (Action updateAction in updateEvent) { try { updateAction(); } catch (Exception e) { DarkLog.Debug("Threw in UpdateEvent, exception: " + e); if (NetworkWorker.fetch.state != ClientState.RUNNING) { if (NetworkWorker.fetch.state != ClientState.DISCONNECTED) { NetworkWorker.fetch.SendDisconnect("Unhandled error while syncing!"); } else { NetworkWorker.fetch.Disconnect("Unhandled error while syncing!"); } } } } //Force quit if (forceQuit) { forceQuit = false; gameRunning = false; fireReset = true; StopGame(); } if (displayDisconnectMessage) { if (HighLogic.LoadedScene != GameScenes.MAINMENU) { if ((UnityEngine.Time.realtimeSinceStartup - lastDisconnectMessageCheck) > 1f) { lastDisconnectMessageCheck = UnityEngine.Time.realtimeSinceStartup; if (disconnectMessage != null) { disconnectMessage.duration = 0; } disconnectMessage = ScreenMessages.PostScreenMessage("You have been disconnected!", 2f, ScreenMessageStyle.UPPER_CENTER); } } else { displayDisconnectMessage = false; } } //Normal quit if (gameRunning) { if (HighLogic.LoadedScene == GameScenes.MAINMENU) { gameRunning = false; fireReset = true; NetworkWorker.fetch.SendDisconnect("Quit to main menu"); } if (ScreenshotWorker.fetch.uploadScreenshot) { ScreenshotWorker.fetch.uploadScreenshot = false; StartCoroutine(UploadScreenshot()); } if (HighLogic.CurrentGame.flagURL != Settings.fetch.selectedFlag) { DarkLog.Debug("Saving selected flag"); Settings.fetch.selectedFlag = HighLogic.CurrentGame.flagURL; Settings.fetch.SaveSettings(); FlagSyncer.fetch.flagChangeEvent = true; } // save every GeeASL from each body in FlightGlobals if (HighLogic.LoadedScene == GameScenes.FLIGHT && bodiesGees.Count == 0) { foreach (CelestialBody body in FlightGlobals.fetch.bodies) { bodiesGees.Add(body, body.GeeASL); } } //handle use of cheats if (!serverAllowCheats) { CheatOptions.InfinitePropellant = false; CheatOptions.NoCrashDamage = false; foreach (KeyValuePair <CelestialBody, double> gravityEntry in bodiesGees) { gravityEntry.Key.GeeASL = gravityEntry.Value; } } if (HighLogic.LoadedScene == GameScenes.FLIGHT && FlightGlobals.ready) { HighLogic.CurrentGame.Parameters.Flight.CanLeaveToSpaceCenter = !VesselWorker.fetch.isSpectating && Settings.fetch.revertEnabled || (PauseMenu.canSaveAndExit == ClearToSaveStatus.CLEAR); } else { HighLogic.CurrentGame.Parameters.Flight.CanLeaveToSpaceCenter = true; } } if (fireReset) { fireReset = false; FireResetEvent(); } if (startGame) { startGame = false; StartGame(); } } catch (Exception e) { DarkLog.Debug("Threw in Update, state " + NetworkWorker.fetch.state.ToString() + ", exception" + e); if (NetworkWorker.fetch.state != ClientState.RUNNING) { if (NetworkWorker.fetch.state != ClientState.DISCONNECTED) { NetworkWorker.fetch.SendDisconnect("Unhandled error while syncing!"); } else { NetworkWorker.fetch.Disconnect("Unhandled error while syncing!"); } } } Profiler.updateData.ReportTime(startClock); }
private void HandleCommandLineArgs() { bool nextLineIsAddress = false; bool valid = false; string address = null; int port = 6702; foreach (string commandLineArg in Environment.GetCommandLineArgs()) { //Supporting IPv6 is FUN! if (nextLineIsAddress) { valid = true; nextLineIsAddress = false; if (commandLineArg.Contains("dmp://")) { if (commandLineArg.Contains("[") && commandLineArg.Contains("]")) { //IPv6 literal address = commandLineArg.Substring("dmp://[".Length); address = address.Substring(0, address.LastIndexOf("]")); if (commandLineArg.Contains("]:")) { //With port string portString = commandLineArg.Substring(commandLineArg.LastIndexOf("]:") + 1); if (!Int32.TryParse(portString, out port)) { valid = false; } } } else { //IPv4 literal or hostname if (commandLineArg.Substring("dmp://".Length).Contains(":")) { //With port address = commandLineArg.Substring("dmp://".Length); address = address.Substring(0, address.LastIndexOf(":")); string portString = commandLineArg.Substring(commandLineArg.LastIndexOf(":") + 1); if (!Int32.TryParse(portString, out port)) { valid = false; } } else { //Without port address = commandLineArg.Substring("dmp://".Length); } } } else { valid = false; } } if (commandLineArg == "-dmp") { nextLineIsAddress = true; } } if (valid) { commandLineConnect = new ServerEntry(); commandLineConnect.address = address; commandLineConnect.port = port; DarkLog.Debug("Connecting via command line to: " + address + ", port: " + port); } else { DarkLog.Debug("Command line address is invalid: " + address + ", port: " + port); } }
public void LoadSettings() { //Read XML settings try { bool saveXMLAfterLoad = false; XmlDocument xmlDoc = new XmlDocument(); if (File.Exists(backupSettingsFile) && !File.Exists(settingsFile)) { DarkLog.Debug("Restoring player settings file!"); File.Copy(backupSettingsFile, settingsFile); } if (!File.Exists(settingsFile)) { xmlDoc.LoadXml(newXMLString()); playerName = DEFAULT_PLAYER_NAME; xmlDoc.Save(settingsFile); } if (!File.Exists(backupSettingsFile)) { DarkLog.Debug("Backing up player token and settings file!"); File.Copy(settingsFile, backupSettingsFile); } xmlDoc.Load(settingsFile); playerName = xmlDoc.SelectSingleNode("/settings/global/@username").Value; try { cacheSize = Int32.Parse(xmlDoc.SelectSingleNode("/settings/global/@cache-size").Value); } catch { DarkLog.Debug("Adding cache size to settings file"); saveXMLAfterLoad = true; cacheSize = DEFAULT_CACHE_SIZE; } try { string floatArrayString = xmlDoc.SelectSingleNode("/settings/global/@player-color").Value; string[] floatArrayStringSplit = floatArrayString.Split(','); float redColor = float.Parse(floatArrayStringSplit[0].Trim()); float greenColor = float.Parse(floatArrayStringSplit[1].Trim()); float blueColor = float.Parse(floatArrayStringSplit[2].Trim()); //Bounds checking - Gotta check up on those players :) if (redColor < 0f) { redColor = 0f; } if (redColor > 1f) { redColor = 1f; } if (greenColor < 0f) { greenColor = 0f; } if (greenColor > 1f) { greenColor = 1f; } if (blueColor < 0f) { blueColor = 0f; } if (blueColor > 1f) { blueColor = 1f; } playerColor = new Color(redColor, greenColor, blueColor, 1f); OptionsWindow.fetch.loadEventHandled = false; } catch { DarkLog.Debug("Adding player color to settings file"); saveXMLAfterLoad = true; playerColor = PlayerColorWorker.GenerateRandomColor(); } try { chatKey = (KeyCode)Int32.Parse(xmlDoc.SelectSingleNode("/settings/global/@chat-key").Value); } catch { DarkLog.Debug("Adding chat key to settings file"); saveXMLAfterLoad = true; chatKey = KeyCode.BackQuote; } try { screenshotKey = (KeyCode)Int32.Parse(xmlDoc.SelectSingleNode("/settings/global/@screenshot-key").Value); } catch { DarkLog.Debug("Adding screenshot key to settings file"); saveXMLAfterLoad = true; chatKey = KeyCode.F8; } try { selectedFlag = xmlDoc.SelectSingleNode("/settings/global/@selected-flag").Value; } catch { DarkLog.Debug("Adding selected flag to settings file"); saveXMLAfterLoad = true; selectedFlag = "Squad/Flags/default"; } XmlNodeList serverNodeList = xmlDoc.GetElementsByTagName("server"); servers = new List <ServerEntry>(); foreach (XmlNode xmlNode in serverNodeList) { ServerEntry newServer = new ServerEntry(); newServer.name = xmlNode.Attributes["name"].Value; newServer.address = xmlNode.Attributes["address"].Value; Int32.TryParse(xmlNode.Attributes["port"].Value, out newServer.port); servers.Add(newServer); } if (saveXMLAfterLoad) { SaveSettings(); } } catch (Exception e) { DarkLog.Debug("XML Exception: " + e); } //Read player token try { //Restore backup if needed if (File.Exists(backupTokenFile) && !File.Exists(tokenFile)) { DarkLog.Debug("Restoring backed up token file!"); File.Copy(backupTokenFile, tokenFile); } //Load or create token file if (File.Exists(tokenFile)) { using (StreamReader sr = new StreamReader(tokenFile)) { playerGuid = new Guid(sr.ReadLine()); } } else { DarkLog.Debug("Creating new token file."); using (StreamWriter sw = new StreamWriter(tokenFile)) { playerGuid = Guid.NewGuid(); sw.WriteLine(playerGuid.ToString()); } } //Save backup token file if needed if (!File.Exists(backupTokenFile)) { DarkLog.Debug("Backing up token file."); File.Copy(tokenFile, backupTokenFile); } } catch { DarkLog.Debug("Error processing token, creating new token file."); playerGuid = Guid.NewGuid(); if (File.Exists(tokenFile)) { File.Move(tokenFile, tokenFile + ".bak"); } using (StreamWriter sw = new StreamWriter(tokenFile)) { sw.WriteLine(playerGuid.ToString()); } DarkLog.Debug("Backing up token file."); File.Copy(tokenFile, backupTokenFile, true); } }
private void DrawContent(int windowID) { GUILayout.BeginVertical(); GUI.DragWindow(moveRect); GUILayout.Space(20); GUILayout.BeginHorizontal(); GUILayout.Label("Player name:", labelOptions); string oldPlayerName = dmpSettings.playerName; dmpSettings.playerName = GUILayout.TextArea(dmpSettings.playerName, 32, textAreaStyle); // Max 32 characters if (oldPlayerName != dmpSettings.playerName) { dmpSettings.playerName = dmpSettings.playerName.Replace("\n", ""); renameEventHandled = false; } GUILayout.EndHorizontal(); GUILayout.BeginHorizontal(); //Draw add button string addMode = selectedSafe == -1 ? "Add" : "Edit"; string buttonAddMode = addMode; if (addingServer) { buttonAddMode = "Cancel"; } addingServer = GUILayout.Toggle(addingServer, buttonAddMode, buttonStyle); if (addingServer && !addingServerSafe) { if (selected != -1) { //Load the existing server settings serverName = dmpSettings.servers[selected].name; serverAddress = dmpSettings.servers[selected].address; serverPort = dmpSettings.servers[selected].port.ToString(); } } //Draw connect button if (networkWorkerDisconnected) { GUI.enabled = (selectedSafe != -1); if (GUILayout.Button("Connect", buttonStyle)) { connectEventHandled = false; } } else { if (GUILayout.Button("Disconnect", buttonStyle)) { disconnectEventHandled = false; } } //Draw remove button if (GUILayout.Button("Remove", buttonStyle)) { if (removeEventHandled == true) { removeEventHandled = false; } } GUI.enabled = true; optionsWindow.display = GUILayout.Toggle(optionsWindow.display, "Options", buttonStyle); if (dmpSettings.serverlistMode != -1) { if (dmpSettings.serverlistMode == 0) { if (GUILayout.Button("Servers", buttonStyle)) { serverListDisclaimerWindow.SpawnDialog(); } } else { serversWindow.display = GUILayout.Toggle(serversWindow.display, "Servers", buttonStyle); } } GUILayout.EndHorizontal(); if (addingServerSafe) { GUILayout.BeginHorizontal(); GUILayout.Label("Name:", labelOptions); serverName = GUILayout.TextArea(serverName, textAreaStyle); GUILayout.EndHorizontal(); GUILayout.BeginHorizontal(); GUILayout.Label("Address:", labelOptions); serverAddress = GUILayout.TextArea(serverAddress, textAreaStyle).Trim(); GUILayout.EndHorizontal(); GUILayout.BeginHorizontal(); GUILayout.Label("Port:", labelOptions); serverPort = GUILayout.TextArea(serverPort, textAreaStyle).Trim(); GUILayout.EndHorizontal(); if (GUILayout.Button(addMode + " server", buttonStyle)) { if (addEventHandled == true) { if (selected == -1) { addEntry = new ServerEntry(); addEntry.name = serverName; addEntry.address = serverAddress; addEntry.port = 6702; Int32.TryParse(serverPort, out addEntry.port); addEventHandled = false; } else { editEntry = new ServerEntry(); editEntry.name = serverName; editEntry.address = serverAddress; editEntry.port = 6702; Int32.TryParse(serverPort, out editEntry.port); editEventHandled = false; } } } } GUILayout.Label("Servers:"); if (dmpSettings.servers.Count == 0) { GUILayout.Label("(None - Add a server first)"); } scrollPos = GUILayout.BeginScrollView(scrollPos, GUILayout.Width(WINDOW_WIDTH - 5), GUILayout.Height(WINDOW_HEIGHT - 100)); for (int serverPos = 0; serverPos < dmpSettings.servers.Count; serverPos++) { bool thisSelected = GUILayout.Toggle(serverPos == selectedSafe, dmpSettings.servers[serverPos].name, buttonStyle); if (selected == selectedSafe) { if (thisSelected) { if (selected != serverPos) { selected = serverPos; addingServer = false; } } else if (selected == serverPos) { selected = -1; addingServer = false; } } } GUILayout.EndScrollView(); //Draw status message GUILayout.Label(status, statusStyle); GUILayout.EndVertical(); }
public void LoadSettings() { //Read XML settings try { bool saveXMLAfterLoad = false; XmlDocument xmlDoc = new XmlDocument(); if (File.Exists(backupSettingsFile) && !File.Exists(settingsFile)) { DarkLog.Debug("Restoring player settings file!"); File.Copy(backupSettingsFile, settingsFile); } if (!File.Exists(settingsFile)) { xmlDoc.LoadXml(newXMLString()); playerName = DEFAULT_PLAYER_NAME; xmlDoc.Save(settingsFile); } if (!File.Exists(backupSettingsFile)) { DarkLog.Debug("Backing up player token and settings file!"); File.Copy(settingsFile, backupSettingsFile); } xmlDoc.Load(settingsFile); playerName = xmlDoc.SelectSingleNode("/settings/global/@username").Value; try { cacheSize = Int32.Parse(xmlDoc.SelectSingleNode("/settings/global/@cache-size").Value); } catch { DarkLog.Debug("Adding cache size to settings file"); saveXMLAfterLoad = true; cacheSize = DEFAULT_CACHE_SIZE; } try { disclaimerAccepted = Int32.Parse(xmlDoc.SelectSingleNode("/settings/global/@disclaimer").Value); } catch { DarkLog.Debug("Adding disclaimer to settings file"); saveXMLAfterLoad = true; } try { string floatArrayString = xmlDoc.SelectSingleNode("/settings/global/@player-color").Value; string[] floatArrayStringSplit = floatArrayString.Split(','); float redColor = float.Parse(floatArrayStringSplit[0].Trim()); float greenColor = float.Parse(floatArrayStringSplit[1].Trim()); float blueColor = float.Parse(floatArrayStringSplit[2].Trim()); //Bounds checking - Gotta check up on those players :) if (redColor < 0f) { redColor = 0f; } if (redColor > 1f) { redColor = 1f; } if (greenColor < 0f) { greenColor = 0f; } if (greenColor > 1f) { greenColor = 1f; } if (blueColor < 0f) { blueColor = 0f; } if (blueColor > 1f) { blueColor = 1f; } playerColor = new Color(redColor, greenColor, blueColor, 1f); OptionsWindow.fetch.loadEventHandled = false; } catch { DarkLog.Debug("Adding player color to settings file"); saveXMLAfterLoad = true; playerColor = PlayerColorWorker.GenerateRandomColor(); OptionsWindow.fetch.loadEventHandled = false; } try { chatKey = (KeyCode)Int32.Parse(xmlDoc.SelectSingleNode("/settings/global/@chat-key").Value); } catch { DarkLog.Debug("Adding chat key to settings file"); saveXMLAfterLoad = true; chatKey = KeyCode.BackQuote; } try { screenshotKey = (KeyCode)Int32.Parse(xmlDoc.SelectSingleNode("/settings/global/@screenshot-key").Value); } catch { DarkLog.Debug("Adding screenshot key to settings file"); saveXMLAfterLoad = true; chatKey = KeyCode.F8; } try { selectedFlag = xmlDoc.SelectSingleNode("/settings/global/@selected-flag").Value; } catch { DarkLog.Debug("Adding selected flag to settings file"); saveXMLAfterLoad = true; selectedFlag = "Squad/Flags/default"; } XmlNodeList serverNodeList = xmlDoc.GetElementsByTagName("server"); servers = new List<ServerEntry>(); foreach (XmlNode xmlNode in serverNodeList) { ServerEntry newServer = new ServerEntry(); newServer.name = xmlNode.Attributes["name"].Value; newServer.address = xmlNode.Attributes["address"].Value; Int32.TryParse(xmlNode.Attributes["port"].Value, out newServer.port); servers.Add(newServer); } if (saveXMLAfterLoad) { SaveSettings(); } } catch (Exception e) { DarkLog.Debug("XML Exception: " + e); } //Read player token try { //Restore backup if needed if (File.Exists(backupPublicKeyFile) && File.Exists(backupPrivateKeyFile) && (!File.Exists(publicKeyFile) || !File.Exists(privateKeyFile))) { DarkLog.Debug("Restoring backed up keypair!"); File.Copy(backupPublicKeyFile, publicKeyFile, true); File.Copy(backupPrivateKeyFile, privateKeyFile, true); } //Load or create token file if (File.Exists(privateKeyFile) && File.Exists(publicKeyFile)) { playerPublicKey = File.ReadAllText(publicKeyFile); playerPrivateKey = File.ReadAllText(privateKeyFile); } else { DarkLog.Debug("Creating new keypair!"); GenerateNewKeypair(); } //Save backup token file if needed if (!File.Exists(backupPublicKeyFile) || !File.Exists(backupPrivateKeyFile)) { DarkLog.Debug("Backing up keypair"); File.Copy(publicKeyFile, backupPublicKeyFile, true); File.Copy(privateKeyFile, backupPrivateKeyFile, true); } } catch { DarkLog.Debug("Error processing keypair, creating new keypair"); GenerateNewKeypair(); DarkLog.Debug("Backing up keypair"); File.Copy(publicKeyFile, backupPublicKeyFile, true); File.Copy(privateKeyFile, backupPrivateKeyFile, true); } }
public void LoadSettings() { try { if (File.Exists(backupOldSettingsFile) || File.Exists(oldSettingsFile)) { DarkLog.Debug("[Settings]: Loading old settings"); LoadOldSettings(); SaveSettings(); File.Delete(backupOldSettingsFile); File.Delete(oldSettingsFile); } bool saveAfterLoad = false; ConfigNode mainNode = new ConfigNode(); if (File.Exists(backupSettingsFile) && !File.Exists(settingsFile)) { DarkLog.Debug("[Settings]: Restoring backup file"); File.Copy(backupSettingsFile, settingsFile); } if (!File.Exists(settingsFile)) { mainNode = GetDefaultSettings(); playerName = DEFAULT_PLAYER_NAME; mainNode.Save(settingsFile); } if (!File.Exists(backupSettingsFile)) { DarkLog.Debug("[Settings]: Backing up settings"); File.Copy(settingsFile, backupSettingsFile); } mainNode = ConfigNode.Load(settingsFile); ConfigNode settingsNode = mainNode.GetNode("SETTINGS"); ConfigNode playerNode = settingsNode.GetNode("PLAYER"); ConfigNode bindingsNode = settingsNode.GetNode("KEYBINDINGS"); playerName = playerNode.GetValue("name"); if (!int.TryParse(settingsNode.GetValue("cacheSize"), out cacheSize)) { DarkLog.Debug("[Settings]: Adding cache size to settings file"); cacheSize = DEFAULT_CACHE_SIZE; saveAfterLoad = true; } if (!int.TryParse(settingsNode.GetValue("disclaimer"), out disclaimerAccepted)) { DarkLog.Debug("[Settings]: Adding disclaimer to settings file"); disclaimerAccepted = 0; saveAfterLoad = true; } if (!playerNode.TryGetValue("color", ref playerColor)) { DarkLog.Debug("[Settings]: Adding color to settings file"); playerColor = PlayerColorWorker.GenerateRandomColor(); saveAfterLoad = true; } int chatKey = (int)KeyCode.BackQuote, screenshotKey = (int)KeyCode.F8; if (!int.TryParse(bindingsNode.GetValue("chat"), out chatKey)) { DarkLog.Debug("[Settings]: Adding chat key to settings file"); this.chatKey = KeyCode.BackQuote; saveAfterLoad = true; } else { this.chatKey = (KeyCode)chatKey; } if (!int.TryParse(bindingsNode.GetValue("screenshot"), out screenshotKey)) { DarkLog.Debug("[Settings]: Adding screenshot key to settings file"); this.screenshotKey = KeyCode.F8; saveAfterLoad = true; } else { this.screenshotKey = (KeyCode)screenshotKey; } if (!playerNode.TryGetValue("flag", ref selectedFlag)) { DarkLog.Debug("[Settings]: Adding selected flag to settings file"); selectedFlag = "Squad/Flags/default"; saveAfterLoad = true; } if (!settingsNode.TryGetValue("compression", ref compressionEnabled)) { DarkLog.Debug("[Settings]: Adding compression flag to settings file"); compressionEnabled = true; saveAfterLoad = true; } if (!settingsNode.TryGetValue("revert", ref revertEnabled)) { DarkLog.Debug("[Settings]: Adding revert flag to settings file"); revertEnabled = true; saveAfterLoad = true; } string interpolatorString = null; int interpolatorInt = 0; try { //Make sure we haven't saved to the old int type if (settingsNode.TryGetValue("interpolation", ref interpolatorString) && !int.TryParse(interpolatorString, out interpolatorInt)) { interpolatorType = (InterpolatorType)Enum.Parse(typeof(InterpolatorType), interpolatorString); } else { DarkLog.Debug("[Settings]: Adding interpolation flag to settings file"); interpolatorType = InterpolatorType.INTERPOLATE1S; saveAfterLoad = true; } } catch { interpolatorType = InterpolatorType.INTERPOLATE1S; saveAfterLoad = true; } if (!settingsNode.TryGetValue("posLoadedVessels", ref interframeEnabled)) { DarkLog.Debug("[Settings]: Adding interframe flag to settings file"); interframeEnabled = true; saveAfterLoad = true; } int toolbarType; if (!int.TryParse(settingsNode.GetValue("toolbar"), out toolbarType)) { DarkLog.Debug("[Settings]: Adding toolbar flag to settings file"); this.toolbarType = DMPToolbarType.BLIZZY_IF_INSTALLED; saveAfterLoad = true; } else { this.toolbarType = (DMPToolbarType)toolbarType; } ConfigNode serversNode = settingsNode.GetNode("SERVERS"); servers.Clear(); if (serversNode.HasNode("SERVER")) { foreach (ConfigNode serverNode in serversNode.GetNodes("SERVER")) { ServerEntry newServer = new ServerEntry(); newServer.name = serverNode.GetValue("name"); newServer.address = serverNode.GetValue("address"); serverNode.TryGetValue("port", ref newServer.port); servers.Add(newServer); } } if (saveAfterLoad) { SaveSettings(); } } catch (Exception e) { DarkLog.Debug("Error while loading settings:"); DarkLog.Debug(e.ToString()); } //Read player token try { //Restore backup if needed if (File.Exists(backupPublicKeyFile) && File.Exists(backupPrivateKeyFile) && (!File.Exists(publicKeyFile) || !File.Exists(privateKeyFile))) { DarkLog.Debug("[Settings]: Restoring backed up keypair!"); File.Copy(backupPublicKeyFile, publicKeyFile, true); File.Copy(backupPrivateKeyFile, privateKeyFile, true); } //Load or create token file if (File.Exists(privateKeyFile) && File.Exists(publicKeyFile)) { playerPublicKey = File.ReadAllText(publicKeyFile); playerPrivateKey = File.ReadAllText(privateKeyFile); } else { DarkLog.Debug("[Settings]: Creating new keypair!"); GenerateNewKeypair(); } //Save backup token file if needed if (!File.Exists(backupPublicKeyFile) || !File.Exists(backupPrivateKeyFile)) { DarkLog.Debug("[Settings]: Backing up keypair"); File.Copy(publicKeyFile, backupPublicKeyFile, true); File.Copy(privateKeyFile, backupPrivateKeyFile, true); } } catch { DarkLog.Debug("Error processing keypair, creating new keypair"); GenerateNewKeypair(); DarkLog.Debug("[Settings]: Backing up keypair"); File.Copy(publicKeyFile, backupPublicKeyFile, true); File.Copy(privateKeyFile, backupPrivateKeyFile, true); } }
private void DrawContent(int windowID) { GUILayout.BeginVertical(); GUI.DragWindow(moveRect); GUILayout.Space(20); GUILayout.BeginHorizontal(); GUILayout.Label("Player name:", labelOptions); string oldPlayerName = Settings.fetch.playerName; Settings.fetch.playerName = GUILayout.TextArea(Settings.fetch.playerName, 32, textAreaStyle); // Max 32 characters if (oldPlayerName != Settings.fetch.playerName) { Settings.fetch.playerName = Settings.fetch.playerName.Replace("\n", ""); renameEventHandled = false; } GUILayout.EndHorizontal(); GUILayout.BeginHorizontal(); //Draw add button string addMode = selectedSafe == -1 ? "Add" : "Edit"; string buttonAddMode = addMode; if (addingServer) { buttonAddMode = "Cancel"; } addingServer = GUILayout.Toggle(addingServer, buttonAddMode, buttonStyle); if (addingServer && !addingServerSafe) { if (selected != -1) { //Load the existing server settings serverName = Settings.fetch.servers[selected].name; serverAddress = Settings.fetch.servers[selected].address; serverPort = Settings.fetch.servers[selected].port.ToString(); } } //Draw connect button if (NetworkWorker.fetch.state == DarkMultiPlayerCommon.ClientState.DISCONNECTED) { GUI.enabled = (selectedSafe != -1); if (GUILayout.Button("Connect", buttonStyle)) { connectEventHandled = false; } } else { if (GUILayout.Button("Disconnect", buttonStyle)) { disconnectEventHandled = false; } } //Draw remove button if (GUILayout.Button("Remove", buttonStyle)) { if (removeEventHandled == true) { removeEventHandled = false; } } GUI.enabled = true; OptionsWindow.fetch.display = GUILayout.Toggle(OptionsWindow.fetch.display, "Options", buttonStyle); GUILayout.EndHorizontal(); if (addingServerSafe) { GUILayout.BeginHorizontal(); GUILayout.Label("Name:", labelOptions); serverName = GUILayout.TextArea(serverName, textAreaStyle); GUILayout.EndHorizontal(); GUILayout.BeginHorizontal(); GUILayout.Label("Address:", labelOptions); serverAddress = GUILayout.TextArea(serverAddress, textAreaStyle).Trim(); GUILayout.EndHorizontal(); GUILayout.BeginHorizontal(); GUILayout.Label("Port:", labelOptions); serverPort = GUILayout.TextArea(serverPort, textAreaStyle).Trim(); GUILayout.EndHorizontal(); if (GUILayout.Button(addMode + " server", buttonStyle)) { if (addEventHandled == true) { if (selected == -1) { addEntry = new ServerEntry(); addEntry.name = serverName; addEntry.address = serverAddress; addEntry.port = 6702; Int32.TryParse(serverPort, out addEntry.port); addEventHandled = false; } else { editEntry = new ServerEntry(); editEntry.name = serverName; editEntry.address = serverAddress; editEntry.port = 6702; Int32.TryParse(serverPort, out editEntry.port); editEventHandled = false; } } } } GUILayout.Label("Servers:"); if (Settings.fetch.servers.Count == 0) { GUILayout.Label("(None - Add a server first)"); } scrollPos = GUILayout.BeginScrollView(scrollPos, GUILayout.Width(WINDOW_WIDTH - 5), GUILayout.Height(WINDOW_HEIGHT - 100)); for (int serverPos = 0; serverPos < Settings.fetch.servers.Count; serverPos++) { bool thisSelected = GUILayout.Toggle(serverPos == selectedSafe, Settings.fetch.servers[serverPos].name, buttonStyle); if (selected == selectedSafe) { if (thisSelected) { if (selected != serverPos) { selected = serverPos; addingServer = false; } } else if (selected == serverPos) { selected = -1; addingServer = false; } } } GUILayout.EndScrollView(); //Draw status message GUILayout.Label(status, statusStyle); GUILayout.EndVertical(); }
public void Update() { if (addEvent != -1) { ServerEntry serverEntry = new ServerEntry(); serverEntry.name = servers[addEvent].serverName; if (serverEntry.name.Length > 23) { serverEntry.name = serverEntry.name.Substring(0, 20) + "..."; } serverEntry.address = servers[addEvent].gameAddress; serverEntry.port = servers[addEvent].gamePort; dmpSettings.servers.Add(serverEntry); dmpSettings.SaveSettings(); display = false; addEvent = -1; } if (connectEvent != -1) { Client.dmpClient.ConnectToServer(servers[connectEvent].gameAddress, servers[connectEvent].gamePort); connectEvent = -1; display = false; } safeDisplay = display; if (safeDisplay) { if ((Client.realtimeSinceStartup - lastUpdateTime) > DISPLAY_UPDATE_INTERVAL) { lastUpdateTime = Client.realtimeSinceStartup; Dictionary <int, ServerListConnection.ServerListEntry> updateServers = serverListConnection.GetServers(); int players = 0; int newer = 0; int older = 0; displayedServers = 0; lock (updateServers) { bool isNew = false; if (servers == null || servers.Length != updateServers.Count) { servers = new ServerListConnection.ServerListEntry[updateServers.Count]; playerCache = new string[updateServers.Count]; isNew = true; } int freeID = 0; foreach (ServerListConnection.ServerListEntry sle in updateServers.Values) { servers[freeID] = sle; if (isNew) { if (sle.location != null) { sle.location = sle.location.ToUpper(); } if (sle.programVersion != null && sle.programVersion.Length > 9) { sle.programVersion = sle.programVersion.Substring(0, 9); } } if (sle.protocolVersion > Common.PROTOCOL_VERSION) { newer++; } if (sle.protocolVersion < Common.PROTOCOL_VERSION) { older++; } if (sle.protocolVersion == Common.PROTOCOL_VERSION) { displayedServers++; } freeID++; } Array.Sort(servers, ServerSorter); for (int i = 0; i < servers.Length; i++) { ServerListConnection.ServerListEntry sle = servers[i]; playerCache[i] = "0"; if (sle.players != null) { playerCache[i] = sle.players.Length.ToString(); players += sle.players.Length; } } } stringBuilder.Clear(); stringBuilder.Append(players); stringBuilder.Append(" players on "); stringBuilder.Append(servers.Length); stringBuilder.Append(" servers."); if (newer > 0) { stringBuilder.Append(" "); stringBuilder.Append(newer); stringBuilder.Append(" incompatible newer servers hidden."); } if (older > 0) { stringBuilder.Append(" "); stringBuilder.Append(older); stringBuilder.Append(" incompatible older servers hidden."); } bottomText = stringBuilder.ToString(); } } }