Example #1
0
        /// <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();
        }
Example #2
0
        /// <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");
            }
        }
Example #3
0
        /// <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();
            }
        }
Example #4
0
        /// <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();
        }
Example #5
0
        /// <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");
        }
Example #6
0
        /// <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();
        }