/// <summary>
        /// Logs an exception with a detailed breakdown. This overload is used in building
        /// patches.
        /// </summary>
        /// <param name="e">The exception to log.</param>
        /// <param name="config">The building config that failed to load.</param>
        internal static void LogBuildingException(Exception e, IBuildingConfig config)
        {
            var cause = e.InnerException ?? e;

            try {
                var message = new StringBuilder(256);
                if (config != null)
                {
                    var type = config.GetType();
                    message.Append("Error when creating building ");
                    message.Append(type.Name);
                    // Name and shame!
                    var mod = ModDebugRegistry.Instance.OwnerOfType(type);
                    if (mod != null)
                    {
                        message.Append(" from mod ");
                        message.Append(mod.ModName);
                        ModLoadHandler.CrashingMod = mod;
                    }
                    message.AppendLine(":");
                }
                message.Append(GetExceptionLog(cause, new HarmonyMethodCache()));
                LogError(message.ToString());
            } catch {
                // Ensure it gets logged at all costs
                BaseLogException(cause, null);
                throw;
            }
        }
Example #2
0
        private static bool Prefix(BuildingConfigManager __instance, IBuildingConfig config)
        {
            bool result = false;

            if (Hooked)
            {
                return(true);
            }

            //CreateBuildingDef
            BuildingDef buildingDef = config.CreateBuildingDef();

            Hooked = true;
            try
            {
                result = RegisterBuilding(__instance, config, buildingDef);
            }
            catch (Exception e) {
                Debug.Log(" === [BuildingModifier] ERROR registering building [" + buildingDef.PrefabID + "]. Incompatible building config.");
                Debug.Log(e.StackTrace);
                // __instance.RegisterBuilding(config);
                //throw e;
                Application.Quit();
            }
            Hooked = false;
            return(result);
        }
            public static void Postfix(IBuildingConfig __instance, GameObject go)
            {
                var T = __instance.GetType();

                if (T == typeof(OilWellCapConfig))
                {
                    AddOilWell(go);
                }
            }
            public static void Postfix(IBuildingConfig __instance, GameObject go)
            {
                var T = __instance.GetType();

                if (T == typeof(GourmetCookingStationConfig))
                {
                    AddGourmetCooking(go);
                }
            }
    public void RegisterBuilding(IBuildingConfig config)
    {
        BuildingDef buildingDef = config.CreateBuildingDef();

        configTable[config] = buildingDef;
        GameObject gameObject = UnityEngine.Object.Instantiate(baseTemplate);

        UnityEngine.Object.DontDestroyOnLoad(gameObject);
        gameObject.GetComponent <KPrefabID>().PrefabTag = buildingDef.Tag;
        gameObject.name = buildingDef.PrefabID + "Template";
        gameObject.GetComponent <Building>().Def = buildingDef;
        gameObject.GetComponent <OccupyArea>().OccupiedCellsOffsets = buildingDef.PlacementOffsets;
        if (buildingDef.Deprecated)
        {
            gameObject.GetComponent <KPrefabID>().AddTag(GameTags.DeprecatedContent, false);
        }
        config.ConfigureBuildingTemplate(gameObject, buildingDef.Tag);
        buildingDef.BuildingComplete = BuildingLoader.Instance.CreateBuildingComplete(gameObject, buildingDef);
        bool flag = true;

        for (int i = 0; i < NonBuildableBuildings.Length; i++)
        {
            if (buildingDef.PrefabID == NonBuildableBuildings[i])
            {
                flag = false;
                break;
            }
        }
        if (flag)
        {
            buildingDef.BuildingUnderConstruction      = BuildingLoader.Instance.CreateBuildingUnderConstruction(buildingDef);
            buildingDef.BuildingUnderConstruction.name = GetUnderConstructionName(buildingDef.BuildingUnderConstruction.name);
            buildingDef.BuildingPreview = BuildingLoader.Instance.CreateBuildingPreview(buildingDef);
            GameObject buildingPreview = buildingDef.BuildingPreview;
            buildingPreview.name += "Preview";
        }
        buildingDef.PostProcess();
        config.DoPostConfigureComplete(buildingDef.BuildingComplete);
        if (flag)
        {
            config.DoPostConfigurePreview(buildingDef, buildingDef.BuildingPreview);
            config.DoPostConfigureUnderConstruction(buildingDef.BuildingUnderConstruction);
        }
        Assets.AddBuildingDef(buildingDef);
    }
            public static void Postfix(IBuildingConfig __instance, GameObject go)
            {
                var T = __instance.GetType();

                if (T == typeof(OilRefineryConfig))
                {
                    AddOilRefinery(go);
                }
                else if (T == typeof(FertilizerMakerConfig))
                {
                    AddFertilizerMaker(go);
                }
                //else if (T == typeof(EthanolDistilleryConfig))
                //    AddEthanolDistillery(go);
                else if (T == typeof(PolymerizerConfig))
                {
                    AddPolymer(go);
                }
            }
