Wiki

Clone wiki

Aeros API / Home

Aeros :: Aeros API


WARNING Text below may contain adult terms and expressions


Aeros Genitals API

Obtaining copy-only Script

Everyone, including content creators, has to obtain copy-only Aeros Cock API Partner script first. That could be done either at Aeros Island in Second Life™ or at our Second Life™ Marketplace store. The fee is L$100.

The script obtained has a communication limit, allowing to operate and listen to only Aeros devices owned by the purchaser of the script. Since version [2017h] the script also allows to communicate with the avatars genitals sitting on the prim, containing the script. Please update via Redelivery Terminal or using the Auto Update HUD provided. You will be able to test your own scripts using Aeros API and use it for your own furniture items, with the AVsitter Plugin provided out-of-the-box. If you are a creator of items for sale, the limit will be removed once you successfully apply for a copy-trans script.

  • In-world vendor is located at Aeros Island and looks like this:

    API Vendor Screenshot.png

    Note: Adult verification and settings required

  • You can also obtain the script from our Second Life™ Marketplace store.

    Note: Adult verification and settings required

Limitations

Copy-only script will only communicate with the genitals owned by the purchaser. Since version [2017h] the script also allows to communicate with the avatars genitals sitting on the prim, containing the script. They cannot be transferred. There is of course a way to create custom communication bridges, but avatars have to get their own copy-only scripts.

Known Issues

