예제 #1
0
        public static void Patch()
        {
            bundle = AssetBundle.LoadFromFile("QMods/AlienRifle2/alienrifle");

            rifleTech = TechTypeHandler.AddTechType("AlienRifleWeapon", "Alien Rifle", "An ancient weapon found in an alien facility", ImageUtils.LoadSpriteFromFile("QMods/AlienRifle2/Assets/alienrifle.png"), false);

            PrefabHandler.RegisterPrefab(new RiflePrefab("AlienRifleWeapon", "WorldEntities/Tools/AlienRifle", rifleTech));

            CraftDataHandler.SetEquipmentType(rifleTech, EquipmentType.Hand);
            TechData data = new TechData();

            data.Ingredients = new List <Ingredient>()
            {
                new Ingredient(TechType.StasisRifle, 1),
                new Ingredient(TechType.Magnetite, 3),
                new Ingredient(TechType.PlasteelIngot, 2),
                new Ingredient(TechType.PrecursorIonCrystal, 1)
            };
            data.craftAmount = 1;

            CraftDataHandler.SetTechData(rifleTech, data);
            CraftDataHandler.SetItemSize(rifleTech, 2, 2);
            CraftTreeHandler.AddTabNode(CraftTree.Type.Workbench, "StasisRifleMods", "Stasis Rifle Upgrades", ImageUtils.LoadSpriteFromFile("QMods/AlienRifle2/Assets/stasisrifleupgrades.png"));
            CraftTreeHandler.AddCraftingNode(CraftTree.Type.Workbench, rifleTech, "StasisRifleMods", "Alien Rifle");

            HarmonyInstance inst = HarmonyInstance.Create("Kylinator25.AlienRifle.V2");

            inst.PatchAll(typeof(MainPatch).Assembly);
        }
예제 #2
0
        public static void Patch()
        {
            QuickLogger.Info("Started patching " + QuickLogger.GetAssemblyVersion());

            // Remove all original Cyclops fabricator nodes
            foreach (string origNodeID in OriginalCyclopsModuleCraftingNodes)
            {
                CraftTreeHandler.RemoveNode(CraftTree.Type.CyclopsFabricator, origNodeID);
            }

            QuickLogger.Info("Removed original crafting nodes from root of Cyclops Fabricator");
            // Recreates all the tabs from the Vehicle Upgrade Console

            foreach (ModulesTab tab in UpgradeModuleTabs)
            {
                CraftTreeHandler.AddTabNode(CraftTree.Type.CyclopsFabricator, tab.TabID, tab.TabName, tab.TabSprite);


                foreach (TechType craftTypeID in tab.CraftNodes)
                {
                    CraftTreeHandler.AddCraftingNode(CraftTree.Type.CyclopsFabricator, craftTypeID, tab.TabID);
                }

                QuickLogger.Info($"Added new tab '{tab.TabID}' to Cyclops Fabricator with '{tab.CraftNodes.Count}' crafting nodes");
            }

            QuickLogger.Info("Patching complete");
        }
예제 #3
0
 public static void Patch()
 {
     // Add the techtype
     tank = TechTypeHandler.AddTechType("SolarOxygenTank", "Solar-powered Oxygen Tank", "An solar-powered oxygen tank which replenishes in the daylight!");
     // Apply prefab
     PrefabHandler.RegisterPrefab(new TankPrefab());
     // Add recipe
     CraftDataHandler.SetTechData(tank, new TechData()
     {
         craftAmount = 1,
         Ingredients = new List <Ingredient>()
         {
             new Ingredient(TechType.AdvancedWiringKit, 1),
             new Ingredient(TechType.EnameledGlass, 1),
             new Ingredient(TechType.Copper, 2),
             new Ingredient(TechType.Quartz, 2),
             new Ingredient(TechType.Pipe, 3),
             new Ingredient(TechType.PlasteelTank, 1),
         }
     });
     // Add it to the crafting tree
     CraftTreeHandler.AddCraftingNode(CraftTree.Type.Fabricator, tank, "Personal", "Equipment");
     // Make the background purple
     CraftDataHandler.SetBackgroundType(tank, CraftData.BackgroundType.ExosuitArm);
     // Double it's crafting time
     CraftDataHandler.SetCraftingTime(tank, 6f);
     // Make it equipable in the tank slot
     CraftDataHandler.SetEquipmentType(tank, EquipmentType.Tank);
     // Make it take a lot of inventory space
     CraftDataHandler.SetItemSize(tank, 3, 3);
     // Start patching
     HarmonyInstance.Create("alexejheroytb.subnauticamods.solaroxygentank").PatchAll(Assembly.GetExecutingAssembly());
 }
