From 763d0120241b225d1d3a152de52fe98e7f268ffa Mon Sep 17 00:00:00 2001 From: Fred Beckhusen Date: Sun, 25 Apr 2021 23:22:03 -0500 Subject: [PATCH] Add half dozen scripts --- .../- Advanced Tree Planter.sol | 3 + .../Advanced Tree Planter V3.0.prj | 6 + .../Object/Script.lsl | 93 +++++ Colorpicker/Colorpicker.sol | 3 + Colorpicker/Colorpicker/Colorpicker.prj | 6 + Colorpicker/Colorpicker/Object/Script.lsl | 129 +++++++ Easy Ladder/Easy Ladder/Object/EZ Ladder.lsl | 121 +++--- HTTP Database/HTTP Database/Object/Script.lsl | 12 + Magic Sensor/Magic Sensor.sol | 3 + Magic Sensor/Magic Sensor/Magic Sensor.prj | 6 + Magic Sensor/Magic Sensor/Object/Script.lsl | 254 +++++++++++++ PawPrints/PawPrints.sol | 3 + PawPrints/PawPrints/PawPrints.prj | 6 + .../Pawprint Prim attach to foot/Script.lsl | 22 ++ PostBox by Ana/PostBox by Ana.sol | 3 + .../PostBox by Ana/PostBox by Ana.prj | 6 + .../PostBox by Ana/PostBox/Script.lsl | 218 +++++++++++ .../Single-Prim Multi-Drawer Script.sol | 3 + .../Drawer/Script.lsl | 357 ++++++++++++++++++ .../Single-Prim Multi-Drawer Script.prj | 6 + Soul Finder/Soul Finder.sol | 3 + Soul Finder/Soul Finder/Soul Finder.prj | 6 + .../Soul Finder/Wear this Prim/Script.lsl | 105 ++++++ 23 files changed, 1318 insertions(+), 56 deletions(-) create mode 100644 Advanced Tree Planter/- Advanced Tree Planter.sol create mode 100644 Advanced Tree Planter/Advanced Tree Planter V3.0/Advanced Tree Planter V3.0.prj create mode 100644 Advanced Tree Planter/Advanced Tree Planter V3.0/Object/Script.lsl create mode 100644 Colorpicker/Colorpicker.sol create mode 100644 Colorpicker/Colorpicker/Colorpicker.prj create mode 100644 Colorpicker/Colorpicker/Object/Script.lsl create mode 100644 HTTP Database/HTTP Database/Object/Script.lsl create mode 100644 Magic Sensor/Magic Sensor.sol create mode 100644 Magic Sensor/Magic Sensor/Magic Sensor.prj create mode 100644 Magic Sensor/Magic Sensor/Object/Script.lsl create mode 100644 PawPrints/PawPrints.sol create mode 100644 PawPrints/PawPrints/PawPrints.prj create mode 100644 PawPrints/PawPrints/Pawprint Prim attach to foot/Script.lsl create mode 100644 PostBox by Ana/PostBox by Ana.sol create mode 100644 PostBox by Ana/PostBox by Ana/PostBox by Ana.prj create mode 100644 PostBox by Ana/PostBox by Ana/PostBox/Script.lsl create mode 100644 Single-Prim Multi-Drawer Script/Single-Prim Multi-Drawer Script.sol create mode 100644 Single-Prim Multi-Drawer Script/Single-Prim Multi-Drawer Script/Drawer/Script.lsl create mode 100644 Single-Prim Multi-Drawer Script/Single-Prim Multi-Drawer Script/Single-Prim Multi-Drawer Script.prj create mode 100644 Soul Finder/Soul Finder.sol create mode 100644 Soul Finder/Soul Finder/Soul Finder.prj create mode 100644 Soul Finder/Soul Finder/Wear this Prim/Script.lsl diff --git a/Advanced Tree Planter/- Advanced Tree Planter.sol b/Advanced Tree Planter/- Advanced Tree Planter.sol new file mode 100644 index 00000000..561c3023 --- /dev/null +++ b/Advanced Tree Planter/- Advanced Tree Planter.sol @@ -0,0 +1,3 @@ + + + diff --git a/Advanced Tree Planter/Advanced Tree Planter V3.0/Advanced Tree Planter V3.0.prj b/Advanced Tree Planter/Advanced Tree Planter V3.0/Advanced Tree Planter V3.0.prj new file mode 100644 index 00000000..23670eec --- /dev/null +++ b/Advanced Tree Planter/Advanced Tree Planter V3.0/Advanced Tree Planter V3.0.prj @@ -0,0 +1,6 @@ + + + + + diff --git a/Advanced Tree Planter/Advanced Tree Planter V3.0/Object/Script.lsl b/Advanced Tree Planter/Advanced Tree Planter V3.0/Object/Script.lsl new file mode 100644 index 00000000..c4e7b874 --- /dev/null +++ b/Advanced Tree Planter/Advanced Tree Planter V3.0/Object/Script.lsl @@ -0,0 +1,93 @@ +// :NAME:Advanced Tree Planter V3.0 +// :AUTHOR:CyberGlo CyberStar +// :KEYWORDS: +// :REV:3.0 +// :WORLD:Second Life, Opensim +// :DESCRIPTION:This device will plant an entire forrest in the 0,0 to 256,256 range (can be changed). It will plant trees at different heights in accordance with the land height level. +// :CATEGORY:Tree +// :CODE: + +// This device will plant an entire forrest in the 0,0 to 256,256 range (can be changed). It will plant trees at different heights in accordance with the land height level. +// You've never seen a forrest like this, it's truly beautiful when finished. +// Be sure to understand this script fully. +// step 1: put script in cube +// step 2: put several varieties of FULL COPY Trees in the cube. +// step 3: click the cube. +// Note: If I were you I would make all the trees you put in the cube phantom, this makes it much easier on the physics engine of your simulator. + + +integer gIntX; +integer gIntY; +integer gIntZ; + +integer gIntStartX; +integer gIntStartY; +integer gIntEndX; +integer gIntEndY; +list gListInventoryList; +rotation gRotRelative = <0.707107, 0.0, 0.0, 0.707107>; + +float gFltPlantProbability; +float gFltRandMax; +integer gIntTreePick; +string gStrTreeName; + +default +{ + state_entry() + { + } + + touch_start(integer param) + { + gIntStartX=0; + gIntStartY=0; + gIntEndX = 256; + gIntEndY = 256; + gFltPlantProbability = .5; + integer count = llGetInventoryNumber(INVENTORY_OBJECT); + gFltRandMax = (float)count; + gIntZ = 0; + string gStrTreeName; + for (gIntStartX=2;gIntStartX); + //llOwnerSay((string)gIntX + " " +(string)gIntY); + llSetText("X: " + (string)gIntX + " Y: " + (string)gIntY+ " Z: " + (string)gIntZ, <1,1,1>, 1.0); + integer gIntTreePick = (integer) llFrand(gFltRandMax+1); + float fltDoIRez = llFrand(1.0); + if (fltDoIRez < gFltPlantProbability) + { + gStrTreeName = llGetInventoryName(INVENTORY_OBJECT,gIntTreePick); + llSleep(3.0); + if (gStrTreeName != "") + { + vector vecNowPos = llGetPos(); + float fltLandHeight = osGetTerrainHeight(vecNowPos.x,vecNowPos.y); + integer intNewX = (integer)vecNowPos.x; + integer intNewY= (integer)vecNowPos.y; + integer intNewZ=(integer)fltLandHeight; + vecNowPos = ; + llSetRegionPos(vecNowPos); + + llOwnerSay("I planted: " + gStrTreeName); + if (gStrTreeName == "TreeSP") + { + llRezObject(gStrTreeName, llGetPos() + <0.0,0.0,3.0>, <0.0,0.0,0.0>, <0.0,0.0,0.0,1.0>, 0); + } + else + { + llRezObject(gStrTreeName, llGetPos() + <0.0,0.0,8.5>, <0.0,0.0,0.0>, gRotRelative, 0); + } + llSleep(3.0); + } + } + } + } + llOwnerSay("I have finished planting Trees."); + } +} \ No newline at end of file diff --git a/Colorpicker/Colorpicker.sol b/Colorpicker/Colorpicker.sol new file mode 100644 index 00000000..f79b329a --- /dev/null +++ b/Colorpicker/Colorpicker.sol @@ -0,0 +1,3 @@ + + + diff --git a/Colorpicker/Colorpicker/Colorpicker.prj b/Colorpicker/Colorpicker/Colorpicker.prj new file mode 100644 index 00000000..1d71cc4a --- /dev/null +++ b/Colorpicker/Colorpicker/Colorpicker.prj @@ -0,0 +1,6 @@ + + + + + diff --git a/Colorpicker/Colorpicker/Object/Script.lsl b/Colorpicker/Colorpicker/Object/Script.lsl new file mode 100644 index 00000000..ff584180 --- /dev/null +++ b/Colorpicker/Colorpicker/Object/Script.lsl @@ -0,0 +1,129 @@ +// :CATEGORY:Color +// :NAME:COlor Picker +// :AUTHOR:Anonymous +// :REV:1.0 +// :WORLD:Second Life, Opensim +// :DESCRIPTION: +// click a color and a brightness then click the preview to get an llOwnerSay with the color: ) <3 +// :CODE: +//script found on a long lost forum and is by Anonymous +//click a color and a brightness then click the preview to get an llOwnerSay with the color: ) <3 +float hue = 0.0; float lum = 0.5; float sat = 1.0; + +integer start_face; + +//hsl to rgb steps take from http://130.113.54.154/~monger/hsl-rgb.html +vector hsl_to_rbg(float h, float s, float l) { + + vector rbg; + float temp1; + float temp2; + + if(l < .5) + temp2 = l*(1.0+s); + else + temp2 = l+s-l*s; + + temp1 = l*2.0-temp2; + + float Rtemp3 = h+1.0/3.0; + if(Rtemp3 < 0.0) + Rtemp3 = Rtemp3+1.0; + else if(Rtemp3 > 1.0) + Rtemp3 = Rtemp3-1.0; + + float Gtemp3 = h; + if(Gtemp3 < 0.0) + Gtemp3 = Gtemp3+1.0; + else if(Gtemp3 > 1.0) + Gtemp3 = Gtemp3-1.0; + + float Btemp3 = h-1.0/3.0; + if(Btemp3 < 0.0) + Btemp3 = Btemp3+1.0; + else if(Btemp3 > 1.0) + Btemp3 = Btemp3-1.0; + + if(6.0*Rtemp3 < 1.0) + rbg.x = temp1+(temp2-temp1)*6.0*Rtemp3; + else if(2.0*Rtemp3 < 1.0) + rbg.x = temp2; + else if(3.0*Rtemp3 < 2.0) + rbg.x = temp1+(temp2-temp1)*((2.0/3.0)-Rtemp3)*6.0; + else + rbg.x = temp1; + + if(6.0*Gtemp3 < 1.0) + rbg.y = temp1+(temp2-temp1)*6.0*Gtemp3; + else if(2.0*Gtemp3 < 1.0) + rbg.y = temp2; + else if(3.0*Gtemp3 < 2.0) + rbg.y = temp1+(temp2-temp1)*((2.0/3.0)-Gtemp3)*6.0; + else + rbg.y = temp1; + + if(6.0*Btemp3 < 1.0) + rbg.z = temp1+(temp2-temp1)*6.0*Btemp3; + else if(2.0*Btemp3 < 1.0) + rbg.z = temp2; + else if(3.0*Btemp3 < 2.0) + rbg.z = temp1+(temp2-temp1)*((2.0/3.0)-Btemp3)*6.0; + else + rbg.z = temp1; + + return rbg; + +} + + + + +default { + + state_entry() + { + llSetPrimitiveParams([ + PRIM_SIZE, <.5,.4,.01>, + PRIM_TYPE, PRIM_TYPE_BOX, PRIM_HOLE_SQUARE, <0,1,0>, 0.0, <0,0,0>, <.8,1,0>, <.02,0,0>, + PRIM_TEXTURE, ALL_SIDES, (key)"5748decc-f629-461c-9a36-a35a221fe21f", <1,1,0>, <0,0,0>, 0.0, + PRIM_TEXTURE, 0, (key)"404e4461-8a22-fbf7-7652-4b81dc7da325", <1,1,0>, <0,0,0>, 0.0, + PRIM_TEXTURE, 2, (key)"01c02d68-dfb0-d907-7397-cba857c61144", <1,1,0>, <0,0,0>, -PI_BY_TWO]); + } + + + touch_start(integer total_number) + { + start_face = llDetectedTouchFace(0); + if(start_face == 4) + llOwnerSay((string)hsl_to_rbg(hue, sat, lum)); + } + + touch(integer total_number) + { + vector st = llDetectedTouchST(0); + integer face = llDetectedTouchFace(0); + if(start_face != face) return; + if(face == 0) + { + sat = st.y; + hue = st.x; + llSetColor(hsl_to_rbg(hue, sat, lum), 4); + } + else if(face == 2) + { + lum = st.x; + llSetColor(hsl_to_rbg(hue, sat, lum), 4); + } + } + + changed(integer change) + { + if (change & CHANGED_OWNER) + { + llResetScript(); + } + } + +} + + diff --git a/Easy Ladder/Easy Ladder/Object/EZ Ladder.lsl b/Easy Ladder/Easy Ladder/Object/EZ Ladder.lsl index 23a1bd9a..ab93a2a6 100644 --- a/Easy Ladder/Easy Ladder/Object/EZ Ladder.lsl +++ b/Easy Ladder/Easy Ladder/Object/EZ Ladder.lsl @@ -1,10 +1,9 @@ // :SHOW:1 // :CATEGORY:Animation // :NAME:Easy Ladder -// :AUTHOR:Fred Beckhusen (Ferd Frederix) +// :AUTHOR:Pedlar Decosta // :KEYWORDS:Ladder // :CREATED:2015-07-15 10:04:12 -// :EDITED:2016-05-02 11:59:18 // :ID:1081 // :NUM:1800 // :REV:2 @@ -15,74 +14,84 @@ // Rev 2: 12-18-2015 added region pos for return -/* Climb ladder - http://community.secondlife.com/t5/Scripting/Ladder-Climb/td-p/256433 - Edited for opensimulator to unsit user at top via offset vector +///* Climb ladder +//http://community.secondlife.com/t5/Scripting/Ladder-Climb/td-p/256433 +//Edited for opensimulator to unsit user at top via offset vector - BVH: climb-rope +//BVH: climb-rope -Fred Beckhusen (Ferd Frederix)z - removed cruft, added offsets and removed ugly hacks. +//Fred Beckhusen (Ferd Frederix)z - removed cruft, added offsets and removed ugly hacks. -*/ - +//*/ -float LADDERHEIGHT= 7.0; // how far to move up +//Pedlar Decosta 2020 - edited it to use object description for the ladder height. +//Added support to climb down using a negative number. Adjusted the variables accordingly. +//Added appropriate sit text. For use in a poseball. 1 at the bottom and one at the top. They work indepently from each other. +// Don't forget to reset scripts when you change the ladder height. + + +float LADDERHEIGHT; // how far to move up float STEPHEIGHT = 0.25; // how far to move each step -float OFFSET = 3; // tilt of the ladder; +float OFFSET = 0; // tilt of the ladder; float Extra = 1; // extra move onto the roof or in the door before unsit climbup() { - - llSetAlpha(0,ALL_SIDES); - llStopAnimation("sit"); - llStartAnimation(llGetInventoryName(INVENTORY_ANIMATION,0)); - - - integer i; - vector original; - float steps = LADDERHEIGHT / STEPHEIGHT; - float offset = OFFSET / steps; // to one side - - original = llGetPos(); - do - { - i++; - vector newPos = llGetPos() + * llGetRot(); - llSetPos(newPos); - } while (i <= (steps)); - llSetPos(llGetPos() + * llGetRot()); // extra, then unsit - - llStopAnimation(llGetInventoryName(INVENTORY_ANIMATION,0)); + llSetAlpha(0,ALL_SIDES); + llStopAnimation("sit"); + llStartAnimation(llGetInventoryName(INVENTORY_ANIMATION,0)); - if (llAvatarOnSitTarget() != NULL_KEY) - { // somebody is sitting on me - llUnSit(llAvatarOnSitTarget()); // unsit him or her - } - - llSetRegionPos(original); - llSetAlpha(1,ALL_SIDES); + + integer i; + vector original; + float steps = LADDERHEIGHT / STEPHEIGHT; + float offset = OFFSET / steps; // to one side + + original = llGetPos(); + do + { + i++; + vector newPos = llGetPos() + * llGetRot(); + llSetPos(newPos); + } while (i <= (steps)); + + llSetPos(llGetPos() + * llGetRot()); // extra, then unsit + + llStopAnimation(llGetInventoryName(INVENTORY_ANIMATION,0)); + + if (llAvatarOnSitTarget() != NULL_KEY) + { // somebody is sitting on me + llUnSit(llAvatarOnSitTarget()); // unsit him or her + } + + llSetRegionPos(original); + llSetAlpha(1,ALL_SIDES); } // end climbup default { - - state_entry() { - llSitTarget(<0.0, 0.0, 0.1>, ZERO_ROTATION); - } - changed(integer change) - { - if(change == CHANGED_LINK) - { - key avatar = llAvatarOnSitTarget(); - - if(avatar != NULL_KEY) - { - llRequestPermissions(avatar,PERMISSION_TRIGGER_ANIMATION); - climbup(); - } - } - } //end changed + state_entry() { + LADDERHEIGHT = (integer)llGetObjectDesc(); + llSetSitText("Climb"); + if(LADDERHEIGHT <=0){ STEPHEIGHT = -0.25; + Extra = -1; llSetSitText("Descend");} + // if(LADDERHEIGHT <=0){ STEPHEIGHT = -0.25;} + llSitTarget(<0.0, 0.0, 0.1>, ZERO_ROTATION); + } + + changed(integer change) + { + if(change == CHANGED_LINK) + { + key avatar = llAvatarOnSitTarget(); + + if(avatar != NULL_KEY) + { + llRequestPermissions(avatar,PERMISSION_TRIGGER_ANIMATION); + climbup(); + } + } + } //end changed } //end default diff --git a/HTTP Database/HTTP Database/Object/Script.lsl b/HTTP Database/HTTP Database/Object/Script.lsl new file mode 100644 index 00000000..f5722220 --- /dev/null +++ b/HTTP Database/HTTP Database/Object/Script.lsl @@ -0,0 +1,12 @@ + +default +{ + state_entry() + { + llSay(0, "Hello, Avatar!"); + } + touch_start(integer total_number) + { + llSay(0, "Touched: "+(string)total_number); + } +} \ No newline at end of file diff --git a/Magic Sensor/Magic Sensor.sol b/Magic Sensor/Magic Sensor.sol new file mode 100644 index 00000000..4f2aaa9c --- /dev/null +++ b/Magic Sensor/Magic Sensor.sol @@ -0,0 +1,3 @@ + + + diff --git a/Magic Sensor/Magic Sensor/Magic Sensor.prj b/Magic Sensor/Magic Sensor/Magic Sensor.prj new file mode 100644 index 00000000..e254d9a1 --- /dev/null +++ b/Magic Sensor/Magic Sensor/Magic Sensor.prj @@ -0,0 +1,6 @@ + + + + + diff --git a/Magic Sensor/Magic Sensor/Object/Script.lsl b/Magic Sensor/Magic Sensor/Object/Script.lsl new file mode 100644 index 00000000..86c6e247 --- /dev/null +++ b/Magic Sensor/Magic Sensor/Object/Script.lsl @@ -0,0 +1,254 @@ +// :CATEGORY:Sensor +// :NAME:Mafic Sensor +// :AUTHOR:CyberGlo Cyberstar +// :REV:1.0 +// :WORLD:Second Life, Opensim +// :DESCRIPTION: +// Finds various scripted, unscripted and other objects and marks them, much like the More-Beacons menu +// :CODE: + +vector offset = < 2, 0, 1.25>; +vector pos; +vector vecNewPos; + +key gKyOID; +key gKySensedObject; +key gKyOrb; + +float fltDistApart; + +list lstObjectNameList; +list lstObjectKeyList; + +string strDisplayString; +string strObjectPos; +string strButtonResponse; + +integer gListener; +integer gListener2; +integer intSearchState; +integer gIntTimedCount; +integer gIntSearchIndex; + +fnWarpPos(vector pos) +{ + llSetRegionPos(pos); +} + + +fnBeamParticles(key gKySensedObject) +{ + llParticleSystem([ PSYS_PART_FLAGS, 0 | PSYS_PART_EMISSIVE_MASK | + PSYS_PART_INTERP_COLOR_MASK | PSYS_PART_INTERP_SCALE_MASK | + PSYS_PART_FOLLOW_SRC_MASK | PSYS_PART_FOLLOW_VELOCITY_MASK |PSYS_PART_TARGET_POS_MASK , + PSYS_SRC_PATTERN,PSYS_SRC_PATTERN_EXPLODE, + PSYS_PART_MAX_AGE, 1.0, + PSYS_PART_START_COLOR,<1,0,0>, + PSYS_PART_END_COLOR,<1,0,0>, + PSYS_PART_START_SCALE,<0.1, 0.4, 0.1>, + PSYS_PART_END_SCALE,<0.1, 0.2, 0.1>, + PSYS_PART_START_GLOW, 0.3, + PSYS_SRC_BURST_RATE,0.01, + PSYS_SRC_ACCEL,<0.0, 0.0, 0.0>, + PSYS_SRC_BURST_PART_COUNT,1, + PSYS_SRC_BURST_RADIUS,0.03, + PSYS_SRC_BURST_SPEED_MIN,0.10, + PSYS_SRC_BURST_SPEED_MAX,0.50, + PSYS_SRC_TARGET_KEY,gKySensedObject, + PSYS_SRC_INNERANGLE,1.55, + PSYS_SRC_OUTERANGLE,1.54, + PSYS_SRC_OMEGA,<0.0, 0.0, 5.0>, + PSYS_SRC_MAX_AGE,0.00, + PSYS_PART_START_ALPHA,0.50, + PSYS_PART_END_ALPHA,0.10 + ]); +} + +updateParticles() +{ + key gKySensor; + llParticleSystem([ PSYS_PART_MAX_AGE,2, + PSYS_PART_FLAGS,PSYS_PART_EMISSIVE_MASK|PSYS_PART_INTERP_SCALE_MASK|PSYS_PART_TARGET_POS_MASK , + PSYS_SRC_TARGET_KEY,gKyOrb, + PSYS_PART_START_COLOR,<1,0,0> , + PSYS_PART_END_COLOR, <1,0,0>, + PSYS_PART_START_SCALE,<.125,.125,FALSE>, + PSYS_PART_END_SCALE,<.01,.01,FALSE>, + PSYS_SRC_PATTERN, PSYS_SRC_PATTERN_EXPLODE, + PSYS_SRC_BURST_RATE,.02, + PSYS_SRC_ACCEL, <0,0,0>, + PSYS_SRC_BURST_PART_COUNT,1, + PSYS_SRC_BURST_RADIUS,.0, + PSYS_SRC_BURST_SPEED_MIN,.25, + PSYS_SRC_BURST_SPEED_MAX,.25, + PSYS_SRC_ANGLE_BEGIN,(float).5*PI, + PSYS_SRC_ANGLE_END,(float).5*PI, + PSYS_SRC_OMEGA, <0,0,1.0>, + PSYS_SRC_MAX_AGE, 0, + PSYS_SRC_TEXTURE, "smoke1", + PSYS_PART_START_ALPHA, 1, + PSYS_PART_END_ALPHA, 1 + ]); +} + +default +{ + on_rez(integer parm) + { + llResetScript(); + } + state_entry() + { + // llSetPrimitiveParams([PRIM_TYPE,PRIM_TYPE_SPHERE,PRIM_SIZE,<0.2,0.2,0.2>,PRIM_PHYSICS,1,PRIM_FULLBRIGHT,1,PRIM_POINT_LIGHT,1,<1,0,0>,1,10,5,PRIM_GLOW,0.3,PRIM_TEXTURE,0,"CLOUDS",<1,1,1>,<1,1,1>,0.0]); + updateParticles(); + llSetStatus(STATUS_PHYSICS, TRUE); + llSleep(0.1); + llSetTimerEvent(0.5); + gKyOID=llGetOwner(); + gKyOrb = llGetKey(); + } + + touch_start(integer c) + { + llListenRemove(gListener); + llListenRemove(gListener2); + gListener = llListen(-99, "", gKyOID, ""); + llDialog(gKyOID, "\nPlease select Scan Type:", ["Active", "Passive", "Scripted","Legacy", "Display","Select", "Beam Off" ] , -99); + llSensorRepeat("", "", intSearchState, 30, PI, 2); + //CAN BE ACTIVE,PASSIVE,SCRIPTED,AGENT + } + + listen(integer chan, string name, key id, string msg) + { + lstObjectNameList = llList2List(lstObjectNameList,0,11); + if (chan == -99) + { + if (msg == "Active") + { + intSearchState=2; + llSensorRepeat("", "", intSearchState, 30, PI, 2); + } + if (msg == "Passive") + { + intSearchState=4; + llSensorRepeat("", "", intSearchState, 30, PI, 2); + } + if (msg == "Legacy") + { + intSearchState=1; + llSensorRepeat("", "", intSearchState, 30, PI, 2); + } + if (msg == "Display") + { + intSearchState =10; + llSensorRepeat("", "", intSearchState, 30, PI, 2); + } + if (msg == "Scripted") + { + intSearchState =8; + llSensorRepeat("", "", intSearchState, 30, PI, 2); + } + if (msg == "Select") + { + + llDialog(gKyOID, "\nPlease select Object:", lstObjectNameList , -98); + gListener2 = llListen(-98, "", gKyOID, ""); + } + if (msg == "Beam Off") + { + updateParticles(); + + } + } + if (chan == -98) + { + gIntSearchIndex = llListFindList(lstObjectNameList,msg); + gKySensedObject = llList2Key(lstObjectKeyList,gIntSearchIndex); + fnBeamParticles(gKySensedObject); + } + } + sensor(integer number_detected) + { + strDisplayString = ""; + lstObjectNameList = []; + lstObjectKeyList = []; + integer intObjectNumber; + for (; intObjectNumber < number_detected; intObjectNumber++) + { + string strObjectName = llDetectedName(intObjectNumber); + key gKySensedObject = llDetectedKey(intObjectNumber); + if (intObjectNumber< 12) + { + if (llListFindList(lstObjectNameList, [strObjectName]) == -1) + { + lstObjectNameList =(lstObjectNameList=[])+lstObjectNameList+[strObjectName]; + lstObjectKeyList = (lstObjectKeyList=[])+lstObjectKeyList+[gKySensedObject]; + // llOwnerSay(strObjectName); + + list lstObjectNow = llGetObjectDetails(gKySensedObject, OBJECT_POS); + vector vecObjectNow = llList2Vector (lstObjectNow,0); + integer intVecX = (integer)vecObjectNow.x; + integer intVecY = (integer)vecObjectNow.y; + integer intVecZ = (integer)vecObjectNow.z; + string strObjPosVec = "<"+(string)intVecX+" "+(string)intVecY+ " " + (string)intVecZ+">"; + strObjectPos = strObjPosVec; + strDisplayString = strDisplayString +strObjectName + " \n"; + strObjectPos = ""; + //lstObjectNameList = []; + //lstObjectKeyList = []; + } + } + } + llSetText(strDisplayString,<1,1,1>,1.0); + //strDisplayString = ""; + //lstObjectNameList = []; + } + changed(integer c) + { + if (c & CHANGED_OWNER) + { + llResetScript(); + } + } + + timer() + { + // gIntTimedCount++; + // if (gIntTimedCount == 1) + // { + // lstObjectNameList=[]; + // lstObjectKeyList=[]; + // strDisplayString=""; + // gIntTimedCount = 0; + // } + if (llGetAgentSize(gKyOID) == ZERO_VECTOR) + { + pos = <128,128,25>; + llMoveToTarget(pos,0.4); + } + else + { + list det = llGetObjectDetails(gKyOID,[OBJECT_POS,OBJECT_ROT]); + pos = llList2Vector(det,0); + vecNewPos = llGetPos(); + fltDistApart =llVecDist(pos,vecNewPos); + if (fltDistApart > 8) + { + llSetText((string)fltDistApart, <1,1,1>,1.0); + pos += <2,0,1>; + fnWarpPos(pos); + + llSetText("",<0.1,0.1,0.1>,0.1); + } + rotation rot = (rotation)llList2String(det,1); + vector worldOffset = offset; + vector avOffset = offset * rot; + pos += avOffset; + if (pos.x < 0 ) { pos.x =1; } + if (pos.x > 256 ) { pos.x = 256;} + if (pos.y < 0 ) { pos.y = 1;} + if (pos.y > 256 ) { pos.y = 256; } + llMoveToTarget(pos,0.4); + } + } +} \ No newline at end of file diff --git a/PawPrints/PawPrints.sol b/PawPrints/PawPrints.sol new file mode 100644 index 00000000..e710f1ac --- /dev/null +++ b/PawPrints/PawPrints.sol @@ -0,0 +1,3 @@ + + + diff --git a/PawPrints/PawPrints/PawPrints.prj b/PawPrints/PawPrints/PawPrints.prj new file mode 100644 index 00000000..d8d7b10f --- /dev/null +++ b/PawPrints/PawPrints/PawPrints.prj @@ -0,0 +1,6 @@ + + + + + diff --git a/PawPrints/PawPrints/Pawprint Prim attach to foot/Script.lsl b/PawPrints/PawPrints/Pawprint Prim attach to foot/Script.lsl new file mode 100644 index 00000000..1a1f0536 --- /dev/null +++ b/PawPrints/PawPrints/Pawprint Prim attach to foot/Script.lsl @@ -0,0 +1,22 @@ +// :CATEGORY:Particles +// :NAME:Pawprints +// :AUTHOR:CyberGlo CyberStar +// :REV:1.0 +// :WORLD:Second Life, Opensim +// :DESCRIPTION: +//drop this script in a prim with a texture and wear it on your foot. +// :CODE: + +//PawPrints by CyberGlo CyberStar +//drop this script in a prim with a texture and wear it on your foot. +// you can make one for right and left foot if you like. +// texture should be named "Paw" +list gLstSys ; +default +{ + state_entry() + { gLstSys = [7, 125, 0, 256, 1, <0.00,0.00,0.00>, 3, <0.00,0.00,0.00>, 5, <0.40,0.20,0.70>, 6, <0.40,0.40,0.70>, 9, 1, 13, 0.50, 8, <0.00,0.00,0.00>, 15, 1, 16, 0.10, 17, 0.10, 20, "", 10, 1.54, 11, 1.55, 21, <0.00,0.00,10.00>, 19, 0, 12, "Paw", 2, llGetKey(), 4, 1]; + llSetTimerEvent(3.0); + } + timer() { llParticleSystem(gLstSys); } +} \ No newline at end of file diff --git a/PostBox by Ana/PostBox by Ana.sol b/PostBox by Ana/PostBox by Ana.sol new file mode 100644 index 00000000..9f0a0c5e --- /dev/null +++ b/PostBox by Ana/PostBox by Ana.sol @@ -0,0 +1,3 @@ + + + diff --git a/PostBox by Ana/PostBox by Ana/PostBox by Ana.prj b/PostBox by Ana/PostBox by Ana/PostBox by Ana.prj new file mode 100644 index 00000000..578e6dd4 --- /dev/null +++ b/PostBox by Ana/PostBox by Ana/PostBox by Ana.prj @@ -0,0 +1,6 @@ + + + + + diff --git a/PostBox by Ana/PostBox by Ana/PostBox/Script.lsl b/PostBox by Ana/PostBox by Ana/PostBox/Script.lsl new file mode 100644 index 00000000..f6492a3f --- /dev/null +++ b/PostBox by Ana/PostBox by Ana/PostBox/Script.lsl @@ -0,0 +1,218 @@ +// :AUTHOR:Anatova Akina +// :CATEGORY:Email +// :NAME:PostBox +// :REV:1.0 +// :WORLD:Second Life,Opensim +// :DESCRIPTION: +// This script transform a prim to a Mail Box. +// :CODE: + +// -------------------------------------- +// This script transform a prim to a Mail Box. + +// Folks can drop notecard to the box. +// Read/unread information is displayed as hovering text. +// You can copy/modify this script, it's totally free. +// -------------------------------------- +// +// 2021-04-22 - refactored / rewritten by Anatova Akina +// * Resolved the 1 notecard not deleted bug +// * Added admin access with IM notifications +// * Uses changed() event better +// * Compacted code, removed unecessary stuff +// * Extended menu text & floatertext can be hidden +// * Added delete notecards confirmation +// +//------------------------------------------- + +////// USER SETTINGS: /////////////////// +// +// Add keys of admin access in the admin list as strings. +// Object owner is added automatically. +// Example: +// list admin=["01234567-89ab-cdef-0123-456789abcdef", "01234567-89ab-cdef-0123-456789abcdef"]; +list admin=[]; + +// set this to FALSE to hide floater text +integer floaterText=TRUE; + +////// END of USER SETTINGS //////////////// + +// column 1 = notecard name, column 2 = read by user +list lMail = []; +integer MAIL_UNREAD = 0; +integer MAIL_READ = 1; + +integer DIALOG_CHANNEL = -4938453; + +string txtRefresh() +{ + integer nTotalCard = llGetListLength(lMail)/2; + integer nNotRead = 0; + integer nCount = 0; + + for (nCount = 0; nCount < llGetListLength(lMail); nCount += 2) + { + if (llList2Integer(lMail, nCount + 1) == MAIL_UNREAD) + nNotRead += 1; + } + + // total string + string cPost = (string)nTotalCard + " card"; + if (nTotalCard > 1) + cPost += "s"; + cPost += " posted"; + + // unread string + string cUnread = (string)nNotRead + " unread"; + + string text="Postbox\n" + cPost + "\n" + cUnread; + + if (floaterText) + llSetText(text, <.95, .75, 0>, 1); + else + llSetText("", <.95, .75, 0>, 1); + + return text; +} + +notifyAdmin(string m) { + integer i=llGetListLength(admin); + while(i) { + llInstantMessage(llList2Key(admin,i-1),m); + i--; + } +} + +// scan and clean inventory of this object +scanInventory(integer notify) +{ + integer n; + for (n=0;n + + diff --git a/Single-Prim Multi-Drawer Script/Single-Prim Multi-Drawer Script/Drawer/Script.lsl b/Single-Prim Multi-Drawer Script/Single-Prim Multi-Drawer Script/Drawer/Script.lsl new file mode 100644 index 00000000..d5bfabb4 --- /dev/null +++ b/Single-Prim Multi-Drawer Script/Single-Prim Multi-Drawer Script/Drawer/Script.lsl @@ -0,0 +1,357 @@ +// :CATEGORY:Furniture +// :NAME: Single-Prim Multi-Drawer Script +// :AUTHOR:Sheena Desade +// :KEYWORDS: +// :REV:1.0 +// :WORLD:Second Life, Opensim +// :DESCRIPTION: +// Opensim drawers in a check +// :CODE: + +//list we're going to store our data in +list l_drawer_prims; + +//i_is_backwards is for if they put a negative sign in front of the offset, indicating +//that they want it to open the opposite direction +integer i_is_backwards = FALSE; +//was the dresser set up properly? +integer i_proper_config = TRUE; + +//integer i_global; +//which axis are they wanting to move it on? +string s_axis = "y"; +//how much do they want it to move? +float f_offset = -0.5; +//how long should they hold the touch for until the script resets? +float f_reset_touch_time = 2.0; +//integer to tell if they held the touch +integer i_touch_held = FALSE; + +get_drawers() +{ + integer i; + integer i_length = llGetNumberOfPrims(); + for (i = 1;i <= i_length;i++) + { + string s_prim_name = llGetLinkName(i); + vector v_root_position = llGetRootPosition(); + + if (s_prim_name == "drawer") + { + //Gets child prim's UUID + key k_link_key = llGetLinkKey(i); + //Gets child prim's regional position + vector v_link_vector = llList2Vector(llGetObjectDetails(k_link_key, [OBJECT_POS]), 0); + //Gets child prim's local position, corrected for rotation + v_link_vector = (v_link_vector - v_root_position) / llGetRootRotation(); + //updates the list with all the details of the new drawer + l_drawer_prims = (l_drawer_prims=[])+l_drawer_prims+(i)+v_link_vector+"closed"; + } + } +} + +get_config() +{ + //Gets the object's description as a list, in all lower-case letters so we don't have to + //worry about capitalizations later + string s_desc = llToLower(llList2String(llGetPrimitiveParams([PRIM_DESC]), 0)); + //Seperates the variables and values in the object's description into a list, + //discarding the seperators + list s_desc2 = llParseString2List(s_desc, ["::", "="], [""]); + //Used in initiating the for loop + integer i; + //Gets the number of entries in the list 'desc2' + integer i_length = llGetListLength(s_desc2); + //i starts at zero, and the for loop runs for as long as i is less than the length of the + //list 'desc2.' at the end of every iteration, it increases i by two, bringing us to the next + //set of variables and values + for (i = 0;i < i_length; i = (i+2)) + { + //result means the value of the variable, it will always be second + string s_result = llStringTrim(llList2String(s_desc2, i+1), STRING_TRIM); + //token means the variable name, it will allways be first + string s_token = llStringTrim(llList2String(s_desc2, i), STRING_TRIM); + + //--- Took this out because it would take too much server time to set values for + //individual drawers, especially if there's a lot of them --- + //--- (Also, I'm lazy... maybe in a future version) --- + //if(token == "configuration") + //{ + //if(result == "global") i_global = TRUE; + //else if(result == "individual") i_global = FALSE; + //else + //{ + //llOwnerSay("Oops! configuration must be set to 'global' or 'individual.'"); + //i_proper_config = FALSE; + //} + //} + + //If we're storing the value for the 'axis' variable + if(s_token == "axis") + { + //if the value for 'axis' is 'x,' 'y,' or 'z' + if(s_result == "x" || s_result == "y" || s_result == "z") s_axis = s_result; + + //if not, they put an incorrect value in + else + { + llOwnerSay("Oops! axis must be set to 'x,' y,' or 'z.'"); + //it's not going to run correctly, so let's stop them from using it + i_proper_config = FALSE; + //let's reset the touch time to something really low, so it's easy to + //reset + f_reset_touch_time = 0.1; + } + } + + //if we're storing the value for the 'offset' variable + else if(s_token == "offset") + { + //temporary variable used later to check for a '-' symbol + string s_offset = llList2String(s_desc2, i+1); + //another temporary variable used to see if they put a '+' symbol (which isn't + //allowed) in there. + integer i4 = llSubStringIndex(s_offset, "+"); + //going ahead and setting the float as a float, to check and see if they + //decided to put letters or symbols in it + f_offset = llList2Float(s_desc2, i+1); + //if they did put letters or symbols in it + if(f_offset == 0.000000 || i4 != -1) + { + llOwnerSay("Oops! The offset value must be other than 0.000000 " + + "and must not contain any letters or special characters aside from a properly " + + "placed negative (-) symbol to indicate a reversed direction from the norm."); + //it's not going to run correctly, so let's stop them from using it + i_proper_config = FALSE; + //let's reset the touch time to something really low, so it's easy to + //reset + f_reset_touch_time = 0.1; + } + + //passed the symbol check, on to the next thing + else + { + //i3 is used to see if there is a '-' symbol, along with the string version + //of the float, which we saved earlier + integer i3 = llSubStringIndex(s_offset, "-"); + //yep, there's a '-' symbol... + if (i3 != -1) + { + //but it isn't at the beginning, where it's supposed to be. + if(i3 != 1) + { + llOwnerSay("Oops! the negative symbol (-) can only be placed at the " + + "beginning of the float."); + //it's not going to run correctly, so let's stop them from using it + i_proper_config = FALSE; + //let's reset the touch time to something really low, so it's easy to + //reset + f_reset_touch_time = 0.1; + } + + //and the '-' symbol is at the beginning, where it's supposed to be. + else + { + //gotta get rid of that pesky '-' symbol so it doesn't interfere with + //our math later. + s_offset = llDeleteSubString(s_offset, 0, i3); + //okie dokie, got rid of it, now let's save the value for offset + f_offset = (float)s_offset; + //this is how we know there was originally a '-' symbol there + i_is_backwards = TRUE; + } + } + + //can't move a prim more than ten meters, so let's reset it to ten if it's more + if(f_offset > 10.00) f_offset = 10.00; + } + } + + //if we're storing the value for the 'touch time to reset' variable + else if(s_token == "touch time to reset") + { + //gotta look for that '-' symbol again, this float isn't supposed to have it + integer i3 = llSubStringIndex(llList2String(s_desc2, i+1), "-"); + //also gotta check if they put letters or other symbols in there. If not, we're good + //to go + f_reset_touch_time = llList2Float(s_desc2, i+1); + + //uh-oh, they put letters or symbols in there + if(f_reset_touch_time == 0.000000 || i3 != -1) + { + llOwnerSay("Oops! The touch time to reset must be greater than 0.000000 "+ + "and must not contain any letters or special characters."); + //it's not going to run correctly, so let's stop them from using it + i_proper_config = FALSE; + //let's reset the touch time to something really low, so it's easy to + //reset + f_reset_touch_time = 0.1; + } + } + } + + //Let's leave this here for debugging purposes, but commented out + /*llSay(0, "After For: axis is set to " + s_axis + "; offset is set to " + + (string) f_offset + "; i_is_backwards is set to " + (string)i_is_backwards + + "; i_proper_config is set to " + (string)i_proper_config + "; touch time to reset " + + "is set to: " +(string)f_reset_touch_time);*/ + } + +default +{ + on_rez(integer start_param) + { + //we need to reset the script if it's just being rezzed. + llResetScript(); + } + + state_entry() + { + llOwnerSay("Initializing drawer script..."); + //we don't want anyone to sit on this, so we'll set a sit target we can use later + //to unsit the avatar so our dresser doesn't break + llSitTarget(<0, 0, 0.1>, ZERO_ROTATION); + //let's get the drawer list and positions as soon as we start up or reset + get_drawers(); + //okay, now we have to get the configuration set-up + get_config(); + if(!i_proper_config) llOwnerSay("...I seem to be configured incorrectly. Please fix " + + "me using the above error message or read the help card, then reset me by clicking me " + + "and holding for " + (string)f_reset_touch_time + " seconds."); + else if (i_proper_config) llOwnerSay("...done."); + } + + //whenever they touch it + touch_start(integer total_number) + { + //Debugging purposes + //llSay(0, "Link numbers with the name 'drawer': " + llDumpList2String(l_drawer_prims, ", ")); + //this is where the timer for the reset goes. + if(llDetectedLinkNumber(0) == 1 && llDetectedKey(0) == llGetOwner()) + { llSetTimerEvent(f_reset_touch_time); } + //get the link number + integer i_dln = llDetectedLinkNumber(0); + //now we're going to actually check our drawer list and see if the prim's in there + integer i_test = llListFindList(l_drawer_prims, [i_dln]); + + if (!i_proper_config && llDetectedKey(0) != llGetOwner()) llRegionSayTo(llDetectedKey(0), 0, "Sorry, but I wasn't " + + "configured properly, so I don't quite know where to move my bits and pieces to. " + + "Please talk to my owner," + llKey2Name(llGetOwner()) + " about this."); + + //if it's in the list AND the drawers are configured properly + else if(i_test != -1 && i_proper_config) + { + //is the drawer opened or closed? + string s_drawer_status = llList2String(l_drawer_prims, i_test+2); + + //if the drawer's closed + if(s_drawer_status == "closed") + { + //we're going to make a temporary offset float so we don't overwrite + //the original + float f_temp_offset = f_offset; + + //if they used a negative float for the offset + if(i_is_backwards) f_temp_offset = (0.0-f_temp_offset); + //if they used a positive float for the offset + else f_temp_offset = f_offset; + + //if they want it moved on the x axis + if(s_axis == "x") + { + //let's retrieve the position info from our handy-dandy list + vector v_link_position = llList2Vector(l_drawer_prims, i_test+1); + //now we need to update the x value of the drawer's position + //to reflect the offset they want + v_link_position.x = v_link_position.x+f_temp_offset; + //and finally we move it + llSetLinkPrimitiveParamsFast(i_dln, [PRIM_POSITION, v_link_position]); + } + + //if they want it moved on the x axis + else if(s_axis == "y") + { + //let's retrieve the position info from our handy-dandy list + vector v_link_position = llList2Vector(l_drawer_prims, i_test+1); + //now we need to update the y value of the drawer's position + //to reflect the offset they want + v_link_position.y = v_link_position.y+f_temp_offset; + //and finally we move it + llSetLinkPrimitiveParamsFast(i_dln, [PRIM_POSITION, v_link_position]); + } + + else if(s_axis == "z") + { + //let's retrieve the position info from our handy-dandy list + vector v_link_position = llList2Vector(l_drawer_prims, i_test+1); //now we need to update the y value of the drawer's position + //to reflect the offset they want + v_link_position.z = v_link_position.z+f_temp_offset; + //and finally we move it + llSetLinkPrimitiveParamsFast(i_dln, [PRIM_POSITION, v_link_position]); + + } + + //last in this section, we update the list to reflect our shiny new 'open' status + l_drawer_prims = llListReplaceList(l_drawer_prims, ["open"], i_test+2, i_test+2); + } + + //if the drawer is open + else if(s_drawer_status == "open") + { + //let's retrieve what the drawer's position is supposed to be + vector v_link_position = llList2Vector(l_drawer_prims, i_test+1); + //let's move the drawer back to where it belongs + llSetLinkPrimitiveParamsFast(i_dln, [PRIM_POSITION, v_link_position]); + //then let's update the status of our drawer + l_drawer_prims = llListReplaceList(l_drawer_prims, ["closed"], i_test+2, i_test+2); + } + } + } + + //When the person releases the mouse from touching the object + touch_end(integer num_detected) + { + //make it so we don't have a timer event any more (saves on memory in the long run) + //(of course, we're about to reset the script, so it doesn't really matter, but + //it never hurts to get in good practice) + llSetTimerEvent(0.0); + + //if they held the touch for the entire reset script touch time + if (i_touch_held == TRUE) llResetScript(); + } + + timer() + { + //lets them know that they can release their hold now + llOwnerSay("Release me to reset the script."); + //sets the touch held integer to true so the script will reset on touch end + i_touch_held = TRUE; + //again, good practice to reset the timer, even if we won't be using it + llSetTimerEvent(0.0); + } + + //if the person has changed the object + changed(integer change) + { + //if the person has linked or de-linked the object, or if an avatar has sat on the object + if(change & CHANGED_LINK) + { + //originally added to give the server time to adjust to someone sitting on this + llSleep(0.5); + //gets the avatar key from the SitTarget function used earlier... + key k_avatar_key = llAvatarOnSitTarget(); + //...if an avatar is sitting on it, then we unsit him. Bad av! + if (k_avatar_key) llUnSit(k_avatar_key); + else + { + llOwnerSay("Remapping drawers..."); + get_drawers(); + llOwnerSay("Re-evaluating configuration..."); + if (i_proper_config) llOwnerSay("...done."); + else llOwnerSay("...I seem to be configured incorrectly. Please fix " + + "me using the above error message or read the help card, then reset me by clicking me " + + "and holding for " + (string)f_reset_touch_time + " seconds."); + } + } + } +} \ No newline at end of file diff --git a/Single-Prim Multi-Drawer Script/Single-Prim Multi-Drawer Script/Single-Prim Multi-Drawer Script.prj b/Single-Prim Multi-Drawer Script/Single-Prim Multi-Drawer Script/Single-Prim Multi-Drawer Script.prj new file mode 100644 index 00000000..8c5c3ccb --- /dev/null +++ b/Single-Prim Multi-Drawer Script/Single-Prim Multi-Drawer Script/Single-Prim Multi-Drawer Script.prj @@ -0,0 +1,6 @@ + + + + + diff --git a/Soul Finder/Soul Finder.sol b/Soul Finder/Soul Finder.sol new file mode 100644 index 00000000..51ed8f40 --- /dev/null +++ b/Soul Finder/Soul Finder.sol @@ -0,0 +1,3 @@ + + + diff --git a/Soul Finder/Soul Finder/Soul Finder.prj b/Soul Finder/Soul Finder/Soul Finder.prj new file mode 100644 index 00000000..86783866 --- /dev/null +++ b/Soul Finder/Soul Finder/Soul Finder.prj @@ -0,0 +1,6 @@ + + + + + diff --git a/Soul Finder/Soul Finder/Wear this Prim/Script.lsl b/Soul Finder/Soul Finder/Wear this Prim/Script.lsl new file mode 100644 index 00000000..f2935edf --- /dev/null +++ b/Soul Finder/Soul Finder/Wear this Prim/Script.lsl @@ -0,0 +1,105 @@ +// :CATEGORY:Sensor +// :NAME:Soul Finder +// :AUTHOR:CyberGlo CyberStar +// :REV:1.0 +// :WORLD:Second Life, Opensim +// :DESCRIPTION: +// it will point a stream of particles toward any persons location +// :CODE: +//CyberGlo CyberStar +//Soul Finder +// put this script in a small prim and wear it. +// type on channel 7 on +// like this /7 on +// type /7 nameofavatar +// it will point a stream of particles toward this persons location +// no matter where they are on the sim. +// even if they walk around it will follow them +// this makes it easy to find people in crowded sims, even if you cant rez an object or tp to them. +// email: pctek.cyberstar@gmail.com + +string gStrAgentName; +key gStrAgentId; + +integer listenHandle; + +remove_listen_handle() +{ + llListenRemove(listenHandle); +} + +updateParticles(key target) +{ + + llParticleSystem([ + PSYS_PART_FLAGS, 0 | PSYS_PART_EMISSIVE_MASK | + PSYS_PART_INTERP_COLOR_MASK | PSYS_PART_INTERP_SCALE_MASK | + PSYS_PART_FOLLOW_SRC_MASK | PSYS_PART_FOLLOW_VELOCITY_MASK |PSYS_PART_TARGET_POS_MASK , + PSYS_SRC_PATTERN,PSYS_SRC_PATTERN_EXPLODE, + PSYS_PART_MAX_AGE, 2.0, + PSYS_PART_START_COLOR,<1,0,0>, + PSYS_PART_END_COLOR,<1,0,0>, + PSYS_PART_START_SCALE,<0.3, 0.8, 0.3>, + PSYS_PART_END_SCALE,<0.1, 0.2, 0.1>, + PSYS_PART_START_GLOW, 1.0, + PSYS_SRC_BURST_RATE,0.01, + PSYS_SRC_ACCEL,<0.0, 0.0, 0.0>, + PSYS_SRC_BURST_PART_COUNT,3, + PSYS_SRC_BURST_RADIUS,0.10, + PSYS_SRC_BURST_SPEED_MIN,0.10, + PSYS_SRC_BURST_SPEED_MAX,0.50, + PSYS_SRC_TARGET_KEY,target, + PSYS_SRC_INNERANGLE,1.55, + PSYS_SRC_OUTERANGLE,1.54, + PSYS_SRC_OMEGA,<0.0, 0.0, 5.0>, + PSYS_SRC_MAX_AGE,0.00, + PSYS_PART_START_ALPHA,0.50, + PSYS_PART_END_ALPHA,0.10 + ]); + +} +default +{ + state_entry() + { + + listenHandle = llListen(7, "", llGetOwner(), ""); + } + + listen(integer channel, string name, key id, string message) + { + gStrAgentName = message; + if ( message == "off" ) + { + llParticleSystem([]); + + } + else + { + gStrAgentId = llName2Key(gStrAgentName); + if(llGetAgentSize(gStrAgentId)) + { + vector pos = llList2Vector(llGetObjectDetails(gStrAgentId, [OBJECT_POS]), 0); + llOwnerSay("I found: " + gStrAgentName + " at " + (string)pos); + updateParticles(gStrAgentId); + } + else + { + llOwnerSay("The person named: " + gStrAgentName + " isn't in this Land."); + } + } + } + + on_rez(integer start_param) + { + llResetScript(); + } + + changed(integer change) + { + if (change & CHANGED_OWNER) + { + llResetScript(); + } + } +} \ No newline at end of file