Date Description Product(s) Affected Release Notes
07/13/2020 [ FIXED ] Apollo now supports API. Customers should update their Apollo to [7c Beta]. Check here for updates. Apollo [7 Beta], [7a Beta], [7b Beta] Implemented
02/09/2018 [ ACKNOWLEDGED ] Names of the Partner API script-enabled devices (including equipped with AVsitter plugin) cannot be longer than 48 characters. If longer, the dialog under "Devices..." in some models of the cocks will crash due to 511 bytes limit. Creators: We apologize that you have to rename the objects according to that limit since unfixed versions will be around for quite a while (You may use https://ethproductions.github.io/bytes/?e=ascii&t=Test for a quick online character counter) Aeros Cock [6.0] - Darius, Nemo confirmed Fixed starting with version [6.1]

How to Apply for copy-trans Script

If you need a copy-trans script to include into your project for sale, you have to make a fully functional product with the copy-only script first and give us a possibility to look at it. We may refuse to give the copy-trans script, if you only started creating in Second Life™, have no Payment Info Used, have no store or evidence of being a serious content creator.

Since you cannot send us your working product with the copy-only script, we would like to see it in action at your site. Please send a link to actual location where the working copy is rezzed along with the request for the copy-trans script. Your personal copy-trans script will be prepared and passed to you. There's no fees collected.

Keep in mind that the script works only in the prims created by you. Many creators work as a team so please mention if your prims where the scripts are placed are going to be created by someone else than you.

Please contact Ray Silent with the request by a simple instant message (no notecards needed).

Compatibility

Only devices version number 5.0 and higher can listen and respond to API commands. Beta versions of the Aeros Cocks might not fully implement API functionality. Consult corresponding product wiki.

Some features has been added later and require higher versions of the genitals and updated Partner API script.

As not all customers upgrade their genitals timely, they may encounter some incompatibility issues. It's up to each creator to notify their users that they may need to update their Aeros products to be able to be able to take advantage of a particular feature as we never force users to upgrade.

Additional APIs and Scripts

Aeros Addons API

Aeros Addons API is a lightweight API that works with the cocks since version [6.0]. It allows developers to create arbitrary addons that would move together with the cocks, hide when necessary and twitch. This protocol doesn't include messages that can be received via Partner API Script. Aeros Addons API doesn't require any additional scripts. Instead, since addons require instant action, Addons API has no encryption or additional linked message layer, so the addons could react quickly, without visual inconsistency between cocks and addons. Addons Public Messaging Protocol is only a one-way communication from cocks to addons. Navigate to Aeros Addons API page for details.

Aeros AVsitter Plugin

  • Copy-only Partner API script (since [2017h]) now includes Aeros AVsitter Plugin. Please update the box via Redelivery Terminal.

  • If you already own a copy-trans Partner API script, you may also receive a copy-trans Aeros AVsitter Plugin script, upon request.

Please navigate to the separate section of the wiki page to learn how the plugin works.

About Aeros in Second Life™

æros: a team of dedicated builders. We specialize on classy looking textures, sculpts & mesh, fun to use HUDs and causing minimum lag scripts. Developing items for SL residents seeking enhanced appearance and pleasure.

Aeros Island is the only official inworld place where Aeros items can be found: Aeros Island, but you can also use Marketplace Store

Note: Adult verification and settings required

Current roles:

Aeros Partner API Script

An application programming interface (API) is a particular set of rules ('code') and specifications that software programs can follow to communicate with each other.

Aeros Genitals API allows to control and to listen to genitals made by Aeros.

Aeros Partner API Script is a script that allows to carry these API calls between custom devices and Aeros genitals. It is to be included into the prim and communication occurs using linked messages.

                                       +------------------------------+
                                       |        Custom Device         |
                                       |------------------------------|
                                       |      [ Custom Script ]       |
                                       |         ^                    |
                                       |         | (communication via Linked Messages)
                                       |         v                    |
   [ Aeros Genitals Device ]   <----------->  [ Partner API Script ]  |
                                       |                              |
                                       +------------------------------+

Revisions

  • API == [2015a] - current most actively used version. Compatible with Genitals >= [5.0], including Genitals >= [6.0]
  • API >= [2016a] - updated API, backward compatible with [2015a], supports both Genitals >= [5.0] and new features introduced in Genitals >= [6.0]:
    • Permission Flags in addition to Permission Levels
    • "permFlags" incoming message
    • "getPermFlags" command
    • "restrictPermFlags" command
    • "rlv" command
    • "touch" incoming message

Note: Search for [6.0] within the page to navigate to updated features. They are marked with Attention Tiny.png icon.

Note: No modifications are requred in the code for [2015a] when upgrading to >=2016a. Just replace the script.

Types of Partner Scripts

There are two types of partner scripts

  • Copy-only API Partner Script. Name format:
    • AerosPartnerScript API [<genitals_first_version>] [<partner_script_version>] or
    • ** Aeros Partner Script API ** [<partner_script_version>] ** - since [2016a] version.

Example: AerosPartnerScript API [5.0] [2015a], ** Aeros Partner Script API ** [2017h]

Note: It's provided with copy-only permissions for testing purposes, no way to sell it away. Works with the owner-only devices as well as those sitting on the prim (since [2017h])

  • API Partner Script.

    • With the Xcite! built-in support name format:

      • AerosPartnerScript API [<genitals_first_version>] [<partner_script_version>] (partner_name)
      • Since [2016a] please request, disabled by default
    • Without the Xcite! built-in support name format:

      • AerosPartnerScript API [<genitals_first_version>] [<partner_script_version>]* (partner_name)
      • ** Aeros Partner Script ** API [<partner_script_version>] (partner_name) - since [2016a] version.

Example: AerosPartnerScript API [5.0] [2015a] (creator.name), ** Aeros Partner Script API ** [2017h] (creator.name), AerosPartnerScript API [5.0] [2015a]* (creator.name)

Note: They will be provided with the copy-trans permissions to each individual creator upon request and permissions are expected to be changed to copy-only or trans-only.

Policies

Naming Policy

The name "Aeros" (written in any case) can only be used in object name that has Partner script inside if paired with " for", i.e. "something for Aeros". Owner of the prim will receive a notification that API has been disabled if this requirement is missing.

Object Creator

Each partner script is tied to particular object creator. The owner of the prim (script) will receive a notification that API has been disabled if this requirement is missing.

Restrictions

We disallow to change object names temporirly to make it look like original Aeros product in Nearby Chat or instant messages or generated dialogs including inventory offerings.

We disallow attempt to misrepresent Aeros genitals like having some features that we strictly disallow: green (brown) texts in Nearby Chat ("talking cocks") and auto-arousal "feature"

We disallow attempts to break security in Aeros genitals and any kind of griefing using Partner API Scripts.

Discontinuing

If we have strong evidence that a parther doesn't follow policies we keep the right to discontinue their partner script, which may result in breaking of the existing content.

Updating

Auto-updating is troublesome with LSL.

When we fix bugs, partners will receive notifications if they have a prim containing any older version of the API Partner Script rezzed. If a content creator is interested in updates, he may just keep one of his products that uses Partner API Script periodically rezzed.

We never send notifications directly to your customers.

We may also send direct IMs to the partners asking to update the Script and to spread an updated version to them if a serious bug has been discovered.

Note: We may also employ a remote discontinuing of the API Script from customer's object inventory in order to prevent any kind of misusing of the API or if we find a bug that causes a serious trouble.

Message Genuineness Checking

Checking of genuine API script is done while catching messages, so both user of genitals and user of devices can be sure messages originate from the pure Aeros API scripts. It’s hardly possible to control Aeros genitals without API script and/or Aeros HUDs. But keep in mind, that Partner API trans-copy script may be fetched from any of the obtained items. It is up to every content creator as to how to deal with that possibility.

Scripts Communication Distance

API Partner Script and genitals mostly use llWhisper to communicate, so maximum distance between objects is 10m. API Partner Script uses llRegionSayTo when destination is a prim UUID.

Note. Devices starting with version 6.0 will use a mixture of llWhisper/llRegionSayTo(llGetOwner(),...) commands to workaround the https://jira.secondlife.com/browse/SVC-6909 bug.


API Commands

General Architecture

To communicate with Aeros genitals object creator should use his personal Aeros Partner script obtained at Aeros Island in Second Life™ (see Types of Partner Scripts above).

This script will translate incoming linked messages into corresponding API commands adding security level to communication. It will also get messages back from genitals and translate them into linked messages so other scripts may benifit from incoming information.

If you are not sure how to use linked message, please reference the LSL wiki.

                                       +------------------------------+
                                       |        Custom Device         |
                                       |------------------------------|
                                       |      [ Custom Script ]       |
                                       |         ^                    |
                                       |         | (communication via Linked Messages)
                                       |         v                    |
   [ Aeros Genitals Device ]   <----------->  [ Partner API Script ]  |
                                       |                              |
                                       +------------------------------+

Outgoing Messages

Outgoing Messages Overview

General form to use for sending a command to API script when it resides in the same prim:

#!c
llMessageLinked(LINK_THIS, -727000, <commandString>, <receiverKey>)
  • <receiverKey> - either genitals prim’s UUID or UUID of the owner of genitals. (To get the genitals prim UUID use API command "getInfo" with owner UUID as receiverKey, see below)

    Note: There's no way to send broadcasting commands too all surrounding devices of several owners at once. You should detect avatars by yourself (using llSensor or simialr) and decide who's your recipient

  • <commandString> contains a command for the cock as shown in tables in following sections

                                       +-----------------------------------+
                                       |        Custom Device              |
                                       |-----------------------------------|
                                       |      [ Custom Script ]            |
                                       |         |                         |
                                       |         | llMessageLinked(LINK_THIS, -727000, <commandString>, <receiverKey>)
                                       |         v                         |
   [ Aeros Genitals Device ]   <------------  [ Partner API Script ]       |
                                       |                                   |
                                       +-----------------------------------+

Incoming Messages

Incoming Messages Overview

For some commands there are answers provided. Also genitals inform scripts about actions performed with them via HUDs. Here’s the general form of listening to answers from API script. The listening script should be placed along the API script (in the same prim if it’s a link set). This allows to put copies of API script in different prims and to listen to notifications separately:

#!c
link_message(integer sender_num, integer num, string str, key id) {
  if (num==-727001) {
    // id represents a key of the genitals prim. Use llGetOwnerKey(id) to get the prim owner
    // str represents answers (look at descriptions in tables below)
    if (llGetOwnerKey(id)!=genitalsOwnerKey) return;
  }
}
... where genitalsOwnerKey is a variable of your desired owner key (llGetOwner() can be used for object owner)

                                       +-----------------------------------+
                                       |        Custom Device              |
                                       |-----------------------------------|
                                       |      [ Custom Script ]            |
                                       |         ^                         |
                                       |         |  link_message(integer sender_num, integer num, string str, key id) {
                                       |         |    if (num==-727001) {
                                       |         |      ...
                                       |         |                         |
   [ Aeros Genitals Device ]   ------------>  [ Partner API Script ]       |
                                       |                                   |
                                       +-----------------------------------+

Filtering Incoming Messages

By Source

As messages may come from other cocks around, it's very important to filter out those you don't need. Forgetting to do that may result in massive amount of messages flowing in at busy regions.

For example, if we only want to listen to messages coming from the cocks owned by the same owner as the script, this may be done like this (as you've seen in the code above):

#!c
link_message(integer sender_num, integer num, string str, key id) {
  if (num==-727001) {
    if (llGetOwnerKey(id)!=llGetOwner()) return; // We don't want messages coming from not mine genitals 
       ...

By Message Type

Filtering by message type allows to get notifications only on messages of certain types and thus minimize impcat on scripts, linked messages buffer and thus making less lags.

Note: In the following commands you are not required to send <receiverKey>, as filters act for all messages coming from any source.

Example:

#!c
// Set filter to "flowStart" commands only
llMessageLinked(LINK_THIS, -727000, "setFilter|flowStart", NULL_KEY);
// Set filter to several types of commands (comma delimit them):
llMessageLinked(LINK_THIS, -727000, "setFilter|flowStart,on,off", NULL_KEY);

Note: Please keep in mind, that shorthand outgoing message names will not work. Instead of "cum" or "pee" you should use "flowStart" for incoming filter

To reset filter:

#!c
// Reset filter to default (all commands except "twitch")
llMessageLinked(LINK_THIS, -727000, "resetFilter", NULL_KEY);

Note: By default filter is set to all commands except "twitch"

To make filter working with any commands, don't mention them:

#!c
// Remove all filters (set empty):
llMessageLinked(LINK_THIS, -727000, "setFilter", NULL_KEY);

Outgoing Commands

Attention

Any outgoing commands listed below, once issued, will show a message to the owner of target genitals as following:

    "<device name>" has been added to the list of devices trying to remotely control your Aeros Cock.
    Use Devices > Select dialog of your <Genitals Name> if you wish to choose that device to control your genitals

This message will only be shown ONCE per object UUID (the pool of UUIDs is limited, so eventually the message may be repeated). It will only be shown if the Mode of permissions is set to Manual. If you want to notify the owner more often, you have to use your device for that. Querying for given permission level (or permission flags API>=[2016a], Genitals>=[6.0]) may help to determine if this is needed or not.


Outgoing Command: getInfo; Incoming Message: info

  • getInfo - get short info about type of genitals in prim/owner set in <receiverKey>. It can be used to obtain list of devices owned by <receiverKey> as well as type of device(s)

Example:

#!c
llMessageLinked(LINK_THIS, -727000, "getInfo", llGetOwner());

Result (for every device available) will be returned as following:

#!c
link_message(integer sender_num, integer num, string str, key id) {
  if (num==-727001) {
    if (llGetOwnerKey(id)!=llGetOwner()) return;
    // str:
    // "info|clit"
    // "info|cock"
    // "info|hermo"
    list parts=llParseStringKeepNulls(str, ["|"], []);
    if (llList2String(parts,0)=="info") {
      if (llList2String(parts,1)=="cock") {
        // Whatever should be done in this case.
      }
    }
  }
}

Note: The answer will follow with or without permissions. The name of the prim (using llKey2Name(id)) can be also used to determine the model name and version number

Possible answers:

  • info|clit
  • info|cock
  • info|hermo

Outgoing Command: getStatus; Incoming Message: on or off

  • getStatus - This command is to get response from <receiverKey> with information about current status whether it turned on or off with corresponding data.

Example:

#!c
// Request short status
llMessageLinked(LINK_THIS, -727000, "getStatus", llGetOwner());
// Request full status with settings
llMessageLinked(LINK_THIS, -727000, "getStatus|full", llGetOwner());

Note: with getStatus|full, result will arrive with all settings

Result (for every device available) will be returned as following:

#!c
link_message(integer sender_num, integer num, string str, key id) {
  if (num==-727001) {
    if (llGetOwnerKey(id)!=llGetOwner()) return;
    // str:
    // "off"
    // "on|<headMode>|<stage>|<verticalAngle>|<horizontalAngle>|<settings>"
    list parts=llParseStringKeepNulls(str, ["|"], []);
    if (llList2String(parts,0)=="on") {
      // Whatever should be done in this case
    }
  }
}

Possible answers:

  • off - when genitals are hidden
  • on|<headMode>|<stage>|<verticalAngle>|<horizontalAngle>|<settings> - when shown with the following params:
    • <headMode> represent a float number between 0 and 1 which means unsheltered and sheltered states for the cock head (or anything in-between when implemented, thus 0.5 will stand for "half-sheltered" or "auto").
    • <stage> stands for 0, 1, 2 modes (flaccid, semi-hard, hard)
    • <verticalAngle> is a number between -PI/2 and PI/2 and stands for angle starting from down to up
    • <horizontalAngle> is a horizontal angle from -PI/4 to PI/4 (may be changed in the future) (if seen from the top)
    • <settings> will be a list of comma-separated param=value sequences (see Command: "on" for details) - available only for getStatus|full request

Outgoing Command: off; Incoming Message: (the same as in getStatus)

  • off - Hide genitals by <receiverKey>.

Example:

#!c
// Hide all owner genitals
llMessageLinked(LINK_THIS, -727000, "off", llGetOwner());

Note: This will cause genitals to send back notification as if getStatus is automatically passed


Outgoing Command: on; Incoming Message: (the same as in getStatus)

  • on - Show genitals by <receiverKey>. Optionally change cock foreskin state, hardness stage and angles of rotation and settings

Example:

#!c
// Show all owner genitals with their previous settings untouched
llMessageLinked(LINK_THIS, -727000, "on", llGetOwner());
// Show all owner genitals with their previous settings untouched except that foreskin will be set to "0" (unsheathered)
llMessageLinked(LINK_THIS, -727000, "on|0", llGetOwner());
// Show all owner genitals with their previous settings untouched except that stage that will be set to "2" (hard)
llMessageLinked(LINK_THIS, -727000, "on||2", llGetOwner());

Full Command Specification:

on|<headMode>|<stage>|<verticalAngle>|<horizontalTilt>|<settingsSet>

Where:

  • <headMode> - float number between 0 (unsheltered) to 1 (sheltered). For cut models it will always be flipped to 0. For uncut or universal models more modes might be implemented, 0.5 will mean semi-sheltered or auto etc.
  • <stage> - 0, 1, 2 that corresponds to flaccid, semi-hard, hard stages. If wrong value provided, it will be skipped.
  • <verticalAngle> - angle in radians from -1 (straight down) to 1 (straight up) - the number should be provided. If number exceed limits, it will be snapped to clothest edge.
  • <horizontalTilt> - angle in radians from -PI/6 (to the left if looking from top) to PI/6 (to the right if looking from top). If number exceed limits, it will be snapped to clothest edge.
  • <settingsSet> - a set of settings, list of pairs name=value delimited with comma. Not all settings are sent every time. Turning the HUD "on" initiates all to be sent. Otherwise only a portion is sent depending on the page of the settings that is being edited.
    • hS - hair size float (0..1). -1 for off
    • shW - shaft width float (0..1).
    • shL - shaft length float (0..1) (Only used in bento cock models).
    • shS - shaft size float (0..1) (Only used in bento models and specifies the way shaft grows between stages of hardness. 0 stands for "grow" and 1 for "show". Values in between mean interpolation between these two).
    • bS - balls size float (0..1). -1 for off.
    • kS - knob size float (0..1).
      • might be missing in bento models. Other method is used.
    • oS - overall size float (0..1).
      • might be missing in bento models. Other method is used.
    • fS - fascia size float (0..1). -1 for off.
      • might be missing in bento models. Other method is used.
    • hC, shC, bC, kC, esC - colors for hair, shaft, balls, knob, entire skin. an integer number. -1 means white.
      • Entire skin color doesn't change any colors. It's only for the HUD to show what's been selected in models up to 6.1. esC will be deprecated.
      • bC might be missing when shaft and balls are using one texture.
    • hT, shT, bT, kT, esT - hair, shaft, balls, knob, entire skin texture integer index. -1 means custom.
      • Entire skin texture index doesn't change any textures. It's only for the HUD to show what's been selected in models up to 6.1. esT will be deprecated.
      • bT might be missing when shaft and balls are using one texture.
    • hP - hair position float (0..1).
    • tL - throbbing level float (0..1).
    • bP - balls position ("Adjust Balls" slider) float (0..1).
      • might be missing in bento models. Other method is used.
    • mS - mega size. float (0..1). -1 for off.
      • might be missing in bento models. Other method is used.
    • cM - condom mode. string value. Empty means no condom. "c" means on. Other non-empty values might be returned depending on what it looks like during the use.

Note: Any of values after the command “on” can be skipped. Each missing value will be substituted with the most lately set to genitals (not what is in the HUD at the moment of API command).

Note: There is no need to put “|” for the rest skipped parameters after the last one that is specified.

Note: This will cause genitals to send back a notification as if getStatus is requested


Outgoing Command: set; Incoming Message: (the same as in getStatus)

  • set - do the same as on but don't show destination <receiverKey> device if it's currently hidden

Example:

#!c
// Set foreskin to 1 (sheathered), stage 0 (flaccid), vertical angle 0.5 radians.
llMessageLinked(LINK_THIS, -727000, "set|1|0|0.5", llGetOwner());

Note: This will cause genitals to send back notification as if getStatus is automatically passed


Outgoing Command: flowStart; Incoming Message: flowStart

  • flowStart - start particles representing liquids coming from <receiverKey> device.

Example:

#!c
// Start flow coming visually from balls, down, precum type
llMessageLinked(LINK_THIS, -727000, "flowStart|balls|down|pre|0.5", llGetOwner());

Full Command Specification:

flowStart|<point>|<direction>|<type>|<force>|<settingsList>

Where:

  • <point> - balls, shaft or knob
  • <direction> - down or side
  • <type> - pre, splash, cum or pee
  • <force> - number between 0.0 to 1.0 showing the force from minimum to maximum allowable. If not provided, the value of 0.5 will be used.
  • <settingsList> - list of comma-separated param=value sequences: "t=<index>" - set index of texture (-1 or beyond available textures means no texture), "c=<RGBA>" - set tinting color as RGBA integer, "l=1" - set to locked (l=0 means unlocked)

Note: Some combinations of points, directions and types are not possible, so the entire command will be skipped. These combinations are known to work in version [5.0]: balls|down|pre, balls|down|splash, balls|down|cum, balls|down|pee, shaft|down|pre, shaft|down|splash, shaft|down|cum, shaft|down|pee, knob|down|pre, knob|down|splash, knob|side|cum, knob|sidepee

Note: The answer will repeat request (depends on success)

Outgoing Command flowStart Shorcuts: cum, pee, pre; Incoming Message: flowStart

The following shortcuts are equal to corresponding commands

  • cum - equal to flowStart|knob|side|cum|0.5
  • pee - equal to flowStart|knob|side|pee|0.5
  • pre - equal to flowStart|knob|down|pre|0.5

Note: The answer will correspondingly repeat request message as in flowStart upon success


Outgoing Command: flowParams; (No Incoming Message)

Attention Tiny.png Requires API>=[2016a]. The command itself has been internally available in the genitals >=5.0

  • flowParams - change particles settings representing liquids coming from <receiverKey> device.

Example:

#!c
// Start flow coming visually from balls, down, precum type
llMessageLinked(LINK_THIS, -727000, "flowParams|cum|t=2", llGetOwner());

Full Command Specification:

flowParams|<type>|<settingsList>

Where:

  • <type> - pre, splash, cum or pee
  • <settingsList> - list of comma-separated param=value sequences: "t=<index>" - set index of texture (-1 or beyond available textures means no texture), "c=<RGBA>" - set tinting color as RGBA integer, "l=1" - set to locked (l=0 means unlocked)

Note: There's no answer to this command


Outgoing Command: flowStop; Incoming Message: flowStop

  • flowStop - stop all fluid particles. (the HUD will also send twitchStop`` command together withflowStop`` for one "stop" button click)

Example:

#!c
// Stop all flows
llMessageLinked(LINK_THIS, -727000, "flowStop", llGetOwner());

Note: The answer will repeat request message upon success


Outgoing Command: twitch; Incoming Message: twitch

  • twitch - twitch the cock once according to HUD settings

Example:

#!c
// Twitch once
llMessageLinked(LINK_THIS, -727000, "twitch", llGetOwner());

Note: The answer will repeat request message upon success


Outgoing Command: twitchStart; Incoming Message: twitchStart

  • twitchStart|<interval>|<count> - Start series of twitching with <interval> as float number of timer between twitches and <count> as integer number for amount of twitches

Example:

#!c
// Twitch once per 2 seconds for 10 times
llMessageLinked(LINK_THIS, -727000, "twitchStart|2|10", llGetOwner());

Note: The answer will repeat request message upon success


Outgoing Command: twitchStop; Incoming Message: twitchStop

  • twitchStop - stop any series of twitching

Example:

#!c
// Stop twitching
llMessageLinked(LINK_THIS, -727000, "twitchStop", llGetOwner());

Note: The answer will repeat request message upon success


Incoming Message: touch

Attention Tiny.png Requires Genitals>=[6.0], API>=[2016a]

Touch message arrives if someone, except the owner clicks a genitals prim:

#!c
link_message(integer sender_num, integer num, string str, key id) {
  if (num==-727001) {
    if (llGetOwnerKey(id)!=llGetOwner()) return;
    // str:
    // "touch|<avatarKey>"
    list parts=llParseStringKeepNulls(str, ["|"], []);
    if (llList2String(parts,0)=="touch") {
      key avatarKey=(key)llList2String(parts,1);
      // Whatever should be done in this case
    }
  }
}

Note: This is only incoming message


Outgoing Command: rlv; (No Incoming Message)

Attention Tiny.png Requires Genitals>=[6.0], API>=[2016a]

  • rlv|<destinationDeviceFlag>|@detach=n - send "@device=n" to <destinationDeviceFlag>
  • rlv|<destinationDeviceFlag>|@detach=y - send "@device=y" to <destinationDeviceFlag>

<destinationDeviceFlag> - 0x01 flag means genitals, 0x02 means the HUD. Combining them as 0x01 | 0x02 will address both types devices of the target device / owner.

Example:

#!c
// Send @detach=n to all genitals owned by llGetOwner()
llMessageLinked(LINK_THIS, -727000, "rlv|"+(string)(0x01 | 0x02)+"|@detach=n", llGetOwner());

Note: There's no answer to this command


Outgoing Command: getPermissions; Incoming Message: permissions

  • getPermissions - requests information about currently given permissions level to the Device that issues this comand.

Example:

#!c
llMessageLinked(LINK_THIS, -727000, "getPermissions", llGetOwner());

Result (for every device available) will be returned as following:

#!c
link_message(integer sender_num, integer num, string str, key id) {
  if (num==-727001) {
    if (llGetOwnerKey(id)!=llGetOwner()) return;
    // str:
    // "permissions|granted|<level>"
    // "permissions|revoked"
    list parts=llParseStringKeepNulls(str, ["|"], []);
    if (llList2String(parts,0)=="permissions") {
      if (llList2String(parts,1)=="granted") {
        // Whatever should be done in this case
      }
    }
  }
}

Note: This is a query of current available permission level for working with owner’s genitals through API. It can also be used for sending request for permissions for controlling a cock of the genitals/owner sent in the <receiverKey> parameter (see Attention above) Note: The answer will be shown immediately, even if genitals owner wasn’t previously asked about permissions from the device using API. If Device Mode in genitals was set to Auto (allowing last device to acquire control) then permission will be provided immediately. The same will happen with prims that are worn by genitals owner.

Possible answers:

  • permissions|granted|<level> - for granted manipulation. <level> will contain the number of security level: 1, 2, 3, 4, etc. Explanations of each levels are following:

    • 1 - Change angles and foreskin only
    • 2 - Change angles and foreskin, turn on/off
    • 3 - Change angles and foreskin, turn on/off, flows
    • 4 - Change angles and foreskin, turn on/off, flows, animations, settings
    • 5 - the same as 4 but with full reflection of changed settings on owner’s HUD
  • permissions|revoked - for revoked manipulation for the device that issued command

Note: Continuous sending of the command is safe. This will not show a message to the owner of the cock if the device was already put into the list previously. Take into account that the owner can change his decision any time, giving grants, or revoking permissions. So the answer represents the state of permissions at the moment of answering.

Note: Commands that require higher level of permissions will be just dismissed, no notification will follow.


Outgoing Command: getPermFlags; Incoming Message: permFlags

Attention Tiny.png Requires Genitals>=[6.0], API>=[2016a]

  • getPermFlags|internal - query internal permission flags to operate genitals by the owner, Remote HUD or any device - the ones that can be restricted using restrictPermFlags|internal.
  • getPermFlags|device - query device permission flags to operate genitals via API as well as information if our device is actually allowed. Will be returned combined with the internal flags.

Example:

#!c
llMessageLinked(LINK_THIS, -727000, "getPermFlags|internal", llGetOwner());
llMessageLinked(LINK_THIS, -727000, "getPermFlags|device", llGetOwner());

Result (for every device available) will be returned as following:

#!c

// Permission Flags Constants
integer PERM_ANGLE        =  0x01;
integer PERM_FORESKIN     =  0x02;
integer PERM_ONOFF        =  0x04;
integer PERM_FLOW         =  0x08;   // includes twitch
integer PERM_ANIM         =  0x10;
integer PERM_RLV          =  0x20;
integer PERM_SETTINGS     =  0x40;
integer PERM_REFLECT      = 0x100;
integer PERM_INT_PERMS    = 0x200;

// ....

link_message(integer sender_num, integer num, string str, key id) {
  if (num==-727001) {
    if (llGetOwnerKey(id)!=llGetOwner()) return;
    // str:
    // "permFlags|internal|granted|<flags>"
    // "permFlags|device|granted|<flags>"
    // "permFlags|device|revoked|<flags>" - this is different from getPermissions, here we actually always return flags
    list parts=llParseStringKeepNulls(str, ["|"], []);
    if (llList2String(parts,0)=="permFlags") {
      if (llList2String(parts,1)=="device") {
        integer granted=(llList2String(parts,2)=="granted");
        integer flags=(integer)llList2String(parts,3);
        if (granted && (flags & PERM_SETTINGS)) {
          // So we are granted permissions and allowed to change settings of the target device, let's do that!
          // .....
        }
      }
    }
  }
}


Outgoing Command: restrictPermFlags; Incoming Message: permFlags|internal (the same as in getPermFlags)

Attention Tiny.png Requires Genitals>=[6.0], API>=[2016a]

  • restrictPermFlags|internal|<flagsToRestrict> - attempt to change internal permission to operate genitals by the owner, Remote HUD or any device. Requires "Int. Perms" (PERM_INT_PERMS (=0x200)) permission for the deivce that attempts to change owner permission level. Auto-permission for attached devices will also work. <flagsToRestrict> are actual flags that should be removed. For example passing 1 will restrict angles change.

How restriction works

This command can only add restrictions and remove restrictions added earlier by the same device, it's unable to remove any restrictions set by other devices. Restrictions will be auto-removed if a device is not repeating restrictPermFlags command at least each 30 second (i.e. device is detached). You can pass 0 as <flagsToRestrict> as well in order to clear your restrictions.

Resulting restiction is a logical AND of all devices' restriction flags that were issued during the last 30 seconds regardless the order in which they were passed. This restriction will be applied to allow user to operate his genitals via HUD. For devices, internal permissions will be applied to any device - attached or non-attached. Actual effective permissions for a non-attached device will be combined with the Devices permissions set by the owner (not to mention that it may have to be given manual permission to operate the genitals).

The explanation above means that even the device that issued restrictions will itself become restricted. In order to be able to issue any change that is currently restricted, it should attempt first for clear corresponding restriction, then issue the change, then set restriction back (if necessary). If several devices restrict the same kind of operation, none of them will be able to clear it only for itself. They will have to communicate to synchronize their actions, which is beyond this API.

Example:

#!c

// Permission Flags Constants
integer PERM_ANGLE        =  0x01;
integer PERM_FORESKIN     =  0x02;
integer PERM_ONOFF        =  0x04;
integer PERM_FLOW         =  0x08;   // includes twitch
// integer PERM_ANIM         =  0x10; // will be discarded
// integer PERM_RLV          =  0x20; // will be discarded
integer PERM_SETTINGS     =  0x40;  // includes condom wearing
// integer PERM_REFLECT      = 0x100; // will be discarded
// integer PERM_INT_PERMS    = 0x200; // will be discarded

// ....

restrict(key target, integer flagsToRestrict) {
  llMessageLinked(LINK_THIS, -727000, "restrictPermFlags|internal|"+(string)flagsToRestrict, target);
}

// ....

default {
  state_entry() {
    llSetTimerEvent(30); 
  }  

  timer() {
    // We want the user NOT to be able to change angles and settings
    restrict(llGetOwner(), PERM_ANGLE | PERM_SETTINGS);
  }

}


Permissions

Permission Flags (Genitals>=[6.0], API>=[2016a]) will eventually substitute Permission Levels, although we'll keep Levels for compatibility.

Permission Levels

Note: Levels of permissions are chosen by the owner of the cock to prevent misusing. For example, If the owner doesn’t want a device to control his flows, he can choose just Level1 or Level2

Auto-granting Permissions Auto-granting happens if the device that issues API commands is worn by the owner of genitals against which commands are directed

Commands and corresponding required minimum levels are listed below:

Command Minimum Level of Permissions Required Permission Flag (Genitals>=[6.0], API>=[2016a])
getPermissions, getPermFlags, getInfo, getStatus (always allowed) (always allowed)
off Level 2 PERM_ONOFF = 0x04;
on Level 1 - for changing angle, if the cock is already shown PERM_ANGLE = 0x01; PERM_FORESKIN = 0x02;
Level 2 - for showing cock and changing angle if it’s currently hidden PERM_ONOFF = 0x04;
Level 4 - for settingsSet to be applied PERM_SETTINGS = 0x40;
Level 5 - for settingsSet to be applied with reflection on owner’s HUD PERM_REFLECT = 0x100;
flowStart, cum, pee, pre, flowStop Level 3 PERM_FLOW = 0x08;
twitch, twitchStart, twitchStop Level 3 PERM_FLOW = 0x08;
restrictPermFlags (no corresponding level) PERM_INT_PERMS = 0x200;
rlv (no corresponding level) PERM_RLV = 0x20;

Permission Flags

Attention Tiny.png Requires Genitals>=[6.0], API>=[2016a]

With versions (6.0 and higher) of genitals we introduced flags of permissions. Flags are more flexible than levels, allowing to fine tune what can or cannot be performed. The following table lists available permission flags:

Flag Explanation
PERM_ANGLE = 0x01 Changing horizontal and vertical angles
PERM_FORESKIN = 0x02 Sliding foreskin on/off - if supported by the model
PERM_ONOFF = 0x04 Hiding/Showing
PERM_FLOW = 0x08 Issuing flows (includes twitching)
PERM_ANIM = 0x10 Run animations
PERM_RLV = 0x20 Execute RLV commands (can only be changed under Devices permissions)
PERM_SETTINGS = 0x40 Change settings
PERM_REFLECT = 0x100 Transfer settings change to the owner HUD
PERM_INT_PERMS = 0x200 Restirct what the Owner can do via HUD (can only be changed under Devices permissions)

The owner is able to change permissions using his genitals dialog as following:

Avatars Permissions.jpg Devices Permissions.jpg

The code below may be useful to convert level number to flags:

#!c
// convert level number to flags
integer level2Flags(integer level) {
  if (level<1) return 0;
  return llList2Integer([0x3,0x7,0xF,0x5F,0x15F],level-1);  
}

Backward conversion may be done by comparing flags as following:

#!c
// convert flags to level number
integer flags2Level(integer flags) {
  if ((flags & 0x15F) == 0x15F) return 5;  // 0x01 | 0x02 | 0x04 | 0x08 | 0x10 | 0x40 | 0x100
  if ((flags & 0x05F) == 0x05F) return 4;  // 0x01 | 0x02 | 0x04 | 0x08 | 0x10 | 0x40;  
  if ((flags & 0x00F) == 0x00F) return 3;  // 0x01 | 0x02 | 0x04 | 0x08;
  if ((flags & 0x007) == 0x007) return 2;  // 0x01 | 0x02 | 0x04;
  if ((flags & 0x003) == 0x003) return 1;  // 0x01 | 0x02;
  return 0;
}

Full Examples

All the scripts below intend that Partner API Script is put along with them. Read above for details.

Nearby Chat Commands Listener

Use the script below for playing with genitals commands and seeing reponses

#!c
// All commands said in Nearby Chat will be sent to genitals owned by llGetOwner() 
// All messages coming from cocks around the script will be transfered here as a link messages


default {
  state_entry() {
    llMessageLinked(LINK_THIS, -727000, "resetFilter", NULL_KEY); // Reset API filter to default
    llListen(0, "", NULL_KEY, "");
  }

  listen(integer channel, string name, key id, string message) {
    // We are relying message to the same owner as object containing this script
    llMessageLinked(LINK_THIS, -727000, message, llGetOwner());
  }

  link_message(integer sender_num, integer num, string str, key id) {
    if (num==-727001) {
      // To listen messages coming from the same owner as the script, uncomment this line:
      // if (llGetOwnerKey(id)!=llGetOwner()) return;

      llSay(0, "API Answer: \n\t"+str
      +"\n\tDevice: "+(string)id+" ["+llKey2Name(id)+"]"
      +"\n\tOwner: "+(string)llGetOwnerKey(id)+" ["+llKey2Name(llGetOwnerKey(id))+"]"); 
    }
  }
}

Foreskin Switching On/Off by Timer Example

Note: An Aeros Cock that supports foreskin is required. "Cut" models will just ignore these attempts.

#!c
// This example will send "foreskin sliding on/off" command to genitals owned 
// by llGetOwner() by random interval

// To say chosen state or not
integer echo=TRUE;
integer on=FALSE; // Off by default

// Change this if you wish some prim to show the status
updateStatus() {
  if (on) {  
    // llSetLinkPrimitiveParamsFast(2, [PRIM_COLOR, 0, <1,1,1>, 1]);
  } else {
    // llSetLinkPrimitiveParamsFast(2, [PRIM_COLOR, 0, <0.5,0.5,0.5>, 1]);
  }
}

integer foreskinState;

refresh(integer say) {
  if (on) {
    foreskinState=!foreskinState;  
    updateStatus();
    if (say) llInstantMessage(llGetOwner(), "[Private Message] Auto foreskin sliding is enabled.");  
    llMessageLinked(LINK_THIS,(-727000),"on|"+(string)foreskinState,llGetOwner());
    llSetTimerEvent(llFrand(1)+1.5); // Don't make it too fast
  } else {
    updateStatus();
    if (say) llInstantMessage(llGetOwner(), "[Private Message] Auto foreskin sliding is disabled.");  
    llSetTimerEvent(FALSE);
  }

}

default {
  state_entry() {
    llMessageLinked(LINK_THIS, -727000, "resetFilter", NULL_KEY); // Reset API filter to default
    refresh(echo);
  }

  touch_start(integer num_detected) {
    on=!on;
    refresh(echo);
  }

  timer() {
    refresh(FALSE);        
  }
}

Listening to Cum Event Example

#!c
setupAerosAPI() {
  // We are only interested in flowStart messages
  llMessageLinked(LINK_THIS, -727000, "setFilter|flowStart", NULL_KEY);
  // For excluding repeated cum clicks (forceful cums, double clicks, etc.)
  REPEAT_INTERVAL=5;
}

integer lastCumUnixTime;
integer REPEAT_INTERVAL;

default {
  state_entry() {
    setupAerosAPI();
  }

  link_message(integer sender_num, integer num, string msg, key id) {
    if (num==-727001) {
      if (llGetOwnerKey(id)!=llGetOwner()) return;
      if (llGetSubString(msg, 0, 9)=="flowStart|") {
        if (llSubStringIndex(msg,"|cum|")>0) {
          // Only react once per REPEAT_INTERVAL seconds
          if ((llGetUnixTime()-lastCumUnixTime)>REPEAT_INTERVAL) {

            llWhisper(0, llKey2Name(llGetOwnerKey(id))
                +" just came. Distance: "
                +(string)(llVecDist(llGetPos(),llList2Vector(llGetObjectDetails(id, [OBJECT_POS]),0)))
                +"m.");

            lastCumUnixTime=llGetUnixTime();

          }
        }
      } 
    }
  }

  changed(integer change) {
    if (change & CHANGED_INVENTORY) {
      setupAerosAPI();
    }
  }
}

Maintaining Cock List Within the 10m Range

#!c
queryAll() {
  llMessageLinked(LINK_THIS, -727000, "getInfo|", NULL_KEY);
}

list devices; // strided list of [deviceKey, lastUnixTime] per one prim
integer TIMEOUT=30;

purifyDevicesList() {
  // Let's remove not responding for long devices   
  integer i;
  while (i<llGetListLength(devices)) {
    if ((llGetUnixTime()-llList2Integer(devices,i+1))>TIMEOUT) {
      devices=llDeleteSubList(devices, i, i+1);
    } else {
      i+=2;
    }
  }
}

default {
  state_entry() {
    llMessageLinked(LINK_THIS, -727000, "setFilter|info", NULL_KEY); // Set API filter to "info" only
    llSetTimerEvent(10);
    queryAll();
  }

  link_message(integer sender_num, integer num, string str, key id) {
    if (num==-727001) {
      // To listen messages coming from the same owner as the script, uncomment this line:
      // if (llGetOwnerKey(id)!=llGetOwner()) return;

      integer found=llListFindList(devices,[id]);
      if (found<0) {
        devices+=[id,llGetUnixTime()];
      } else {
        // updating lastUnixTime
        devices=llListReplaceList(devices, [llGetUnixTime()], found+1, found+1);
      }

    }
  }

  timer() {
    queryAll();
    purifyDevicesList();
  }

}

Testing Supported Xcite! Genitals Commands

Note: This doesn't affect Xcite! Genitals. It affects Aeros Cocks via the same 2 commands that Xcite! uses

Note: Xcite! is being turned off by default in recent versions of API script. Please IM Ray Silent if you need extended version.

#!c
// This test shows usage of two Xcite commands: 20010 & 20020
// Clicking on prim will send random tilt to genitalsOwnerName owner

string genitalsOwnerName="SomeName Resident"; // Attention! Case Sensitive! Should strictly follow llKey2Name format. Shouldn't trim "Resident" 

default {
  state_entry() {
    llMessageLinked(LINK_THIS, -727000, "resetFilter", NULL_KEY); // Reset API filter to default
    // Test of getting info about genitals
    llMessageLinked(LINK_THIS, 20010, genitalsOwnerName, NULL_KEY);
  }

  touch_start(integer num_detected) {
    // Changing tilt
    float angle=(llFrand(1+PI/2)-1.)*RAD_TO_DEG;
    llMessageLinked(LINK_THIS, 20020, genitalsOwnerName+"|"+(string)angle, NULL_KEY);
  }

  link_message(integer sender_num, integer num, string str, key id) {
    if (num==-727001) {
      llSay(0, "API Answer: \n\t"+str
      +"\n\tDevice: "+(string)id+" ["+llKey2Name(id)+"]"
      +"\n\tOwner: "+(string)llGetOwnerKey(id)+" ["+llKey2Name(llGetOwnerKey(id))+"]"); 
    } else if (num==10011) {
      llSay(0, "Xcite! Answer: \n\t"+str
      +"\n\tDevice: "+(string)id+" ["+llKey2Name(id)+"]"
      +"\n\tOwner: "+(string)llGetOwnerKey(id)+" ["+llKey2Name(llGetOwnerKey(id))+"]"); 
    }
  }

}

Auto-Throbbing

#!c
// This example will send "twitch" command to genitals owned. Includes toggle by touch 
// by llGetOwner() by random interval


// To say chosen state or not
integer echo=TRUE;

integer on=FALSE;

// Change this if you wish some prim to show the status
updateStatus() {
  if (on) {  
    // llSetLinkPrimitiveParamsFast(2, [PRIM_COLOR, 0, <1,1,1>, 1]);
  } else {
    // llSetLinkPrimitiveParamsFast(2, [PRIM_COLOR, 0, <0.5,0.5,0.5>, 1]);
  }
}


refresh(integer say) {
  if (on) {  
    llMessageLinked(LINK_THIS,(-727000),"twitch",llGetOwner());
    if (say) llInstantMessage(llGetOwner(), "[Private Message] Auto throbbing is enabled.");  
    llSetTimerEvent(llFrand(1)+1.5); // Don't make it faster than once per second
  } else {
    if (say) llInstantMessage(llGetOwner(), "[Private Message] Auto throbbing is disabled.");  
    llSetTimerEvent(FALSE);
  }
  updateStatus();
}

default {
  state_entry() {
    llMessageLinked(LINK_THIS, -727000, "resetFilter", NULL_KEY); // Reset API filter to default
    refresh(echo);
  }

  touch_start(integer num_detected) {
    on=!on;
    refresh(echo);
  }

  timer() {
    refresh(FALSE);        
  }
}

Using Undocumented hF Flag

#!c
// Demonstration of using an undocumented "hF" flag that hides specific cock parts

integer ANNOUNCE_INCOMING = FALSE;

integer toggle;

integer FLAG_PRIM_KNOB  = 0x01;
integer FLAG_PRIM_SHAFT = 0x02;
integer FLAG_PRIM_BALLS = 0x04;
integer FLAG_PRIM_HAIR  = 0x08;
integer FLAG_PRIM_FASCIA= 0x10;

integer getWhatToHideFlags() {
  return FLAG_PRIM_KNOB | FLAG_PRIM_SHAFT | FLAG_PRIM_HAIR;   
}

default {
  state_entry() {
    llMessageLinked(LINK_THIS, -727000, "resetFilter", NULL_KEY); // Reset API filter to default
  }

  touch_start(integer count) {
    toggle=!toggle;
    if (toggle) {
      llMessageLinked(LINK_THIS, -727000, "on|||||hF="+(string)getWhatToHideFlags(), llGetOwner());
    } else {
      llMessageLinked(LINK_THIS, -727000, "on|||||hF=0", llGetOwner());
    }
  }

  link_message(integer sender_num, integer num, string str, key id) {
    if (num==-727001) {
      // To listen messages coming from the same owner as the script, uncomment this line:
      // if (llGetOwnerKey(id)!=llGetOwner()) return;
      if (ANNOUNCE_INCOMING) {
        llSay(0, "API Answer: \n\t"+str
        +"\n\tDevice: "+(string)id+" ["+llKey2Name(id)+"]"
        +"\n\tOwner: "+(string)llGetOwnerKey(id)+" ["+llKey2Name(llGetOwnerKey(id))+"]"); 
      }
    }
  }
}

Compatibility with Xcite!

Since version [2017h] compatibility with Xcite! API is stripped by default. If you need it please contact Ray Silent

We've added a very limited support to Xcite! commands due to total absence of automatic excitement and cum features in Aeros. So only angle change is supported. To use compatibility you still need to include Aeros Genitals API script into the prim that issues Xcite! commands.

See Full Example above.

Supported Command 20010 (Info Query)

#!c
llMessageLinked(LINK_SET, 20010, "nameOfAvatar", "");
linked message answer will contain fields as following:
num=10011
str=clit | cock | herma
Difference from Xcite!: The answer will contain a <key> of genitals prim in a linked message (in id field). Also we’ll return herma for hermaphrodite genitals (when they appear on the market).

Supported Command 20020 (Tilt)

#!c
llMessageLinked(LINK_SET, 20020, "nameOfAvatar|50", ""); // 50 is a number in degrees from -90 to 90 (limits are not mentioned in Xcite! API docs)

There will be no answer to this message.

Attention! Name of the avatar (nameOfAvatar) is Case Sensitive! Should follow llKey2Name format. Shouldn't trim "Resident"

Difference from Xcite!: Aeros compatibility script will translate the number provided into level angle. Hardness will not be affected by the tilt. Restore tilt command will be skipped.

Compatibility with AVsitter™

Some creators want their products to provide automatic tilting feature. Also individual furniture owners might want to add this ability to the items they own, as long as they have modify rights. For the method described here you need a ** Aeros Partner API Script ** included in the object along with the AVsitter plugin script.

Capabilities

  • Full support of stages of hardness, vertical and horizontal angles

How to Obtain the AVsitter™ Aeros Plugin

  • Copy-only ** Aeros Partner API Script ** since version [2017h] has the ** Aeros AVsitter Plugin ** included. Please update your box via Redelivery Terminal at the store (links in Ray Silent profile) to get one.

  • For the copy-trans version please contact Ray Silent and get your personal ** Aeros AVsitter Plugin ** script, if you already own copy-trans ** Aeros Partner API Script **. Otherwise look above for instructions how to apply for the copy-trans version.

Usage

It could be useful to start working with the script by placing all Aeros-related scripts and notecards into a linked prim rather than the prim where animations reside. That would save a lot of time in case anything has to be changed in the notecard or an additional memory script ("Extra DB") has to be added. It could be a temporary prim created by the owner (when the copy-trans version is used and requires that). The prim can be renamed to remind a creator that it is a temporary location. Once angle recording is finished and everything passes the test, all items can be moved to the root prim and the temporary linked prim can be deleted, if desired.

Note: The Aeros scripts and notecards can be kept in that prim, as long as the name of the prim is recognizable by the end users when they get a notification from the object attempting to manipulate their Aeros Cock. Not the root object name is printed in that case.

Help Message

Once added to the item, the script will print out the following help message:

(æ) Aeros AVsitter Plugin - record and auto-restore Aeros Cock angles
[!] Can be placed into any prim in a linkset to avoid slow inventory reloads. Give it a nice name

[X] Notecard "** Aeros AVsitter Plugin ** EditMode [ON]" activates Edit Mode.
* Navigate to the animation.
* For each sitting avatar with Aeros Cock:
* [!] Once prompted, give permissions to manipulate the cock(s) via [ Devices… ]>[ What… ] menu.

* Use Aeros Cock HUD:
Move Orange Arrow or Horizontal Angle Slider: [] ADD/MODIFY the record.
DOUBLE-Click PRECUM (Blue): Temporarily Turn Recording [ ON ] / [ OFF ]
DOUBLE-Click STOP (Between Yellow & Pink): [] DELETE CURRENT record.
DOUBLE-Click CUM (White): DUMP ALL recorded angles to the Nearby Chat.
DOUBLE-Click SPLASH (Pink): DUMP ALL & [] DELETE ALL records.

* Use "** Aeros AVsitter Plugin ** Data" notecard for storage.
* wiki page

This is basically describing how to use the plugin.

Status Report

Periodically the status is printed as following:

(æ) FreeMem: [ 21K ] Extra DBs: [ 1 ] APIScript: [ OK ] Edit Mode: [ ON ] Recording: [ ON ].

Where:

  • FreeMem: [ 21K ] - only tells you how much memory is left at the main AVsitter Plugin script. This does not count extra db scripts that might be added when necessary
  • Extra DBs: [ 1 ] - means there is "1" extra db script is found
  • APIScript: [ MISSING ] tells you that ** Aeros Partner API Script ** wasn't found. It makes the script impossible to listen or issue commands to aeros genitals sitting on the object.
  • APIScript: [ OUTDATED ] gives you a clue to update API script to a more recent version.
  • APIScript: [ MULTIPLE] tells you to remove unnecessary API script(s) and leave only one.
  • Edit Mode: [ OFF ] tells you that data recordings is deactivated since the Notecard ** Aeros AVsitter Plugin ** EditMode [ON] is not present.
  • Recording: [ OFF ] means that recording has been temporarily disabled

Aeros AVsitter Plugin Modes

The same script works in two modes:

Edit Mode [ ON ]

This is active when a particular item is found in the object inventory, namely, ** Aeros AVsitter Plugin ** EditMode [ON]. It can be an empty notecard. In this mode:

  • Anyone sitting on the prim can switch temporarily the Recording mode on/off by DOUBLE-Clicking the PRECUM button (colored blue).
  • Dump (DOUBLE-Click CUM (White)) and Dump & Delete All (DOUBLE-Click SPLASH (Pink)) commands are also available to anyone.

Note: Remove or rename the ** Aeros AVsitter Plugin ** EditMode [ON] notecard if you plan to have your product rezzed at the store to prevent the records being messed up. This might be also useful when the product is ready for shipping.

  • When the Temporarily Recording is [ ON ], all sitters cocks (if more than one) will be listened by the script. Every angle change will be printed out to the Nearby Chat and saved into the Plugin script memory or extra db script(s) memory(ies). The script also sends commands back to the cock(s) upon animation changes so that the product creator(s) can monitor what has been recorded. The Plugin script forces the cock to be visible back when the data exists.
  • DOUBLE-Click stop (right under yellow button) works per sitter(!!!) in order to remove a record. This doesn't remove records for the other sitters of the same animation (read "button").

Edit Mode [ OFF ]

This mode becomes active when the notecard ** Aeros AVsitter Plugin ** EditMode [ON] is removed or renamed. No changes are possible in this mode. Only restoring of the cock state is happening. The plugin will not force the cock(s) to become visible if it has been hidden by the owner(s).

  • Reading from the notecard is always enabled in case scripts are restarted or the notecard changes.

Aeros AVsitter Plugin Extra DB

Since plugin's [2019a] version the box also comes with the ** Aeros AVsitter Plugin Extra DB ** script. This one is extra, optional, useful when a lot of data for animations are to be recorded. That depends alot on how long the names of the animations are, and whether bento hands appended animations are used etc.

The main plugin script will orchestrate when Extra DB might be necessary or unnecessary. When to use it and how. For example, when the main plugin is running out of memory it will say in Nearby Chat to add an Extra DB script. This may be asked to do later on. The same exact script will have to be dropped in. The inventory will automatically rename the scripts by appending 1, 2 etc. to the names, so nothing has to be done other than just dropping them in.

Usually more memory is needed when the recording is going on. Therefore, when all the data is moved into the notecard, the script might say that such and such Extra DB script is not necessary BEING EMPTY. Make sure to follow these directions so that as less scripts are left as possible.

Using the Aeros AVsitter Plugin

Prerequisite

  • AVsitter scripts are working
  • ** Aeros AVsitter Plugin ** is included
  • ** Aeros Partner Script API ** is included
  • ** Aeros AVsitter Plugin ** EditMode [ON] notecard is placed to activate EditMode
  • ** Aeros AVsitter Plugin ** Data notecard is created and added (In theory this is optional if you only want to keep data in the memory. In practice it might be dangerous not to have a backup with all the data)

Note: The plugin script starts working in Edit Mode only when those requirements are met. Before you pass the product to someone else, make sure you remove EditMode notecard or rename it so it works in user mode by only restoring sitting avatar tilting commands.

Recording

  • Start by navigating to a desired animation.

Once you reach an animation where you want the cock(s) to be automatically positioned, tilt every cock (if there's several like MMF animations) using Cock's HUD(s):

  • Switch the cock ON (if it was hidden)
  • Move the orange arrow to tilt vertically and change the stage of hardness
  • Click the (<->) button in the middle of orange arrow and tilt the cock horizontally - if required

That operation will actually add or overwrite the data stored in the plugin script(s) memory. (Just switching the cock ON will actually already send the data too!) Adjust as many times as you want. Go back to the same menu and repeat according to your creation style. Everything is stored in the script's memory automatically.

Note: Each sitter, whether one or several, who you want to have tilting data saved, should put on any model of the Aeros Cocks (version [5.0] and higher). We made sure that the angles of different models are consistent and only slightly vary.

Playing

Here comes the part when the cock will notify its owner that such and such device (item) is attempting to control it. This is not going to happen any eariler so keep your eye on the messages in Nearby Chat. This is very important to follow what is said by the cocks in Nearby Chat and give proper permissions, otherwise nothing will visibly change. Provide permissions that at least allow tilting by simply switching to each avatar (if you are using alts) and clicking own cock objects, and proceeding to Devices > Select... (renamed to Which... since [6.1]) menu. Obviously each cock should have their Devices > Mode.. set to something else than Off. For development, Auto is recommended (read the Note below). And the Set Perms... has to contain (they are set by default): * ☒ Angles - Change Angles * ☒ On/Off - Turn On/Off That is exactly the same permission mechanism as your customers will see once they receive the product.

Note: Please note that to prevent lags and conflicts (as well as questions about priorities), only one device is allowed to manipulate the cock at a time. Also device owners do not get notified again about the same recent device's desire to issue commands. So if they don't see their cocks tilted according to animations, it might be because another device is selected and became current. Going to back to selection menu is one way. The other one is to set Devices > Mode... to Auto.

Repeat the animation after permission has been provided.

Saving

Once in a while, dump the data (DOUBLE-Click CUM (White)). Substitute what is in the ** Aeros AVsitter Plugin ** Data notecard with what has been printed out.

Note: Extra DB scripts will also print out what's in them. Make sure to append that data as well. Note: It might be a good idea to remove regular chat lines to make notecard loading process faster. But those lines could be kept without a problem, since only the lines starting with æ| will be recognized.

** Aeros AVsitter Plugin ** Data has to reside in the same prim in order to be read.

Note: You can skip creating the notecard at all and just never erase the data from Plugin script's memory. The data will not survive if you move the script into another object though. You'll have to use the notecard for that case as well as for backing data up and importing it back into the script's memory.

Deleting

If you wish, you can delete all the data you have saved in the script's memory by double-clicking the SPLASH (pink colored) button right on the Cock HUD. That will first Dump and then Delete everything that was in the script's memory. If you do that after the data was automatically read from the notecard, you'll be able to append new recorded data to the notecard. Double-clicking SPLASH is only a preference, if you like working and backing up in chunks. Keep in mind that each time upon saving the notecard, the data will be actually re-read back to the script's memory. Keep your eye on the Nearby Chat.

Testing

Repeat according to your style until you finish all the animations you want the cock to be tilted for. Replay animations randomly to see that the cock(s) are actually changing their positions according to the created data.

Dump the data, save to the notecard and see what is reported back. Follow directions to add/remove Extra DB script(s).

Tips & Tricks

  • Double-click the HUD's "stop" button when you notice that the tilting data was created where is was not necessary. In Edit Mode the cock will be switched "ON" back automatically when there is a data in your next animation. (In user mode the script is less demanding. It only sends a command to the cock - when it's already switched ON).

  • When the cock is hidden, any of the CUM / SPLAH / PRECUM buttons do not work.

  • Remove the first of three last numbers (the line will look like that, for example, æ|1|sensual BJ|SensualBJ-1M||-0.017453|0) in order to make the cock hardness level untouched.

  • You may any time walk through the notecard (if you decided to create one) and manually remove the lines that you don't want to appear.

Troubleshooting

  • When you drop in a notecard from another product and see that the angles seem not restoring, check if the sitter # matches with the æ|0| number in the notecard. It may happen that the sitter is actually numbered as #1, so just replace all æ|0| with the æ|1|.

Using AVsitter ADJUST Menu

Since version [2019a], ADJUST AVsitter menu can be used to offer owners or users of the furniture to switch Aeros API Script on and off. A notification message will be sent to the one who initiated this change. There is three different linked messages to use:

  • -7279990 - to switch off
  • -7279991 - to switch on
  • -7279992 - to toggle on / off

In order to have two buttons, one for ON and another for OFF, add the following line in your AVsitter notecard:

ADJUST [Aeros Off]|-7279990|[Aeros On]|-7279991

For just one button to toggle ON / OFF:

ADJUST [Aeros Toggle]|-7279992

Keep in mind, that if you already have the ADJUST line in your AVsitter notecard, you'll need to append these <name>|<number> values to the existing line with additional | right in front.

Alternatively, create a separate button that acts as a sub-menu as following:

MENU Settings
BUTTON [Aeros Off]|-7279990
BUTTON [Aeros On]|-7279991

Automatic Precum and Splash

Adding automatic fluids according to some animations and timeouts could be done with a custom script.

Please keep in mind that we discourage automatic cum. So think of automatic precum & splash fluids as something to provide instead. In some rare cases cum is expected. Please use common sense and make sure you explain to your customers how to disable this feature using Devices > Perms... cock menu, otherwise unexpected cums might discourage them. Provide a custom button in AVsitter menu to switch automatic fluids on/off as well.

Why not making a universal script? Because usually the sequence of when and how the fluids should be emitted and stopped is very much tied to the product, so it cries for a custom script. Very packed with logic universal script would only contribute to lag. So here's an example of a script that would issue particular fluids when the right animation is played and when a timeout has been reached. Then it stops auto-issued fluid when it leaves the spot.

//(TODO)

default {
  state_entry() {
  }
}

Suggestions

Please send your suggestions and bug reports to Ray Silent in-world.

Updated