SedSens Creator API Guide

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

  1. Purpose
  2. What You Need
  3. Licensing and Script Permissions
  4. How the Creator API Works
  5. Quick Start with AVsitter
  6. Sending Commands and Receiving Replies
  7. Required Command Order
  8. Command Reference
  9. Target Modes
  10. Body Parts and Hit Levels
  11. AVsitter Events
  12. Complete AVsitter Adapter Example
  13. Errors and Troubleshooting
  14. Testing Checklist
  15. 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:

  1. An approved SedSens Creator API application.
  2. The personalized Creator API script generated for your Second Life avatar UUID.
  3. A prim or mesh created by the licensed creator.
  4. An AVsitter setup or another linked-message controller.
  5. A valid SedSens Prop Type Key, such as spank, crop, or scratch.
  6. 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:

  1. Choose whether the target must be seated or may be standing nearby.
  2. Choose the SedSens Prop Type.
  3. Supply one target avatar UUID.
  4. Wait for the Suit to confirm the target.
  5. Send one or more hits.
  6. 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:

  • SEATED
  • DEVICE

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:

  • 1 Tender
  • 2 Firm
  • 3 Hard

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:

  • TRUE
  • FALSE
  • 1
  • 0

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:

  1. Confirm the personalized Creator API remains in a prim created by the licensed creator.
  2. Confirm the next-owner script permissions do not allow both Copy and Transfer.
  3. Confirm the API reports version 2.5.019 and protocol 2.2.
  4. Test one AVpos button with one sitter.
  5. Confirm the correct Prop Type loads.
  6. Confirm the correct body location and hit level.
  7. Confirm a nearby non-sitter cannot be selected in SEATED mode.
  8. Confirm AVcontrol targets the sitter rather than the controller.
  9. Confirm standing clears or invalidates the target.
  10. Confirm rapid button presses return BUSY without corrupting the command sequence.
  11. Test multiple sitters and SYNC poses.
  12. 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.

Official AVsitter References