예제 #4
0
        protected virtual void Patch()
        {
            this.TechType = TechTypeHandler.AddTechType(NameID, FriendlyName, Description, RequiredForUnlock == TechType.None);

            if (!ModulesEnabled) // Even if the options have this be disabled,
            {
                return;          // we still want to run through the AddTechType methods to prevent mismatched TechTypeIDs as these settings are switched
            }
            if (RequiredForUnlock == TechType.None)
            {
                KnownTechHandler.UnlockOnStart(this.TechType);
            }
            else
            {
                KnownTechHandler.SetAnalysisTechEntry(RequiredForUnlock, new TechType[1] {
                    this.TechType
                }, $"{FriendlyName} blueprint discovered!");
            }

            PrefabHandler.RegisterPrefab(this);

            SpriteHandler.RegisterSprite(this.TechType, $"./QMods/MoreCyclopsUpgrades/Assets/{NameID}.png");

            CraftDataHandler.SetTechData(this.TechType, GetRecipe());

            if (AddToCraftTree)
            {
                CraftTreeHandler.AddCraftingNode(Fabricator, this.TechType, FabricatorTabs);
            }

            CraftDataHandler.SetEquipmentType(this.TechType, EquipmentType.CyclopsModule);
            CraftDataHandler.AddToGroup(TechGroup.Cyclops, TechCategory.CyclopsUpgrades, this.TechType);

            SetStaticTechTypeID(this.TechType);
        }
예제 #5
0
        public CoralSample()
            : base("CoralSample", "Coral Shelf Sample", "A sample of coral from the Twisty Bridges.")
        {
            OnFinishedPatching += () =>
            {
                KnifePatches.AddHarvestable(TechType.TwistyBridgesCoralShelf, 200f);
                Main.AddModTechType(this.TechType);
                CraftDataHandler.SetHarvestOutput(TechType.TwistyBridgesCoralShelf, this.TechType);
                CraftDataHandler.SetHarvestType(TechType.TwistyBridgesCoralShelf, HarvestType.DamageAlive);
                CraftDataHandler.SetTechData(TechType.Bleach, new SMLHelper.V2.Crafting.RecipeData()
                {
                    craftAmount = 1,
                    Ingredients = new List <Ingredient>()
                    {
                        new Ingredient(this.TechType, 1),
                        new Ingredient(TechType.Salt, 1)
                    }
                });
                CraftTreeHandler.AddCraftingNode(CraftTree.Type.Fabricator, TechType.Bleach, new string[] { "Resources", "BasicMaterials" });

                CraftDataHandler.SetTechData(TechType.DisinfectedWater, new SMLHelper.V2.Crafting.RecipeData()
                {
                    craftAmount = 2,
                    Ingredients = new List <Ingredient>()
                    {
                        new Ingredient(TechType.Bleach, 1)
                    }
                });
                CraftTreeHandler.AddCraftingNode(CraftTree.Type.Fabricator, TechType.DisinfectedWater, new string[] { "Survival", "Water" });
                KnownTechHandler.SetAnalysisTechEntry(this.TechType, new TechType[] { TechType.Bleach });
                KnownTechHandler.SetAnalysisTechEntry(TechType.Bleach, new TechType[] { TechType.DisinfectedWater });
                LanguageHandler.Main.SetTechTypeTooltip(TechType.Bleach, "NaClO. Sodium hypochlorite bleach. Sanitizing applications.");
            };
        }
