API/Link Messages

v7 beta documentation in progress. v7 beta documentation may be incomplete or inaccurate.
v7 functions and features may be significantly different from previous ACS versions.
These instructions are not valid for current v6+ ACS!


ACS uses internal link messages on channels between 150 and 1600. To avoid conflicts with your own scripts, you may prefer to use link message channels outside of this range when adding in systems that co-habitate a linkset.

I'm going to be documenting a selection of ACS internal link messages here for easier integration with other scripts (as time permits) and will provide example scripts to help you make add-ons.

If you add a script to the linkset, it can listen for certain link messages (such as ignition on/off) which you then can assign to functions in your own script.

This list will grow over time as I can get to it.

See also: ACS API commands.


Link messages to intercept:

Yes: indicates the message is sent out to the entire linkset (LINK_SET)
Root: indicates the message is only heard in the root prim (LINK_ROOT)

version: the earliest ACS version the commands will work with

whatever: means you can send this message from any script in the linkset and the rest will pick it up and respond.

Channel Message Key Info Linkset Note version
175 any (blank) Pass message to connected HUD Yes Message sent to Driver HUD LINK_SET v7.0
230 "1" (blank) Over water Yes Sent from Amphibian Sensor v7 beta
230 "0" (blank) Over land Yes Sent from Amphibian Sensor v7 beta
317 (blank) (blank) Previous Park Animation Root whatever v5
318 (blank) (blank) Next Park Animation Root whatever v5
489 Gear # (blank) Current gear # Yes reverse gear is 0 v7.0
576 "0" NULL_KEY Passenger Stood Yes Sent from Passenger Prim v6
576 "1" UUID Passenger Sat Yes Sent from Passenger Prim v6
578 "0" (blank) Headlights OFF Yes whatever v5
578 "1" (blank) Headlights ON Yes whatever v5
581 (blank) UUID Unauthorized sit attempt on locked vehicle Root Sent from Engine v5
582 (blank) (blank) Alarm Triggered Yes whatever v5
583 (blank) (blank) Alarm Stopped Yes whatever v5
659 (blank) (blank) Engine OFF Yes whatever v4
660 (blank) (blank) Engine ON Yes whatever v4
661 (blank) (blank) Burnout OFF Yes wheels and sound v4
662 (blank) (blank) Burnout ON Yes wheels and sound v4
663 (blank) (blank) Burnout Particles OFF Root v7 Received by ParticleSystem v4
664 (blank) (blank) Burnout Particles ON Root v7 Received by ParticleSystem v4
675 (blank) (blank) Eject Passengers Yes whatever v4
676 "0" (blank) Group Access Disabled Yes whatever v6
676 "1" (blank) Group Access Enabled Yes whatever v6
686 "0" (blank) Unlocked Yes whatever v6
686 "1" (blank) Locked Yes whatever v6
689 (blank) (blank) Flight Mode ON Yes whatever v4
696 "0" (blank) In reverse Yes Sent from Engine v5
696 "1" (blank) In forward gear Yes Sent from Engine v5
789 (blank) (blank) Flight Mode OFF Yes whatever v4
876 "0" NULL_KEY Driver Stood Yes Sent from Engine v6
876 "1" UUID Driver Sat (with StartParked OFF) Root Sent from Engine v6
876 "2" UUID Driver Sat (with StartParked ON) Root Sent from Engine v6
888 (blank) (blank) Turned Left Yes Sent from Engine v4
889 (blank) (blank) Turned Right Yes Sent from Engine v4
890 (blank) (blank) Turned Straight Yes Sent from Engine v4

Link messages to send to issue commands to ACS:

Linkset Yes: indicates the message is sent out to the entire linkset (LINK_SET)
Root: indicates the message is only directed at the root prim (LINK_ROOT)

Channel Message Key Info Linkset
200 (blank) user uuid Call vehicle menu No

Additional Link Message Commands

You can also send any of the v7 Driver HUD & Gesture API Commands from your own scripts as link messages to control vehicle systems. See the v7 Driver HUD & Gesture API Commands page.


Example of using the engine on/off link messages to do something in a script:

default
{
    link_message(integer sender_num, integer num, string message, key id)
    {
        if (num == 660)
        {
            llOwnerSay("Engine on!");
        }
        else
        if (num == 659)
        {
            llOwnerSay("Engine off!");
        }
    }
}

Example of detecting a passenger sitting:

//Place in root prim. Sends greeting to a passenger when they sit on a passenger prim
default
{
    link_message(integer sender_num, integer num, string message, key id)
    {
        if (num == 576)
        {
            if (message=="1")
            {
                llInstantMessage(id,"Hello "+llKey2Name(id));
            }
        }
    }
}

Example of triggering a different sound for every gear:

//Triggers a different sound for every gear change
//add a sound for each gear, add as many as you need. make sure no comma after the last sound in the list!! 

list soundlist = [
    "2601191f-c7f7-14be-7206-7aa999ef3d44", //reverse
    "18d06e87-8398-c8b9-450d-534446f8db84", //gear 1
    "0e4e1351-cc51-7fec-1d98-4997b8d3f041", //gear 2
    "69052600-8383-bb04-6091-cec2af82ae0e", //gear 3
    "487b3309-cd5d-b86d-418f-27de9118eac1", //gear 4
    "8803fe82-e99f-ccb1-cd41-eb4aa2ad9bd6", //gear 5
    "c18ca004-b06a-a145-bad8-6a7671f9cbaf", //gear 6
    "7b1e46d5-4cdf-a41b-88af-f803a7bd2c78", //gear 7
    "ae998638-bfaf-90e2-360e-1e8874b25804"  //gear 8 etc - make sure no comma after the last sound!! 
];

float volume = 1.0; //volume between 0.0 and 1.0

default
{
    link_message(integer sender_num, integer num, string message, key id)
    {
        if (num == 489)
        {
            if ((integer)message<llGetListLength(soundlist)) 
        {
            llTriggerSound(llList2Key(soundlist,(integer)message),volume);
        }
        }
    }
}

Example of making a passenger prim visible only when sat on:

This does not use the ACS link messages.

//Place in passenger prim along with a sit script. 
//This script does not add a llSitTarget() of its own and will not work without a passenger sit.

default
{
    changed(integer change)
    {
        if(change & CHANGED_LINK)
        {
            key Avatar = llAvatarOnLinkSitTarget(LINK_THIS);
            if (Avatar) 
            {
                llSetAlpha(1.0,ALL_SIDES);
            }
            else
            {
                 llSetAlpha(0.0, ALL_SIDES);
            }
        }
    }
}

Example of vehicle that can only be rezzed under a certain group tag:

This does not use the ACS link messages.

// Members Only Rez
// Kills an object on rezzing if not rezzed under the group key specified.
// Object must be no-modify to prevent removal of this script by the object owner
// Owner must rez the object with the group tag active, if not in the group the object will vanish/llDie().
// Owner must not have "Always rez objects under land group if possible" enabled in their viewer so the object will rez under the correct group. 
// (In Firestorm  this is under Preferences/Firestorm/General)
// - karyn vaher

key groupkey = "e20dc953-1b32-0880-28ff-9d845f40e52e"; //set the group key here!

default
{
    on_rez(integer x)
    {
        if (llList2Key(llGetObjectDetails(llGetKey(), [OBJECT_GROUP]),0)!=groupkey)
        {
            //put stuff here to happen if not in the group
            llDie();
        }
    }
}

[v7 Main]