AVsitter/AVsitter2/Plugins/AVprop/[AV]object.lsl
Sei Lisa f1ec6bde26 Add code that forces an error if compiled in LSO to all scripts
This should prevent accidents when saving in inventory in the official viewer.
2018-10-10 13:50:07 +02:00

279 lines
7.5 KiB
Text

/*
* [AV]object - Used in props for attaching, derezzing, etc.
*
* 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.020";
integer comm_channel;
integer local_attach_channel = -2907539;
integer listen_handle;
integer prop_type;
integer prop_id;
integer prop_point;
integer experience_denied_reason;
key originalowner;
key parentkey;
key give_prop_warning_request;
list A = [parentkey]; //OSS::list A; // Force error in LSO
unsit_all()
{
integer i = llGetNumberOfPrims();
while (llGetAgentSize(llGetLinkKey(i)) != ZERO_VECTOR)
{
llUnSit(llGetLinkKey(i));
i--;
}
}
integer verbose = 5;
Out(integer level, string out)
{
if (verbose >= level)
{
llOwnerSay(llGetScriptName() + "[" + version + "] " + out);
}
}
default
{
on_rez(integer start)
{
if (start)
{
state prop;
}
}
}
state prop
{
state_entry()
{
if (llGetLinkNumber() < 2)
{
if (llGetStartParameter() <= -10000000)
{
string start_param = (string)llGetStartParameter();
prop_type = (integer)llGetSubString(start_param, -1, -1);
prop_point = (integer)llGetSubString(start_param, -3, -2);
prop_id = (integer)llGetSubString(start_param, -5, -4);
comm_channel = (integer)llGetSubString(start_param, 0, -6);
listen_handle = llListen(comm_channel, "", "", "");
llSay(comm_channel, "REZ|" + (string)prop_id);
}
else
{
}
}
if (prop_type != 2 && prop_type != 1)
{
if (llGetInventoryType("[AV]sitA") == INVENTORY_NONE)
{
llSetClickAction(-1); // OSS::llSetClickAction(CLICK_ACTION_NONE);
}
}
else
{
llSetClickAction(CLICK_ACTION_TOUCH);
}
//LSL::
parentkey = llList2String(llGetObjectDetails(llGetKey(), [OBJECT_REZZER_KEY]) + A, 0);
A = [];
if(llGetStartParameter() && !llList2Integer(llGetObjectDetails(parentkey, [OBJECT_ATTACHED_POINT]), 0))
{
llSetTimerEvent(10);
}
else
{
llSetTimerEvent(0);
}
//::LSL
}
attach(key id)
{
if (comm_channel)
{
if (llGetAttached())
{
llListen(local_attach_channel, "", "", "");
llSay(comm_channel, "ATTACHED|" + (string)prop_id);
llSay(local_attach_channel, "LOCAT|" + (string)llGetAttached());
if (experience_denied_reason == 17)
{
if (llGetOwner() == originalowner)
{
list details = llGetExperienceDetails(""); // OSS::list details;
if (llList2String(details, 3) == "17")
{
llSay(comm_channel, "NAG|" + llList2String(details, 0));
}
}
}
}
else
{
llSay(comm_channel, "DETACHED|" + (string)prop_id);
}
}
}
touch_start(integer touched)
{
if ((!llGetAttached()) && (prop_type == 2 || prop_type == 1))
{
llRequestExperiencePermissions(llDetectedKey(0), ""); // OSS::llRequestPermissions(llDetectedKey(0), PERMISSION_ATTACH);
}
}
run_time_permissions(integer permissions)
{
if (permissions & PERMISSION_ATTACH)
{
if (llGetAttached())
{
llDetachFromAvatar();
}
else
{
llAttachToAvatarTemp(prop_point);
}
}
else
{
llSay(comm_channel, "DEREZ|" + (string)prop_id);
llDie();
}
}
//LSL::
experience_permissions(key target_id)
{
if (llGetAttached())
{
llDetachFromAvatar();
}
else
{
llAttachToAvatarTemp(prop_point);
}
}
experience_permissions_denied(key agent_id, integer reason)
{
originalowner = llGetOwner();
experience_denied_reason = reason;
llRequestPermissions(agent_id, PERMISSION_ATTACH);
}
//::LSL
on_rez(integer start)
{
if (!llGetAttached())
{
state restart_prop;
}
}
listen(integer channel, string name, key id, string message)
{
list data = llParseString2List(message, ["|"], []);
string command = llList2String(data, 0);
if (llList2String(data, 0) == "LOCAT" && llGetOwnerKey(id) == llGetOwner() && llList2String(data, 1) == (string)llGetAttached())
{
llRequestPermissions(llGetOwner(), PERMISSION_ATTACH);
}
else if (command == "ATTACHTO" && prop_type == 1 && (key)llList2String(data, 2) == llGetKey())
{
if (llGetAgentSize((key)llList2String(data, 1)) == ZERO_VECTOR)
{
llSay(comm_channel, "DEREZ|" + (string)prop_id);
llDie();
}
else
{
llRequestExperiencePermissions(llList2Key(data, 1), ""); // OSS::llRequestPermissions(llList2Key(data, 1), PERMISSION_ATTACH);
}
}
else if (llGetSubString(command, 0, 3) == "REM_")
{
integer remove;
if (command == "REM_ALL")
{
remove = TRUE;
}
else if (command == "REM_INDEX" || (command == "REM_WORLD" && !llGetAttached()))
{
if (~llListFindList(data, [(string)prop_id]))
{
remove = TRUE;
}
}
else if (llGetAttached() && command == "REM_WORN" && (key)llList2String(data, 1) == llGetOwner())
{
remove = TRUE;
}
if (remove)
{
if (llGetAttached())
{
llRequestPermissions(llGetOwner(), PERMISSION_ATTACH);
}
else
{
if (llGetAgentSize(llGetLinkKey(llGetNumberOfPrims())) != ZERO_VECTOR)
{
unsit_all();
llSleep(1);
}
llSay(comm_channel, "DEREZ|" + (string)prop_id);
llDie();
}
}
}
else if (message == "PROPSEARCH" && !llGetAttached())
{
llSay(comm_channel, "SAVEPROP|" + (string)prop_id);
}
}
//LSL::
timer()
{
if(llGetObjectMass(parentkey) == 0)
{
if(!llGetAttached())
{
llDie();
}
else
{
llRequestPermissions(llGetOwner(), PERMISSION_ATTACH);
}
}
}
//::LSL
}
state restart_prop
{
state_entry()
{
state prop;
}
}