예제 #6
0
        internal static void PatchCraftingTabs()
        {
            if (CraftingTabsPatched)
            {
                return; // Just a safety
            }
            QuickLogger.Info("Separating batteries and power cells into their own fabricator crafting tabs");

            // Remove original crafting nodes
            CraftTreeHandler.RemoveNode(CraftTree.Type.Fabricator, ResCraftTab, ElecCraftTab, TechType.Battery.ToString());
            CraftTreeHandler.RemoveNode(CraftTree.Type.Fabricator, ResCraftTab, ElecCraftTab, TechType.PrecursorIonBattery.ToString());
            CraftTreeHandler.RemoveNode(CraftTree.Type.Fabricator, ResCraftTab, ElecCraftTab, TechType.PowerCell.ToString());
            CraftTreeHandler.RemoveNode(CraftTree.Type.Fabricator, ResCraftTab, ElecCraftTab, TechType.PrecursorIonPowerCell.ToString());

            // Add a new set of tab nodes for batteries and power cells
            CraftTreeHandler.AddTabNode(CraftTree.Type.Fabricator, BatteryCraftTab, "Batteries", SpriteManager.Get(TechType.Battery), ResCraftTab, ElecCraftTab);
            CraftTreeHandler.AddTabNode(CraftTree.Type.Fabricator, PowCellCraftTab, "Power Cells", SpriteManager.Get(TechType.PowerCell), ResCraftTab, ElecCraftTab);

            // Move the original batteries and power cells into these new tabs
            CraftTreeHandler.AddCraftingNode(CraftTree.Type.Fabricator, TechType.Battery, BatteryCraftPath);
            CraftTreeHandler.AddCraftingNode(CraftTree.Type.Fabricator, TechType.PrecursorIonBattery, BatteryCraftPath);
            CraftTreeHandler.AddCraftingNode(CraftTree.Type.Fabricator, TechType.PowerCell, PowCellCraftPath);
            CraftTreeHandler.AddCraftingNode(CraftTree.Type.Fabricator, TechType.PrecursorIonPowerCell, PowCellCraftPath);

            CraftingTabsPatched = true;
        }
예제 #7
0
        public void Patch()
        {
            if (this.IsPatched)
            {
                return;
            }

            this.TechType = TechTypeHandler.AddTechType(this.ClassID, this.FriendlyName, this.Description, this.UnlocksAtStart);

            if (!this.UnlocksAtStart)
            {
                KnownTechHandler.SetAnalysisTechEntry(this.RequiredForUnlock, new TechType[] { this.TechType });
            }

            if (this.Sprite == null)
            {
                this.Sprite = ImageUtils.LoadSpriteFromFile(IOUtilities.Combine(ExecutingFolder, this.PluginFolder, this.IconFileName));
            }

            SpriteHandler.RegisterSprite(this.TechType, this.Sprite);

            CraftDataHandler.SetTechData(this.TechType, GetBlueprintRecipe());

            CraftDataHandler.AddToGroup(TechGroup.Resources, TechCategory.Electronics, this.TechType);

            CraftDataHandler.SetEquipmentType(this.TechType, this.ChargerType);

            CraftTreeHandler.AddCraftingNode(CraftTree.Type.Fabricator, this.TechType, this.StepsToFabricatorTab);

            PrefabHandler.RegisterPrefab(this);

            AddToList();

            this.IsPatched = true;
        }