Example #7
0
        /// <summary>
        /// Наполнение префаба данными
        /// </summary>
        /// <param name="prefab">Объект префаба</param>
        /// <param name="configObject">Объект конфигурационного файла</param>
        /// <typeparam name="T">Тип конфигурационного файла</typeparam>
        private void FillPrefabWithData <T>(GameObject prefab, T configObject)
        {
            var hpComponent     = prefab.GetComponent <HPComponent>();
            var speedComponent  = prefab.GetComponent <SpeedComponent>();
            var attackComponent = prefab.GetComponent <AttackComponent>();
            var costComponent   = prefab.GetComponent <CostComponent>();
            var visionComponent = prefab.GetComponent <VisionComponent>();

            if (typeof(T) == typeof(IBuildingConfig))
            {
                IBuildingConfig buildingConfig = (IBuildingConfig)configObject;
                //TODO заполнить для зданий, когда появятся необходимые компоненты
            }

            if (typeof(T) == typeof(IUnitConfig))
            {
                IUnitConfig unitConfig = (IUnitConfig)configObject;

                if (hpComponent != null)
                {
                    hpComponent.MaxHP = (int)unitConfig.Hp;
                }
                if (speedComponent != null)
                {
                    speedComponent.MaxSpeed = unitConfig.Speed;
                }
                if (attackComponent != null)
                {
                    attackComponent.MinDamage   = (int)unitConfig.MinAttack;
                    attackComponent.MaxDamage   = (int)unitConfig.MaxAttack;
                    attackComponent.AttackDelay = (int)unitConfig.AttackSpeed;
                }
                if (costComponent != null)
                {
                    costComponent.Gold = (int)unitConfig.Cost;
                }
                if (visionComponent != null)
                {
                    visionComponent.AttackRange = unitConfig.MaxDistance;
                }
            }
        }
Example #8
0
            public static void Postfix(IBuildingConfig __instance, GameObject go)
            {
                var T = __instance.GetType();

                if (T == typeof(GeneratorConfig))
                {
                    AddCoalGenerator(go);
                }
                else if (T == typeof(WoodGasGeneratorConfig))
                {
                    AddWoodGenerator(go);
                }
                else if (T == typeof(PetroleumGeneratorConfig))
                {
                    AddOilGenerator(go);
                }
                else if (T == typeof(MethaneGeneratorConfig))
                {
                    AddGasGenerator(go);
                }
            }
Example #9
0
            public static void Postfix(IBuildingConfig __instance, GameObject go)
            {
                var T = __instance.GetType();

                if (T == typeof(AlgaeHabitatConfig))
                {
                    AddAlgaeHabitat(go);
                }
                else if (T == typeof(ElectrolyzerConfig))
                {
                    AddElectrolyzer(go);
                }
                else if (T == typeof(MineralDeoxidizerConfig))
                {
                    AddMineralDeoxidizer(go);
                }
                else if (T == typeof(RustDeoxidizerConfig))
                {
                    AddRust(go);
                }
            }
