SedSens Creator API Guide
Creator API script: 2.5.019
Linked-message protocol: 2.2
Primary integration: AVsitter 2
Audience: Approved SedSens furniture and device creators
Contents
- Purpose
- What You Need
- Licensing and Script Permissions
- How the Creator API Works
- Quick Start with AVsitter
- Sending Commands and Receiving Replies
- Required Command Order
- Command Reference
- Target Modes
- Body Parts and Hit Levels
- AVsitter Events
- Complete AVsitter Adapter Example
- Errors and Troubleshooting
- Testing Checklist
- Version History
Purpose
The SedSens Creator API allows approved creators to connect furniture and other scripted products to a Seductive Sensations Suit.
A creator script can:
- Select a SedSens Prop Type.
- Select one specific nearby Suit wearer.
- Confirm that the wearer is eligible for the requested interaction.
- Apply a hit to a supported body location.
- Use the configured Prop textures, sounds, alpha hits, and user settings.
Most Second Life furniture creators use AVsitter. This guide therefore begins with AVsitter and then explains the underlying SedSens commands for creators using a custom controller.
What You Need
Before beginning, you need:
- An approved SedSens Creator API application.
- The personalized Creator API script generated for your Second Life avatar UUID.
- A prim or mesh created by the licensed creator.
- An AVsitter setup or another linked-message controller.
- A valid SedSens Prop Type Key, such as
spank,crop, orscratch. - A test avatar wearing a responsive Seductive Sensations Suit.
The Creator API script and the controller script must be in the same linkset.
The furniture owner, menu operator, sitter, and Suit wearer do not need a Creator API license. The license belongs to the approved creator whose UUID is built into the personalized script.
The selected sitter must have the requested Prop Type available and configured in SedSens. The furniture owner is used only when the Suit checks whether the furniture is allowed to apply an effect.
Licensing and Script Permissions
Creator validation
When the Creator API starts or resets, it checks the creator of the prim containing the script.
- If the prim creator matches the licensed creator UUID, the script continues to the website license check.
- If the prim creator does not match, the Creator API reports the mismatch and removes itself.
- Changing the current owner does not change the prim creator.
Next-owner permissions
The Creator API may be distributed with either of these next-owner permission combinations:
- Copy and no transfer
- No copy and transfer
The script must not allow both Copy and Transfer for the next owner. If both are enabled, the Creator API reports the problem and removes itself.
Website license check
The Creator API checks the SedSens website once when it starts or resets.
- Approved, locked, and grace-period decisions allow the script to start.
- Rejected applications cause the script to remove itself.
- Revoked licenses cause the script to remove itself.
- A temporary website failure leaves the script inactive. It does not delete the script.
- The script does not poll the website repeatedly.
- Reset the script manually after a temporary website failure.
How the Creator API Works
Your controller communicates with the Creator API using linked messages.
The normal workflow is:
- Choose whether the target must be seated or may be standing nearby.
- Choose the SedSens Prop Type.
- Supply one target avatar UUID.
- Wait for the Suit to confirm the target.
- Send one or more hits.
- Clear the target when the interaction ends.
Every command receives a reply. Do not send the next command until the expected reply arrives.
Quick Start with AVsitter
Channels
| Purpose | Linked-message number |
|---|---|
| AVsitter internal messages | 90000 through 90500 |
| Example AVpos button | 7336 |
| Send command to SedSens | 7337 |
| Receive reply from SedSens | 7367 |
The SedSens numbers do not conflict with AVsitter's internal range.
Add an AVpos button
The following AVpos line creates a button that requests a Tender Spank:
BUTTON Spank|7336|spank,b1,1
A harder hit with two alpha hits:
BUTTON Hard Spank|7336|spank,b1,3,2
Another Prop Type and body location:
BUTTON Scratch|7336|scratch,al2,2
The button payload uses this order:
propTypeKey,bodyPart,hitLevel,optionalAlphaHits
If the AVpos custom key is empty, AVsitter supplies the menu avatar UUID. When AVcontrol is used, the key may contain:
controller_uuid|sitter_uuid
The SedSens target must be the sitter UUID, which is the final UUID in that value. The controller UUID is only the person operating the menu.
Sending Commands and Receiving Replies
Send a command
llMessageLinked(LINK_SET, 7337, "COMMAND", "parameter");
Use LINK_SET so the controller and Creator API may be placed in different prims within the same linkset.
Receive a reply
link_message(integer senderNumber, integer number, string command, key response)
{
if (number == 7367)
{
llOwnerSay(command + ": " + (string)response);
}
}
Reply format
The string field contains the command name.
Successful replies use:
OK
OK|data
Failed replies use:
ERROR_CODE
ERROR_CODE|detail
Example:
Command: SET_TARGET
Reply: OK|avatar_uuid,female,3
Required Command Order
For AVsitter furniture, use this sequence:
1. SET_TARGET_MODE with SEATED
2. Wait for SET_TARGET_MODE reply
3. SET_TARGET with the sitter avatar UUID
4. Wait for SET_TARGET reply
5. SET_PROP with the Prop Type Key
6. Wait for SET_PROP reply
7. HIT with bodyPart,hitLevel,optionalAlphaHits
8. Wait for HIT reply
9. CLEAR_TARGET when the sitter stands or the interaction ends
The Creator API performs website and Suit requests asynchronously. Sending another command while one of those operations is active returns BUSY.
Command Reference
PING
Confirms that the Creator API script is running.
llMessageLinked(LINK_SET, 7337, "PING", "");
Success:
OK|PONG
PING remains available when the website license is inactive.
VERSION
Returns the Creator API script release and linked-message protocol release.
llMessageLinked(LINK_SET, 7337, "VERSION", "");
Success:
OK|2.5.019,2.2
VERSION remains available when the website license is inactive.
COMMANDS
Returns the supported command names.
llMessageLinked(LINK_SET, 7337, "COMMANDS", "");
Success:
OK|PING,VERSION,COMMANDS,STATUS,LICENSE_STATUS,BODY_PARTS,SET_PROP,GET_PROP,SET_TARGET_MODE,GET_TARGET_MODE,SET_TARGET,GET_TARGET,CLEAR_TARGET,HIT,SET_SOUND
STATUS
Returns the current Prop, target, sound, mode, and license state.
llMessageLinked(LINK_SET, 7337, "STATUS", "");
Success data is returned in this order:
propType,propKeyId,alphaHits,targetAvatar,targetSuitType,targetHitLimit,soundEnabled,targetMode,licenseActive
LICENSE_STATUS
Returns 1 when the startup website decision activated the Creator API or 0 when it did not.
llMessageLinked(LINK_SET, 7337, "LICENSE_STATUS", "");
LICENSE_STATUS remains available when the website license is inactive.
BODY_PARTS
Returns all body location keys accepted by HIT.
llMessageLinked(LINK_SET, 7337, "BODY_PARTS", "");
Success:
OK|al1,al2,al3,ar1,ar2,ar3,b1,b2,b3,b4,b5,b6,b7,b8,f1,f2,f3,f4,f5,f6,ll1,ll2,ll3,ll4,lr1,lr2,lr3,lr4
SET_PROP
Loads the active Prop configuration for the currently selected sitter. Complete SET_TARGET before this command.
Parameter:
SedSens Prop Type Key
Example:
llMessageLinked(LINK_SET, 7337, "SET_PROP", "crop");
Success data:
propType,propKeyId,alphaHits
Possible errors include BAD_PROP, HTTP_START, HTTP_TIMEOUT, HTTP_404, and BAD_RESPONSE.
GET_PROP
Returns the currently loaded Prop configuration.
llMessageLinked(LINK_SET, 7337, "GET_PROP", "");
Success data:
propType,propKeyId,alphaHits
SET_TARGET_MODE
Selects the target rules.
Accepted parameters:
SEATEDDEVICE
Example:
llMessageLinked(LINK_SET, 7337, "SET_TARGET_MODE", "SEATED");
Changing the target mode clears the current target.
GET_TARGET_MODE
Returns the current target mode.
llMessageLinked(LINK_SET, 7337, "GET_TARGET_MODE", "");
SET_TARGET
Selects one specific target avatar and asks the target's Suit to respond.
The parameter must be the target avatar UUID, not an object UUID.
llMessageLinked(LINK_SET, 7337, "SET_TARGET", (string)targetAvatar);
Success data:
targetAvatarUuid,suitType,targetHitLimit
Possible errors include BAD_TARGET, DNF, NOT_SEATED, and TIMEOUT.
GET_TARGET
Returns the current target avatar and Suit information.
llMessageLinked(LINK_SET, 7337, "GET_TARGET", "");
Success data:
targetAvatarUuid,suitType,targetHitLimit
CLEAR_TARGET
Clears the current target.
llMessageLinked(LINK_SET, 7337, "CLEAR_TARGET", "");
Success:
OK|CLEARED
Send this command when the sitter stands, the device action ends, or the controller changes to another target.
HIT
Applies the loaded Prop configuration to the selected Suit.
Parameter:
bodyPart,hitLevel,optionalAlphaHits
Example:
llMessageLinked(LINK_SET, 7337, "HIT", "b1,2");
Example with an alpha-hit override:
llMessageLinked(LINK_SET, 7337, "HIT", "b1,3,2");
Hit levels:
1Tender2Firm3Hard
The selected Suit may impose a lower maximum hit level. A request above that limit returns HIT_BLOCKED.
Possible errors include NO_TARGET, DNF, TARGET_INVALID, NO_PROP, BAD_BODY_PART, BAD_HIT, and HIT_BLOCKED.
SET_SOUND
Enables or disables the Prop sounds played by the Creator API object.
Accepted parameters:
TRUEFALSE10
Example:
llMessageLinked(LINK_SET, 7337, "SET_SOUND", "FALSE");
Possible error:
BAD_BOOL
Target Modes
SEATED
SEATED is the default and recommended AVsitter furniture mode.
The selected target must:
- Be within 20 metres of the Creator API object.
- Be seated on the same furniture linkset.
- Wear a responsive Seductive Sensations Suit.
The person operating the menu does not automatically become the target.
The Creator API checks the target again before every hit. If the target stands or moves out of range, the hit is rejected.
DEVICE
DEVICE supports products intentionally operated without sitting.
The controller must still supply one specific nearby avatar UUID. The Creator API does not scan for or automatically select nearby avatars.
The target must:
- Be within 20 metres of the Creator API object.
- Wear a responsive Seductive Sensations Suit.
Body Parts and Hit Levels
Arms
| Key | Body location |
|---|---|
al1 |
Left Shoulder |
al2 |
Left Bicep |
al3 |
Left Forearm |
ar1 |
Right Shoulder |
ar2 |
Right Bicep |
ar3 |
Right Forearm |
Back
| Key | Body location |
|---|---|
b1 |
Left Shoulder Blade |
b2 |
Right Shoulder Blade |
b3 |
Left Middle Back |
b4 |
Right Middle Back |
b5 |
Left Lower Back |
b6 |
Right Lower Back |
b7 |
Left Ass Cheek |
b8 |
Right Ass Cheek |
Front
| Key | Body location |
|---|---|
f1 |
Right Upper Chest |
f2 |
Left Upper Chest |
f3 |
Right Breast |
f4 |
Left Breast |
f5 |
Stomach |
f6 |
Crotch |
Legs
| Key | Body location |
|---|---|
ll1 |
Left Thigh, Front |
ll2 |
Left Shin |
ll3 |
Left Thigh, Rear |
ll4 |
Left Calf |
lr1 |
Right Thigh, Front |
lr2 |
Right Shin |
lr3 |
Right Thigh, Rear |
lr4 |
Right Calf |
Do not invent additional body location keys. Use BODY_PARTS if your controller needs to retrieve the supported list at runtime.
AVsitter Events
AVsitter uses linked-message numbers from 90000 through 90500.
The most useful events for SedSens are:
| Number | AVsitter event | SedSens use |
|---|---|---|
90045 |
A pose has started | Trigger a pose-driven SedSens effect |
90050 |
A pose was selected manually | Observe menu selection when required |
90060 |
An avatar has seated | Record or prepare a possible target |
90065 |
A sitter has stood | Clear the active SedSens target |
Use 90045 for pose-driven effects because it confirms that the pose actually played. Message 90050 is only sent for a manual menu selection.
For 90045, the message string contains pipe-separated information:
sitterNumber|poseName|animationFile|setNumber|allSitters|oldSyncName|isSync
The event's key field contains the affected avatar UUID.
For a SYNC pose, target only the sitter who should receive the SedSens effect. Do not target every UUID in the all-sitters field automatically.
Complete AVsitter Adapter Example
This example:
- Receives AVpos buttons on
7336. - Uses the final AVcontrol UUID as the sitter.
- Waits for every SedSens reply.
- Clears the target when the active sitter stands.
integer AV_BUTTON = 7336;
integer SEDSENS_SEND = 7337;
integer SEDSENS_REPLY = 7367;
string pendingProp = "";
string pendingHit = "";
key pendingTarget = NULL_KEY;
key activeTarget = NULL_KEY;
string pendingStep = "";
sendApi(string command, string parameter)
{
llMessageLinked(LINK_SET, SEDSENS_SEND, command, parameter);
}
key targetFromAvsitter(key suppliedKey)
{
list values = llParseStringKeepNulls((string)suppliedKey, ["|"], []);
integer count = llGetListLength(values);
if (count > 1)
{
return (key)llList2String(values, count - 1);
}
return suppliedKey;
}
clearPending()
{
pendingProp = "";
pendingHit = "";
pendingTarget = NULL_KEY;
pendingStep = "";
}
beginEffect(string payload, key suppliedKey)
{
if (pendingStep != "")
{
return;
}
list values = llParseStringKeepNulls(payload, [","], []);
pendingProp = llStringTrim(llList2String(values, 0), STRING_TRIM);
string bodyPart = llStringTrim(llList2String(values, 1), STRING_TRIM);
string hitLevel = llStringTrim(llList2String(values, 2), STRING_TRIM);
string alphaHits = llStringTrim(llList2String(values, 3), STRING_TRIM);
pendingTarget = targetFromAvsitter(suppliedKey);
if (pendingProp == "" || bodyPart == "" || hitLevel == "" || pendingTarget == NULL_KEY)
{
clearPending();
return;
}
pendingHit = bodyPart + "," + hitLevel;
if (alphaHits != "")
{
pendingHit += "," + alphaHits;
}
pendingStep = "SET_TARGET_MODE";
sendApi("SET_TARGET_MODE", "SEATED");
}
default
{
link_message(integer senderNumber, integer number, string message, key id)
{
if (number == AV_BUTTON)
{
beginEffect(message, id);
return;
}
if (number == 90065)
{
key standingAvatar = id;
if (standingAvatar == activeTarget && pendingStep == "")
{
sendApi("CLEAR_TARGET", "");
activeTarget = NULL_KEY;
}
return;
}
if (number != SEDSENS_REPLY || message != pendingStep)
{
return;
}
list reply = llParseStringKeepNulls((string)id, ["|"], []);
string status = llList2String(reply, 0);
if (status != "OK")
{
llOwnerSay("SedSens " + message + " failed: " + (string)id);
clearPending();
return;
}
if (pendingStep == "SET_TARGET_MODE")
{
pendingStep = "SET_TARGET";
sendApi("SET_TARGET", (string)pendingTarget);
}
else if (pendingStep == "SET_TARGET")
{
activeTarget = pendingTarget;
pendingStep = "SET_PROP";
sendApi("SET_PROP", pendingProp);
}
else if (pendingStep == "SET_PROP")
{
pendingStep = "HIT";
sendApi("HIT", pendingHit);
}
else if (pendingStep == "HIT")
{
clearPending();
}
}
}
Pose-driven addition
To trigger an effect when an AVsitter pose starts:
if (number == 90045)
{
list poseData = llParseStringKeepNulls(message, ["|"], []);
string poseName = llList2String(poseData, 1);
if (poseName == "Over Knee Spank")
{
beginEffect("spank,b1,2", id);
}
}
Errors and Troubleshooting
General command errors
| Error | Meaning | What to check |
|---|---|---|
LICENSE_INACTIVE |
The startup website decision did not activate the API | Reset after resolving the website or license issue |
BUSY |
A website request or Suit handshake is active | Wait for the current reply before sending another command |
BAD_COMMAND |
The command is unknown | Use COMMANDS to retrieve the supported list |
Prop errors
| Error | Meaning | What to check |
|---|---|---|
BAD_PROP |
No Prop Type Key was supplied | Supply a non-empty centralized Prop Type Key |
NO_PROP |
No Prop configuration is loaded | Complete SET_PROP successfully before HIT |
BAD_RESPONSE |
The website response lacked required Prop data | Confirm the published Prop configuration is complete |
HTTP_404 |
The Prop Type Key or configuration was not found | Confirm the key and published configuration |
Target errors
| Error | Meaning | What to check |
|---|---|---|
BAD_TARGET_MODE |
The mode was not SEATED or DEVICE |
Supply a supported target mode |
BAD_TARGET |
The avatar UUID was missing or invalid | Supply one target avatar UUID |
DNF |
The target was not found within 20 metres | Move the target closer |
NOT_SEATED |
A SEATED target is not seated on this linkset |
Confirm the correct sitter UUID |
TIMEOUT |
The selected Suit did not answer | Confirm the target is wearing a responsive Suit |
NO_TARGET |
No target was selected | Complete SET_TARGET successfully |
TARGET_INVALID |
The target stood, moved away, or no longer qualifies | Select the target again if appropriate |
Hit and setting errors
| Error | Meaning | What to check |
|---|---|---|
BAD_BODY_PART |
The body location key is unsupported | Use BODY_PARTS or the table in this guide |
BAD_HIT |
Hit level was outside 1 through 3 | Use Tender, Firm, or Hard |
HIT_BLOCKED |
The Suit's configured limit is lower | Respect the hit limit returned by SET_TARGET |
BAD_BOOL |
The sound setting was invalid | Use TRUE, FALSE, 1, or 0 |
Website errors
| Error | Meaning | What to check |
|---|---|---|
HTTP_START |
Second Life could not begin the request | Retry after checking regional HTTP availability |
HTTP_TIMEOUT |
The request failed after bounded retries | Check the website and retry later |
HTTP_408 |
The website request timed out | Retry after the service recovers |
HTTP_429 |
Too many requests were sent | Slow the controller and wait before retrying |
HTTP_500 or higher |
The website encountered an error | Retry after the service recovers |
Testing Checklist
Before releasing a product:
- Confirm the personalized Creator API remains in a prim created by the licensed creator.
- Confirm the next-owner script permissions do not allow both Copy and Transfer.
- Confirm the API reports version
2.5.019and protocol2.2. - Test one AVpos button with one sitter.
- Confirm the correct Prop Type loads.
- Confirm the correct body location and hit level.
- Confirm a nearby non-sitter cannot be selected in
SEATEDmode. - Confirm AVcontrol targets the sitter rather than the controller.
- Confirm standing clears or invalidates the target.
- Confirm rapid button presses return
BUSYwithout corrupting the command sequence. - Test multiple sitters and SYNC poses.
- Test the final next-owner copy of the complete product.
Version History
| Script version | Protocol | Change |
|---|---|---|
2.5.019 |
2.2 |
Loads Prop configuration from the selected sitter and separates furniture-owner access checks from the Suit reply target. |
2.5.018 |
2.1 |
Normalized the former 2.5.18 display to a fixed-width revision and rebuilt the Creator API documentation. No protocol change. |