Hi there! You are currently browsing as a guest. Why not create an account? Then you get less ads, can thank creators, post feedback, keep a list of your favourites, and more!
Inventor
Original Poster
#1 Old 27th Jun 2022 at 5:17 AM Last edited by echoweaver : 2nd Feb 2023 at 12:33 PM.
Default Tutorial: Sims 3 Custom Foods with CCLoader
Thanks to omedapixel for the screenshots!

This is a tutorial for creating a custom meal that your sim can cook, including a recipe book that can be purchased at the book store to learn it. It makes use of DouglasVeiga's brilliant utility CCLoader, which hands all the scripting bits so that you won't have to.

What you will be doing is cloning and altering objects using S3PE and s3oc, and you’ll be modifying a bunch of XML.

Note: You MUST have CCLoader installed in your game to use recipes made with this tutorial! https://modthesims.info/showthread....598#post4660598

Prologue: What food do you want?

Your first step is creative. I assume you came to this tutorial with a food in mind. What existing food in your game looks most like the food you want to add? Unless you have mad meshing skillz and want to build your own model, you’re going to want to retexture one of the existing foods in the game. This isn’t as bad as it sounds -- you can cover a lot of ground with cookies, peanut butter and jelly sandwiches, and spaghetti. Spaghetti is essentially a picture on top of a plate. You can use it for almost anything that is fairly flat.

There are five stages of preparing food. They are creatively named foodPrep, foodCook, foodBake, foodServe, and foodEat. Most foods don’t need all of foodPrep, foodCook, and foodBake. Recipes that can be cooked on an outdoor grill have a sixth state called foodCookEight.

The food stages don’t all have to be cloned from the same recipe. You can mix and match. Odds are you’ll want foodEat and foodServe from the same recipe. If you’re doing a grillable recipe, you’ll probably want foodCook and foodCookEight from the same place.

We’re going to postpone everything about the actual cooking and start with the two meshes every recipe needs: foodEat and foodServe.

Step 1: Find the recipe you want to clone

Once you’ve decided what game food you want to retexture, note the English name of the food.

Now open s3pe. Go to File->Open and navigate to GameData\Shared\Packages\FullBuild0.package. You should see several packages here with Build in the filename. You probably want to start with FullBuild0.package. It has most of the recipes, but there are others scattered through the other files. Failing there, your next best bet is DeltaBuild0.package.

Search for the English name of the recipe. You should see results that include foodEat[Foodname] and foodServe[Foodname] VPXY resources.



Now, in rare cases (more common in basegame foods), you might not find the recipe anywhere with this name search. I pulled my hair out trying to find foodServeHamburger, which turned out to have no name. The readable names are just for humans, you see. The game uses the InstanceID. The devs don’t actually have to make the name text field of the food states match anything in particular, but to their credit, they almost always match it to the InstanceID.
If your search turns up nothing in any of the build packages, try one final trick. Use DouglasVeiga's ModelInstanceKey generator, which is described in more detail below, to hash the instance key for the food state you want (i.e. “foodServeHamburger”) and search on that InstanceID.

Note: You have to hash an InstanceID on the *exact* food state name you want. Searching on a hash of, say, just “Hamburger”, isn’t going to get you instances that contain hamburger. I haven’t tested to see if it is case-sensitive (Hamburger vs. hamburger), but I’ve been making sure I match case when I use the instance key generator. Also, check your spelling .

Quote:
Also Note: You can also clone expansion foods from the appropriate [Expansion Name]\GameData\Shared\Packages\FullBuild package. However, the result must have a Group ID of 0 for base game, which requires a bit more attention during the RK replacement Step 3.


Once you’ve succeeded in this step, you have found VPXY resources for foodEat and foodServe for the food model you want to clone. You can proceed to…

Step 2: Clone your template food

You’re going to clone the food states into new objects using s3oc. The problem we have is that S3OC clones use OBJ resources, and you usually can’t actually find the OBJD or OBJK resources for foods. That’s why we’re using the VPXY resource. VPXY (I don’t know what, if anything, those letters stand for) is the connector resource. It has the key for the models and also the key(s) for the XML resources, which will have a different InstanceID.

So, using the VPXY, S3OC can find all the resources it needs to clone. But it’s looking for OBJ resources. We’re going to have to fake one to use.

Download Arsil's Dummy OBJ for Cloning Purposes

Double-click the VPXY for the food state you just found. Click "Copy RK."



Now open the dummy OBJ in s3pe. Right-click OBJK and select “Edit OBJK” on the popup menu.



This opens a window that lists optional resources that might be included in an OBJK resource. Click the “TGI Blocks…” button at the bottom



Click Add and then Paste RK. Save.



Now you’re back on the edit OBJK window. Check Model. The dropdown AssetResourceName will now be populated with info from that VPXY. Click the dropdown and select it. Save.



Now, select File->Save As… and give your dummy package a new name. A good option is “dummyFoodEatCookies” or whatever applies.

Do the same for all the other food states you want to clone.

Quote:
Note: You’re going to use the dummy obj package over and over again. You don’t want to overwrite it. Always use “Save As” and rename.


Now open S3OC and open your new “dummyFoodEatCookies” package. Click the OBJ, let it initialize tabs. Now click Clone and check Create Clone Package, Find Missing Resources, and Renumber/rename. Provide the ACTUAL name you want for this new food state, e.g. “foodEatSeaweedSalad”.



Do the same for all the other food states you’re cloning.

If you open your new foodEatSeaweedSalad (or whatever), you’ll see that you now have a complete object with model (MODL) and textures (_IMG). In fact, you probably have more stuff than you care about, like textures for the plate and a gray-and-black “burnt” texture that seems to show up in every package whether it’s even possible to burn the food. Some of this stuff may be all right to delete, but I'd wait until you have a functioning food before experimenting with that.

What you have here is a brand new food state that looks exactly like the game food state you started with. You also have no way to instantiate it in the game because S3OC generated a new InstanceID that the game has no way to reference.

Step 3: Give the recipe an identity S3OC gave the package resources unique and internally-consistent InstanceIDs, but the game needs specific IDs to be able to connect the name and the recipe to the models. We have to give these new food states the InstanceIDs that the game will be looking for.

