Wiki
Clone wikiAeros API / Home
Aeros :: Aeros API
WARNING Text below may contain adult terms and expressions
- Aeros :: Aeros API
- Aeros Genitals API
- About Aeros in Second Life™
- Aeros Partner API Script
- API Commands
- Outgoing Commands
- Outgoing Command: getInfo; Incoming Message: info
- Outgoing Command: getStatus; Incoming Message: on or off
- Outgoing Command: off; Incoming Message: (the same as in getStatus)
- Outgoing Command: on; Incoming Message: (the same as in getStatus)
- Outgoing Command: set; Incoming Message: (the same as in getStatus)
- Outgoing Command: flowStart; Incoming Message: flowStart
- Outgoing Command: flowParams; (No Incoming Message)
- Outgoing Command: flowStop; Incoming Message: flowStop
- Outgoing Command: twitch; Incoming Message: twitch
- Outgoing Command: twitchStart; Incoming Message: twitchStart
- Outgoing Command: twitchStop; Incoming Message: twitchStop
- Incoming Message: touch
- Outgoing Command: rlv; (No Incoming Message)
- Outgoing Command: getPermissions; Incoming Message: permissions
- Outgoing Command: getPermFlags; Incoming Message: permFlags
- Outgoing Command: restrictPermFlags; Incoming Message: permFlags|internal (the same as in getPermFlags)
- Permissions
- Full Examples
- Compatibility with Xcite!
- Compatibility with AVsitter™
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:
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:
- Ray Silent - Developer
- Aeros Spot - Support
- Faeros Kroll - Artist, Designer
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 withGenitals >= [5.0]
, includingGenitals >= [6.0]
API >= [2016a]
- updated API, backward compatible with [2015a], supports bothGenitals >= [5.0]
and new features introduced inGenitals >= [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 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; } }
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 hiddenon|<headMode>|<stage>|<verticalAngle>|<horizontalAngle>|<settings>
- when shown with the following params:- <headMode> represent a float number between
0
and1
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
andPI/2
and stands for angle starting from down to up - <horizontalAngle> is a horizontal angle from
-PI/4
toPI/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 forgetStatus|full
request
- <headMode> represent a float number between
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) to1
(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) toPI/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 ason
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
orknob
- <direction> -
down
orside
- <type> -
pre
,splash
,cum
orpee
- <force> - number between
0.0
to1.0
showing the force from minimum to maximum allowable. If not provided, the value of0.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 toflowStart|knob|side|cum|0.5
pee
- equal toflowStart|knob|side|pee|0.5
pre
- equal toflowStart|knob|down|pre|0.5
Note: The answer will correspondingly repeat request message as in
flowStart
upon success
Outgoing Command: flowParams
; (No Incoming Message)
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
orpee
- <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 sendtwitchStop`` command together with
flowStop`` 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
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)
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 only2
- Change angles and foreskin, turn on/off3
- Change angles and foreskin, turn on/off, flows4
- Change angles and foreskin, turn on/off, flows, animations, settings5
- 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
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 usingrestrictPermFlags|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
)
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 passing1
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
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:
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", "");
num=10011 str=clit | cock | herma
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 followllKey2Name
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...
toAuto
.
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