This tutorial is aimed for adding simple decorative slots. In the example I have used I will be adding 14 slots to a bookcase. Adding slots requires adding lines in the Resource Node (CRES), so I recommend reading The Resource Node (CRES) by Numenor for an explanation of the CRES structure. This is important if you want to add slots to a more complicated object or one with multiple nodes.
I am not going to retype a perfectly good explanation of what slots are, but instead link you to a very good overview. The Introduction to slots explains the different types of slots and how they function. The Working Slots is a bit more technical but explains how to create routable slots to an extended footprint. I highly recommend you read both of these prior to using the tutorial.
An Introduction to Slots by Numenor & Atavera – Of special interest – Post #13
Creating Working Slots for Extended Objects by fisheyes
The Object Data (OBJD) and the Slot File (SLOT) are connected via line 0x0014: slots id in the OBJD. This entry points to the Slot File (SLOT) Instance being used by that particular tile. In the case of a single tile object there is one OBJD and it points to the single SLOT. If you have multiple OBJDs then each one is going to point to a SLOT resource if it has routing or container slots. For container slots about the only difference to where you put your additional slots is where you want your entry point. With multi-tile objects the main OBJD does not need to have the slot link, but rather the OBJDs that are numbered and correspond to the footprint position.
The Text Lists (STR#) is linked to the SLOT and the CRES by the # and the String value. The # is the value in the I9 position in the SLOT and the String value is in the CRES cObjectGraphNode Filename box.
I start with the STR# because this is where I add the number of slots positions I want along with there name. If your adding lots of slots it would be useful to name them descriptively. I will be adding 2 slots for each of 7 shelves, so deco1L and deco1R, deco2L and deco2R, etc. This will help to know what values to add in when you get to the CRES, and to troubleshoot in game if your slot position is not where you intended. Make sure to leave any lines that are currently here, this will be any routing slots and existing container slots that are in use.
- Select Text Lists
- Select Model Bone Names
- Click Add – Enter Descriptive Name in String field – Repeat for each slot
- Click Commit
Here we need to add one line for each slot, so I will be adding 14 Container slots. This currently has just one Routing slot. The values here are somewhat of a mystery (at least for me). I’m not sure if even all of them have been identified, I certainly don’t know all of them. I get these values from an object that behaves how I want it to. For example, if I want this to behave like an end table, I clone an end table and write down the values I have there.
Some known values:
- F3 has to do with the weight allowed of an object
- I7 has to do with the type of object allowed on the surfaces – See Post #13 in link above
- I9 is the slot #
- I10 appears to be a counter of the order they are accessed in game
- Select Slot File in Resource Tree
- Select Slot in Resource List
- Select Container in drop down box
- Click Add
The values in the table on the left are entered in the boxes on the right. Looking at the table on the left, F1 on the left is Float 1 on the right. F4 is Float 4 which is on the Version 0x05+ tab, and you can see F5, F6 and I6 also is on this tab. S1 and S2 will be on the 0x06+ tab. Keep selecting the different tabs on the right to enter the different values. Note: My SimPE is not maximized to make it easier for screenshots, if you maximize you will see the whole table view on the left and not have to scroll.
- Select each Container slot
- Change values
- Repeat for each slot added
After adding all Container slots
< a name=”cres”>Resource Node (CRES).
Please note that the CRES, if done improperly, will crash your game. Select your CRES, then the Edit Blocks tab. Here we will add one cObjectGraphNode for each slot, a total of 14 for mine. You can easily find this resource by looking for the longest value in the drop down box. Write down the line number given for each one, you will need this later when adding the children to the main CRES node. Note: mine range from 0xC-0x19.
- Select the Resource Node (CRES) in the Resource Tree
- Select the CRES in the Resource List
- Select the Edit Blocks tab
- Select cObjectGraphNode
- Click Add
- Repeat last two steps for each slot you are adding
- Click Commit
You don’t need to commit after everything, but if you accidentally select another resource while working on the CRES you will lose your process. You also won’t see the lines added in your CRES Hierarchy until you commit, select another resource, then select the CRES again.
After adding the 14 cObjectGraphNode lines – note my 0xC – 0x19 line numbers
Adding the newly added lines to be the child:
Finding the right node to add your container slots to can be challenging. And this will also vary based on the object and how many tiles it occupies. This one is easy, it’s a single tile bookcase with a routing slot already there as a child. I have found that the Practical named node does tend to work well. Ignore the other Practical nodes in the pics, for some reason Maxis made all the shelves have a separate node. Now in theory, I would guess that this shelf could have the slots added to each node. But we are going to ignore that and go with the familiar.
We are going to add our container slots to the same node as the routing slot. Select the cTransformNode, look on the right side at the Child Nodes: box. Some values are already added here, these are the existing children. Select the last value and click add, change the value in Child Index to one larger. These values are in Hex and why I told you to write them down previously. I will be adding one line for each one I added in the Edit Block tab, 14 of them with the Child Index values starting at 0x0000000C and going to 0x00000019.
- Select the Node to add children to – in this it is 0x3: Practical – bookcase (cShapeRefNode)
- Select the cTransformNode tab
- In the Child Nodes box Select the last node
- Select Add
- Change the Child Index value to one more than what was there. This should be the same value you wrote down when adding the cObjectGraphNode.
- Repeat for each slot you have added
- Make sure you have one entry in the Child Nodes box for each cObjectGraphNode you added previously and that the numbers all match
- Click Commit
Note that the numbers after 0x in the Child Index box must be equal to 8. And make sure the Unknown 1 value is always 0x0001.
After all Child Nodes have been added
Select another resource, then select the CRES again. Select the CRES Hierarchy and you will see all of the lines you just added as children under your Practical node.
All Child Nodes properly linked
Names and Slot Positions:
Now we need to name our slots and define the x ,y, and z-axis locations. The name is what we entered back in the STR#, which you should have written down. If you didn’t you can still go back to the STR# and look at them, but make sure you commit any changes you have made in the CRES before going to another resource. While in the CRES Hierarcy tab you can select the line and it will jump to the details of that resource, so select the first cObjectGraphNode you added. The cTransformNode tab is where we enter the axis values and the cObjectGraphNode is where we enter the slot name.
Slot positioning of a node is relative to the parent node. This means your slot position is now how far the parent node. So if a parent node has an x-value of .32, and you want your new slot to be .5 from center you will enter .12 for the x-value.
- Select the first cObjectGraphNode you added in the Blocklist drop down box
- Select the cObjectGraphNode tab
- In the Filename box change this to the same as the first slot name in the STR# – in my case it is deco1L
- Select the cTransformNode tab
- Enter the values in the Translation box
- Repeat the last 5 steps for each cObjectGraphNode you added so that each one has a name and Translation values
- Click Commit
- x is left/right
- y is front/back
- z is top/bottom
Y and Z are transposed compared to your 3d editor. I always use Wings3d to determine the values I want. When you select a single vertice the top of the screen shows the x,y,z value. Milkshape also shows this but only when you hover over a vertice. Some of this is trial and error. But know that coffee table heights are .5, end tables are .8, and counters are 1.0. A single full tile in game is .5x.5 and a wall is 3.0 tall. The values we are entering will be how far and what direction from the center of a tile.
Example of Finding Vertice in Milkshape:
Hover over vertice (shown in large window on right), look at the bottom of screen (shows x, y, and z values)
After all values have been entered and you have Clicked Commit, select another Resource then select the CRES again. Then select the CRES Hierachy again. Now you will see all of your added cObjectGraphNode lines have a name and trans values. Save your package and test in game. Use the “M” key to cycle between slots in game. If one of them is not in the place you would like, you can easily find which one because you named them descriptively. Remember? 🙂 This is why mine are labeled as deco1L, deco1R, deco2L, deco2R, etc, each one represent which shelf and the L and R are for Left and Right respectively. Note that when testing slots, slot values are read by the game when the object is bought. So if you have to go back and modify your Translation values you will need to re-buy your object.
Object Data (OBJD)
If you have added a new SLOT resource to an object that had none or if you have extended the footprint and would like to have slots enter the object at each footprint then you need to link the new SLOT resource to the correct footprint.
- Select the SLOT resource
- Make note of the Instance number (will be 0x00000080(128) and up)
- Select OBJD
- Go to 0x0014: slots id and replace the current value with your SLOT Instance number
Tutorial by HugeLunatic. Please do NOT repost this tutorial anywhere in part or full.