The model InstanceID is a hash, but it's neither Hash64 nor Hash32, the ones that we're used to using in s3pe. To create the InstanceID you need, download DouglasVeiga’s Model Instance Key Generator.

This is just a simple Windows exe. Double-click to run it. It will open a terminal window. Type in the name of the new food state (e.g. foodEatSeaweedSalad). The output is your new InstanceID.



Open the package for your cloned food state in s3pe. Double-click the MODL resource. Select the Instance in the popup and copy it. Close the package and open it in s3oc. Now Select Tools->ResourceKey.



In the left-hand column of select criteria UNcheck “Instance”. Paste the InstanceID that you just copied into the text field. Now uncheck the “Instance” in the Replace column and copy-paste the ID generated by the Instance Key Generator. Click Replace. Save. Close.



Quote:
Note: If you have cloned an expansion model, you have to do some more finagling here. The cloned model will have the Group IDs of whichever expansion it came from. If you leave the GroupID this way, it will only work if you specify that expansion in the recipe xml. What you probably want is for the recipe to be base game. This has to be done in two steps, replacing both the InstanceID and the GroupID at the same time because there are two different GroupIDs involved.

The GroupID is calculated from the expansion number and is different for the MLOD and the MODL. Arsil explains in this post from the epic thread with dawg: https://modthesims.info/showthread....854#post4669854

That whole thread is recommended reading.
S3OC only replaces InstanceID references INSIDE resources. You have to go back to S3PE and manually change the IDs of the resources themselves. So, open the same back in S3PE AGAIN.

Click the Instance column header to source by instance. This groups all the resources together that have the same InstanceID. You want to change the MODL, VPXY, and MLOD if it exists.

Double-click each one, select the InstanceID, and paste the key from the Instance Key Generator in there too. Save and close.



Now you have individual packages representing a brand new food that knows its own name!

Step 4: Define the recipe with CCLoader

Here’s where CCLoader comes in. Creating a new food requires some scripting. DouglasVeiga kindly did all that for us. Get what you need here:

CCLoader

Download CCLoader and CCLoader_Generator and unzip them. CCLoader will have to be installed separately as a mod for your recipe to work. CCLoader_Generator is an exe you’ll run locally to produce files that CCLoader will need to do its scripting. You need to run CCLoader_Generator for EACH new recipe you create. You can’t reuse its output because it’s generating unique identifiers each time. Also, DON’T RENAME THESE FILES.

Note: CCLoader_Generator unzips with a folder called “base”. Leave base in the same folder as the generator, or it won’t work.

When you run the generator, you’ll get a S3SA script resource and a bunch of XML templates, not all of which you need for a recipe.



Since this is a tutorial for JUST recipes, you just need the index (the xml file that just has the CCL number), Books, and Recipes. You can delete the other XML resources. Make sure to keep the S3SA one!

You can also set a recipe to be learned automatically at a certain skill level. If you plan to do that, you don't need Books.xml either.

Quote:
NOTE: You need to install the CCLoader package in your game IN ADDITION to your new food package in order to use the food.


Step 4.1 Index File

Open the file that is just named with the unique identifier “.xml”. Delete the lines for the files you won’t be using (e.g. plants and ingredients).



Step 4.2: Book

Quote:
Do this if you want your recipe to be learned from a book purchased at the bookstore. If you want it to be auto-learned, skip this step.


Open the Books file in any old text editor, find the Recipe template, and copy-paste that recipe book template below the specified comment. Do NOT remove the blank XML template itself. Fill in the name of the recipe with no spaces as the Title and Recipe. Don’t worry about the spacelessness -- we’re going to define a different string to actually display in the game. Feel free to put your author info in there too, but I’m not sure it’s actually displayed in the game.



Several of these fields are for specialized situations, and if you have nothing to say, you can leave them out. AllowedWorlds, for example, is pretty much about vacation worlds. World Adventures had recipes that could only be purchased in specific vacation destinations. You probably won’t do something like this, and if you do, it’s not covered in this tutorial

The GeometryState values I know are BookMediumThin and BookMediumThick, but there are probably others to be found someplace. A single recipe sounds like a thin book to me.

Length is the number of time units that the sim will spend reading the book.

Value is the number of simoleons your sim will pay for the recipe at the bookstore.

MaterialState is the texture on the book. BookRecipe1 is the blue texture. There are others that you can find by exploring, but I’m not going to cover it here.

Thus, an example recipe book definition would be:

Code:
<BookRecipe>
  <Title>SeaweedSalad</Title>  <!-- MUST be unique -->
  <Author>Echo Weaver</Author>
  <Recipe>SeaweedSalad</Recipe>
  <Length>30</Length>
  <Value>125</Value>
  <GeometryState>BookMediumThin</GeometryState>
  <MaterialState>BookRecipe1</MaterialState>
</BookRecipe>


Step 4.3: Recipe

You’re going to need some game info to complete this part, so you’ll do better to just copy-paste the relevant recipe definition from the game and make the changes you need.

The models you cloned in Step 1 have something called geostates, which are different ways the model might be displayed. Examples would be full, half_full, used, burnt, etc. Unfortunately, these don’t really follow a consistent naming convention, so you don’t know what they would be called without looking them up. The geostates are described in the MODL resource, but only in hashed form. If there is a way to UNhash these IDs to get the text names back, I don’t know it. A lot of hashing algorithms are one-way.

The way to get the geostate names is to go find the game’s recipe definition for whatever you cloned them from. You get that from the recipe master list.

To look up existing XML recipe definitions:

Use S3PE to open C:\Program Files (x86)\Electronic Arts\The Sims 3\Game\Bin\Gameplay\GameplayData.package
Search for RecipeMasterList
Export RecipeMasterList to file

Now open the RecipeMasterList XML file and search for the name of the recipe you cloned the foodEat and foodServe models from in Step 1, e.g. Hamburger. You’ll find an XML definition of the recipe set inside <Data> tags.

Copy the <Data> tags and everything between them into your CCLoader-created Recipes file.

Now, you have the names of the geostates in all the correct places in the XML, and you can change the rest of the definition to suit your new recipe.

The geostates are in the form of foodModelName#geostate, e.g. foodEatMacAndCheese#halfFull. The cloned food names need to be replaced with your food name. If you are creating a recipe for Miso Soup cloned from Mac and Cheese, foodEatMacAndCheese#halfFull becomes foodEatMisoSoup#halfFull.

