The new versioning scheme uses a letter instead of the dash. The letter is a p for a work-in-progress/pre-release version, or an r for a release version. For example: 2.2p04 - work in progress for version 2.2r04 2.2r04 - release version (2.2-04 with the previous scheme) The two digit number will be increasing even for minor changes. The last minor changes indicator is dropped.
249 lines
8.4 KiB
Text
249 lines
8.4 KiB
Text
/*
|
|
* [AV]camera - Set pose-specific camera settings
|
|
*
|
|
* This Source Code Form is subject to the terms of the Mozilla Public
|
|
* License, v. 2.0. If a copy of the MPL was not distributed with this
|
|
* file, You can obtain one at http://mozilla.org/MPL/2.0/.
|
|
*
|
|
* Copyright © the AVsitter Contributors (http://avsitter.github.io)
|
|
* AVsitter™ is a trademark. For trademark use policy see:
|
|
* https://avsitter.github.io/TRADEMARK.mediawiki
|
|
*
|
|
* Please consider supporting continued development of AVsitter and
|
|
* receive automatic updates and other benefits! All details and user
|
|
* instructions can be found at http://avsitter.github.io
|
|
*/
|
|
|
|
string #version = "2.2p04";
|
|
string notecard_name = "AVpos";
|
|
string main_script = "[AV]sitA";
|
|
key notecard_key;
|
|
key notecard_query;
|
|
integer notecard_line;
|
|
integer notecard_section;
|
|
integer SCRIPT_CHANNEL;
|
|
string myPose;
|
|
key mySitter;
|
|
list camera_triggers = [myPose]; //OSS::list camera_triggers; // Force error in LSO
|
|
list camera_settings;
|
|
integer lastByButton = -1;
|
|
string lastPose;
|
|
|
|
integer get_number_of_scripts()
|
|
{
|
|
integer i = 1;
|
|
while (llGetInventoryType(main_script + " " + (string)i) == INVENTORY_SCRIPT)
|
|
{
|
|
i++;
|
|
}
|
|
return i;
|
|
}
|
|
|
|
integer verbose = 0;
|
|
|
|
Out(integer level, string out)
|
|
{
|
|
if (verbose >= level)
|
|
{
|
|
llOwnerSay(llGetScriptName() + "[" + version + "] " + out);
|
|
}
|
|
}
|
|
|
|
Readout_Say(string say, string SCRIPT_CHANNEL)
|
|
{
|
|
llSleep(0.2);
|
|
llMessageLinked(LINK_THIS, 90022, say, SCRIPT_CHANNEL);
|
|
}
|
|
|
|
set_camera(integer byButton)
|
|
{
|
|
if (mySitter) // OSS::if (osIsUUID(mySitter) && mySitter != NULL_KEY)
|
|
{
|
|
if (llGetPermissions() & PERMISSION_CONTROL_CAMERA)
|
|
{
|
|
if (llGetPermissionsKey() == mySitter)
|
|
{
|
|
integer index = llListFindList(camera_triggers, [myPose]);
|
|
if (index == -1)
|
|
{
|
|
if (~lastByButton)
|
|
{
|
|
index = lastByButton;
|
|
}
|
|
else
|
|
{
|
|
index = llListFindList(camera_triggers, ["DEFAULT"]);
|
|
}
|
|
}
|
|
if (~index)
|
|
{
|
|
if (byButton)
|
|
{
|
|
lastByButton = index;
|
|
}
|
|
list settings = llParseStringKeepNulls(llList2String(camera_settings, index), ["|"], []);
|
|
vector pos = (vector)llList2String(settings, 0) * llGetRot() + llGetPos();
|
|
vector focus = (vector)llList2String(settings, 1) * llGetRot() + llGetPos();
|
|
llSetCameraParams([CAMERA_ACTIVE, 1, CAMERA_FOCUS, focus, CAMERA_FOCUS_LOCKED, TRUE, CAMERA_POSITION, pos, CAMERA_POSITION_LOCKED, TRUE, CAMERA_FOCUS_OFFSET, <0,0,0>]);
|
|
}
|
|
else
|
|
{
|
|
llSetCameraParams([CAMERA_ACTIVE, 0]);
|
|
}
|
|
return;
|
|
}
|
|
}
|
|
llRequestPermissions(mySitter, PERMISSION_CONTROL_CAMERA);
|
|
}
|
|
}
|
|
|
|
default
|
|
{
|
|
run_time_permissions(integer perm)
|
|
{
|
|
if (perm & PERMISSION_CONTROL_CAMERA)
|
|
{
|
|
set_camera(FALSE);
|
|
}
|
|
}
|
|
|
|
state_entry()
|
|
{
|
|
camera_triggers = [];
|
|
SCRIPT_CHANNEL = (integer)llGetSubString(llGetScriptName(), llSubStringIndex(llGetScriptName(), " "), 99999);
|
|
notecard_key = llGetInventoryKey(notecard_name);
|
|
if (llGetInventoryType(notecard_name) == INVENTORY_NOTECARD)
|
|
{
|
|
Out(0, "Loading...");
|
|
notecard_query = llGetNotecardLine(notecard_name, 0);
|
|
}
|
|
}
|
|
|
|
link_message(integer sender, integer num, string msg, key id)
|
|
{
|
|
if (sender == llGetLinkNumber())
|
|
{
|
|
if (num == 90230 | num == 90231)
|
|
{
|
|
list data = llParseStringKeepNulls(id, ["|"], []);
|
|
key this_controller = (key)llList2String(data, 0);
|
|
key this_sitter = (key)llList2String(data, -1);
|
|
if (this_sitter == mySitter)
|
|
{
|
|
myPose = msg;
|
|
if (myPose == "RESET")
|
|
{
|
|
lastByButton = -1;
|
|
myPose = lastPose;
|
|
}
|
|
set_camera(TRUE);
|
|
if (num == 90230)
|
|
{
|
|
llMessageLinked(LINK_THIS, 90005, "", this_controller);
|
|
}
|
|
}
|
|
}
|
|
else if (num == 90045)
|
|
{
|
|
list data = llParseStringKeepNulls(msg, ["|"], []);
|
|
integer sitter = (integer)llList2String(data, 0);
|
|
if (sitter == SCRIPT_CHANNEL)
|
|
{
|
|
mySitter = id;
|
|
myPose = llList2String(data, 1);
|
|
lastPose = myPose;
|
|
set_camera(FALSE);
|
|
}
|
|
}
|
|
else if (num == 90065)
|
|
{
|
|
if (id == mySitter)
|
|
{
|
|
lastByButton = -1;
|
|
mySitter = NULL_KEY;
|
|
}
|
|
else
|
|
{
|
|
llSleep(0.1);
|
|
set_camera(FALSE);
|
|
}
|
|
}
|
|
else if (num == 90174 && (integer)msg == SCRIPT_CHANNEL)
|
|
{
|
|
integer i = llGetListLength(camera_triggers);
|
|
integer index;
|
|
while (~(index = llListFindList(camera_triggers, [myPose])))
|
|
{
|
|
camera_triggers = llDeleteSubList(camera_triggers, index, index);
|
|
camera_settings = llDeleteSubList(camera_settings, index, index);
|
|
}
|
|
if (id != "none")
|
|
{
|
|
camera_triggers += myPose;
|
|
camera_settings += (string)id;
|
|
llSay(0, "CAMERA saved to '" + myPose + "' for SITTER " + (string)SCRIPT_CHANNEL + ".");
|
|
llSay(0, "CAMERA " + myPose + "|" + (string)id);
|
|
}
|
|
else
|
|
{
|
|
llSay(0, "CAMERA cleared from '" + myPose + "' for SITTER " + (string)SCRIPT_CHANNEL + ".");
|
|
}
|
|
set_camera(FALSE);
|
|
}
|
|
else if (num == 90020 && ((string)id == llGetScriptName() || (string)id + " " + msg == llGetScriptName()))
|
|
{
|
|
if ((integer)msg == SCRIPT_CHANNEL)
|
|
{
|
|
integer i;
|
|
for (i = 0; i < llGetListLength(camera_triggers); i++)
|
|
{
|
|
Readout_Say("CAMERA " + llList2String(camera_triggers, i) + "|" + llList2String(camera_settings, i), msg);
|
|
}
|
|
llMessageLinked(LINK_THIS, 90021, msg, (string)id);
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
changed(integer change)
|
|
{
|
|
if (change & CHANGED_INVENTORY)
|
|
{
|
|
if (llGetInventoryKey(notecard_name) != notecard_key)
|
|
{
|
|
llResetScript();
|
|
}
|
|
}
|
|
}
|
|
|
|
dataserver(key query_id, string data)
|
|
{
|
|
if (query_id == notecard_query)
|
|
{
|
|
if (data == EOF)
|
|
{
|
|
Out(0, (string)llGetListLength(camera_triggers) + " Cameras Ready, Mem=" + (string)llGetFreeMemory());
|
|
}
|
|
else
|
|
{
|
|
data = llGetSubString(data, llSubStringIndex(data, "◆") + 1, 99999);
|
|
data = llStringTrim(data, STRING_TRIM);
|
|
string command = llGetSubString(data, 0, llSubStringIndex(data, " ") - 1);
|
|
list parts = llParseStringKeepNulls(llGetSubString(data, llSubStringIndex(data, " ") + 1, 99999), [" | ", " |", "| ", "|"], []);
|
|
string part0 = llStringTrim(llList2String(parts, 0), STRING_TRIM);
|
|
if (command == "SITTER")
|
|
{
|
|
notecard_section = (integer)part0;
|
|
}
|
|
else if (notecard_section == SCRIPT_CHANNEL && command == "CAMERA")
|
|
{
|
|
string part1 = llStringTrim(llDumpList2String(llList2List(parts, 1, 99999), "|"), STRING_TRIM);
|
|
list sequence = llParseString2List(part1, ["|"], []);
|
|
camera_triggers += part0;
|
|
camera_settings += part1;
|
|
}
|
|
notecard_query = llGetNotecardLine(notecard_name, ++notecard_line);
|
|
}
|
|
}
|
|
}
|
|
}
|