286 lines
9.8 KiB
Text
286 lines
9.8 KiB
Text
/*
|
|
* [AV]helperscript - Setup aid, to move poses by moving an object
|
|
*
|
|
* 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 registration_product = "AVsitter2";
|
|
string product = "AVhelper";
|
|
string #version = "2.2";
|
|
integer OLD_HELPER_METHOD;
|
|
list colors = [<1,0.5,1>, <0.5,0.5,1>, <1,0.5,0.5>, <0.5,1,0.5>, <1,1,0.5>, <0.5,1,1>];
|
|
integer helper_index;
|
|
float alpha;
|
|
integer sitter_number;
|
|
key CURRENT_AV;
|
|
integer comm_channel;
|
|
string base_object_name = "[AV]helper";
|
|
vector ball_size = <0.2,0.2,0.2>;
|
|
vector default_size = <0.12,0.12,3.5>;
|
|
key key_request;
|
|
vector my_pos;
|
|
rotation my_rot;
|
|
list A = [CURRENT_AV]; // Force error in LSO //OSS::
|
|
|
|
stop_all_anims()
|
|
{
|
|
if (llAvatarOnSitTarget()) // OSS::if (llAvatarOnSitTarget() != NULL_KEY)
|
|
{
|
|
if (llGetPermissions() & PERMISSION_TRIGGER_ANIMATION)
|
|
{
|
|
if (llGetAgentSize(llGetPermissionsKey()) != ZERO_VECTOR)
|
|
{
|
|
list anims = llGetAnimationList(llGetPermissionsKey());
|
|
integer n;
|
|
for (n = 0; n < llGetListLength(anims); n++)
|
|
{
|
|
llStopAnimation(llList2String(anims, n));
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
set_text()
|
|
{
|
|
string text = "▽";
|
|
integer i;
|
|
string t = "SITTER";
|
|
if (llGetStartParameter() < -1000000000)
|
|
{
|
|
t = "PRIM";
|
|
}
|
|
for (i = 0; i < sitter_number % 5; i++)
|
|
{
|
|
text += "\n \n ";
|
|
}
|
|
text = t + " " + (string)helper_index + "\n" + text;
|
|
llSetText(text, llList2Vector(colors, helper_index % llGetListLength(colors)), 1);
|
|
}
|
|
|
|
setup()
|
|
{
|
|
alpha = llList2Float(llGetPrimitiveParams([PRIM_COLOR, 0]), 1);
|
|
CURRENT_AV = llList2Key(A, 0); //OSS::CURRENT_AV = "";
|
|
A = []; //OSS::
|
|
vector size = default_size;
|
|
if (llGetCreator() != llGetInventoryCreator(llGetScriptName()))
|
|
{
|
|
size = llGetScale();
|
|
}
|
|
integer i;
|
|
for (i = 0; i < sitter_number; i++)
|
|
{
|
|
size -= <0.001,0.001,0.>;
|
|
}
|
|
set_text();
|
|
llSetObjectName(base_object_name + " " + (string)helper_index);
|
|
if (llGetCreator() == llGetInventoryCreator(llGetScriptName()))
|
|
{
|
|
llSetLinkPrimitiveParamsFast(LINK_THIS, [PRIM_TYPE, PRIM_TYPE_BOX, PRIM_HOLE_DEFAULT, <0,1,0>, 0, ZERO_VECTOR, <1,1,0>, ZERO_VECTOR, PRIM_TEXTURE, ALL_SIDES, TEXTURE_BLANK, <1,1,0>, ZERO_VECTOR, 0, PRIM_COLOR, ALL_SIDES, llList2Vector(colors, helper_index % llGetListLength(colors)), alpha, PRIM_COLOR, 1, <1,1,1>, alpha, PRIM_COLOR, 3, <1,1,1>, alpha, PRIM_SIZE, size]);
|
|
}
|
|
else
|
|
{
|
|
llSetLinkPrimitiveParamsFast(LINK_THIS, [PRIM_COLOR, ALL_SIDES, llList2Vector(colors, helper_index % llGetListLength(colors)), alpha, PRIM_SIZE, size]);
|
|
}
|
|
llRegionSay(comm_channel, "REG|" + (string)sitter_number);
|
|
}
|
|
|
|
default
|
|
{
|
|
state_entry()
|
|
{
|
|
llSetText("", <1,1,1>, 1);
|
|
llSetObjectName(base_object_name);
|
|
if (llGetCreator() == llGetInventoryCreator(llGetScriptName()))
|
|
{
|
|
llSetLinkPrimitiveParamsFast(LINK_THIS, [PRIM_TEXTURE, ALL_SIDES, TEXTURE_BLANK, <1,1,0>, <0,0,0>, 0, PRIM_FULLBRIGHT, ALL_SIDES, TRUE, PRIM_COLOR, ALL_SIDES, llList2Vector(colors, 0), 0.7, PRIM_GLOW, ALL_SIDES, 0.]);
|
|
}
|
|
else
|
|
{
|
|
llSetLinkPrimitiveParamsFast(LINK_THIS, [PRIM_TEXTURE, ALL_SIDES, TEXTURE_BLANK, <1,1,0>, <0,0,0>, 0, PRIM_FULLBRIGHT, ALL_SIDES, TRUE]);
|
|
}
|
|
integer everyonePerms = llGetObjectPermMask(MASK_EVERYONE);
|
|
if ((everyonePerms & PERM_MOVE) == 0 && llGetOwner() == llGetInventoryCreator(llGetScriptName()))
|
|
{
|
|
llOwnerSay("WARNING! AVhelper should be set to 'Anyone Can Move'");
|
|
}
|
|
llSitTarget(-<0,0,0.35>, ZERO_ROTATION);
|
|
llSetStatus(STATUS_PHANTOM, TRUE);
|
|
}
|
|
|
|
on_rez(integer start)
|
|
{
|
|
llResetTime();
|
|
llSetClickAction(CLICK_ACTION_TOUCH);
|
|
if (start == 0)
|
|
{
|
|
llSetTimerEvent(0);
|
|
llSetText("", <1,1,1>, 1);
|
|
if (llGetCreator() == llGetInventoryCreator(llGetScriptName()))
|
|
{
|
|
llSetLinkPrimitiveParamsFast(LINK_THIS, [PRIM_SIZE, ball_size]);
|
|
}
|
|
}
|
|
else
|
|
{
|
|
helper_index = start % 1000 * -1;
|
|
sitter_number = helper_index;
|
|
if (start < -1000000000)
|
|
{
|
|
helper_index = sitter_number = 0;
|
|
}
|
|
comm_channel = llFloor(start / 1000) * 1000;
|
|
llListen(5, "", "", "");
|
|
llListen(comm_channel, "", "", "");
|
|
setup();
|
|
}
|
|
}
|
|
|
|
listen(integer chan, string name, key id, string msg)
|
|
{
|
|
if (chan == 5 && id == CURRENT_AV)
|
|
{
|
|
key av = (key)msg;
|
|
if (av) // OSS::if (osIsUUID(av) && av != NULL_KEY)
|
|
{
|
|
if (llGetAgentSize(av) != ZERO_VECTOR)
|
|
{
|
|
list avatar_location = llGetObjectDetails(av, [OBJECT_POS, OBJECT_ROT]);
|
|
if (llVecMag(llGetPos() - llList2Vector(avatar_location, 0)) < 10)
|
|
{
|
|
llSetLinkPrimitiveParamsFast(LINK_THIS, [PRIM_POSITION, llList2Vector(avatar_location, 0), PRIM_ROTATION, llList2Rot(avatar_location, 1)]);
|
|
}
|
|
else
|
|
{
|
|
llRegionSayTo(id, 0, "Avatar too far away.");
|
|
}
|
|
}
|
|
else
|
|
{
|
|
llRegionSayTo(id, 0, "Avatar not found nearby.");
|
|
}
|
|
}
|
|
}
|
|
if (llGetOwnerKey(id) == llGetOwner())
|
|
{
|
|
list data = llParseString2List(msg, ["|"], []);
|
|
if (llList2String(data, 0) == "DONE" && llList2Integer(data, 1) == sitter_number || llList2String(data, 0) == "DONEA")
|
|
{
|
|
if (OLD_HELPER_METHOD)
|
|
{
|
|
if (llAvatarOnSitTarget()) // OSS::if (llAvatarOnSitTarget() != NULL_KEY)
|
|
{
|
|
stop_all_anims();
|
|
llRegionSay(comm_channel, "GETUP");
|
|
}
|
|
}
|
|
llDie();
|
|
}
|
|
else if (llList2String(data, 0) == "SWAP")
|
|
{
|
|
integer one = (integer)llList2String(data, 1);
|
|
integer two = (integer)llList2String(data, 2);
|
|
if (sitter_number == one)
|
|
{
|
|
sitter_number = helper_index = two;
|
|
setup();
|
|
}
|
|
else if (sitter_number == two)
|
|
{
|
|
sitter_number = helper_index = one;
|
|
setup();
|
|
}
|
|
}
|
|
else if (llList2Integer(data, 1) == sitter_number)
|
|
{
|
|
if (llList2String(data, 0) == "POS")
|
|
{
|
|
vector pos = (vector)llList2String(data, 2);
|
|
rotation rot = (rotation)llList2String(data, 3);
|
|
OLD_HELPER_METHOD = (integer)llList2String(data, 4);
|
|
CURRENT_AV = (key)llList2String(data, 5);
|
|
if (OLD_HELPER_METHOD)
|
|
{
|
|
llSetClickAction(CLICK_ACTION_SIT);
|
|
}
|
|
llSetLinkPrimitiveParamsFast(LINK_THIS, [PRIM_POSITION, pos, PRIM_ROTATION, rot]);
|
|
if (llGetPos() != pos)
|
|
{
|
|
llSetRegionPos(pos);
|
|
}
|
|
my_pos = llGetPos();
|
|
my_rot = llGetRot();
|
|
llSetTimerEvent(0.01);
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
timer()
|
|
{
|
|
if (my_pos != llGetPos() || my_rot != llGetRot())
|
|
{
|
|
my_pos = llGetPos();
|
|
my_rot = llGetRot();
|
|
llRegionSay(comm_channel, "MOVED|" + (string)sitter_number + "|" + (string)my_pos + "|" + (string)my_rot);
|
|
}
|
|
else if (llGetTime() > 86400) // auto-remove helper after 1 day
|
|
{
|
|
llDie();
|
|
}
|
|
}
|
|
|
|
changed(integer change)
|
|
{
|
|
if (change & CHANGED_LINK)
|
|
{
|
|
key av = llAvatarOnSitTarget();
|
|
if (OLD_HELPER_METHOD)
|
|
{
|
|
if (av) // OSS::if (osIsUUID(av) && av != NULL_KEY)
|
|
{
|
|
llRequestPermissions(av, PERMISSION_TRIGGER_ANIMATION);
|
|
llRegionSay(comm_channel, "ANIMA|" + (string)av);
|
|
}
|
|
else
|
|
{
|
|
stop_all_anims();
|
|
llRegionSay(comm_channel, "GETUP");
|
|
CURRENT_AV = "";
|
|
}
|
|
}
|
|
else if (av) // OSS::if (osIsUUID(av) && av != NULL_KEY)
|
|
{
|
|
llUnSit(av);
|
|
llDialog(av, product + " " + version + "\n\nDo not sit on the helper with AVsitter2 unless you have enabled the old helper mode. Move the helper while sitting on the furniture. Please see instructions at http://avsitter.com", ["OK"], -68154283);
|
|
}
|
|
}
|
|
}
|
|
|
|
touch_start(integer total_number)
|
|
{
|
|
if (llGetStartParameter() != 0)
|
|
{
|
|
llRegionSay(comm_channel, "MENU|" + (string)sitter_number + "|" + (string)llDetectedKey(0));
|
|
}
|
|
}
|
|
|
|
run_time_permissions(integer perm)
|
|
{
|
|
if (perm & PERMISSION_TRIGGER_ANIMATION)
|
|
{
|
|
llStopAnimation("sit");
|
|
}
|
|
}
|
|
}
|