예제 #1
0
        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();
        }
예제 #2
0
        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);
        }
예제 #3
0
        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();
        }
예제 #4
0
        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);
    }
예제 #6
0
        /// <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);
            }
        }
예제 #7
0
 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);
 }
예제 #8
0
        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);
            }
        }
예제 #9
0
        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);
        }
예제 #10
0
        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();
        }
예제 #11
0
        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);
        }
예제 #12
0
        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);
        }
예제 #13
0
 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();
     });
 }
예제 #14
0
        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();
        }
예제 #15
0
 static LandPlotUpgradeRegistry()
 {
     ModdedIDRegistry.RegisterIDRegistry(moddedUpgrades);
     EnumPatcher.RegisterAlternate(typeof(LandPlot.Upgrade), (obj, name) => CreateLandPlotUpgrade(obj, name));
 }
예제 #16
0
 static SpawnResourceRegistry()
 {
     ModdedIDRegistry.RegisterIDRegistry(moddedSpawnResources);
     EnumPatcher.RegisterAlternate(typeof(SpawnResource.Id), (obj, name) => CreateSpawnResourceId(obj, name));
 }