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!
Quick Reply
Search this Thread
Forum Resident
Original Poster
#26 Old 14th Nov 2011 at 8:31 PM
Alright, so using TSRW when I edit or duplicate the slots for the seats, what I did above was incorrect, right? I am referring to this:


If so, what do I do to duplicate/edit the slots? Do I just not edit the bone hash? Or is there a specific code I have to place in there? Also, with the New Name, is there a specific name I need to add for that?

Sorry for asking really simple questions on this.
Advertisement
Forum Resident
#27 Old 14th Nov 2011 at 10:21 PM
If your editing the seat slots, I would keep the default name and bone hash. Otherwise, like previously mentioned, the game will get lost and it won't work.


Facebook | Currently On Hiatus | Twitter
Current Works-In-Progress: 0
Future Car | 2012 EA Cars | Car Parts | Jet Plane | Telephone Table | Concept Car
Traditional Bed Set | Living Set | 82 Slate Roofs | 1/2-Tile Kitchen Set | Distant Terrains | Kids Bedroom
Forum Resident
Original Poster
#28 Old 14th Nov 2011 at 11:27 PM
I did exactly what Morphead said and have some good/bad results.

The good results is that the sims can use the hot tub now and the seats without having any error.

The bad news is that the duplicate seats are really messed up.

First, the two sims are merging together when the seat is taken (ignore the floor cutout. I forgot to change that.)


Second, if I click on an empty seat, I sometimes get a "Seat Taken" error.


I left the routing and seating completely unmodified as shown below:

Slot window:


Route window:



I am assuming that for the duplicate slots that I need to change the name of it to give it a new hash but keep the bone hash unmodified. Is this correct?
One horse disagreer of the Apocalypse
#29 Old 14th Nov 2011 at 11:44 PM
No if you are making *new* slots (duplicating a slot is the same as making a new one) then they need unique bone names. What you shouldn't do is change the name of existing ones.

"You can do refraction by raymarching through the depth buffer" (c. Reddeyfish 2017)
Forum Resident
Original Poster
#30 Old 15th Nov 2011 at 12:10 AM
Oh, okay, thanks Inge. Sorry about the whole mixup.

Okay, so when making unique bone names, how do I go about doing that? I am assuming the 0x00000000 name isn't what I should use for this.

When you say Bone Name, you do not mean the bone hash, correct? You mean the Bone Name area next to the bone hash?


Sorry, I just want to double check.
Forum Resident
#31 Old 15th Nov 2011 at 3:46 AM
I think your best bet in adding new slots, without the waterfall is to make a new script. If the script is similar to other scripts it should be probably one of the easiest things for a new person to do. As it requires a number change and adding two lines I'll look into it though.


Facebook | Currently On Hiatus | Twitter
Current Works-In-Progress: 0
Future Car | 2012 EA Cars | Car Parts | Jet Plane | Telephone Table | Concept Car
Traditional Bed Set | Living Set | 82 Slate Roofs | 1/2-Tile Kitchen Set | Distant Terrains | Kids Bedroom
Forum Resident
Original Poster
#32 Old 15th Nov 2011 at 6:34 AM
Thank you so much, Morphead!

Do you mind helping me through making the script? I'm sorry for asking a lot, but I'm really hoping to get this working.
˙uʍop ǝpᴉsdn ǝɹ,noʎ 'oN
#33 Old 15th Nov 2011 at 7:17 AM
Quote: Originally posted by cmomoney
Your own script class derived from the grotto that changes the 'JetFXName' and 'JetFXNameUpgradedName' to that of the 4-seater would work, and still keep the six seats.


This would be even easier as you would only change two words.

"Part of being a mesher is being persistent through your own confusedness" - HystericalParoxysm
| (• ◡•)| (❍ᴥ❍ʋ) [◕ ‿ ◕]
Sockpuppet
#34 Old 15th Nov 2011 at 8:49 AM
Quote: Originally posted by cmomoney
This would be even easier as you would only change two words.


keep in mind that the 4seater fx is much smaller.
But since you can scale special effects you might can make it fit the grotto tub.
Not sure if the waterjets then will match tho.
Forum Resident
Original Poster
#35 Old 15th Nov 2011 at 5:59 PM
I've been thinking about it, and I might delete the entire waterfall animation with the jets like I first did. I am trying to make an ancient bath, and the water jets don't really seem to match.