예제 #8
0
        internal static void PatchAll()
        {
            // Create a new crafting tree tab for batteries and power cells
            var tabIcon = ImageUtils.LoadSpriteFromFile(@"./Qmods/" + MgBatteryAssets + @"/CraftingTabIcon.png");

            CraftTreeHandler.AddTabNode(CraftTree.Type.Fabricator, BatteryPowerCraftingTab, "Batteries and Power Cells", tabIcon, ResourcesCraftingTab, ElectronicsCraftingTab);

            // Remove the original batteries from the Electronics tab
            CraftTreeHandler.RemoveNode(CraftTree.Type.Fabricator, ResourcesCraftingTab, ElectronicsCraftingTab, TechType.Battery.ToString());
            CraftTreeHandler.RemoveNode(CraftTree.Type.Fabricator, ResourcesCraftingTab, ElectronicsCraftingTab, TechType.PowerCell.ToString());
            CraftTreeHandler.RemoveNode(CraftTree.Type.Fabricator, ResourcesCraftingTab, ElectronicsCraftingTab, TechType.PrecursorIonBattery.ToString());
            CraftTreeHandler.RemoveNode(CraftTree.Type.Fabricator, ResourcesCraftingTab, ElectronicsCraftingTab, TechType.PrecursorIonPowerCell.ToString());

            // And add them back in on the new Batteries and PowerCells tab
            CraftTreeHandler.AddCraftingNode(CraftTree.Type.Fabricator, TechType.Battery, PathToNewTab);
            CraftTreeHandler.AddCraftingNode(CraftTree.Type.Fabricator, TechType.PowerCell, PathToNewTab);

            var config = new DeepConfig();

            config.ReadConfigFile();

            var lithiumBattery = new DeepBattery(config.BatteryCapacity);

            lithiumBattery.Patch();

            var lithiumPowerCell = new DeepPowerCell(lithiumBattery);

            lithiumPowerCell.Patch();

            // Add the Ion Batteries after the Deep Batteries
            CraftTreeHandler.AddCraftingNode(CraftTree.Type.Fabricator, TechType.PrecursorIonBattery, PathToNewTab);
            CraftTreeHandler.AddCraftingNode(CraftTree.Type.Fabricator, TechType.PrecursorIonPowerCell, PathToNewTab);
        }
예제 #9
0
        public void PostPatch()
        {
            //patch crafting recipes
            //is there a more efficient way of doing this?
            var techDataBlade = new RecipeData()
            {
                craftAmount = 3,
                Ingredients = new List <Ingredient>()
                {
                    new Ingredient(TechType.Titanium, 3)
                }
            };

            CraftDataHandler.SetTechData(turbineBlade, techDataBlade);
            CraftTreeHandler.AddCraftingNode(CraftTree.Type.Fabricator, turbineBlade, new string[] { "Resources", "Electronics" });
            KnownTechHandler.SetAnalysisTechEntry(TechType.WiringKit, new TechType[] { turbineBlade });
            CraftDataHandler.SetItemSize(turbineBlade, new Vector2int(2, 1));
            //SetItemSize(turbineBlade, 2, 1);

            var techDataGen = new RecipeData()
            {
                craftAmount = 1,
                Ingredients = new List <Ingredient>()
                {
                    new Ingredient(TechType.WiringKit, 1),
                    new Ingredient(TechType.PowerCell, 1),
                    new Ingredient(TechType.Lubricant, 1)
                }
            };

            CraftDataHandler.SetTechData(turbineGenerator, techDataGen);
            KnownTechHandler.SetAnalysisTechEntry(TechType.WiringKit, new TechType[] { turbineGenerator });
            CraftTreeHandler.AddCraftingNode(CraftTree.Type.Fabricator, turbineGenerator, new string[] { "Resources", "Electronics" });
            CraftDataHandler.SetItemSize(turbineGenerator, new Vector2int(2, 2));
            //SetItemSize(turbineBlade, 2, 2);

            var techDataPole = new RecipeData()
            {
                craftAmount = 1,
                Ingredients = new List <Ingredient>()
                {
                    new Ingredient(TechType.Titanium, 4)
                }
            };

            CraftDataHandler.SetTechData(turbinePole, techDataPole);
            KnownTechHandler.SetAnalysisTechEntry(TechType.WiringKit, new TechType[] { turbinePole });
            CraftTreeHandler.AddCraftingNode(CraftTree.Type.Fabricator, turbinePole, new string[] { "Resources", "Electronics" });
            CraftDataHandler.SetItemSize(turbinePole, new Vector2int(1, 2));
            //SetItemSize(turbineBlade, 1, 2);

            //Add the databank entry.
            LanguageHandler.SetLanguageLine("Ency_WindTurbine", "Wind Turbine");
            LanguageHandler.SetLanguageLine("EncyDesc_WindTurbine", string.Format("A large generator suspended by 17.5 meter tall pole. The lightweight blades are rotated by the planet's strong air currents and efficiently converts the force into electrical energy. The generator contains a large internal battery that can hold up to {0} units of power. Unlike solar panels, these operate at roughly the same efficiency throughout the day. Orientation does not appear to affect power output. However certain places seem to simply have more wind than others. Power output also increases with altitude.", config.MaxPower));

            //This just isn't working for now. Maybe another update?
            //var windTool = new WindTool.WindToolPatch();
            //windTool.Patch();
        }