Now change the rest of the XML definition to match your recipe.

Various XML tags:
Recipe_Key, _Name, and _Class are all the same, and they match the Title/Recipe value in the book XML.

Level is the level of cooking skill the sim needs to learn the recipe.

Skill_Chunk is the number of skill advancement units the sim will gain toward their cooking skill when they cook this recipe.

Auto_Learn is whether you automatically learn the recipes when you get to the correct level of Cooking skill or if you have to read a recipe book. If your recipe is learned automatically, put an “x” value here, and you just wasted your time defining a recipe book in the section above!

Learnable is True. I’m not sure when it would ever not be true. You never have to bother to define this value unless you’re doing something with the recipe I don’t understand.

There are a bunch of self-explanatory yes/no fields that describe which meals it applies to, whether it can burn, etc. Specify yes with an x. You only need to include the ones you are setting to yes.

Utensil is spoon, fork, or hand. Chopsticks might also work, though that’s also a hidden sim trait, so you should look up a Shang Simla recipe to verify this if you want to use it.

Register and Venue Cost are the number of Simoleons a sim pays to buy a serving from a vendor.

I don’t know what Adult Only is, but it seems to be safe to ignore.

Ingredient_1, Ingredient_2, Ingredient_3 are the ingredients required to cook the recipe. There might be a case where an internal game name is different from the English name of an ingredient seen while playing, but so far every one I’ve tried has worked as expected.

If you cloned MacAndCheese to make MisoSoup, your final recipe definition might look like:

Code:
<Data>
  <Recipe_Key>MisoSoup</Recipe_Key>
  <Recipe_Name>MisoSoup</Recipe_Name>
  <Recipe_Description>MisoSoupDescription</Recipe_Description>
  <Recipe_Class>MisoSoup</Recipe_Class>
  <Level>4</Level>
  <Skill_Chunk>200</Skill_Chunk>
  <Can_Be_Favorite>x</Can_Be_Favorite>
  <Can_Burn>x</Can_Burn>
  <Can_Spoil>x</Can_Spoil>
  <Lunch>x</Lunch>
  <Dinner>x</Dinner>
  <Ingredient_1>Tofu</Ingredient_1>
  <Ingredient_2>Kelp</Ingredient_2>
  <Is_Vegetarian>x</Is_Vegetarian>
  <Create_In_Fridge>FoodTray</Create_In_Fridge>
  <Container_Type>Bowl</Container_Type>
  <Can_Make_Single>x</Can_Make_Single>
  <Can_Make_Group>x</Can_Make_Group>
  <Single_Full>foodEatMisoSoup#full</Single_Full>
  <Single_Half>foodEatMisoSoup#halfFull</Single_Half>
  <Single_Empty>foodEatMisoSoup#used:FoodUsed</Single_Empty>
  <Single_Full_Burnt>foodEatMisoSoup#full:Burnt</Single_Full_Burnt>
  <Single_Half_Burnt>foodEatMisoSoup#halfFull:Burnt</Single_Half_Burnt>
  <Single_Empty_Burnt>foodEatMisoSoup#used:BurntUsed</Single_Empty_Burnt>
  <Group_Full>foodServeMisoSoup#full</Group_Full>
  <Group_Half>foodServeMisoSoup#halfFull</Group_Half>
  <Group_Empty>foodServeMisoSoup#used:FoodUsed</Group_Empty>
  <Group_Full_Burnt>foodServeMisoSoup#full:Burnt</Group_Full_Burnt>
  <Group_Half_Burnt>foodServeMisoSoup#halfFull:Burnt</Group_Half_Burnt>
  <Group_Empty_Burnt>foodServeMisoSoup#used:BurntUsed</Group_Empty_Burnt>
  <Utensil>spoon</Utensil>
  <RegisterCost>10</RegisterCost>
  <VenueCost>10</VenueCost>
  <AdultOnly>10</AdultOnly>
 </Data>


Now Save and Close.

Step 5: Build a package for your food

Open S3PE and select File->New.

Drag into this new package the foodEat and foodServe packages you created. Then drag in the S3SA dll and all the XML files generated by CCLoader that you just completed.

Save into a package with the name of your food.

Congratulations! You have a recipe that you could load into your game and cook. The results would look exactly like the food you cloned, it would have a blank name, and the cutting board animation wouldn’t be appropriate, but it would work!

Step 6: Name your food for others to see

For the game to know what name to present to the user, you have to add a STBL resource. This just describes how to add strings for English, but more STBL resources can be added for other languages.

1. In s3pe, select menu item Resource->Add select STBL as Type
2. The name doesn’t matter, but it should be something meaningful. Group should be 0.
3. Click FNV64 to hash. Change the first 2 digits after the x to 00. Click OK.
Note: If I understand correctly, the first 2 digits are the language code, and 00 is English.
4. You now have a new blank STBL resource. Right-click it, select Edit STBL.
5. Paste Gameplay/Excel/RecipeMasterList/Data:[YourFoodName] into nameless field at bottom. Click Add. Click in the right-hand window, type the display name for the Recipe. Click Save.
6. Paste Gameplay/Excel/Books/BookRecipe:[YourFoodName] into nameless field at bottom. Click Add. This time provide the display name for the Recipe Book. It’ll probably be the same string. Click Save.

Now if you load the package into the game, you’ll be able to buy a correctly-named recipe book from the store, read it to learn a correctly-named recipe that requires the correct ingredients, can be cooked with a completely bonkers-looking cutting board, and will result in foods that look exactly like the stuff you cloned.

Quote:
Note: We have only provided an English STBL here. If you intend to make your food available for download, you will need to make sure it has a STBL resource the 15 other languages available in TS3. There are several modder utilities for adding STBL resources to your package that you might prefer to editing the STBL in s3pe. I'm not covering that here, but it should be easy to find a modder who can point you to them.


Step 7: Texture your food

For this, you need a graphics editor that can handle DDS files. This seems to be an industry-niche thing and hard to find. I use Photoshop Elements with a free downloaded DDS plugin. Gimp can handle DDSes. Before I had Photoshop Elements, I used some free downloadable DDS converters that weren’t great but would convert back and forth to a file format I could edit.

Here’s one I found online to convert jpg to dds. It seems to work all right if you don’t have better options: https://convertio.co/jpg-dds/

