Skip to content
lsl.devlsl.devLSL Dev

game_control

event
Event syntax
game_control(
  1. key id,// UUID of the avatar supplying controller input.
  2. integer button_levels,// A 32-bit mask representing the canonical buttons currently held down on the controller. Values: GameControlButton
  3. list axes// A list of six float values in the range [-1.0, 1.0] representing canonical controller axes.
) { … }

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.

How to use
game_control(key id, integer button_levels, list axes)
{
}
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
  • 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
Example 1
58 collapsed lines
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);
}
}

LSL Game Control Beta

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.