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