This isn’t a texturing tutorial, though. I’m sure there’s lots more detail on this subject to be found elsewhere.

I’ve found that texturing foods tends to come in two forms -- making small changes to the existing texture of a recipe with a complex model (e.g. hamburger, lobster thermador), or replacing the texture of a simple model (e.g. salad, spaghetti, soup). A lot of recipes are literally a picture on top of a plate or bowl. You can replace those textures with a top-down image of the food you want that you find on Google Images. On the other hand, I created a fish sandwich by taking a hamburger, coloring the beef with the breaded fish pattern from fish and chips, and coloring the cheese green (for kelp).

If you use a downloaded image from the internet, you’ll probably want to reduce the resolution, or you’ll end up with something disturbingly more detailed than the rest of the Sims world. Most food images are 64x64 pixels or 128x128, and that seems to work well.

In the package, find the _IMG files you want to texture. Right-click and export to file. Work your texturing magic on these files, then drag them back into the package using S3PE to replace the old images. You’ll likely have more than one copy of the same texture if foodEat, foodServe, and/or the other food states use the same texture. You’ll need to replace all of them.

Step 8: Define a Cooking Process

I left this until last because it could be its own tutorial, and I was dreading writing about it.

The cooking process is the XML definition of all those cute animations sims do while they are cooking something. The options for a cooking process are huge and daunting. There are dozens of different little food models specifically designed to go into any of a half-dozen slots on the cutting board. Sims can chop, shake, pinch, stir, and more. Foods can be boiled, fried, cooked in the oven, cooked on the grill, or some combination.

If there’s a comprehensive list of values to go in the cooking process XML, I don’t know it. The only way I know to learn is to browse through a bunch of cooking process definitions in the game. You can find examples of cooking processes by searching for the name of existing recipes in GameplayData.package as described in step 4.3.

You have three options for the Cooking Process:
1. Don’t provide a cooking process. The game will throw a default animation out there to get your food cooked. It might not match your food well, but it won’t look like a broken game.

2. Copy one from GameplayData. One bowl of batter looks very much like another. There may well be an existing definition that works just fine for your recipe.

3. Build your own custom process. Down the rabbithole, darling. FWIW, I find them kind of crazily satisfying.

For options 2 and 3, the easy part is creating the blank resource:

Select Resource->Add
Select _XML 0x0333406C as the Type
Group is 0
The name MUST BE the class name of your recipe. Click FNV64 to hash it.
Click OK.

Cooking processes reference models and geostates for other stages of cooking. This is where foodPrep, foodBake, foodCook, etc. come in. You can reference existing ones from other recipes, or you can clone/texture your own using Steps 1, 2, and 3 of ths tutorial. Note that while foodPrep and foodCook often only use the texture as bowl or saucepan contents, I haven’t found a way to JUST add the texture without going through cloning the whole object. YMMV.

This is the last step. Once you have provided a cooking process XML resource, your package should have everything it needs to be a fully-realized recipe and food.

Step 9: Checklist

In addition to your package, you MUST INSTALL the CCLoader package for your recipe to work.

A completed package containing a custom food recipe should contain:
  1. foodEat and foodServe models at the very least
  2. foodPrep, foodCook, foodBake models as appropriate
  3. Replacement textures for Eat, Serve, and anything else that needs texturing
  4. InstanceIDs generated with DouglasVeiga’s Model Instance Key Generator
  5. STBL resource with strings to name the recipe and the recipe book
  6. CCLoader-generated S3SA dll
  7. CCLoader-generated XML file index
  8. CCLoader-generated Recipes
  9. CCLoader-generated Books
  10. Cooking process XML resource

Now poor yourself a drink. You’ve earned it.

Epilogue 1: Supplemental reading

If you haven’t suffocated under this novel-length tutorial, you could read a whole lot more.

This thread, Toward Custom Foods, breaks down a lot more technical details that I glossed over, such as modeling and geostates. https://modthesims.info/showthread.php?t=474083

DouglasVeiga’s CCLoader thread: https://modthesims.info/showthread.php?p=4660598. This contains links to other threads on the subject.

CCLoader creation thread: https://modthesims.info/showthread.php?t=567081

Cooking functional birthday and wedding cakes with Icarus_Allsorts’s Cook With Any Ingredient mod: https://modthesims.info/showthread....363#post4941363

Epilogue 2: Example Cooking Process

Note: There are a lot of empty tags that need to stay in the definition. The good news is that it gives you a decent idea of the options you have.

Code:
<?xml version="1.0"?>
<EWFishSandwich>
<CookingProcess>
  <Cooking_Processes></Cooking_Processes>
  <Supported_Processes></Supported_Processes>
  <Step_1></Step_1>
  <Step_2></Step_2>
  <Step_3></Step_3>
  <Step_4></Step_4>
  <Step_5></Step_5>
  <Load_Models></Load_Models>
  <Load_Pot_Materials></Load_Pot_Materials>
  <Load_Large_Bowl_Material></Load_Large_Bowl_Material>
  <Load_All_Large_Bowl_Materials></Load_All_Large_Bowl_Materials>
  <Load_Grill_Models></Load_Grill_Models>
  <Load_PlateServing_Model></Load_PlateServing_Model>
  <Models></Models>
  <Pot_Materials></Pot_Materials>
  <Large_Bowl_Material></Large_Bowl_Material>
  <Large_Bowl_Materials></Large_Bowl_Materials>
  <Grill_Models></Grill_Models>
  <PlateServing_Model></PlateServing_Model>
 </CookingProcess>
<CookingProcess>
  <Cooking_Processes>No Prep</Cooking_Processes>
  <Step_1>Done</Step_1>
  <Load_Models>x</Load_Models>
  <Load_Grill_Models>x</Load_Grill_Models>
  <Models>FoodCookFishAndChips#foodUncooked, FoodCookFishAndChips#foodCooked:FoodCooked, FoodCookFishAndChips#foodCooked:Burnt</Models>
  <Pot_Materials>potMaterialsUncooked, potMaterialsCooked, potMaterialsBurnt,</Pot_Materials>
  <Large_Bowl_Material>foodPrepFruitParfait</Large_Bowl_Material>
  <Large_Bowl_Materials>bowlMaterialUncooked, bowlMaterialCooked, bowlMaterialBurnt</Large_Bowl_Materials>
  <Grill_Models>foodCookEightFishAndChips, foodCookEightFishAndChips:FoodCooked, foodCookEightFishAndChips:Burnt, FoodCookFishAndChips#foodUncooked</Grill_Models>
  <PlateServing_Model>foodPrepHotDogs:Default</PlateServing_Model>
 </CookingProcess>
