public static void AddCustomRecipe(GameObject prefab, Items.RecipesConfig recipes, bool craftingMode) { var recipe = ScriptableObject.CreateInstance <Recipe>(); recipe.m_item = prefab.GetComponent <ItemDrop>(); var neededResources = new List <Piece.Requirement>(); foreach (var rec in recipes.recipes) { if (rec.name == prefab.name) { foreach (var component in rec.resources) { neededResources.Add(MockRequirement.Create(component.item, component.amount)); } if (rec.craftingStation != null && craftingMode != true) { recipe.m_craftingStation = Mock <CraftingStation> .Create(rec.craftingStation); } if (rec.repairStation != null) { recipe.m_repairStation = Mock <CraftingStation> .Create(rec.repairStation); } recipe.m_amount = rec.amount; recipe.m_minStationLevel = rec.minStationLevel; recipe.m_resources = neededResources.ToArray(); } } CustomRecipe newRecipe = new CustomRecipe(recipe, fixReference: true, true); ObjectDBHelper.Add(newRecipe); }
private void Awake() { // Do all your init stuff here // Acceptable value ranges can be defined to allow configuration via a slider in the BepInEx ConfigurationManager: https://github.com/BepInEx/BepInEx.ConfigurationManager Config.Bind <int>("Main Section", "Example configuration integer", 1, new ConfigDescription("This is an example config, using a range limitation for ConfigurationManager", new AcceptableValueRange <int>(0, 100))); // Jotunn comes with its own Logger class to provide a consistent Log style for all mods using it Jotunn.Logger.LogInfo("ModStub has landed"); CustomPiece cpHeart = null; CustomPiece cpExpander = null; cpHeart.Piece.m_craftingStation = PrefabManager.Cache.GetPrefab <CraftingStation>("piece_workbench"); CraftingStation customCraftingStation = cpHeart.PiecePrefab.AddComponent <CraftingStation>(); customCraftingStation.m_name = "$piece_TS_Expander_CS"; cpExpander.Piece.m_craftingStation = customCraftingStation; cpExpander.Piece.m_resources = new Piece.Requirement[] { MockRequirement.Create("Stone", 10), MockRequirement.Create("Wood", 10) }; cpExpander.PiecePrefab.AddComponent <CraftingStation>(); cpExpander.PiecePrefab.GetComponent <CraftingStation>().m_name = "$piece_TS_Expander_CS"; cpExpander.PiecePrefab.GetComponent <CraftingStation>().m_rangeBuild = 45; // 50 or 45 - the range is for the player *not* the piece. }
// Implementation of assets using mocks, adding recipe's manually without the config abstraction private void AddMockedItems() { if (!backpackPrefab) { Jotunn.Logger.LogWarning($"Failed to load asset from bundle: {embeddedResourceBundle}"); } else { // Create and add a custom item CustomItem CI = new CustomItem(backpackPrefab, true); ItemManager.Instance.AddItem(CI); //Create and add a custom recipe Recipe recipe = ScriptableObject.CreateInstance <Recipe>(); recipe.m_item = backpackPrefab.GetComponent <ItemDrop>(); recipe.m_craftingStation = Mock <CraftingStation> .Create("piece_workbench"); var ingredients = new List <Piece.Requirement> { MockRequirement.Create("LeatherScraps", 10), MockRequirement.Create("DeerHide", 2), MockRequirement.Create("Iron", 4), }; recipe.m_resources = ingredients.ToArray(); CustomRecipe CR = new CustomRecipe(recipe, true, true); ItemManager.Instance.AddRecipe(CR); //Enable BoneReorder BoneReorder.ApplyOnEquipmentChanged(); } embeddedResourceBundle.Unload(false); }
private static void AddRecipe() { var recipeFire = ScriptableObject.CreateInstance <Recipe>(); var recipeFrost = ScriptableObject.CreateInstance <Recipe>(); var recipeLightning = ScriptableObject.CreateInstance <Recipe>(); recipeFire.m_item = AssetHelper.BombFirePrefab.GetComponent <ItemDrop>(); recipeFrost.m_item = AssetHelper.BombFrostPrefab.GetComponent <ItemDrop>(); recipeLightning.m_item = AssetHelper.BombLightningPrefab.GetComponent <ItemDrop>(); var itemReqsFire = new List <Piece.Requirement> { MockRequirement.Create("Coal", 10), MockRequirement.Create("Ooze", 5), MockRequirement.Create("LeatherScraps", 5), }; recipeFire.m_amount = 5; recipeFire.name = "Recipe_BombFire"; var itemReqsFrost = new List <Piece.Requirement> { MockRequirement.Create("FreezeGland", 5), MockRequirement.Create("Ooze", 5), MockRequirement.Create("LeatherScraps", 5), }; recipeFrost.m_amount = 5; recipeFrost.name = "Recipe_BombFrost"; var itemReqsLightning = new List <Piece.Requirement> { MockRequirement.Create("HardAntler", 1), MockRequirement.Create("Ooze", 5), MockRequirement.Create("LeatherScraps", 5), }; recipeLightning.m_amount = 5; recipeLightning.name = "Recipe_BombLightning"; recipeFire.m_resources = itemReqsFire.ToArray(); recipeFrost.m_resources = itemReqsFrost.ToArray(); recipeLightning.m_resources = itemReqsLightning.ToArray(); recipeFire.m_craftingStation = Mock <CraftingStation> .Create(CraftingStationPrefabName); recipeFrost.m_craftingStation = Mock <CraftingStation> .Create(CraftingStationPrefabName); recipeLightning.m_craftingStation = Mock <CraftingStation> .Create(CraftingStationPrefabName); customRecipeFire = new CustomRecipe(recipeFire, true, true); customRecipeFrost = new CustomRecipe(recipeFrost, true, true); customRecipeLightning = new CustomRecipe(recipeLightning, true, true); ItemManager.Instance.AddRecipe(customRecipeFire); ItemManager.Instance.AddRecipe(customRecipeFrost); ItemManager.Instance.AddRecipe(customRecipeLightning); }
public static void AddPieceToTool() { Harmony.CreateAndPatchAll(Assembly.GetExecutingAssembly(), "com.rolopogo.Basement"); MaterialReplacer.GetAllMaterials(); // Load from assetbundle var bundle = AssetBundle.LoadFromMemory(ResourceUtils.GetResource(Assembly.GetExecutingAssembly(), "Basement.Resources.basement")); basementPrefab = bundle.LoadAsset <GameObject>("Basement"); basementPrefab.AddComponent <Basement>(); bundle.Unload(false); Plugin.basementPrefab.name = "basement.basementprefab"; // update material references MaterialReplacer.ReplaceAllMaterialsWithOriginal(basementPrefab); var woodRequirement = MockRequirement.Create("Wood", 100, true); woodRequirement.FixReferences(); var stoneRequirement = MockRequirement.Create("Stone", 100, true); stoneRequirement.FixReferences(); var customRequirements = new Piece.Requirement[] { woodRequirement, stoneRequirement }; var piece = basementPrefab.GetComponent <Piece>(); piece.m_resources = customRequirements; piece.m_category = Piece.PieceCategory.Misc; piece.m_craftingStation = Mock <CraftingStation> .Create("piece_stonecutter"); piece.m_clipEverything = true; // Add spawn effect piece.m_placeEffect = Prefab.Cache.GetPrefab <GameObject>("piece_stonecutter").GetComponent <Piece>().m_placeEffect; piece.FixReferences(); Prefab.NetworkRegister(basementPrefab); // Add to tool var hammerPrefab = Prefab.Cache.GetPrefab <GameObject>("Hammer"); var hammerPieceTable = hammerPrefab.GetComponent <ItemDrop>().m_itemData.m_shared.m_buildPieces; hammerPieceTable.m_pieces.Add(basementPrefab.gameObject); }
private static void AddCustomRecipe() { var recipe = ScriptableObject.CreateInstance <Recipe>(); recipe.m_item = AssetHelper.LeadPrefab.GetComponent <ItemDrop>(); var neededResources = new List <Piece.Requirement> { MockRequirement.Create("Ooze", 4), MockRequirement.Create("DeerHide", 2), }; recipe.m_resources = neededResources.ToArray(); CustomRecipe = new CustomRecipe(recipe, false, true); ObjectDBHelper.Add(CustomRecipe); }
// Add new items with mocked prefabs private void AddMockedItems() { // Load assets from resources var assetstream = typeof(TestMod).Assembly.GetManifestResourceStream("TestMod.AssetsEmbedded.capeironbackpack"); if (assetstream == null) { Jotunn.Logger.LogWarning("Requested asset stream could not be found."); } else { var assetBundle = AssetBundle.LoadFromStream(assetstream); var prefab = assetBundle.LoadAsset <GameObject>("Assets/Evie/CapeIronBackpack.prefab"); if (!prefab) { Jotunn.Logger.LogWarning($"Failed to load asset from bundle: {assetBundle}"); } else { // Create and add a custom item var CI = new CustomItem(prefab, fixReference: true); // Mocked refs in prefabs need to be fixed ItemManager.Instance.AddItem(CI); // Create and add a custom recipe var recipe = ScriptableObject.CreateInstance <Recipe>(); recipe.name = "Recipe_Backpack"; recipe.m_item = prefab.GetComponent <ItemDrop>(); recipe.m_craftingStation = Mock <CraftingStation> .Create("piece_workbench"); var ingredients = new List <Piece.Requirement> { MockRequirement.Create("LeatherScraps", 10), MockRequirement.Create("DeerHide", 2), MockRequirement.Create("Iron", 4) }; recipe.m_resources = ingredients.ToArray(); var CR = new CustomRecipe(recipe, fixReference: true, fixRequirementReferences: true); // Mocked main and requirement refs need to be fixed ItemManager.Instance.AddRecipe(CR); // Enable BoneReorder BoneReorder.ApplyOnEquipmentChanged(); } assetBundle.Unload(false); } }
/* * Private Methods */ private static void AddCustomRecipe() { var recipe = ScriptableObject.CreateInstance <Recipe>(); recipe.m_item = MeadPewterPrefab.GetComponent <ItemDrop>(); recipe.m_amount = 10; var neededResources = new List <Piece.Requirement> { MockRequirement.Create("Pewter", 1), MockRequirement.Create("MeadTasty", 2), }; recipe.m_resources = neededResources.ToArray(); recipe.m_craftingStation = Mock <CraftingStation> .Create(CraftingStationPrefabName); CustomRecipe = new CustomRecipe(recipe, fixReference: true, true); ObjectDBHelper.Add(CustomRecipe); }
public static void GetRecipe(ref Recipe recipe, JToken json, bool useName = true) { var itemReqs = new List <Piece.Requirement>(); int index = 0; foreach (var item in json["recipe"]) { itemReqs.Add(MockRequirement.Create((string)item["item"], (int)item["amount"])); itemReqs[index].m_amountPerLevel = (int)item["perLevel"]; index++; } if (useName) { recipe.name = $"Recipe_{json.Path}"; } recipe.m_resources = itemReqs.ToArray(); recipe.m_craftingStation = Mock <CraftingStation> .Create((string)json["station"]); recipe.m_amount = (int)json["amountCrafted"]; }
public void Init() { var ab = AssetBundle.LoadFromMemory(Properties.Resources.eviesbackpacks); IronBackpackPrefab = InitPrefab(ab, "Assets/Evie/CapeIronBackpack.prefab"); LoadCraftedItem(IronBackpackPrefab, new List <Piece.Requirement> { MockRequirement.Create("LeatherScraps", 10), MockRequirement.Create("DeerHide", 2), MockRequirement.Create("Iron", 4), }); SilverBackpackPrefab = InitPrefab(ab, "Assets/Evie/CapeSilverBackpack.prefab"); LoadCraftedItem(SilverBackpackPrefab, new List <Piece.Requirement> { MockRequirement.Create("LeatherScraps", 5), MockRequirement.Create("WolfPelt", 6), MockRequirement.Create("Silver", 4), }); InitLocalisation(); }
// Implementation of assets using mocks, adding recipe's manually without the config abstraction private void AddMockedItems() { Jotunn.Logger.LogInfo("test items"); if (!slappingFish) { Jotunn.Logger.LogWarning($"Failed to load asset from bundle: {slappingFishBundle}"); } else { Jotunn.Logger.LogInfo("test items 2"); // Create and add a custom item CustomItem CI = new CustomItem(slappingFish, true); CI.ItemDrop.m_itemData.m_shared.m_attackStatusEffect = challengedEffect.StatusEffect; CI.ItemDrop.m_itemData.m_shared.m_damages.m_slash = 0; CI.ItemDrop.m_itemData.m_shared.m_damages.m_pierce = 0; ItemManager.Instance.AddItem(CI); //Create and add a custom recipe Recipe recipe = ScriptableObject.CreateInstance <Recipe>(); recipe.name = "Recipe_SlappingFish"; recipe.m_item = slappingFish.GetComponent <ItemDrop>(); recipe.m_craftingStation = Mock <CraftingStation> .Create("piece_workbench"); var ingredients = new List <Piece.Requirement> { MockRequirement.Create("Wood", 1), }; recipe.m_resources = ingredients.ToArray(); CustomRecipe CR = new CustomRecipe(recipe, true, true); ItemManager.Instance.AddRecipe(CR); //Enable BoneReorder BoneReorder.ApplyOnEquipmentChanged(); } slappingFishBundle.Unload(false); }
private static void AddRecipe() { var recipe = ScriptableObject.CreateInstance <Recipe>(); recipe.m_item = AssetHelper.TorchOlympiaPrefab.GetComponent <ItemDrop>(); var itemReqs = new List <Piece.Requirement> { MockRequirement.Create("HelmetYule", 1), MockRequirement.Create("Flametal", 70), MockRequirement.Create("YagluthDrop", 100), MockRequirement.Create("YmirRemains", 20), }; recipe.name = "Recipe_Secret"; recipe.m_resources = itemReqs.ToArray(); recipe.m_craftingStation = Mock <CraftingStation> .Create(CraftingStationPrefabName); customRecipe = new CustomRecipe(recipe, true, true); if ((bool)balance["TorchOlympia"]["enabled"]) { ItemManager.Instance.AddRecipe(customRecipe); } }
private static void AddPieceToTool() { var hoePrefab = Prefab.Cache.GetPrefab <GameObject>("Hoe"); var hoePieceTable = hoePrefab.GetComponent <ItemDrop>().m_itemData.m_shared.m_buildPieces; var pieceChair = Mock <Piece> .Create("piece_chair"); var clonedPrefab = Prefab.GetRealPrefabFromMock <Piece>(pieceChair).gameObject.InstantiateClone("customChair"); var woodRequirement = MockRequirement.Create("Wood"); woodRequirement.FixReferences(); var customRequirements = new List <Piece.Requirement> { woodRequirement }; var customPieceChair = clonedPrefab.GetComponent <Piece>(); customPieceChair.m_resources = customRequirements.ToArray(); customPieceChair.m_category = Piece.PieceCategory.Misc; hoePieceTable.m_pieces.Add(clonedPrefab.gameObject); }
public static void AddBelt(string name) { var setBalance = balance[name]; UtilityBelt beltData = UtilityBelts[name]; GameObject clonedBelt = PrefabManager.Instance.CreateClonedPrefab(beltData.BaseID, beltData.CloneID); //Set ID so that previous armors still exist clonedBelt.name = beltData.FinalID; CustomItem belt = new CustomItem(clonedBelt, true); belt.ItemDrop.m_itemData.m_shared.m_name = $"{beltData.Name}"; //GET EFFECT StatusEffect status = GetArmorEffect((string)setBalance["effect"], setBalance, "head", ref belt.ItemDrop.m_itemData.m_shared.m_description); if (status != null) { belt.ItemDrop.m_itemData.m_shared.m_equipStatusEffect = status; } else { Log.LogWarning($"{name} - No status effect found for provided effect: {(string)setBalance["effect"]}"); } //Recipes Recipe recipe = ScriptableObject.CreateInstance <Recipe>(); recipe.name = $"Recipe_{beltData.BaseID}"; List <Piece.Requirement> helmetList = new List <Piece.Requirement>(); var recipeReqs = setBalance["crafting"]; int index = 0; foreach (JObject item in recipeReqs["items"]) { helmetList.Add(MockRequirement.Create((string)item["item"], (int)item["amount"])); helmetList[index].m_amountPerLevel = (int)item["perLevel"]; index++; } recipe.m_craftingStation = Mock <CraftingStation> .Create((string)recipeReqs["station"]); //Set crafting station level recipe.m_minStationLevel = (int)recipeReqs["minLevel"]; //Assign reqs to recipe recipe.m_resources = helmetList.ToArray(); //Add item to recipe recipe.m_item = belt.ItemDrop; //Create the custome recipe CustomRecipe customRecipe = new CustomRecipe(recipe, fixReference: true, fixRequirementReferences: true); ItemManager.Instance.AddItem(belt); //Add recipes to DB ItemManager.Instance.AddRecipe(customRecipe); }
public static void AddArmorPiece(string setName, string location) { var setBalance = balance[setName]; ArmorSet armor = ArmorSets[setName]; for (int i = (int)setBalance["upgrades"]["startingTier"]; i <= 5; i++) { var tierBalance = setBalance["upgrades"][$"t{i}"]; string id = ""; string name = ""; switch (location) { case "head": id = armor.HelmetID; name = armor.HelmetName; break; case "chest": id = armor.ChestID; name = armor.ChestName; break; case "legs": id = armor.LegsID; name = armor.LegsName; break; default: break; } //Create mocks for use in clones GameObject clonedPiece = PrefabManager.Instance.CreateClonedPrefab($"{id}T{i}", id); //Set ID so that previous armors still exist if (setName != "barbarian") { string armorSetName = char.ToUpper(setName[0]) + setName.Substring(1); clonedPiece.name = $"{id}T{i}_Terraheim_AddNewSets_Add{armorSetName}Armor"; } else { clonedPiece.name = $"{id}T{i}_Terraheim_BarbarianArmor_AddNewSets"; } CustomItem piece = new CustomItem(clonedPiece, true); piece.ItemDrop.m_itemData.m_shared.m_name = $"{name}{i}"; ModArmorPiece(setName, location, ref piece.ItemDrop.m_itemData, setBalance, true, i); //Recipes Recipe recipe = ScriptableObject.CreateInstance <Recipe>(); recipe.name = $"Recipe_{id}T{i}"; List <Piece.Requirement> recipeList = new List <Piece.Requirement>(); //Add base armor to requirements int j = 0; if (i == (int)setBalance["upgrades"]["startingTier"]) { recipeList.Add(MockRequirement.Create(id, 1, false)); j++; recipeList[0].m_amountPerLevel = 0; } var recipeReqs = balance["upgradePath"][$"t{i}"]; int index = 0 + j; foreach (JObject item in recipeReqs[location]) { recipeList.Add(MockRequirement.Create((string)item["item"], (int)item["amount"])); recipeList[index].m_amountPerLevel = (int)item["perLevel"]; index++; } recipe.m_craftingStation = Mock <CraftingStation> .Create((string)recipeReqs["station"]); //Set crafting station level recipe.m_minStationLevel = (int)recipeReqs["minLevel"]; //Assign reqs to recipe recipe.m_resources = recipeList.ToArray(); //Add item to recipe recipe.m_item = piece.ItemDrop; //Create the custome recipe CustomRecipe customPieceRecipe = new CustomRecipe(recipe, fixReference: true, fixRequirementReferences: true); ItemManager.Instance.AddItem(piece); //Add recipes to DB ItemManager.Instance.AddRecipe(customPieceRecipe); } }
private static void RegisterPrefab(string ResourceName) { try { // read the json and parse it into it's respective json class string jsonData = ReadEmbeddedJSON(ResourceName); Models.JSON.JSON_Prefab obj = SimpleJson.SimpleJson.DeserializeObject <Models.JSON.JSON_Prefab>(jsonData); GameObject prefab = PrefabBundle.LoadAsset <GameObject>(obj.Prefab); switch (obj.Type) { case "Piece": // create the piece config and prep it var pieceConfig = new PieceConfig(); pieceConfig.PieceTable = obj.PieceConfig.PieceTable; // Add the ingredient requirements to the recipe var requirements = new List <RequirementConfig>(); foreach (KeyValuePair <string, int> requirement in obj.PieceConfig.Requirements) { var newRequirement = new RequirementConfig(); newRequirement.Item = requirement.Key; newRequirement.Amount = requirement.Value; requirements.Add(newRequirement); } pieceConfig.Requirements = requirements.ToArray(); // init the piece and add it to the game with jotunn CustomPiece newPiece = new CustomPiece(prefab, pieceConfig); PieceManager.Instance.AddPiece(newPiece); break; case "Item": // init the item and add it to the game with jotunn CustomItem newItem = new CustomItem(prefab, false); ItemManager.Instance.AddItem(newItem); // create the item recipe and prep some details Recipe newRecipe = ScriptableObject.CreateInstance <Recipe>(); newRecipe.name = "Recipe_" + newItem.ItemDrop.name; newRecipe.m_item = prefab.GetComponent <ItemDrop>(); newRecipe.m_craftingStation = Mock <CraftingStation> .Create(obj.RecipeConfig.CraftingStation); // Add the ingredient requirements to the recipe var ingredients = new List <Piece.Requirement>(); foreach (KeyValuePair <string, int> ingredient in obj.RecipeConfig.Ingredients) { ingredients.Add(MockRequirement.Create(ingredient.Key, ingredient.Value)); } newRecipe.m_resources = ingredients.ToArray(); // add the custom recipe to the game with jotunn CustomRecipe customRecipe = new CustomRecipe(newRecipe, true, true); ItemManager.Instance.AddRecipe(customRecipe); break; } // add the translations to our system list foreach (KeyValuePair <string, string> entry in obj.Translations) { EnglishTranslations.Add(entry.Key, entry.Value); } } catch (Exception err) { Console.print("Unable to register prefab: " + ResourceName + " => " + err); } }
private static Piece SetupCraftingStation(GameObject model, CraftingStation station, GameObject cart) { //Add model to cart var modelInstance = Instantiate(model, cart.transform); modelInstance.SetActive(true); // update material references MaterialReplacer.ReplaceAllMaterialsWithOriginal(modelInstance); Debug.Log("fix component refs"); //Fix component refs var wbWNT = cart.GetComponent <WearNTear>(); wbWNT.m_new = modelInstance.transform.Find("new").gameObject; wbWNT.m_worn = modelInstance.transform.Find("worn").gameObject; wbWNT.m_broken = modelInstance.transform.Find("broken").gameObject; wbWNT.m_fragmentRoots = new GameObject[] { modelInstance.transform.Find("cart_Destruction").gameObject }; var rb = cart.GetComponent <Rigidbody>(); rb.centerOfMass = Vector3.up * 0.3f; Debug.Log("fix vagon"); var vagon = cart.GetComponent <Vagon>(); vagon.m_name = station.m_name + " $tool_cart"; vagon.m_attachPoint = modelInstance.transform.Find("AttachPoint"); vagon.m_lineAttachPoints0 = modelInstance.transform.Find("LineAttach0"); vagon.m_lineAttachPoints1 = modelInstance.transform.Find("LineAttach1"); vagon.m_container = null; vagon.m_loadVis = new List <Vagon.LoadData>(); Debug.Log("fix wheels"); cart.transform.Find("Wheel1").position = modelInstance.transform.Find("Wheel1").position; cart.transform.Find("Wheel2").position = modelInstance.transform.Find("Wheel2").position; modelInstance.transform.Find("Wheel1").SetParent(cart.transform.Find("Wheel1"), false); modelInstance.transform.Find("Wheel2").SetParent(cart.transform.Find("Wheel2"), false); cart.transform.Find("Wheel1/Wheel1").localRotation = Quaternion.identity; cart.transform.Find("Wheel2/Wheel2").localRotation = Quaternion.identity; cart.transform.Find("Wheel1/Wheel1").localPosition = Vector3.zero; cart.transform.Find("Wheel2/Wheel2").localPosition = Vector3.zero; Debug.Log("add crafting station"); var cs = modelInstance.transform.Find("crafting station").gameObject.AddComponent <CraftingStation>(); cs.m_name = station.m_name; cs.m_icon = station.m_icon; cs.m_discoverRange = station.m_discoverRange; cs.m_rangeBuild = station.m_rangeBuild; cs.m_craftRequireRoof = false; cs.m_craftRequireFire = false; cs.m_roofCheckPoint = cs.transform; cs.m_connectionPoint = cs.transform; cs.m_showBasicRecipies = station.m_showBasicRecipies; cs.m_useDistance = station.m_useDistance; cs.m_useAnimation = station.m_useAnimation; cs.m_craftItemEffects = station.m_craftItemEffects; cs.m_craftItemDoneEffects = station.m_craftItemDoneEffects; cs.m_repairItemDoneEffects = station.m_repairItemDoneEffects; if (cs.transform.Find("AreaMarker")) { DestroyImmediate(cs.transform.Find("AreaMarker")); } cs.m_areaMarker = Instantiate(station.transform.Find("AreaMarker"), modelInstance.transform).gameObject; cs.gameObject.name = "CraftyCarts.CraftingStation"; Debug.Log("setup recipe"); var piece = cart.GetComponent <Piece>(); piece.m_name = station.m_name + " $tool_cart"; piece.m_craftingStation = station.GetComponent <Piece>().m_craftingStation; // Recipes var nail = MockRequirement.Create("BronzeNails", 10, true); nail.FixReferences(); var newReqs = station.GetComponent <Piece>().m_resources.ToList(); newReqs.Add(nail); piece.m_resources = newReqs.ToArray(); return(piece); }