| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321 |
- /*
- * teleporter_using_crystals.lsl
- * Part of the Sloodle project (www.sloodle.org)
- *
- * Copyright (c) 2011-06 contributors (see below)
- * Released under the GNU GPL v3
- * -------------------------------------------
- *
- * This program is free software: you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- * You should have received a copy of the GNU General Public License
- * along with this program. If not, see <http://www.gnu.org/licenses/>.
- *
- * All scripts must maintain this copyrite information, including the contributer information listed
- *
- * DESCRIPTION
- * This script was built for an adventure game which involves access to hidden chambers etc.
- * A user must collect a blue crystal, drop it onto the ground, to insert it into this teleporter
- * Once a crystal has been inserted, the teleporter will be activated for 30 seconds.
- * The teleporter makes use of the objects description input field, which you can find in the edit
- * box inside the Second Life viewer.
- * Enter in: CHANNEL:99882234,NAME:Teleporter,REZSOUND:SND_dancershort,DROPSOUND:SND_splash2
- * CHANNEL: is the channel the blue crystal will use to communicate with this teleporter
- * NAME is the name of the object which the blue crystal will set its sensors for, and when found, move towards
- * REZSOUND is the name of the sound file that will play when this teleporter is rezzed
- * After a crystal shouts an INSERT message into this script, this script will send a linked message to
- * sloodle_mod_touchable to see if the interaction (teleport) is allowed
- * sloodle_mod_touchable will contact the server, and respond via linked message if teleporting is allowed
- * ie: if the user's currency matches any restrictions placed in this objects configuration
- * if all restrictions have been fulfilled, the teleporter will teleport the sitting user to the destination
- * in the config.
- *
- * THIS VERSION IS FOR OPENSIM - llAvatarSitOnTarget doesnt work in Opensim, so the behavior is modified:
- * User must sdrop a crystal in to activate the teleporter, then sit, then click to tp
- *
- * For this script to function properly, it should have the following sounds inside
- * SND_POWER_DOWN
- * SND_POWER_UP
- * SND_SPARKS
- * SND_VORTEX
- *
- * Accompaning scripts:
- * sloodle_mod_touchable-1.0
- * sloodle_rezzer_object
- * sloodle_setup_notecard_httpin
- *
- * Contributors:
- * Paul Preibisch
- * Edmund Edgar
- * SND_SPARKS: http://www.freesound.org/people/Connum/
- */
- // The Long distance telport script license info is below:
- //Long distance teleport version 1.1
- // ----------------------------------
- // This script is based on other public domain free scripts, so I don't
- // take credit for any of the work here.
- // Bits and pieces combined by Lisbeth Cohen - plus added show/hide.
- //
- // The basics of the script is based on Till Sterling's simple teleport
- // script, with cross sim transportation routine developed by
- // Keknehv Psaltery, modified by Strife Onizuka, Talarus Luan and
- // Keknehv Psaltery.
- // The transportation functionality is based upon Nepenthes Ixchel's
- // 1000m Menu-driven Intra-Sim Teleporter
- //
- // Thank you to authors who have given me permission to publish this script.
- // A special thank you to Keknehv Psaltery for suggesting small improvements!
- //
- // Realeased as public domain - you are NOT allowed to sell it without the
- // permissions of all the authors I've credited above (except those who
- // may have left sl at the time)!
- // Feel free to use it in freebies and to give it to your friends :-)
- //
- // Please do not take credit for the work of all those great authors
- // mentioned above!
- // If you edit the script, please do not change the lines above - thanks!
- // ------------------------------------------------------------------------
- string SLOODLE_EOF = "sloodleeof";
- integer eof = FALSE; // Have we reached the end of the configuration data?
- integer SLOODLE_CHANNEL_OBJECT_DIALOG = -3857343;//configuration channel
- integer isconfigured = 0;
- integer MAX=30;
- key sitter;
- integer counter=0;
- string animation;
- integer SLOODLE_TELPORTER_POWER_UP= -1639277101;
- integer SLOODLE_TELPORTER_POWER_DOWN= -1639277102;
- integer SLOODLE_OBJECT_INTERACTION= -1639271132; //channel interaction objects speak on
- integer TARGET_CHANNEL;
- string TARGET_NAME;
- integer SLOODLE_TOUCH_OBJECT_SUCCESS = -1639277100;
- vector RED =<1.00000, 0.00000, 0.00000>;
- vector ORANGE=<1.00000, 0.43763, 0.02414>;
- vector YELLOW=<1.00000, 1.00000, 0.00000>;
- vector GREEN=<0.00000, 1.00000, 0.00000>;
- vector BLUE=<0.00000, 0.00000, 1.00000>;
- vector BABYBLUE=<0.00000, 1.00000, 1.00000>;
- vector PINK=<1.00000, 0.00000, 1.00000>;
- vector PURPLE=<0.57338, 0.25486, 1.00000>;
- vector BLACK= <0.00000, 0.00000, 0.00000>;
- vector WHITE= <1.00000, 1.00000, 1.00000>;
- //order of animation messages
- key userKey;
- vector MYDEST;
- integer SLOODLE_NOT_ENOUGH_CURRENCY= -1001;// AWARDS You do not have enough points to use this object. (There may be a customized message in the next line.)
- integer SLOODLE_OBJECT_REGISTER_INTERACTION= -1639271133; //channel objects send interactions to the mod_interaction-1.0 script on to be forwarded to server
- debug(string str){
- //llOwnerSay(str);
- }
- string objecttogive;
- integer soundCounter=0;
- integer DOOR_STATE;
- vector rezzer_position_offset;
- rotation rezzer_rotation_offset;
- key rezzer_uuid;
- /***********************************************
- * extractResponse()
- * Is used so that sending of linked messages is more readable by humans. Ie: instead of sending a linked message as
- * GETDATA|50091bcd-d86d-3749-c8a2-055842b33484
- * Context is added instead: COMMAND:GETDATA|PLAYERUUID:50091bcd-d86d-3749-c8a2-055842b33484
- * By adding a context to the messages, the programmer can understand whats going on when debugging
- * All this function does is strip off the text before the ":" char
- ***********************************************/
- string extractResponse(string cmd){
- return llList2String(llParseString2List(cmd, [":"],[]),1);
- }
- move_to_layout_position() {
- // llOwnerSay("todo: move to position "+(string)rezzer_position_offset+", rot "+(string)rezzer_rotation_offset+ " in relation to rezzer "+(string)rezzer_uuid);
- list rezzerdetails = llGetObjectDetails( rezzer_uuid, [ OBJECT_POS, OBJECT_ROT ] );
- vector rezzerpos = llList2Vector( rezzerdetails, 0 );
- rotation rezzerrot = llList2Rot( rezzerdetails, 1 );
- sloodle_set_pos( rezzerpos + ( rezzer_position_offset * rezzerrot ) );
- llSetRot( rezzerrot * rezzer_rotation_offset );
- }
- sloodle_set_pos(vector targetposition){
- integer counter=0;
- while ((llVecDist(llGetPos(), targetposition) > 0.001)&&(counter<50)) {
- counter+=1;
- llSetPos(targetposition);
- }
- }
- vector getVector(string s){
- list vector_parts = llParseString2List(s,["<",",",">"], []);
- vector result;
- result.x = llList2Float(vector_parts,0);
- result.y = llList2Float(vector_parts,1);
- result.z = llList2Float(vector_parts,2);
- return result;
- }
- integer sloodle_handle_command(string str){
- // llOwnerSay("handling command "+str);
- list bits = llParseString2List(str,["|"],[]);
- integer numbits = llGetListLength(bits);
-
- string name;
- if (numbits >= 1 ) {
- name = llList2String(bits,0);
-
- string value1 = "";
- string value2 = "";
-
- if (numbits > 1) value1 = llList2String(bits,1);
- if (numbits > 2) value2 = llList2String(bits,2);
-
- }
- if (name == "set:destination") {
-
- string dataStr = llList2String(bits,1);
- llOwnerSay("dataStr: "+dataStr);
- if (llGetSubString(dataStr, 0, 0)=="<"){
- MYDEST= getVector(dataStr);
- }else{
- list data = llParseString2List(dataStr, ["/"], []);
- MYDEST= <llList2Float(data, 0),llList2Float(data, 1),llList2Float(data, 2)>;
- }
- llOwnerSay("Teleporter Destination: "+(string)MYDEST);
-
- }else
- if (name == "set:position") {
- rezzer_position_offset = (vector)llList2String(bits,1);
- rezzer_rotation_offset = (rotation)llList2String(bits,2);
- rezzer_uuid = llList2Key(bits,3);
- }
-
- return TRUE;
- }
- trytoTp(key av){
- //when touched, tell mod_interaction script that a water action has occured
- llMessageLinked(LINK_SET, SLOODLE_OBJECT_REGISTER_INTERACTION, "accessteleporter", av);
- llSay(0,"Attempting to Teleport");
- }
- list give_in_folder;
- integer item_no = 0;
-
- //The target location .. change this to where you want to end up (x, y, z)
- vector gTargetPos = <246, 181, 415>;
- // Text for the "pie menu"
- string gSitText="Teleport";
- // Return position for tp object - no need to edit
- vector gStartPos=<0,0,0>;
- // Key for avatar sitting on object, if any
- key gAvatarID=NULL_KEY;
- // If you don't enable this the teleport object will be left at the destination.
- integer gReturnToStartPos=TRUE;
-
- // This routine do the actual transport
- warpPos( vector destpos)
- { //R&D by Keknehv Psaltery, 05/25/2006
- //with a little pokeing by Strife, and a bit more
- //some more munging by Talarus Luan
- //Final cleanup by Keknehv Psaltery
- // Compute the number of jumps necessary
- integer jumps = (integer)(llVecDist(destpos, llGetPos()) / 10.0) + 1;
- // Try and avoid stack/heap collisions
- if (jumps > 100 )
- jumps = 100; // 1km should be plenty
- list rules = [ PRIM_POSITION, destpos ]; //The start for the rules list
- integer count = 1;
- while ( ( count = count << 1 ) < jumps)
- rules = ([]) + rules + rules; //should tighten memory use.
- llSetPrimitiveParams( rules + llList2List( rules, (count - jumps) << 1, count) );
- if (sitter!=NULL_KEY){
- llUnSit(sitter);
- }
- move_to_layout_position();
- }
- string teleporter="OFF";
- integer count=0;
- default {
- on_rez(integer start_param) {
- llResetScript();
- llSitTarget ( <-0.00000, 0.00000, 1.20565>, <0.00000, 0.00000, 0.00000, 1.00000>);
- }
- state_entry() {
-
- llSitTarget(<0.0, 0.0, 1.0>, ZERO_ROTATION);
-
- teleporter="ON";
-
-
- }
-
- changed(integer change) {
- if ((change & CHANGED_LINK) != 0){
-
- sitter = llAvatarOnSitTarget();
- // llOwnerSay((string)sitter);
- if (sitter!=NULL_KEY){
- trytoTp(sitter);
- }
- }
- }
-
-
-
- link_message(integer sender_num, integer num, string str, key id) {
- // Split the data up into lines
- list lines = llParseStringKeepNulls(str, ["\n"], []);
- integer numlines = llGetListLength(lines);
- // Extract all the status fields
- list statusfields = llParseStringKeepNulls( llList2String(lines,0), ["|"], [] );
- // Get the statuscode
- integer statuscode = llList2Integer(statusfields,0);
- key user = llList2Key(statusfields,6);
- // Was it an error code?
- if (num==SLOODLE_CHANNEL_OBJECT_DIALOG){
- llTriggerSound("SND_POWER_UP", 1);
- }
-
- if (num==SLOODLE_OBJECT_INTERACTION){
- string notenoughcurrencymessage=llList2String(lines,1);
- if (statuscode==1){
- if (llList2String(lines,1)=="accessteleporter"){
- llSay(0,"Teleporting to: "+(string)MYDEST);
- llTriggerSound("SND_TELEPORTING", 0.7);
- warpPos(MYDEST);
- }
- }else if (statuscode=-1001){
- llSay(0,notenoughcurrencymessage);
- llTriggerSound("SND_SPARKS", 0.7);
- llUnSit(sitter);
- }
- }
- if (num == SLOODLE_CHANNEL_OBJECT_DIALOG) {
- // Split the message into lines
- integer i = 0;
- for (i=0; i < numlines; i++) {
- isconfigured = sloodle_handle_command(llList2String(lines, i));
- }
- return;
- }
-
-
- }
- }
-
- // Please leave the following line intact to show where the script lives in Git:
- // SLOODLE LSL Script Git Location: mod/interaction-1.0/objects/teleporter/assets/teleporter.lslp
|