<CookingProcess>
  <Cooking_Processes>Grill</Cooking_Processes>
  <Supported_Processes>x</Supported_Processes>
  <Step_1>Cutting_Board</Step_1>
  <Step_2>Food_Tray</Step_2>
  <Step_3>Grill</Step_3>
  <Step_4>Done</Step_4>
 </CookingProcess>
<CookingProcess>
  <Cooking_Processes>Bake</Cooking_Processes>
  <Step_1>Cutting_Board</Step_1>
  <Step_2>Baking_Dish</Step_2>
  <Step_3>In_Oven</Step_3>
  <Step_4>Done</Step_4>
 </CookingProcess>
<CookingProcess>
  <Cooking_Processes>Just Cutting Board</Cooking_Processes>
  <Step_1>Cutting_Board</Step_1>
  <Step_2>Done</Step_2>
 </CookingProcess>
<CookingProcess>
  <Cooking_Processes>Fry/Broil</Cooking_Processes>
  <Step_1>Cutting_Board</Step_1>
  <Step_2>Frying_Pan</Step_2>
  <Step_3>Stove_And_Oven</Step_3>
  <Step_4>Done</Step_4>
 </CookingProcess>
<CookingProcess>
  <Cooking_Processes>Fry</Cooking_Processes>
  <Supported_Processes>x</Supported_Processes>
  <Step_1>Cutting_Board</Step_1>
  <Step_2>Frying_Pan</Step_2>
  <Step_3>On_Stove</Step_3>
  <Step_4>Done</Step_4>
 </CookingProcess>
<CookingProcess>
  <Cooking_Processes>Mix, Fry/Broil</Cooking_Processes>
  <Step_1>Cutting_Board</Step_1>
  <Step_2>Stir_In_Bowl</Step_2>
  <Step_3>Frying_Pan</Step_3>
  <Step_4>Stove_And_Oven</Step_4>
  <Step_5>Done</Step_5>
 </CookingProcess>
<CookingProcess>
  <Cooking_Processes>Mix, Fry</Cooking_Processes>
  <Step_1>Cutting_Board</Step_1>
  <Step_2>Stir_In_Bowl</Step_2>
  <Step_3>Frying_Pan</Step_3>
  <Step_4>On_Stove</Step_4>
  <Step_5>Done</Step_5>
 </CookingProcess>
<CookingProcess>
  <Cooking_Processes>Mix, Bake</Cooking_Processes>
  <Step_1>Cutting_Board</Step_1>
  <Step_2>Stir_In_Bowl</Step_2>
  <Step_3>Baking_Dish</Step_3>
  <Step_4>In_Oven</Step_4>
  <Step_5>Done</Step_5>
 </CookingProcess>
<CookingProcess>
  <Cooking_Processes>Cook in Pot</Cooking_Processes>
  <Step_1>Cutting_Board</Step_1>
  <Step_2>Stir_In_Bowl</Step_2>
  <Step_3>Pot</Step_3>
  <Step_4>On_Stove</Step_4>
  <Step_5>Done</Step_5>
 </CookingProcess>
<CookingProcess>
  <Cooking_Processes>Just Mix in Big Bowl</Cooking_Processes>
  <Step_1>Cutting_Board</Step_1>
  <Step_2>Stir_In_Bowl</Step_2>
  <Step_3>Done</Step_3>
 </CookingProcess>
<CookingProcess>
  <Cooking_Processes>Microwave</Cooking_Processes>
  <Step_1>Microwave</Step_1>
  <Step_2>Done</Step_2>
 </CookingProcess>
<CookingProcess>
  <Cooking_Processes>Microwave in Big Bowl</Cooking_Processes>
  <Step_1>Cutting_Board</Step_1>
  <Step_2>Stir_In_Bowl</Step_2>
  <Step_3>Microwave</Step_3>
  <Step_4>Done</Step_4>
 </CookingProcess>
<CookingProcess>
  <Cooking_Processes>Microwave on Plate</Cooking_Processes>
  <Step_1>Cutting_Board</Step_1>
  <Step_2>Plate_Serving</Step_2>
  <Step_3>Microwave</Step_3>
  <Step_4>Done</Step_4>
 </CookingProcess>
<FoodTray>
  <Slot_0></Slot_0>
  <Slot_1></Slot_1>
  <Slot_2></Slot_2>
  <Slot_3></Slot_3>
  <Slot_4></Slot_4>
  <Slot_5></Slot_5>
  <Slot_6></Slot_6>
  <Slot_7></Slot_7>
  <Slot_8></Slot_8>
  <Slot_9></Slot_9>
  <Slot_10></Slot_10>
 </FoodTray>
<FoodTray>
  <Slot_0>fishFilletCod</Slot_0>
  <Slot_4>bowlGarnish:FoodBowlBreadCrumbs</Slot_4>
  <Slot_8>sprigParsley</Slot_8>
  <Slot_9>butter#butterWhole</Slot_9>
 </FoodTray>
<CuttingBoard>
  <Num_Loops></Num_Loops>
  <Chop_Loop></Chop_Loop>
  <Crack_Egg></Crack_Egg>
  <Spread_Loop></Spread_Loop>
  <Stuff></Stuff>
  <Pour_Carton></Pour_Carton>
  <Pour_Box></Pour_Box>
  <Take_Pat_Place></Take_Pat_Place>
  <Hand_Top_To_Bottom></Hand_Top_To_Bottom>
  <Hand_Top_Right_To_Bottom></Hand_Top_Right_To_Bottom>
  <Shake_Spice></Shake_Spice>
  <Pinch_Spice></Pinch_Spice>
  <Pour_Whipped_Cream_Loop></Pour_Whipped_Cream_Loop>
  <Chop_Slot></Chop_Slot>
  <PickUp_Bottom_Slot></PickUp_Bottom_Slot>
  <Stuff_Slot></Stuff_Slot>
  <Bowl_Slot></Bowl_Slot>
  <Jar_Slot></Jar_Slot>
  <Grab_LowerLeft_Slot></Grab_LowerLeft_Slot>
  <Put_LowerRight_Slot></Put_LowerRight_Slot>
  <Grab_UpperMiddle_Slot></Grab_UpperMiddle_Slot>
  <Grab_UpperRight_Slot></Grab_UpperRight_Slot>
  <Box_Slot></Box_Slot>
  <Carton_Slot></Carton_Slot>
  <Deco_1></Deco_1>
  <Deco_2></Deco_2>
  <Deco_3></Deco_3>
  <Deco_4></Deco_4>
  <Deco_5></Deco_5>
  <Deco_6></Deco_6>
  <Deco_7></Deco_7>
 </CuttingBoard>
