/// <summary> /// Performs actions to be taken once an update (application or reversion) has been applied, including saving data, updating button states, and refreshing renders. /// </summary> protected override void FinishUpdate() { base.FinishUpdate(); // Update any dirty building renders. BuildingData.Update(); }
/// <summary> /// Apply button event handler. /// </summary> protected override void Apply() { try { // Make sure we have valid a target and replacement. if (CurrentTargetItem != null && ReplacementPrefab != null) { switch (CurrentMode) { case ReplacementModes.Individual: // Individual replacement. IndividualBuildingReplacement.Instance.Replace(currentBuilding, CurrentTargetItem.originalPrefab, ReplacementPrefab, CurrentTargetItem.index, angleSlider.TrueValue, xSlider.TrueValue, ySlider.TrueValue, zSlider.TrueValue, (int)probabilitySlider.TrueValue); // Update current target. CurrentTargetItem.individualPrefab = ReplacementPrefab; CurrentTargetItem.individualProb = (int)probabilitySlider.TrueValue; break; case ReplacementModes.Grouped: // Grouped replacement. BuildingReplacement.Instance.Replace(currentBuilding, CurrentTargetItem.originalPrefab, ReplacementPrefab, -1, angleSlider.TrueValue, xSlider.TrueValue, ySlider.TrueValue, zSlider.TrueValue, (int)probabilitySlider.TrueValue); // Update current target. CurrentTargetItem.replacementPrefab = ReplacementPrefab; CurrentTargetItem.replacementProb = (int)probabilitySlider.TrueValue; break; case ReplacementModes.All: // All- replacement. AllBuildingReplacement.Instance.Replace(null, CurrentTargetItem.originalPrefab ?? CurrentTargetItem.replacementPrefab, ReplacementPrefab, -1, angleSlider.TrueValue, xSlider.TrueValue, ySlider.TrueValue, zSlider.TrueValue, (int)probabilitySlider.TrueValue); // Update current target. CurrentTargetItem.allPrefab = ReplacementPrefab; CurrentTargetItem.allProb = (int)probabilitySlider.TrueValue; break; default: Logging.Error("invalid replacement mode at BuildingInfoPanel.Apply"); return; } // Update any dirty building renders. BuildingData.Update(); // Update target list. targetList.Refresh(); // Update highlighting target. RenderOverlays.CurrentProp = ReplacementPrefab as PropInfo; RenderOverlays.CurrentTree = ReplacementPrefab as TreeInfo; } } catch (Exception e) { // Log and report any exception. Logging.LogException(e, "exception applying building replacement"); } }
/// <summary> /// Adds a new tree or prop. /// </summary> private void AddNew() { // Make sure a valid replacement prefab is set, and that we've got space for another prop. if (ReplacementPrefab != null) { // New prop index. int newIndex = 0; // Check to see if we've got a current prop array. if (currentBuilding.m_props != null) { // Existing m_props array - check that we've got space for another entry. newIndex = currentBuilding.m_props.Length; if (newIndex > 63) { // Props maxed out - exit. return; } // Get old props reference. BuildingInfo.Prop[] oldBuildingProps = currentBuilding.m_props; // Create new props array with one extra entry, and copy the old props to it. currentBuilding.m_props = new BuildingInfo.Prop[newIndex + 1]; for (int i = 0; i < newIndex; ++i) { currentBuilding.m_props[i] = oldBuildingProps[i]; } } else { // No m_props array already; create one. currentBuilding.m_props = new BuildingInfo.Prop[1]; } // Add new prop. currentBuilding.m_props[newIndex] = new BuildingInfo.Prop { m_angle = angleSlider.TrueValue, m_prop = ReplacementPrefab as PropInfo, m_tree = ReplacementPrefab as TreeInfo, m_finalProp = ReplacementPrefab as PropInfo, m_finalTree = ReplacementPrefab as TreeInfo, m_fixedHeight = true, m_position = new Vector3(xSlider.TrueValue, ySlider.TrueValue, zSlider.TrueValue), m_probability = (int)probabilitySlider.TrueValue }; // Refresh render to recgonise new prop. BuildingData.DirtyList.Add(currentBuilding); BuildingData.Update(); // Regenerate target list. TargetList(); } }
/// <summary> /// (Re-)loads the current config (per ConfigurationUtils.CurrentSavedConfigName). /// </summary> private void LoadConfig() { // Clear current replacements. ReplacementUtils.NukeSettings(); // Load config file. ConfigurationUtils.LoadConfig(); Logging.KeyMessage("reloaded global configuration"); // Update button states accordingly. UpdateButtonStates(); // Update dirty renders. BuildingData.Update(); NetData.Update(); }
/// <summary> /// Called by the game when level loading is complete. /// </summary> /// <param name="mode">Loading mode (e.g. game, editor, scenario, etc.)</param> public override void OnLevelLoaded(LoadMode mode) { Logging.Message("commencing loading checks"); base.OnLevelLoaded(mode); // Don't do anything further if we're not operating. if (!isModEnabled) { Logging.Message("exiting"); return; } // Check to see that Harmony 2 was properly loaded. if (!Patcher.Patched) { // Harmony 2 wasn't loaded; abort. Logging.Error("Harmony patches not applied; aborting"); isModEnabled = false; // Display warning message. ListMessageBox harmonyBox = MessageBoxBase.ShowModal <ListMessageBox>(); // Key text items. harmonyBox.AddParas(Translations.Translate("ERR_HAR0"), Translations.Translate("BOB_ERR_HAR"), Translations.Translate("BOB_ERR_FAT"), Translations.Translate("ERR_HAR1")); // List of dot points. harmonyBox.AddList(Translations.Translate("ERR_HAR2"), Translations.Translate("ERR_HAR3")); // Closing para. harmonyBox.AddParas(Translations.Translate("MES_PAGE")); // Don't do anything further. return; } Logging.Message("loading checks passed"); // Build lists of loaded prefabs. PrefabLists.BuildLists(); // Load prop packs. new NetworkPackReplacement(); // Load configuration file. ConfigurationUtils.LoadConfig(); // Set up BOB tool. ToolsModifierControl.toolController.gameObject.AddComponent <BOBTool>(); // Display update notification. WhatsNew.ShowWhatsNew(); // Set up Network Skins 2 reflection. ModUtils.NS2Reflection(); // Enable thin wires, if applicable. if (ModSettings.ThinnerWires) { ElectricalWires.Instance.ApplyThinnerWires(); } // Force update of any dirty net or building prefabs from replacement process. Logging.Message("updating dirty prefabs"); BuildingData.Update(); NetData.Update(); // Set up options panel event handler. OptionsPanel.OptionsEventHook(); // Display any exception message that occured during load. InfoPanelManager.CheckException(); // Activate tool hotkey. UIThreading.Operating = true; Logging.Message("loading complete"); }
/// <summary> /// Reverts all current settings and clears replacement dictionaries. /// </summary> internal static void NukeSettings() { Logging.KeyMessage("reverting all replacements"); // Revert all-building replacements. try { AllBuildingReplacement.Instance?.RevertAll(); } catch (Exception e) { // Don't let a single failure stop us. Logging.LogException(e, "exception reverting all-building replacements"); } // Revert building replacements. try { BuildingReplacement.Instance?.RevertAll(); } catch (Exception e) { // Don't let a single failure stop us. Logging.LogException(e, "exception reverting building replacements"); } // Revert individual building replacements. try { IndividualBuildingReplacement.Instance?.RevertAll(); } catch (Exception e) { // Don't let a single failure stop us. Logging.LogException(e, "exception reverting individual building replacements"); } // Revert network pack replacements. try { NetworkPackReplacement.Instance?.RevertAll(); } catch (Exception e) { // Don't let a single failure stop us. Logging.LogException(e, "exception reverting network pack replacements"); } // Revert all-network replacements. try { AllNetworkReplacement.Instance?.RevertAll(); } catch (Exception e) { // Don't let a single failure stop us. Logging.LogException(e, "exception reverting all-network replacements"); } // Revert network replacements. try { NetworkReplacement.Instance?.RevertAll(); } catch (Exception e) { // Don't let a single failure stop us. Logging.LogException(e, "exception reverting network replacements"); } // Revert individual network replacements. try { IndividualNetworkReplacement.Instance?.RevertAll(); } catch (Exception e) { // Don't let a single failure stop us. Logging.LogException(e, "exception reverting individual network replacements"); } // Revert scaling. try { Scaling.Instance?.RevertAll(); } catch (Exception e) { // Don't let a single failure stop us. Logging.LogException(e, "exception reverting scaling elemennts"); } // Regenerate dirty renders. NetData.Update(); BuildingData.Update(); }