Now, with the seating. This bath is made to fit sixteen sims. I have added all sixteen slots and now need to find out how to make it so that they can use all sixteen seats. cmomoney mentioned the scripting. What exactly do I open up to change this? Is it the OBJK file and export it to look at in mono?
One horse disagreer of the Apocalypse
#36 Old 15th Nov 2011 at 6:40 PM
Oh, no you have to use Reflector or similar to dig out various bits from the game dlls. They will need exporting using s3pe. I think we have a tutorial somewhere... This is a good place to begin: http://simswiki.info/wiki.php?title...ripting_Modding

"You can do refraction by raymarching through the depth buffer" (c. Reddeyfish 2017)
Forum Resident
Original Poster
#37 Old 15th Nov 2011 at 6:56 PM
I guess I need to stop hiding from the Pure Scripting Modding tutorial. Hopefully it isn't as challenging as it seems.
Should I follow this tutorial step by step first, then try to use it to make my seats functional, or should I just follow it while correcting the seats at the same time? I have done scripting before, but not for the Sims game. What would be the best approach to do this?
˙uʍop ǝpᴉsdn ǝɹ,noʎ 'oN
#38 Old 15th Nov 2011 at 7:13 PM
What you will be doing is similar to this: http://simswiki.info/wiki.php?title..._Object_Modding, but instead of adding an interaction, you'll be changing the 'CreateSeatingGroup' to add more slots than the original.

"Part of being a mesher is being persistent through your own confusedness" - HystericalParoxysm
| (• ◡•)| (❍ᴥ❍ʋ) [◕ ‿ ◕]
One horse disagreer of the Apocalypse
#39 Old 15th Nov 2011 at 8:11 PM
Sorry Birdyfly I missed replying to one of your questions. When adding a slot, I added from this list:
public enum Slot : uint
{
ContainmentSlot_0 = 0xa820f8a6,
ContainmentSlot_1 = 0xa820f8a7,
ContainmentSlot_10 = 0x52e76ed5,
ContainmentSlot_11 = 0x52e76ed4,
ContainmentSlot_12 = 0x52e76ed7,
ContainmentSlot_13 = 0x52e76ed6,
ContainmentSlot_14 = 0x52e76ed1,
ContainmentSlot_15 = 0x52e76ed0,
ContainmentSlot_16 = 0x52e76ed3,
ContainmentSlot_17 = 0x52e76ed2,
ContainmentSlot_18 = 0x52e76edd,
ContainmentSlot_19 = 0x52e76edc,
ContainmentSlot_2 = 0xa820f8a4,
ContainmentSlot_20 = 0x4fe76a1c,
ContainmentSlot_21 = 0x4fe76a1d,
ContainmentSlot_22 = 0x4fe76a1e,
ContainmentSlot_23 = 0x4fe76a1f,
ContainmentSlot_3 = 0xa820f8a5,
ContainmentSlot_4 = 0xa820f8a2,
ContainmentSlot_41 = 0x4de76737,
ContainmentSlot_42 = 0x4de76734,
ContainmentSlot_43 = 0x4de76735,
ContainmentSlot_5 = 0xa820f8a3,
ContainmentSlot_6 = 0xa820f8a0,
ContainmentSlot_62 = 0x4be763d2,
ContainmentSlot_7 = 0xa820f8a1,
ContainmentSlot_8 = 0xa820f8ae,
ContainmentSlot_9 = 0xa820f8af,
ContainmentSlot_Sentinel = 0x4be763d3,
FXJoint_0 = 0x318a282c,
FXJoint_1 = 0x318a282d,
FXJoint_2 = 0x318a282e,
FXJoint_3 = 0x318a282f,
FXJoint_4 = 0x318a2828,
FXJoint_5 = 0x318a2829,
FXJoint_6 = 0x318a282a,
FXJoint_7 = 0x318a282b,
FXJoint_8 = 0x318a2824,
FXJoint_9 = 0x318a2825,
FXJoint_SandsOfUnderstanding = 0x5d33660a,
FXJoint_Science_0 = 0x9cec4dcb,
FXJoint_Science_1 = 0x9cec4dca,
FXJoint_Science_2 = 0x9cec4dc9,
FXJoint_Science_3 = 0x9cec4dc8,
FXJoint_Sentinel = 0x5d33660b,
IKTarget_0 = 0xa2c0a4b3,
IKTarget_1 = 0xa2c0a4b2,
IKTarget_2 = 0xa2c0a4b1,
IKTarget_3 = 0xa2c0a4b0,
IKTarget_4 = 0xa2c0a4b7,
IKTarget_5 = 0xa2c0a4b6,
IKTarget_6 = 0xa2c0a4b5,
IKTarget_7 = 0xa2c0a4b4,
IKTarget_8 = 0xa2c0a4bb,
IKTarget_9 = 0xa2c0a4ba,
IKTarget_Sentinel = 0xa2c0a4bb,
None = 0,
PlacementSlot_E = 0x5cb037aa,
PlacementSlot_N = 0x5cb037a1,
PlacementSlot_S = 0x5cb037bc,
PlacementSlot_Sentinel = 0x5cb037b9,
PlacementSlot_W = 0x5cb037b8,
RoutingSlot_0 = 0x31229a4c,
RoutingSlot_1 = 0x31229a4d,
RoutingSlot_10 = 0xa678e707,
RoutingSlot_11 = 0xa678e706,
RoutingSlot_12 = 0xa678e705,
RoutingSlot_13 = 0xa678e704,
RoutingSlot_14 = 0xa678e703,
RoutingSlot_15 = 0xa678e702,
RoutingSlot_16 = 0xa678e701,
RoutingSlot_17 = 0xa678e700,
RoutingSlot_18 = 0xa678e70f,
RoutingSlot_19 = 0xa678e70e,
RoutingSlot_2 = 0x31229a4e,
RoutingSlot_3 = 0x31229a4f,
RoutingSlot_4 = 0x31229a48,
RoutingSlot_5 = 0x31229a49,
RoutingSlot_6 = 0x31229a4a,
RoutingSlot_7 = 0x31229a4b,
RoutingSlot_8 = 0x31229a44,
RoutingSlot_9 = 0x31229a45,
RoutingSlot_Sentinel = 0xa678e70f,
TransformBone = 0xcd68f001
}