<CuttingBoard>
  <Num_Loops>1</Num_Loops>
  <Crack_Egg>x</Crack_Egg>
  <Chop_Slot>sprigParsley</Chop_Slot>
  <Bowl_Slot>bowlGarnish:FoodBowlBreadCrumbs</Bowl_Slot>
  <Grab_LowerLeft_Slot>fishFilletCod</Grab_LowerLeft_Slot>
  <Carton_Slot>oil</Carton_Slot>
  <Deco_2>lime#limesWhole</Deco_2>
  <Deco_3>butter#butterWhole</Deco_3>
  <Deco_5>foodPrepHamburgerBunsPile</Deco_5>
 </CuttingBoard>
<CuttingBoard>
  <Num_Loops>2</Num_Loops>
  <Chop_Loop>x</Chop_Loop>
  <Pinch_Spice>x</Pinch_Spice>
  <Chop_Slot>sprigParsley</Chop_Slot>
  <Bowl_Slot>bowlGarnish:FoodBowlBreadCrumbs</Bowl_Slot>
  <Put_LowerRight_Slot>fishFilletCod</Put_LowerRight_Slot>
  <Carton_Slot>oil</Carton_Slot>
  <Deco_2>lime#limesWhole</Deco_2>
  <Deco_3>butter#butterWhole</Deco_3>
  <Deco_5>foodPrepHamburgerBunsPile</Deco_5>
 </CuttingBoard>
<CuttingBoard>
  <Num_Loops>2</Num_Loops>
  <Chop_Loop>x</Chop_Loop>
  <Shake_Spice>x</Shake_Spice>
  <Chop_Slot>sprigParsley</Chop_Slot>
  <Stuff_Slot>fishFilletCod</Stuff_Slot>
  <Bowl_Slot>bowlGarnish:FoodBowlBreadCrumbs</Bowl_Slot>
  <Carton_Slot>oil</Carton_Slot>
  <Deco_2>lime#limesHalf</Deco_2>
  <Deco_3>butter#butterWhole</Deco_3>
  <Deco_5>foodPrepHamburgerBunsPile</Deco_5>
 </CuttingBoard>
 <CuttingBoard>
  <Num_Loops>2</Num_Loops>
  <Pinch_Spice>x</Pinch_Spice>
  <Chop_Slot>sprigParsley</Chop_Slot>
  <Stuff_Slot>fishFilletCod</Stuff_Slot>
  <Bowl_Slot>bowlGarnish:FoodBowlBreadCrumbs</Bowl_Slot>
  <Carton_Slot>oil</Carton_Slot>
  <Deco_2>lime#limesHalf</Deco_2>
  <Deco_3>butter#butterWhole</Deco_3>
  <Deco_5>foodPrepHamburgerBunsPile</Deco_5>
 </CuttingBoard>
<CuttingBoard>
  <Num_Loops>2</Num_Loops>
  <Pour_Carton>x</Pour_Carton>
  <Chop_Slot>sprigParsley</Chop_Slot>
  <Bowl_Slot>bowlGarnish:FoodBowlBreadCrumbs</Bowl_Slot>
  <Stuff_Slot>fishFilletCod</Stuff_Slot>
  <Carton_Slot>oil</Carton_Slot>
  <Deco_2>lime#limesHalf</Deco_2>
  <Deco_3>butter#butterHalf</Deco_3>
  <Deco_5>foodPrepHamburgerBunsPile</Deco_5>
 </CuttingBoard>
<CuttingBoard>
  <Num_Loops>2</Num_Loops>
  <Pinch_Spice>x</Pinch_Spice>
  <Chop_Slot>sprigParsley</Chop_Slot>
  <Pinch_Spice>x</Pinch_Spice>
  <Stuff_Slot>FoodCookFishAndChips#foodUncooked</Stuff_Slot>
  <Bowl_Slot>bowlGarnish:FoodBowlBreadCrumbs</Bowl_Slot>
  <Carton_Slot>oil</Carton_Slot>
  <Deco_2>lime#limesHalf</Deco_2>
  <Deco_3>butter#butterHalf</Deco_3>
  <Deco_5>foodPrepHamburgerBunsPile</Deco_5>
 </CuttingBoard>
<CuttingBoard>
 </CuttingBoard>
</EWFishSandwich>

Echo Weaver's Simblr: http://echoweaver.tumblr.com/
A portrait in stubbornness - Playing the same legacy since 2009
Sample a Brave Legacy: http://sims3sample.illation.net
1 users say thanks for this. (Who?)
Advertisement
Forum Resident
#2 Old 27th Jun 2022 at 2:43 PM
Bookmarking this for later when I finally get around to bringing some of my national foods into the game! Thank you!
Field Researcher
#3 Old 27th Jun 2022 at 3:38 PM
Thanks for this tutorial! I have always wanted to create my own recipes.
Inventor
Original Poster
#4 Old 27th Jun 2022 at 5:31 PM
I'm so glad it's helpful! I wrote it a while ago and posted it for feedback. In theory, this tutorial is now complete and can be moved by the admins.

I just went back to create a simple recipe (scrambled eggs) that I wanted to use in order to eat the eggs on my farm without needing any other ingredients. It worked on the first try! So at least I can figure out my own explanations

