public static void PostPatch() { FishPatcher.Patch(harmony); TechTypePatcher.Patch(); CraftTreeTypePatcher.Patch(); PingTypePatcher.Patch(); EnumPatcher.Patch(harmony); CraftDataPatcher.Patch(harmony); CraftTreePatcher.Patch(harmony); ConsoleCommandsPatcher.Patch(harmony); LanguagePatcher.Patch(harmony); PrefabDatabasePatcher.PostPatch(harmony); SpritePatcher.Patch(); KnownTechPatcher.Patch(harmony); BioReactorPatcher.Patch(); OptionsPanelPatcher.Patch(harmony); ItemsContainerPatcher.Patch(harmony); PDAPatcher.Patch(harmony); PDAEncyclopediaPatcher.Patch(harmony); ItemActionPatcher.Patch(harmony); LootDistributionPatcher.Patch(harmony); WorldEntityDatabasePatcher.Patch(harmony); IngameMenuPatcher.Patch(harmony); TooltipPatcher.Patch(harmony); Logger.Debug("Saving TechType Cache"); TechTypePatcher.cacheManager.SaveCache(); Logger.Debug("Saving CraftTreeType Cache"); CraftTreeTypePatcher.cacheManager.SaveCache(); }
public static Identifiable.Id CreateIdentifiableId(object value, string name, bool shouldCategorize = true) { if (SRModLoader.CurrentLoadingStep > SRModLoader.LoadingStep.PRELOAD) { throw new Exception("Can't register identifiables outside of the PreLoad step"); } var id = (Identifiable.Id)value; if (moddedIdentifiables.ContainsKey(id)) { throw new Exception( $"Identifiable {value} is already registered to {moddedIdentifiables[id].ModInfo.Id}"); } var sr = SRMod.GetCurrentMod(); if (sr != null) { moddedIdentifiables[id] = sr; } EnumPatcher.AddEnumValue(typeof(Identifiable.Id), id, name); if (shouldCategorize) { CategorizeId(id); } return(id); }
public static void RegisterAllEnums(Module module) { SRMod.ForceModContext(SRModLoader.GetModForAssembly(module.Assembly)); foreach (var type in module.GetTypes()) { if (type.GetCustomAttributes(true).Any((x) => x is EnumHolderAttribute)) { foreach (var field in type.GetFields(BindingFlags.Static | BindingFlags.Public | BindingFlags.NonPublic)) { if (!field.FieldType.IsEnum) { continue; } if ((int)field.GetValue(null) == 0) { var newVal = EnumPatcher.GetFirstFreeValue(field.FieldType); EnumPatcher.AddEnumValueWithAlternatives(field.FieldType, newVal, field.Name); field.SetValue(null, newVal); } else { EnumPatcher.AddEnumValueWithAlternatives(field.FieldType, field.GetValue(null), field.Name); } } } } SRMod.ClearModContext(); }
public T RegisterValueWithEnum(T id, string name) { var newid = RegisterValue(id); EnumPatcher.AddEnumValue(RegistryType, newid, name); return(newid); }
public static Identifiable.Id CraftLargo(this LookupDirector director, Identifiable.Id slimeA, Identifiable.Id slimeB, Action <SlimeDefinition> extraLargoBehaviour = null, Predicate <Identifiable.Id> canBeTarr = null, Predicate <Identifiable.Id> forceLargo = null) { if (director.LargoExists(slimeA, slimeB)) { return(Identifiable.Id.NONE); } string prefabName = "slime" + slimeA.ToString().Replace("_SLIME", "").ToUpper()[0] + slimeA.ToString().Replace("_SLIME", "").ToLower().Substring(1) + slimeB.ToString().Replace("_SLIME", "").ToUpper()[0] + slimeB.ToString().Replace("_SLIME", "").ToLower().Substring(1); string name = slimeA.ToString().Replace("_SLIME", "") + slimeB.ToString().Replace("_SLIME", "") + "_LARGO"; Identifiable.Id largoID = IdentifiableRegistry.CreateIdentifiableId(EnumPatcher.GetFirstFreeValue(typeof(Identifiable.Id)), name); SlimeDefinitions defs = GameContext.Instance.SlimeDefinitions; SlimeDefinition curr = defs.GetSlimeByIdentifiableId(slimeA); SlimeDefinition other = defs.GetSlimeByIdentifiableId(slimeB); bool largofyState = curr.CanLargofy; curr.CanLargofy = true; if (!other.CanLargofy && !(forceLargo?.Invoke(slimeB) ?? false)) { return(Identifiable.Id.NONE); } bool largofyStateB = other.CanLargofy; other.CanLargofy = true; SlimeDefinition largoDef = defs.GetLargoByBaseSlimes(curr, other); largoDef.IdentifiableId = largoID; curr.CanLargofy = largofyState; other.CanLargofy = largofyStateB; if (!(canBeTarr?.Invoke(slimeB) ?? true)) { largoDef.Diet.EatMap.RemoveAll((entry) => entry.becomesId == Identifiable.Id.TARR_SLIME); largoDef.Diet.EatMap.RemoveAll((entry) => entry.becomesId == Identifiable.Id.GLITCH_TARR_SLIME); } extraLargoBehaviour?.Invoke(largoDef); SlimeTemplate largoTemplate = new SlimeTemplate(prefabName, largoDef).SetVacSize(Vacuumable.Size.LARGE) .SetTranslation(curr.Name + " " + other.Name + " Largo").Create(); LookupRegistry.RegisterIdentifiablePrefab(largoTemplate.ToPrefab()); return(largoID); }
/// <summary> /// Generates all the IDs for the largos. /// <para>NOTE that all IDs are generated even if they don't get used.</para> /// </summary> /// <param name="slimeToLargo">ID of the slime to create largos</param> public static void GenerateLargoIDs(Identifiable.Id slimeToLargo) { foreach (Identifiable.Id id in Identifiable.SLIME_CLASS) { if (GetLargoID(slimeToLargo, id) != Identifiable.Id.NONE) { continue; } string name = $"{slimeToLargo.ToString().Replace("_SLIME", "")}_{id.ToString().Replace("_SLIME", "")}_LARGO"; var newVal = EnumPatcher.GetFirstFreeValue(typeof(Identifiable.Id)); IdentifiableRegistry.CreateIdentifiableId(newVal, name, false); } }
static object FixMono(Type enumType, object mono) { if (EnumPatcher.TryGetRawPatch(enumType, out var patch)) { var oldValues = (int[])values.GetValue(mono); var oldNames = (string[])names.GetValue(mono); patch.GetArrays(out string[] toBePatchedNames, out int[] toBePatchedValues); Array.Resize(ref toBePatchedNames, toBePatchedNames.Length + oldNames.Length); Array.Resize(ref toBePatchedValues, toBePatchedValues.Length + oldValues.Length); Array.Copy(oldNames, 0, toBePatchedNames, toBePatchedNames.Length - oldNames.Length, oldNames.Length); Array.Copy(oldValues, 0, toBePatchedValues, toBePatchedValues.Length - oldValues.Length, oldValues.Length); names.SetValue(mono, toBePatchedNames); values.SetValue(mono, toBePatchedValues); } return(mono); }
static void FixEnum(object type, ref ulong[] oldValues, ref string[] oldNames) { var enumType = type as Type; if (EnumPatcher.TryGetRawPatch(enumType, out var patch)) { patch.GetArrays(out string[] toBePatchedNames, out ulong[] toBePatchedValues); Array.Resize(ref toBePatchedNames, toBePatchedNames.Length + oldNames.Length); Array.Resize(ref toBePatchedValues, toBePatchedValues.Length + oldValues.Length); Array.Copy(oldNames, 0, toBePatchedNames, toBePatchedNames.Length - oldNames.Length, oldNames.Length); Array.Copy(oldValues, 0, toBePatchedValues, toBePatchedValues.Length - oldValues.Length, oldValues.Length); oldValues = toBePatchedValues; oldNames = toBePatchedNames; Array.Sort <ulong, string>(oldValues, oldNames, Comparer <ulong> .Default); } }
public static void PrePatch() { EnumPatcher.Patch(harmony); Logger.Initialize(); #if SUBNAUTICA Logger.Log($"Loading v{Assembly.GetExecutingAssembly().GetName().Version} for Subnautica", LogLevel.Info); #elif BELOWZERO Logger.Log($"Loading v{Assembly.GetExecutingAssembly().GetName().Version} for BelowZero", LogLevel.Info); #endif Logger.Debug("Loading TechType Cache"); TechTypePatcher.cacheManager.LoadCache(); Logger.Debug("Loading CraftTreeType Cache"); CraftTreeTypePatcher.cacheManager.LoadCache(); PrefabDatabasePatcher.PrePatch(harmony); }
public static void PostPatch() { FishPatcher.Patch(harmony); TechTypePatcher.Patch(); CraftTreeTypePatcher.Patch(); PingTypePatcher.Patch(); TechCategoryPatcher.Patch(); TechGroupPatcher.Patch(); BackgroundTypePatcher.Patch(); EquipmentTypePatcher.Patch(); EnumPatcher.Patch(harmony); CraftDataPatcher.Patch(harmony); CraftTreePatcher.Patch(harmony); ConsoleCommandsPatcher.Patch(harmony); LanguagePatcher.Patch(harmony); PrefabDatabasePatcher.PostPatch(harmony); SpritePatcher.Patch(harmony); KnownTechPatcher.Patch(harmony); BioReactorPatcher.Patch(); OptionsPanelPatcher.Patch(harmony); ItemsContainerPatcher.Patch(harmony); PDALogPatcher.Patch(harmony); PDAPatcher.Patch(harmony); PDAEncyclopediaPatcher.Patch(harmony); ItemActionPatcher.Patch(harmony); LootDistributionPatcher.Patch(harmony); WorldEntityDatabasePatcher.Patch(harmony); LargeWorldStreamerPatcher.Patch(harmony); IngameMenuPatcher.Patch(harmony); TooltipPatcher.Patch(harmony); SurvivalPatcher.Patch(harmony); CustomSoundPatcher.Patch(harmony); Logger.Debug("Saving TechType Cache"); TechTypePatcher.cacheManager.SaveCache(); Logger.Debug("Saving CraftTreeType Cache"); CraftTreeTypePatcher.cacheManager.SaveCache(); Logger.Debug("Saving PingType Cache"); PingTypePatcher.cacheManager.SaveCache(); }
internal Identifiable.Id CraftLargo(bool canBeTarr, Identifiable.Id slimeA, Identifiable.Id slimeB, System.Action <SlimeDefinition> extraLargoBehaviour = null) { if (GameContext.Instance.LookupDirector.LargoExists(slimeA, slimeB)) { return(Identifiable.Id.NONE); } string prefabName = mainObject.Name + slimeB.ToString().Replace("_SLIME", "").ToUpper()[0] + slimeB.ToString().Replace("_SLIME", "").ToLower().Substring(1); string name = slimeA.ToString().Replace("_SLIME", "") + slimeB.ToString().Replace("_SLIME", "") + "_LARGO"; Identifiable.Id largoID = IdentifiableRegistry.CreateIdentifiableId(EnumPatcher.GetFirstFreeValue(typeof(Identifiable.Id)), name); SlimeDefinitions defs = GameContext.Instance.SlimeDefinitions; SlimeDefinition other = defs.GetSlimeByIdentifiableId(slimeB); if (!other.CanLargofy) { return(Identifiable.Id.NONE); } SlimeDefinition largoDef = defs.GetLargoByBaseSlimes(definition, other); largoDef.IdentifiableId = largoID; if (!canBeTarr) { largoDef.Diet.EatMap.RemoveAll((entry) => entry.becomesId == Identifiable.Id.TARR_SLIME); largoDef.Diet.EatMap.RemoveAll((entry) => entry.becomesId == Identifiable.Id.GLITCH_TARR_SLIME); } extraLargoBehaviour?.Invoke(largoDef); SlimeTemplate largoTemplate = new SlimeTemplate(prefabName, largoDef).SetFeralState(canBeFeral).SetGlitchState(canBeAGlitch) .SetVacSize(Vacuumable.Size.LARGE).SetTranslation(definition.Name + " " + other.Name + " Largo").Create(); LookupRegistry.RegisterIdentifiablePrefab(largoTemplate.ToPrefab()); return(largoID); }
public static PlayerState.Upgrade CreatePersonalUpgrade(object value, string name) { if (SRModLoader.CurrentLoadingStep > SRModLoader.LoadingStep.PRELOAD) { throw new Exception("Can't register gadgets outside of the PreLoad step"); } var id = (PlayerState.Upgrade)value; if (moddedUpgrades.ContainsKey(id)) { throw new Exception( $"Upgrade {value} is already registered to {moddedUpgrades[id].ModInfo.Id}"); } var sr = SRMod.GetCurrentMod(); if (sr != null) { moddedUpgrades[id] = sr; } EnumPatcher.AddEnumValue(typeof(PlayerState.Upgrade), id, name); return(id); }
static LandPlotUpgradeRegistry() { ModdedIDRegistry.RegisterIDRegistry(moddedUpgrades); EnumPatcher.RegisterAlternate(typeof(LandPlot.Upgrade), (obj, name) => CreateLandPlotUpgrade(obj, name)); PurchasableUIRegistry.RegisterManipulator((LandPlotUI ui, ref Purchasable[] purchasables) => { List <Purchasable> purchasables1 = purchasables.ToList(); Purchasable Demolish = purchasables1.FirstOrDefault(match => match.nameKey == DemolishKey); if (Demolish == null) { return; } purchasables1.Remove(Demolish); Purchasable ClearCrop = purchasables1.FirstOrDefault(match => match.nameKey == ClearCropKey); if (ClearCrop != null) { purchasables1.Remove(ClearCrop); purchasables1.Add(ClearCrop); } purchasables1.Add(Demolish); purchasables = purchasables1.ToArray(); }); }
private static void Initialize() { var harmony = HarmonyInstance.Create("com.ahk1221.smlhelper"); FishPatcher.Patch(harmony); TechTypePatcher.Patch(); CraftTreeTypePatcher.Patch(); PingTypePatcher.Patch(); EnumPatcher.Patch(harmony); CraftDataPatcher.Patch(harmony); CraftTreePatcher.Patch(harmony); DevConsolePatcher.Patch(harmony); LanguagePatcher.Patch(harmony); PrefabDatabasePatcher.Patch(harmony); SpritePatcher.Patch(); KnownTechPatcher.Patch(harmony); BioReactorPatcher.Patch(harmony); OptionsPanelPatcher.Patch(harmony); ItemsContainerPatcher.Patch(harmony); PDAPatcher.Patch(harmony); PDAEncyclopediaPatcher.Patch(harmony); ItemActionPatcher.Patch(harmony); LootDistributionPatcher.Patch(harmony); WorldEntityDatabasePatcher.Patch(harmony); IngameMenuPatcher.Patch(harmony); TooltipPatcher.Patch(harmony); Logger.Debug("Saving TechType Cache"); TechTypePatcher.cacheManager.SaveCache(); Logger.Debug("Saving CraftTreeType Cache"); CraftTreeTypePatcher.cacheManager.SaveCache(); }
static LandPlotUpgradeRegistry() { ModdedIDRegistry.RegisterIDRegistry(moddedUpgrades); EnumPatcher.RegisterAlternate(typeof(LandPlot.Upgrade), (obj, name) => CreateLandPlotUpgrade(obj, name)); }
static SpawnResourceRegistry() { ModdedIDRegistry.RegisterIDRegistry(moddedSpawnResources); EnumPatcher.RegisterAlternate(typeof(SpawnResource.Id), (obj, name) => CreateSpawnResourceId(obj, name)); }