obviously avoiding any already used. Then if the script wants to use it, this is how the game tends to do it. For routing and container slots it is not necessary to match a bone in the RIG, and therefore I simply call the bonename the same as the slotname for my added entries. I have not tried adding any other type of slot - I have a feeling Effect slots do need a RIG entry.

"You can do refraction by raymarching through the depth buffer" (c. Reddeyfish 2017)
One horse disagreer of the Apocalypse
#40 Old 15th Nov 2011 at 8:51 PM Last edited by Inge Jones : 15th Nov 2011 at 9:12 PM.
Oh, the script tutorials are a little out of date. There is an easier way to extract the assemblies now. Where it says: "Click on Grid at the bottom of the S3PE window, and then click on the Assembly row and the little drop-down arrow on the right. Click on Export… " now you just have to right-click on the S3SA and choose Export dll. It will even save to the correct name.

Also in the tutorial "Creating a game-compatible Visual Studio project" since a couple of patches ago we can no longer make up our own complete namespace, and it has to begin with an existing namespace that is used in the game.

"You can do refraction by raymarching through the depth buffer" (c. Reddeyfish 2017)
Forum Resident
Original Poster
#41 Old 15th Nov 2011 at 10:21 PM
Inge,
I feel comfortable using Mono develop over Visual Studio, and to me, they look almost identical. I have used Mono to edit Sims 3 XML mods to update them without any problems. Will I be able to use this program to make script mods as well? It supports Csharp scripts, Java scripts, and Python.
One horse disagreer of the Apocalypse
#42 Old 15th Nov 2011 at 10:53 PM
It just needs to compile into a .Net dll.

"You can do refraction by raymarching through the depth buffer" (c. Reddeyfish 2017)
Forum Resident
Original Poster
#43 Old 16th Nov 2011 at 6:10 PM
I did the very first part of the script, but I want to make sure I did this correctly.



I am following this tutorial: http://simswiki.info/wiki.php?title..._Object_Modding
One horse disagreer of the Apocalypse
#44 Old 16th Nov 2011 at 6:19 PM
Well I do it like this:

namespace Sims3.Gameplay.IngeJones
{
public class ijSims3Stairs_Snap : StaircaseSpiral
{

So the actual object's scriptclass is the class, rather than the namespace.

"You can do refraction by raymarching through the depth buffer" (c. Reddeyfish 2017)
Forum Resident
Original Poster
#45 Old 16th Nov 2011 at 6:58 PM
Alright, I added the brackets.


Okay, I am now using reflector and am in the Sims3GameplayObjects -> Sims3GameplayObjects.dll -> Sims3.Gameplay.Objects.Plumbing

In the drop down menu, do I need the:
HotTubGrottoCeleb
or
HotTubSeat


Also, since I'm doing scripting anyways, there is something else I want to do with it. I am not sure if I should ask now since I am working on the hot tub seating first and hoping I can get that done.
I guess I'll go ahead and ask anyways and just come back to it once I get the seating right.

Since I am making a bath house tub for the ancient theme, I am wanting it to act as such. Is there a way to:
a) Increase the hygiene of the sim that uses it like an average bath tub? That way the hygiene does get filled up when the sims use it.
b) Make it so when the sims use this particular tub (not all hot tubs), they will be naked instead of in their swim suits? I know there is the skinny dipping function, but I want them to not wear their swimsuits at all with this since it is meant to be a huge bath tub.

Obviously these two are after I get the seats to hold 16 sims.
One horse disagreer of the Apocalypse
#46 Old 16th Nov 2011 at 7:08 PM
I am confused why you're not making a class for your object, which is called "BirdyBathHouseTub"

So you'd have
namespace Sims3.Gameplay.Objects.Plumbing.BirdyFly

{
public class BirdyBathHouseTub : HotTubGrottoCeleb

{

"You can do refraction by raymarching through the depth buffer" (c. Reddeyfish 2017)
Forum Resident
Original Poster
#47 Old 16th Nov 2011 at 7:20 PM Last edited by birdyfly : 16th Nov 2011 at 8:20 PM.
Oops, sorry, Inge, I'm still a little slow when it comes to scripting. I have it changed now to have it look like this:

using System;
using System.Collections.Generic;
using System.Text;
using Sims3.Gameplay.Objects.Miscellaneous;
using Sims3.Gameplay.Interactions;
using Sims3.Gameplay.Actors;
using Sims3.Gameplay.Autonomy;
using Sims3.SimIFace;
using Sims3.UI;

namespace Sims3.Gameplay.Objects.Plumbing.BirdyFly
{
public class BirdyBathHouseTub : HotTubGrottoCeleb
{

EDIT:

Okay, I have the seats working now. The next step is what I stated above. That is the hygiene increase and the sim changing into the naked outfit instead of swimsuit.

For the hygiene, I saw this line of code:


Quote:
[TunableComment("Range: Positive floats. Description: How much hygiene Sims gain per sim hour when in the HotTub posture."), Tunable]
private static float kHotTubHygieneGainPerHour = 40f;

I changed the 40f to 90f.

Now my code looks like this:



Did I do this line of code correctly? If so, then how do I add the outfit changer?
In the HotTubSeat in the .NET Reflector has this line of code:

Quote:
public override bool SitDown(Sim s, Slot slot, Sim invitedBy, bool isAutonomous)
{
Sim.SwitchOutfitHelper switchOutfitHelper = null;
bool isSkinnyDipping = invitedBy.IsSkinnyDipping();
if (isSkinnyDipping)
{
switchOutfitHelper = new Sim.SwitchOutfitHelper(s, 3, 1, false);
}
else
{
switchOutfitHelper = new Sim.SwitchOutfitHelper(s, 3);
}
switchOutfitHelper.Start();
HotTubBase container = base.Container as HotTubBase;
base.get_Host().AddToUseList(s);
if (container.SitDown(s, slot, this, switchOutfitHelper, isSkinnyDipping, invitedBy, isAutonomous))
{
if (s.HasExitReason(0x800))
{
InteractionInstance cancelTransition = s.get_Posture().GetCancelTransition();
s.get_InteractionQueue().PushAsContinuation(cancelTransition, true);
return false;
}
return true;
}
base.get_Host().RemoveFromUseList(s);
return false;
}


Is this is code I need? If so, how do I implement it into the script I already have? Do I just add it to the end of the script? And do I need all of this line, or just part of it?
Forum Resident
Original Poster
#48 Old 19th Nov 2011 at 1:04 AM
Alright, I tried testing the code after adding the public bool statement, and it didn't do anything outfit wise.
Here is the final script:


I am not sure what I did wrong. Was that the wrong line of code that I added?
Page 2 of 2
Back to top