Example #10
0
        private static bool RegisterBuilding(BuildingConfigManager __instance, IBuildingConfig config, BuildingDef buildingDef)
        {
            //Debug.Log(config.CreateBuildingDef().PrefabID);
            if (!Helper.Config.Enabled)
            {
                return(true);
            }

            Helper.Log(" === [BuildingModifier] BuildingModifierMod_BuildingConfigManager_RegisterBuilding Prefix === ");

            //CreateBuildingDef
            //BuildingDef buildingDef = config.CreateBuildingDef();
            // Check if there is a config for the current building
            if (!Helper.Config.Modifiers.ContainsKey(buildingDef.PrefabID))
            {
                Helper.Log(" === [BuildingModifier] Ignoring: " + buildingDef.PrefabID);
                return(true);
            }

            Debug.Log(" === [BuildingModifier] Processing: " + buildingDef.PrefabID);

            Helper.Log(" === [BuildingModifier] CreateBuildingDef === ");
            Helper.Process(buildingDef, null);
            buildingDef.GenerateOffsets();  // Remake the offsets after modification


            // Create gameobject
            //configTable[config] = buildingDef;
            ((Dictionary <IBuildingConfig, BuildingDef>)configTableF.GetValue(__instance))[config] = buildingDef;
            //GameObject gameObject = Object.Instantiate(baseTemplate);
            GameObject gameObject = UnityEngine.Object.Instantiate((GameObject)baseTemplateF.GetValue(__instance));

            UnityEngine.Object.DontDestroyOnLoad(gameObject);
            gameObject.GetComponent <KPrefabID>().PrefabTag = buildingDef.Tag;
            gameObject.name = buildingDef.PrefabID + "Template";
            gameObject.GetComponent <Building>().Def = buildingDef;
            gameObject.GetComponent <OccupyArea>().OccupiedCellsOffsets = buildingDef.PlacementOffsets;
            if (buildingDef.Deprecated)
            {
                gameObject.GetComponent <KPrefabID>().AddTag(GameTags.DeprecatedContent);
            }

            //ConfigureBuildingTemplate
            config.ConfigureBuildingTemplate(gameObject, buildingDef.Tag);
            Helper.Log(" === [BuildingModifier] ConfigureBuildingTemplate === ");
            Helper.Process(buildingDef, gameObject);

            //ConfigureBuildingTemplate
            buildingDef.BuildingComplete = BuildingLoader.Instance.CreateBuildingComplete(gameObject, buildingDef);
            Helper.Log(" === [BuildingModifier] CreateBuildingComplete === ");
            Helper.Process(buildingDef, gameObject);

            bool flag = true;

            //for (int i = 0; i < NonBuildableBuildings.Length; i++)
            for (int i = 0; i < ((string[])NonBuildableBuildingsF.GetValue(__instance)).Length; i++)
            {
                //if (buildingDef.PrefabID == NonBuildableBuildings[i])
                if (buildingDef.PrefabID == ((string[])NonBuildableBuildingsF.GetValue(__instance))[i])
                {
                    flag = false;
                    break;
                }
            }

            // Previews
            if (flag)
            {
                buildingDef.BuildingUnderConstruction      = BuildingLoader.Instance.CreateBuildingUnderConstruction(buildingDef);
                buildingDef.BuildingUnderConstruction.name = BuildingConfigManager.GetUnderConstructionName(buildingDef.BuildingUnderConstruction.name);
                buildingDef.BuildingPreview       = BuildingLoader.Instance.CreateBuildingPreview(buildingDef);
                buildingDef.BuildingPreview.name += "Preview";
            }

            buildingDef.PostProcess();

            // Try to avoid errors if the gameobject doesn't have RequiereInputs

            /*
             * if (gameObject.GetComponent<RequireInputs>() == null)
             *  gameObject.AddOrGet<RequireInputs>();
             */

            //DoPostConfigureComplete
            config.DoPostConfigureComplete(buildingDef.BuildingComplete);
            Helper.Log(" === [BuildingModifier] DoPostConfigureComplete === ");
            Helper.Process(buildingDef, gameObject);

            // Previews
            if (flag)
            {
                config.DoPostConfigurePreview(buildingDef, buildingDef.BuildingPreview);
                Helper.Log(" === [BuildingModifier] CreateBuildingUnderConstruction === ");
                Helper.Process(buildingDef, gameObject);

                config.DoPostConfigureUnderConstruction(buildingDef.BuildingUnderConstruction);
                Helper.Log(" === [BuildingModifier] CreateBuildingPreview === ");
                Helper.Process(buildingDef, gameObject);
            }

            Assets.AddBuildingDef(buildingDef);

            return(false);
        }