Echo Weaver's Simblr: http://echoweaver.tumblr.com/
A portrait in stubbornness - Playing the same legacy since 2009
Sample a Brave Legacy: http://sims3sample.illation.net
Test Subject
#5 Old 23rd Jul 2022 at 10:28 PM
Thank you so much for the tutorial! The sims 3 custom food scene is pretty dead compared to the sims 2 or 4, and if you can't find the pie you want at the store you have to make it yourself, in this case the metaphor is quite literal.
Forum Resident
#6 Old 24th Jul 2022 at 8:00 PM
Bookmarking as well, what a great resource with detailed steps, thank you Echo Weaver!
Test Subject
#7 Old 27th Jul 2022 at 2:08 PM
Thank you! Custom foods is one of the things I really miss in the sims 3
Test Subject
#8 Old 27th Jul 2022 at 9:47 PM
Can we edit the texture for the plate so that different foods can have different plates?
Inventor
Original Poster
#9 Old 3rd Aug 2022 at 4:48 PM
Quote: Originally posted by RebeckaGabriella
Can we edit the texture for the plate so that different foods can have different plates?


I don't think this can be done with a recipe. It might be possible. When I deep-clone a recipe, I often get the plate texture with it, but that doesn't necessarily mean that the recipe will use that texture when you make it.

Echo Weaver's Simblr: http://echoweaver.tumblr.com/
A portrait in stubbornness - Playing the same legacy since 2009
Sample a Brave Legacy: http://sims3sample.illation.net
Lab Assistant
#10 Old 7th Aug 2022 at 12:04 PM
Thank you sooooo much I have been waiting for something like this for a long time! I have wanted to make custom recipes since I started play 2 a long time ago. you have just made my year. I was in the middle of make a fast-food set but they were going to be morsels... but I'm gonna take a stab at the real deal now! thanks to you! you are my simmer of the year!
Inventor
Original Poster
#11 Old 24th Aug 2022 at 8:27 PM
Addendum: The instructions I have for replacing the instance ID of the cloned food in Step 3 only works for cloning BASE GAME foods. If you clone a food from an expansion or store item, you also have to replace the group ID with the relevant group ID for base game. The process for how to do this is wrapped up in the epic custom cannabis thread between dawg and Arsil. I'm going to need to review it before adding those instructions to my tutorial.

Echo Weaver's Simblr: http://echoweaver.tumblr.com/
A portrait in stubbornness - Playing the same legacy since 2009
Sample a Brave Legacy: http://sims3sample.illation.net
Inventor
Original Poster
#12 Old 7th Feb 2023 at 8:55 PM
Updated the tutorial to include screenshots snapped by @omedapixel.

Echo Weaver's Simblr: http://echoweaver.tumblr.com/
A portrait in stubbornness - Playing the same legacy since 2009
Sample a Brave Legacy: http://sims3sample.illation.net
Inventor
Original Poster
#13 Old 24th Aug 2023 at 1:48 AM Last edited by echoweaver : 14th Sep 2023 at 3:02 AM.
Tutorial Addendum: Making custom cakes with Custom Cake Connector
You need:
1. CCLoader
2. CustomCakeConnector
3. A package with your custom cake

Your custom cake:
Clone a cake -- For a birthday cake, you need to clone a birthday cake, and for a wedding cake the same. This is because the geostates for full, half eaten, empty, and candles (for birthday) are not the same at all.

Clone a slice. This can be any cake slice, or even any recipe food you like. Just make sure the Single_Full, Single_Half, and Single_Empty geostates match the names of the geostates in the food you clone.

Create a CCLoader recipe for the cake slice. For a buy-only cake, this recipe is very simple. It just needs to match the cake slice recipe in RecipeMasterList. This includes the naming and instance ID replacement in Step 3 of the general CCLoader tutorial above. Keep in mind that this recipe is for the slice, not the cake object. The birthday/wedding cake generates the serving from this recipe when your sim grabs a slice -- that's why the slice of a retextured birthday cake looks like the original object.

Code:
<Data>
  <Recipe_Key>Cake Slice</Recipe_Key>
  <Recipe_Name>CakeSlice</Recipe_Name>
  <Level>0</Level>
  <Skill_Chunk>0</Skill_Chunk>
  <Learnable>False</Learnable>
  <Can_Spoil>x</Can_Spoil>
  <Dessert>x</Dessert>
  <Is_Vegetarian>x</Is_Vegetarian>
  <Create_In_Fridge>FoodTray</Create_In_Fridge>
  <Container_Type>Plate</Container_Type>
  <Can_Make_Single>x</Can_Make_Single>
  <Single_Full>foodEatBirthdayCake#foodFull</Single_Full>
  <Single_Half>foodEatBirthdayCake#foodHalfFull</Single_Half>
  <Single_Empty>foodEatBirthdayCake#foodUsed:FoodUsed</Single_Empty>
  <Utensil>spoon</Utensil>
  <VenueCost>8</VenueCost>
 </Data>


A wedding cake slice is:

Code:
 <Data>
  <Recipe_Key>Wedding Cake Slice</Recipe_Key>
  <Recipe_Name>WeddingCakeSlice</Recipe_Name>
  <ModelCodeVersion>EP4</ModelCodeVersion>
  <Level>0</Level>
  <Skill_Chunk>0</Skill_Chunk>
  <Learnable>False</Learnable>
  <Can_Spoil>x</Can_Spoil>
  <Dessert>x</Dessert>
  <Is_Vegetarian>x</Is_Vegetarian>
  <Create_In_Fridge>FoodTray</Create_In_Fridge>
  <Container_Type>Plate</Container_Type>
  <Can_Make_Single>x</Can_Make_Single>
  <Single_Full>foodEatCakeWeddingTraditional#full;EP4</Single_Full>
  <Single_Half>foodEatCakeWeddingTraditional#half;EP4</Single_Half>
  <Single_Empty>foodEatCakeWeddingTraditional#used;EP4</Single_Empty>
  <Utensil>spoon</Utensil>
  <VenueCost>8</VenueCost>
 </Data>


Note that the wedding cake slice is tagged for EP4. This brings up the next issue, which is that you really want these recipes to be base game compatible (i.e. groups 1 and 0). To accomplish this, you can clone a store wedding cake if you want to. If you clone the Generations wedding cake, you'll need to two instance-group replacements. The VPXY and MODL resources of your cloned cake will have a group that ends in 1, and the MLOD resource (if there is one) will have a group that ends in 0. You will need to go through both ID replacement steps for oldinstance-old0group to newinstance-0 and oldinstane-old1group to newinstance-1.