예제 #10
0
            /// <summary>
            /// Loads titanium ingot
            /// </summary>
            public static void TitaniumIngot()
            {
                var _x = 1;
                var _y = 1;
                var _e = true;

                var languageName = "Titanium Ingot";

                try
                {
                    Log.Debug(languageName, Status.Start);
                    if (ConfigCheck(languageName))
                    {
                        var Config = MI.Config.cfgfile;
                        Config.TryGet(ref _x, languageName, "Size", "x");
                        Config.TryGet(ref _y, languageName, "Size", "y");
                        Config.TryGet(ref _e, languageName, "Enabled");
                    }
                    Log.Debug(languageName, "Adding TechType...");
                    var techType = TechType.ScrapMetal;
                    Log.Debug(languageName, "Adding TechData...");
                    var techDataB = new TechData()
                    {
                        craftAmount = 1,
                        Ingredients = new List <Ingredient>()
                        {
                            new Ingredient(TechType.TitaniumIngot, 1)
                        },
                        LinkedItems = new List <TechType>()
                        {
                            TechType.Titanium,
                            TechType.Titanium,
                            TechType.Titanium,
                            TechType.Titanium,
                            TechType.Titanium,
                            TechType.Titanium
                        }
                    };
                    Log.Debug(languageName, $"Linked item count is {techDataB.linkedItemCount.ToString()}");
                    Log.Debug(languageName, "Linking TechData with TechType...");
                    CraftDataHandler.SetTechData(techType, techDataB);
                    Log.Debug(languageName, "TechData linked with TechType");
                    Log.Debug(languageName, "Adding Fabricator node...");
                    CraftTreeHandler.AddCraftingNode(CraftTree.Type.Fabricator, techType, "Resources", "Unpack");
                    Log.Debug(languageName, "Fabricator node added");
                    Log.Debug(languageName, "Applying item size...");
                    CraftDataHandler.SetItemSize(TechType.TitaniumIngot, new Vector2int(_x, _y));
                    Log.Debug(languageName, "Item size applied");
                    Log.Debug(languageName, Status.Stop);
                }
                catch (Exception e)
                {
                    Log.e(e);
                }
            }
예제 #11
0
            /// <summary>
            /// Loads item sizes for plasteel ingot
            /// </summary>
            public static void PlasteelIngot()
            {
                var _x = 1;
                var _y = 1;
                var _e = true;

                var languageName = "Plasteel Ingot";

                try
                {
                    Log.Debug(languageName, Status.Start);
                    if (ConfigCheck(languageName))
                    {
                        var Config = MI.Config.cfgfile;
                        Config.TryGet(ref _x, languageName, "Size", "x");
                        Config.TryGet(ref _y, languageName, "Size", "y");
                        Config.TryGet(ref _e, languageName, "Enabled");
                    }
                    Log.Debug(languageName, "Adding TechType...");
                    var sprite   = SpriteManager.Get(TechType.Lithium);
                    var techType = TechTypeHandler.AddTechType("MIPlasteel", languageName, "Turn one plasteel ingot into 1 titanium ingot and 2 lithium", sprite);
                    Log.Debug(languageName, "Adding TechData...");
                    var techDataB = new TechData()
                    {
                        craftAmount = 0,
                        Ingredients = new List <Ingredient>()
                        {
                            new Ingredient(TechType.PlasteelIngot, 1)
                        },
                        LinkedItems = new List <TechType>()
                        {
                            TechType.TitaniumIngot,
                            TechType.Lithium,
                            TechType.Lithium
                        }
                    };
                    Log.Debug(languageName, "Linking TechData with TechType...");
                    CraftDataHandler.SetTechData(techType, techDataB);
                    Log.Debug(languageName, "TechData linked with TechType");
                    Log.Debug(languageName, "Adding Fabricator node...");
                    CraftTreeHandler.AddCraftingNode(CraftTree.Type.Fabricator, techType, "Resources", "Unpack");
                    Log.Debug(languageName, "Fabricator node added");
                    Log.Debug(languageName, "Applying item size...");
                    CraftDataHandler.SetItemSize(TechType.PlasteelIngot, new Vector2int(_x, _y));
                    Log.Debug(languageName, "Item size applied");
                    Log.Debug(languageName, Status.Stop);
                }
                catch (Exception e)
                {
                    Log.e(e);
                }
            }
