示例#1
0
        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);
        }
示例#2
0
        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);
        }
示例#4
0
        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);
        }
示例#5
0
        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);
        }
示例#6
0
        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);
        }
示例#7
0
        // 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);
            }
        }
示例#8
0
        /*
         * 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"];
        }
示例#10
0
        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();
        }
示例#11
0
        // 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);
        }
示例#12
0
        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);
            }
        }
示例#13
0
        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);
        }
示例#14
0
        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);
        }
示例#15
0
        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);
            }
        }
示例#16
0
        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);
            }
        }
示例#17
0
        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);
        }