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
| Constant | Value |
|---|---|
| GAME_CONTROL_BUTTON_SOUTH | 0x00000001 |
| GAME_CONTROL_BUTTON_A | 0x00000001 |
| GAME_CONTROL_BUTTON_EAST | 0x00000002 |
| GAME_CONTROL_BUTTON_B | 0x00000002 |
| GAME_CONTROL_BUTTON_WEST | 0x00000004 |
| GAME_CONTROL_BUTTON_X | 0x00000004 |
| GAME_CONTROL_BUTTON_NORTH | 0x00000008 |
| GAME_CONTROL_BUTTON_Y | 0x00000008 |
| GAME_CONTROL_BUTTON_BACK | 0x00000010 |
| GAME_CONTROL_BUTTON_GUIDE | 0x00000020 |
| GAME_CONTROL_BUTTON_START | 0x00000040 |
| GAME_CONTROL_BUTTON_LEFTSTICK | 0x00000080 |
| GAME_CONTROL_BUTTON_RIGHTSTICK | 0x00000100 |
| GAME_CONTROL_BUTTON_LEFTSHOULDER | 0x00000200 |
| GAME_CONTROL_BUTTON_RIGHTSHOULDER | 0x00000400 |
| GAME_CONTROL_BUTTON_DPAD_UP | 0x00000800 |
| GAME_CONTROL_BUTTON_DPAD_DOWN | 0x00001000 |
| GAME_CONTROL_BUTTON_DPAD_LEFT | 0x00002000 |
| GAME_CONTROL_BUTTON_DPAD_RIGHT | 0x00004000 |
| GAME_CONTROL_BUTTON_MISC1 | 0x00008000 |
| GAME_CONTROL_BUTTON_PADDLE1 | 0x00010000 |
| GAME_CONTROL_BUTTON_PADDLE2 | 0x00020000 |
| GAME_CONTROL_BUTTON_PADDLE3 | 0x00040000 |
| GAME_CONTROL_BUTTON_PADDLE4 | 0x00080000 |
| GAME_CONTROL_BUTTON_TOUCHPAD | 0x00100000 |
| Constant | Value |
|---|---|
| GAME_CONTROL_AXIS_LEFTX | 0x00000000 |
| GAME_CONTROL_AXIS_LEFTY | 0x00000001 |
| GAME_CONTROL_AXIS_RIGHTX | 0x00000002 |
| GAME_CONTROL_AXIS_RIGHTY | 0x00000003 |
| GAME_CONTROL_AXIS_TRIGGERLEFT | 0x00000004 |
| GAME_CONTROL_AXIS_TRIGGERRIGHT | 0x00000005 |
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.