Skip to content
lsl.devlsl.devLSL Dev

Game control

Looking for the current API? Open the game_control reference →

Wiki description

Triggered when compatible viewer sends fresh GameControlData message.
Requires the controlling agent to grant PERMISSION_GAME_CONTROL to the script. This permission is automatically granted if the script is attached or sat upon.

Specification

ConstantValue
GAME_CONTROL_BUTTON_SOUTH0x00000001
GAME_CONTROL_BUTTON_A0x00000001
GAME_CONTROL_BUTTON_EAST0x00000002
GAME_CONTROL_BUTTON_B0x00000002
GAME_CONTROL_BUTTON_WEST0x00000004
GAME_CONTROL_BUTTON_X0x00000004
GAME_CONTROL_BUTTON_NORTH0x00000008
GAME_CONTROL_BUTTON_Y0x00000008
GAME_CONTROL_BUTTON_BACK0x00000010
GAME_CONTROL_BUTTON_GUIDE0x00000020
GAME_CONTROL_BUTTON_START0x00000040
GAME_CONTROL_BUTTON_LEFTSTICK0x00000080
GAME_CONTROL_BUTTON_RIGHTSTICK0x00000100
GAME_CONTROL_BUTTON_LEFTSHOULDER0x00000200
GAME_CONTROL_BUTTON_RIGHTSHOULDER0x00000400
GAME_CONTROL_BUTTON_DPAD_UP0x00000800
GAME_CONTROL_BUTTON_DPAD_DOWN0x00001000
GAME_CONTROL_BUTTON_DPAD_LEFT0x00002000
GAME_CONTROL_BUTTON_DPAD_RIGHT0x00004000
GAME_CONTROL_BUTTON_MISC10x00008000
GAME_CONTROL_BUTTON_PADDLE10x00010000
GAME_CONTROL_BUTTON_PADDLE20x00020000
GAME_CONTROL_BUTTON_PADDLE30x00040000
GAME_CONTROL_BUTTON_PADDLE40x00080000
GAME_CONTROL_BUTTON_TOUCHPAD0x00100000
ConstantValue
GAME_CONTROL_AXIS_LEFTX0x00000000
GAME_CONTROL_AXIS_LEFTY0x00000001
GAME_CONTROL_AXIS_RIGHTX0x00000002
GAME_CONTROL_AXIS_RIGHTY0x00000003
GAME_CONTROL_AXIS_TRIGGERLEFT0x00000004
GAME_CONTROL_AXIS_TRIGGERRIGHT0x00000005

Caveats

  • If enabled at the client: avatar movements may be translated into GameControl input.
  • There is room for 32 buttons [bits 0 through 31] however at most only 16 buttons can be simultaneously held down at any one time.
  • There are currently always 6 axes values, even when the controller device has more or less
    • DO NOT read the axes list from the end, use negative indexes to access it, or assume it's length, the list may gain new axes over time
    • All axes elements will be in range [-1,1]
    • By default,
      • Left-tilting a thumbstick on GAME_CONTROL_AXIS_LEFTX or GAME_CONTROL_AXIS_RIGHTX yields a positive value, while right-tilting yields a negative value
      • Up-tilting a thumbstick on GAME_CONTROL_AXIS_LEFTY or GAME_CONTROL_AXIS_RIGHTY yields a positive value, while down-tilting yields a negative value
      • Pulling a trigger will increase the value of GAME_CONTROL_AXIS_TRIGGERLEFT or GAME_CONTROL_AXIS_TRIGGERRIGHT, while releasing will decrease the value

Examples

integer prev_button_levels = 0;
integer print_list(string name, integer type, list data)
{
    integer data_length = llGetListLength(data);
    string text = name + " : ";
    if (data_length > 0)
    {
        integer use_comma = FALSE;
        integer i = 0;
        for (i = 0; i < data_length; i++)
        {
            if (!use_comma)
            {
                use_comma = TRUE;
            }
            else
            {
                text += ",";
            }
            if (type == TYPE_INTEGER)
            {
                integer b = (llList2Integer(data, i));
                text += (string)(b);
                llOwnerSay("pack i=" + (string)(i) + " b=" + (string)(b));
            }
            else if (type == TYPE_FLOAT)
            {
                text += (string)(llList2Float(data, i));
            }
        }
    }
    llOwnerSay(text); 
    return data_length;
}

string bits2nybbles(integer bits)
{
    integer lsn; // least significant nybble
    string nybbles = "";
    do
        nybbles = llGetSubString("0123456789ABCDEF", lsn = (bits & 0xF), lsn) + nybbles;
    while (bits = (0xfffFFFF & (bits >> 4)));
    return nybbles;
}

default
{
    state_entry()
    {
        key agent = llGetOwner();
        llRequestPermissions(agent, PERMISSION_GAME_CONTROL);
        llRegionSayTo(agent, 0, "Accept the permissions request to proceed.");
    }
    
    run_time_permissions(integer perm)
    {
        if(perm & PERMISSION_GAME_CONTROL)
        {
            llOwnerSay("Received PERMISSION_GAME_CONTROL from " 
                + llKey2Name(llGetPermissionsKey())
                + ".  Ready for game_control events");
        }
    }

    game_control(key id, integer button_levels, list axes)
    {
        integer button_edges = button_levels ^ prev_button_levels;
        prev_button_levels = button_levels;

        string button_levels_hex = bits2nybbles(button_levels);
        string button_edges_hex = bits2nybbles(button_edges);
        llOwnerSay("game_control :");
        llOwnerSay("  button_levels=0x" + button_levels_hex);
        llOwnerSay("  button_edges=0x" + button_edges_hex);
        print_list("  axes", TYPE_FLOAT, axes);
    }
}

See also: functions

See also: events

See also: articles

Original wiki source

Some wiki templates and tables need their original context. View this article on the Second Life Wiki. Technical wording and examples are retained from the source; historical guidance may differ from current behavior.