예제 #12
0
        /// <summary>
        /// Add recipe for unpacking the compressed type into constituents
        /// </summary>
        protected internal void AddUnpackRecipe()
        {
            var tempType   = TechTypeHandler.AddTechType($"Unpack{ClassID}", $"Unpack {FriendlyName}", $"Unpack {FriendlyName} back into {_ingredientType.AsString()}", SpriteManager.Get(_ingredientType));
            var unpackData = new TechData()
            {
                craftAmount = 0,
                Ingredients = new List <Ingredient> {
                    new Ingredient(this.TechType, 1)
                },
                LinkedItems = new List <TechType>(Enumerable.Repeat(_ingredientType, 10))
            };

            CraftDataHandler.SetTechData(tempType, unpackData);
            CraftTreeHandler.AddCraftingNode(CraftTree.Type.Fabricator, tempType, Names.FabricatorCategoryId, $"Unpack{_type}");
        }
예제 #13
0
        //public static TechType RepulsionKnifeID;

        public static void Patch()
        {
            RoseLogger.PatchStart(modName, "1.0.0");
            try
            {
                Atlas.Sprite obsidianKnifeIcon = null;
                obsidianKnifeIcon = ImageUtils.LoadSpriteFromFile($"./QMods/MoreKnives/Assets/ObsidianKnife.png");

                ObsidianKnifeID = TechTypeHandler.AddTechType("obsidianknife", "Obsidian Knife", "An enhanced knife that exudes a rapidly cooling magma, forming a sharp obsidian edge.");

                SpriteHandler.RegisterSprite(ObsidianKnifeID, obsidianKnifeIcon);

                KnifePrefab obsidianKnifePrefab = new KnifePrefab("obsidianknife", "WorldEntities/Tools/ObsidianKnife", ObsidianKnifeID);

                DropItems.PatchDropItems();

                var techDataObsidian = new TechData
                {
                    craftAmount = 1,
                    Ingredients = new List <Ingredient>()
                    {
                        new Ingredient(TechType.Knife, 1),
                        new Ingredient(DropItems.ObsidianFlakeID, 1),
                    },
                };

                CraftDataHandler.SetTechData(ObsidianKnifeID, techDataObsidian);

                CraftTreeHandler.AddCraftingNode(CraftTree.Type.Workbench, ObsidianKnifeID, new string[] { "Survival Knife", "obsidianknife" });

                CraftDataHandler.SetItemSize(ObsidianKnifeID, new Vector2int(1, 1));

                CraftDataHandler.SetEquipmentType(ObsidianKnifeID, EquipmentType.Hand);

                PrefabHandler.RegisterPrefab(obsidianKnifePrefab);

                var harmony = HarmonyInstance.Create("rose.moreknives.mod");
                harmony.PatchAll(Assembly.GetExecutingAssembly());


                RoseLogger.PatchComplete(modName);
            }

            catch (Exception ex)
            {
                RoseLogger.PatchFailed(modName, ex);
            }
        }
예제 #14
0
        private void PatchCraftingTree()
        {
            if (FabricatorType == CraftTree.Type.None)
            {
                Logger.Log($"FabricatorType property for Craftable instance of {this.ClassID} must have a value greater than CraftTree.Type.None.", LogLevel.Error);
                throw new Exception($"Error patching Craftable:{this.ClassID}");
            }

            if (this.StepsToFabricatorTab == null || this.StepsToFabricatorTab.Length == 0)
            {
                CraftTreeHandler.AddCraftingNode(this.FabricatorType, this.TechType);
            }
            else
            {
                CraftTreeHandler.AddCraftingNode(this.FabricatorType, this.TechType, this.StepsToFabricatorTab);
            }
        }