Stepford Implant API
Make Your Own Applications Work With The Stepford Implant!
Make Your Own Applications Work With The Stepford Implant!
The Stepford Implant status API works with all Stepford Implant versions 4.1 and higher.
The auto-talk loader API works with implant version 4.5+. Click here for the dedicated page that explains how to use the Stepford Implant API to create a content loader.
With using any of the Stepford Implant Application Programming Interfaces (API) you agree to the following terms:
Currently the Stepford Implant API is free of charge (or 1 L$) and free of royalties. It comes with copy and transfer permission, however, you need to apply to Lava Babii for full authorisation to distribute it. I claim the right to change the API pricing policy of any API kit at any time without notice. If you already have obtained an API kit, you will not be charged again or retroactively.
You must be stated as the creator of the object that runs the script. If not, the script may deny working.
The creator of the API kits (me) is not liable for any kind of damages that may be caused by its use. I also don't guarantee any kind of fitness for purpose. It is what it is.
No product that uses the Stepford Implant API kits is allowed to share implant data without user (owner) consent.
No product that uses the Stepford Implant API kits is allowed to request DEBIT permission from its user.
If your product causes harm to the user or me, including my business model, or causes other severe and justified complaints by users, I claim the right to revoke its authorisation, which also results in disabling API scripts in all distributed products by the same creator.
If you don't agree with these terms, don't use the Stepford Implant API kits.
Some of the terms may sound a bit harsh. They're in the user's best interest to ensure best quality and minimal space for abuse. Rest assured that I will not revoke an authorisation if a user simply doesn't like your product, or if a complaint has nothing to do with the Stepford Implant API. I certainly will send a warning before enacting any other measures.
The Stepford API requires a self-contained script that must run in an object created by you. It's available on Second Life Marketplace.
Once you've obtained the script, you can work on your first product, but you will not be able to distribute it. For distribution you need approval by Lava Babii. To achieve such approval, send the product including description of what it does and how it's used to Lava Babii. After approval, Lava Babii will activate your distribution authorisation. The activation works remotely and does not require any modification to your product.
Note that further products will not require another approval.
The Stepford Implant API is a script that is simply dropped into an object created by you. It sends linked messages which in turn can be received by your scripts to perform your application functions.
NOTE: From API version 1.4+, all linked message from the API have the num argument set to 1920. Please check in your link_message implementation whether the message if from the API, e. g. with:
link_message(integer sender_num, integer num, string message, key id) {
if (num != 1920)
return ;
...
}
Commands are sent via llMessageLinked().
Since API version 1.4
llMessageLinked(LINK_THIS, 0, "LOADTALK", <notecard_uuid>) - Requests the implant to load auto-talk content from a notecard with the given UUID.
Since API version 1.5
llMessageLinked(LINK_THIS, 0, "GET-STATUS", "") - Triggers the implant to send a status event (see below). Also works as detection: If there is a status message, there is an implant.
llMessageLinked(LINK_THIS, <increase>, "IQ-ADD", "") - Increases the IQ of the implant by the value of the num argument. To decrease the IQ, use a negative number. Valid numbers are -5 to +5.
Since API version 1.6
llMessageLinked(LINK_THIS, <attach point number>, "TOUCHED" | "SLAPPED" | "GROPED", <toucher key>) - Notifies the implant that the wearer has been touched. The attach point number refers to the body part touched as specified by LSL. The 3rd argument specifies whether it was a touch, a slap, or some sort of groping. Finally, the UUID of the avatar who touched the wearer can be submitted using the toucher key argument (NULL_KEY if there is none, or its unknown).
Since API version 1.8
llMessageLinked(LINK_THIS, 0, "SILENT", "ON" | "OFF") - Turns the silent mode feature of the implant on and off.
llMessageLinked(LINK_THIS, 0, "BIMBOTALK", "ON" | "OFF") - Turns the Bimbotalk feature of the implant on and off. (Note: The Bimbotalk feature only applies with an IQ lower than 70.)
llMessageLinked(LINK_THIS, 0, "TALKMODE", "OFF" | "DIRTY" | "SUSPENDED" | "GOODWIFE") - Sets the Autotalk mode of the implant. (Note: "SUSPENDED" means speech control without the requirement to talk dirty.)
llMessageLinked(LINK_THIS, 0, "NAME", <name>) - Sets the pet name used by the implant, where <name> is a string. Do not use unicode characters.
llMessageLinked(LINK_THIS, 0, "$<command>", llGetOwner()) - Any string that starts with "$" will be sent as local chat command to the implant. Example: "$sit on the stool" will be sent as if someone had commanded the implant in local chat with "<name>, sit on the stool". The local chat command sent with this method does not require an avatar name, because it is sent only to the addressed agent.
Every message sent by the API though link_message() uses the pipe symbol '|' to separate its field values. The first value of every message states the type of message. Currently there are 3 message types available:
status - Contains the full status of the implant with all scores.
Since version 1.4
loading-started - Indicates that content loading has started in the implant.
loading-finished - indicates that content loading has finished.
The API script is basically a relay that translates remote implant messages into linked messages in your object. It also acts as a gatekeeper, making sure a) that you're only getting the messages you're supposed to and b) prevents message flooding by limiting the maximum amount of messages to 1 per second.
Implant data is considered private and protected, so it will only be shared among objects owned by the same owner. If you want to create a system that uses data from other people's implant, you'd have to make an object that relays the data, and distribute this object to implant users. If they wear your object, you probably can consider them consenting to sharing their data. However, take notice of the terms above. I will deactivate APIs for creations that are malicious or abusive. Scripted objects that share implant data without consent are in violation of the terms and conditions.
// Simple example how to use the Stepford Implant API
default {
state_entry() {
llOwnerSay(llGetScriptName() + " ready for operation, " + (string) llGetFreeMemory()
+ " bytes free.");
}
link_message( integer sender_num, integer num, string str, key id )
{
if (str == "READY") {
state run;
}
}
on_rez( integer start_param)
{
llResetScript();
}
}
state run {
state_entry() {
llMessageLinked(LINK_THIS, 0, "GET-STATUS", "");
}
link_message(integer sender_num, integer num, string message, key id) {
if (num != 1920)
return ;
list d = llParseStringKeepNulls(message, ["|"], []);
if (llList2String(d, 0) != "status") {
llOwnerSay("This is not a status message: " + message);
return ;
}
llOwnerSay("Serial No.:" + (string)llList2Integer(d, 1));
llOwnerSay("Orientation (bi = 0, straight = 1, lesbian =2): " +(string) llList2Integer(d, 2));
llOwnerSay("Encounters: " + (string)llList2Integer(d, 3));
llOwnerSay("Partner ID: " + (string)llList2Key(d, 4));
llOwnerSay("Partner gender (0 = female, 1 = male): " + (string)llList2Integer(d, 5));
llOwnerSay("Partner name: " + llList2String(d, 6));
llOwnerSay("Reputation score: " + (string)llList2Integer(d, 7));
llOwnerSay("Reputation tag: " + llList2String(d, 8));
llOwnerSay("Libido score: " + (string)llList2Integer(d, 9));
llOwnerSay("Libido tag: " + llList2String(d, 10));
llOwnerSay("Orgasm count (currently unused): " + (string)llList2Integer(d, 11));
llOwnerSay("SXP vaginal: " + (string)llList2Integer(d, 12));
llOwnerSay("SXP oral: " + (string)llList2Integer(d, 13));
llOwnerSay("SXP handjob: " + (string)llList2Integer(d, 14));
llOwnerSay("SXP anal: " + (string)llList2Integer(d, 15));
llOwnerSay("SXP titjob: " + (string)llList2Integer(d, 16));
llOwnerSay("SXP cumslut: " + (string)llList2Integer(d, 17));
llOwnerSay("Implant type (0 = wife, 2 = bimbo): " + (string)llList2Integer(d, 18));
llOwnerSay("Dirtiness: " + (string)llList2Integer(d, 19));
llOwnerSay("IQ: " + (string)llList2Integer(d, 20));
// 4.6+
llOwnerSay("IQ label: " + llList2String(d, 21));
llOwnerSay("Talk mode (0=OFF, 1=DIRTY, 2=SUSPENDED, 3=GOODWIFE): " + (string)llList2Integer(d, 22));
llOwnerSay("IM block (0=ALL, 1=PARCEL, 2=OFF, 4=ALL/forced): " + (string)llList2Integer(d, 23));
llOwnerSay("IM block count (number of agents blocked from IM): " + (string)llList2Integer(d, 24));
llOwnerSay("Silent mode: " + (string)llList2Integer(d, 25));
llOwnerSay("Hotwife mode: " + (string)llList2Integer(d, 26));
llOwnerSay("Remote control enabled: " + (string)llList2Integer(d, 27));
llOwnerSay("Project Arousal detected: " + (string)llList2Integer(d, 28));
llOwnerSay("Sounds on: " + (string)llList2Integer(d, 29));
llOwnerSay("Animations on: " + (string)llList2Integer(d, 30));
llOwnerSay("RLV relay active: " + (string)llList2Integer(d, 31));
// 4.7+
llOwnerSay("Bimbotalk on: " + (string)llList2Integer(d, 32));
}
on_rez( integer start_param)
{
llResetScript();
}
}