Find the OBJK resource of your cloned cake. Click it, right click, and click "Edit OBJK". Change the String value to one of the three custom cake classes in CustomCakeConnector:
- Sims3.Gameplay.Objects.CookingObjects.CustomCake.CustomWeddingCake
- Sims3.Gameplay.Objects.CookingObjects.CustomCake.CustomBirthdayCake
- Sims3.Gameplay.Objects.CookingObjects.CustomCake.CustomNonBirthdayCake


Find the OBJD resource of your cloned cake. Click it and then click Grid. Change the Instance Name to the recipe key of the recipe you just created.


Making a bakeable cake:

Note that this is a summary. I expect to provide more detail and some screenshots.

Start with a buyable cake using the steps above. It's worth making that and testing it to be sure you have that part right.

Update recipe with group serving. You don't need a new recipe. Note the fullNoCandles geostate for birthday cakes. The square store cake doesn't have one, but it's added in the two custom cakes here.

Use the Harvestable_Name tag in the recipe XML to indicate that this is a recipe from Custom Cake Connector.

<Data>
<Recipe_Key>EWCarrotCake</Recipe_Key>
<Recipe_Name>EWCarrotCake</Recipe_Name>
<Recipe_Class>EWCarrotCake</Recipe_Class>
<Harvestable_Name>CakeConnector</Harvestable_Name>
<Level>2</Level>
<Skill_Chunk>250</Skill_Chunk>
<Ingredient_1>Egg</Ingredient_1>
<Ingredient_2>Carrot</Ingredient_2>
<Ingredient_3>Pecan</Ingredient_3>
<Can_Spoil>x</Can_Spoil>
<Dessert>x</Dessert>
<Is_Vegetarian>x</Is_Vegetarian>
<Create_In_Fridge>FoodTray</Create_In_Fridge>
<Container_Type>Plate</Container_Type>
<Can_Make_Single>x</Can_Make_Single>
<Can_Make_Group>x</Can_Make_Group>
<Single_Full>EWCarrotCakeSlice#foodFull</Single_Full>
<Single_Half>EWCarrotCakeSlice#foodHalfFull</Single_Half>
<Single_Empty>EWCarrotCakeSlice#foodUsed:FoodUsed</Single_Empty>
<Group_Full>foodServeEWCarrotCake#foodFullNoCandles</Group_Full>
<Group_Half>foodServeEWCarrotCake#halfFull</Group_Half>
<Group_Empty>foodServeEWCarrotCake#used</Group_Empty>
<Group_Full_Burnt>foodServeEWCarrotCake#foodFullNoCandles:Burnt</Group_Full_Burnt>
<Group_Half_Burnt>foodServeEWCarrotCake#halfFull:Burnt</Group_Half_Burnt>
<Group_Empty_Burnt>foodServeEWCarrotCake#used:Burnt</Group_Empty_Burnt>
<Utensil>spoon</Utensil>
<VenueCost>8</VenueCost>
</Data>

Do ID replacement for MODL/VPXY of the cake object itself

Create an NGMP resource to connect the key of the recipe to the instance ID of the cake Objects

Add book if applicable. If you don't want to have to purchase a book, you can add <Auto_Learn>x</Auto_Learn> to the recipe definition instead.

If you deleted the books xml from the generated CCLoader files, you don't have to regenerate to add it. There's no magic in the way CCLoader looks for xml files.

Add to CCLxxx.dll _XML resource, where xxx is the number generated by CCLoaderGenerator:
<Books_XML>CCLxxx_Books.xml</Books_XML>

Then create a new _XML 0x0333406C resource with group 0, set the name to CCLxxx_Books.xml, and click FNV64 to has the instance ID. Then you can copy XML into the resource from any other CCLoader recipe you have and replace the BookRecipe data with the info for your recipe.

It would look something like this:
<BookRecipe>
<Title>EWCarrotCake</Title> <!-- MUST be unique -->
<Author>Echo Weaver</Author>
<Recipe>EWCarrotCake</Recipe>
<Length>30</Length>
<Value>50</Value>
<PagesMinNorm>1</PagesMinNorm>
<PagesMinBW>2</PagesMinBW>
<GeometryState>BookMediumThin</GeometryState>
<MaterialState>BookRecipe1</MaterialState>
</BookRecipe>

The Skill_Chunk (Amount of improvement cooking the recipe will add to your skill) and Value (Cost of the book in simoleons) settings follow a pretty straightforward scale as the skill level of the recipe. I like to try to make these match. You can look in the RecipeMasterList to see Skill Chunks.

Standard info from CCLoader tutorial for CookingProcess. If you don't want to provide one, you can set <Recipe_Class>SomeExistingRecipeKey</Recipe_Class> to make the cooking process match an existing EA recipe.

Don't forget STBLs!

If you're adding a book, you'll need
Gameplay/Excel/Books/BookRecipe:YourRecipeKey
Gameplay/Excel/RecipeMasterList/Data:YourRecipeKey
Gameplay/Excel/RecipeMasterList/Data:RecipeKeyForYourSlice
Screenshots

Echo Weaver's Simblr: http://echoweaver.tumblr.com/
A portrait in stubbornness - Playing the same legacy since 2009
Sample a Brave Legacy: http://sims3sample.illation.net
Lab Assistant
#14 Old 4th Dec 2023 at 1:49 AM
Thank you so much for this tutorial! I'm trying to make my very first custom food right now!
Inventor
Original Poster
#15 Old 4th Dec 2023 at 2:53 PM
Quote: Originally posted by tamalinn
Thank you so much for this tutorial! I'm trying to make my very first custom food right now!


Wonderful! If you're confused, please ask questions here. I'm monitoring this thread, and there are other custom recipe experts who hang out on MTS.

Echo Weaver's Simblr: http://echoweaver.tumblr.com/
A portrait in stubbornness - Playing the same legacy since 2009
Sample a Brave Legacy: http://sims3sample.illation.net
Lab Assistant
#16 Old 5th Dec 2023 at 3:27 AM
Thank you! The tutorial is really easy to follow, but I think I messed something up with the images. Instead of latkes with dollops of sour cream and apple sauce, my sim made dark brown pancakes with pats of dark brown butter and a dark brown blob on the side. :-/ She applauded after eating them, though, so at least the flavor came out right, haha.
Back to top