/////////////////////////////////////////////////////////////////////////// // Copyright (C) Wizardry and Steamworks 2021 - License: GNU GPLv3 // // Please see: http://www.gnu.org/licenses/gpl.html for legal details, // // rights of fair usage, the disclaimer and warranty conditions. // /////////////////////////////////////////////////////////////////////////// /////////////////////////////////////////////////////////////////////////// // Copyright (C) 2015 Wizardry and Steamworks - License: CC BY 2.0 // /////////////////////////////////////////////////////////////////////////// string wasKeyValueGet(string k, string data) { if(llStringLength(data) == 0) return ""; if(llStringLength(k) == 0) return ""; list a = llParseStringKeepNulls(data, ["&", "="], []); integer i = llListFindList(llList2ListStrided(a, 0, -1, 2), [ k ]); if(i != -1) return llList2String(a, 2*i+1); return ""; } key sitting = NULL_KEY; vector destination = ZERO_VECTOR; integer channel = 0; default { state_entry() { channel = (integer)("0x8" + llGetSubString(llGetOwner(), 0, 6)); llListen(channel, "", "", ""); llSetTimerEvent(10); } listen(integer num, string name, key id, string message) { if(message == "DIE") { llDie(); } destination = (vector)wasKeyValueGet("destination", message); sitting = (key)wasKeyValueGet("avatar", message); if(destination == ZERO_VECTOR || sitting == NULL_KEY) { return; } state configured; } timer() { llDie(); } on_rez(integer num) { llResetScript(); } } state configured { state_entry() { llSitTarget(<0,0,1>, ZERO_ROTATION); llSetClickAction(CLICK_ACTION_SIT); llSetTimerEvent(10); } changed(integer change) { if(change & CHANGED_LINK) { key agent = llAvatarOnSitTarget(); if(agent == NULL_KEY) { llUnSit(agent); return; } if(agent == sitting) { llWhisper(channel, "OK"); state teleport; } llInstantMessage(agent, "Sorry, the teleporter is currently in use by: " + llList2String( llParseString2List( llKey2Name(sitting), [" "], [] ), 0 ) ); llUnSit(agent); return; } } timer() { llDie(); } on_rez(integer num) { llResetScript(); } } state teleport { state_entry() { // set timeout llSetTimerEvent(10); // clear sit position and action llSetRegionPos(destination); // request to set camera llRequestPermissions(sitting, PERMISSION_CONTROL_CAMERA); } run_time_permissions(integer perm) { // set the camera so the viewer follows the agent // this works if the viewer is not zoomed-in on // the teleport pad if(perm & PERMISSION_CONTROL_CAMERA) { llSetCameraParams([ CAMERA_ACTIVE, 1, CAMERA_BEHINDNESS_ANGLE, 45.0, CAMERA_BEHINDNESS_LAG, 0.5, CAMERA_DISTANCE, 8.0, CAMERA_FOCUS_LAG, 0.05 , CAMERA_FOCUS_LOCKED, TRUE, CAMERA_FOCUS_THRESHOLD, 0.0, CAMERA_PITCH, 20.0, CAMERA_POSITION_LAG, 0.1, CAMERA_POSITION_LOCKED, TRUE, CAMERA_POSITION_THRESHOLD, 0.0, CAMERA_FOCUS_OFFSET, <3,0,2> ]); llClearCameraParams(); } llSetTimerEvent(0.1); } timer() { key agent = llAvatarOnSitTarget(); if(agent != NULL_KEY) { llUnSit(agent); } llDie(); } on_rez(integer num) { llResetScript(); } }