/// <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; } }
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); } }
/// <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; } } }
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); } }
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); } }
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); }