Blazed Spy Security Hud System

This is a security HUD.  Ther are four buttons that are needed for the HUD to work properly.

Seruity HUD

This script goes in the root prim of the HUD:

float scanWeather = 0.1;
float scanTactical = 5;
integer notify = 1;
integer interval = 1; ///----how long (in seconds it takes to update the text)
integer range = 200; ////----how far it will scan (max i can get is 96M)
string radarID="";///--default detects no one, so DO NOT CHANGE
key id; 



default
{
    on_rez(integer params){
        
        llResetScript();} //start fresh
    
    state_entry()
    {key owner = llGetOwner();
        llOwnerSay("This system only works on land you own. For GROUP LAND, deed the security system to group \n ******W A R N I N G****** \n ANY ONE CAN USE THESE CONTROLS WHEN YOU DEED THEM TO GROUP. \n ******W A R N I N G******");
        llGiveInventory(owner, "!Sensor.420-SecurityHUD");
        llTargetOmega(<0,0,1>,5,0); //see everyone around me
        llSensorRepeat("","",AGENT,range,PI,interval); //Sensor is always active
    }

    sensor(integer n) {
        integer i; 
        string blazedman; 
        vector pos; 
        vector me = llGetPos(); 
        integer dist;
        string agent = " ";
        for(i=0; i, 1); //set your color here
    }

no_sensor( ){ llSetText("", <1 ,1,1>, 1); ; } //when no one is around, the text goes away.
 
    }

 Unsit Avatar Button Script:

//Formatted Sensor Dialog script by Evil Fool
//Modified by blazed Undercity
//Now its got a use, i modified to allow owner to do stuff to the ppl that are in the sensor's range



integer gOwnerOnly = FALSE;
integer gChann = -293190; //make your OWN unique channel to be sure your not on someone else's.
integer gStride = 9;
list names;
list keys;
integer gPos = 0;
key tReq;


dialog(key id) 
{
    integer nTop = gPos + gStride - 1;
    list buttons = llList2List(names, gPos, nTop);
    string msg = llDumpList2String(buttons, "\n");
    while(llGetListLength(buttons) % 3 != 0)
    { buttons = llListInsertList(buttons, [" "], gStride);
    }
    if (gPos >= gStride)
    { buttons += ["PREVIOUS"];
    }
    if (nTop - 1 

 Send Home Button:

//Formatted Sensor Dialog script by Evil Fool
//Modified by blazed Undercity
//Now its got a use, i modified to allow owner to do stuff to the ppl that are in the sensor's range



integer gOwnerOnly = FALSE;
integer gChann = -293190; //make your OWN unique channel to be sure your not on someone else's.
integer gStride = 9;
list names;
list keys;
integer gPos = 0;
key tReq;


dialog(key id) 
{
    integer nTop = gPos + gStride - 1;
    list buttons = llList2List(names, gPos, nTop);
    string msg = llDumpList2String(buttons, "\n");
    while(llGetListLength(buttons) % 3 != 0)
    { buttons = llListInsertList(buttons, [" "], gStride);
    }
    if (gPos >= gStride)
    { buttons += ["PREVIOUS"];
    }
    if (nTop - 1 

 Eject Button Script:

//Formatted Sensor Dialog script by Evil Fool
//Modified by blazed Undercity
//Now its got a use, i modified to allow owner to do stuff to the ppl that are in the sensor's range



integer gOwnerOnly = FALSE;
integer gChann = -293190; //make your OWN unique channel to be sure your not on someone else's.
integer gStride = 9;
list names;
list keys;
integer gPos = 0;
key tReq;


dialog(key id) 
{
    integer nTop = gPos + gStride - 1;
    list buttons = llList2List(names, gPos, nTop);
    string msg = llDumpList2String(buttons, "\n");
    while(llGetListLength(buttons) % 3 != 0)
    { buttons = llListInsertList(buttons, [" "], gStride);
    }
    if (gPos >= gStride)
    { buttons += ["PREVIOUS"];
    }
    if (nTop - 1 

 Ban Button:

//Formatted Sensor Dialog script by Evil Fool
//Modified by blazed Undercity
//Now its got a use, i modified to allow owner to do stuff to the ppl that are in the sensor's range



integer gOwnerOnly = FALSE;
integer gChann = -293190; //make your OWN unique channel to be sure your not on someone else's.
integer gStride = 9;
list names;
list keys;
integer gPos = 0;
key tReq;


dialog(key id) 
{
    integer nTop = gPos + gStride - 1;
    list buttons = llList2List(names, gPos, nTop);
    string msg = llDumpList2String(buttons, "\n");
    while(llGetListLength(buttons) % 3 != 0)
    { buttons = llListInsertList(buttons, [" "], gStride);
    }
    if (gPos >= gStride)
    { buttons += ["PREVIOUS"];
    }
    if (nTop - 1 

 

TBF Security Cube

// ~ NOTES ~

// Licence

// Restricted land access script by Arduenn Schwartzman
// Licenced according to the following Creative Commons terms:
// Attribution-NonCommercial-ShareAlike 3.0 Unported
// http://creativecommons.org/licenses/by-nc-sa/3.0/

// Version changes

// v0.1 - Created 3/6/2013 by Arduenn
// v0.2 - By Arduenn:
//        Reads guest list from notecard.
//        The names from the list are handled case-insensitive.
//        Tidied up the script comments.

// Caveats

// IMPORTANT! If an agent is not on the guest list
// and happens to sit on an object that is owned by that agent,
// the object will be ejected too. If that object happens to
// be 'No Copy', it will be gone forever! This is a dangerous
// toy. People may Abuse Report you if this is not set up
// properly. The original maker cannot be held liable for any
// damage suffered from using this security script.



// ~ ADVANCED SETTINGS ~

// Scanning boundaries

// 'BOUNDARY_LOW=<0,0,1000>;' and 'BOUNDARY_HIGH=<256 ,256,2000>;'
// means: Restrict access from 1000 to 2000 meter altitude.

vector BOUNDARY_LOW=<0,0,0>;

vector BOUNDARY_HIGH=<256 ,256,200>;

// Time between warning and ejection (seconds)

float EJECT_TIME=20;

// Warning message

string WARNING="\nWARNING\n\nYou have entered a restricted area. You will be ejected in 20 seconds.\n";

// Scanning type

// Use 'integer SCANNING_TYPE=AGENT_LIST_PARCEL;' to scan people in this parcel.
// Use 'integer SCANNING_TYPE=AGENT_LIST_PARCEL_OWNER;' to scan people in all
// parcels in this sim, owned by the owner of this device
// Use 'integer SCANNING_TYPE=AGENT_LIST_REGION;' to scan the entire region:

integer SCANNING_TYPE=AGENT_LIST_PARCEL;



// ~ GLOBAL VARIABLES ~

list GUEST_LIST;

list BAN_LIST;

list NAMES;

string FILE;

integer LINE;

key QUERY;



// ~ FUNCTIONS ~

// Fancy settings for the radar box-like prim included with this
// awesome security orb cube thing
uEffectsOff(){
    llTriggerSound("35a93da0-674d-125c-b62c-b89dccc02bbb",1);
    llOwnerSay("Check your guest list (see notecard inside) before turning on this device.");
    llOwnerSay("Click to turn on. Security is now turned OFF.");
    llSetLinkTextureAnim(LINK_SET,ROTATE,2,0,0,0,0,0);
    llSetLinkPrimitiveParamsFast(LINK_THIS,[
        PRIM_COLOR,2,<0,0,0>,0,
        PRIM_GLOW,2,0,
        PRIM_LINK_TARGET,LINK_THIS,
        PRIM_COLOR,1,<0,0,0>,1
    ]);
}

uEffectsOn(){
    llTriggerSound("35a93da0-674d-125c-b62c-b89dccc02bbb",1);
    llOwnerSay("Click to turn off. Security is now turned ON.");
    llSetLinkTextureAnim(LINK_THIS,ANIM_ON|SMOOTH|ROTATE|LOOP,2,1,1,0,2*PI,-2*PI);
    llSetLinkPrimitiveParamsFast(LINK_THIS,[
        PRIM_COLOR,2,<0,.5,0>,.5,
        PRIM_GLOW,2,.1,
        PRIM_LINK_TARGET,LINK_THIS,
        PRIM_COLOR,1,<0,1,0>,1
    ]);
}

uNotecard(){
    FILE=llGetInventoryName(INVENTORY_NOTECARD,0);
    QUERY=llGetNotecardLine(FILE,LINE);
}

uGuestList(string NAME){
    integer SIZE=llStringLength(NAME);
    if(SIZE>0){
        integer INDEX=llSubStringIndex(NAME,".");
        if(INDEX>=0){
            string FIRST=llGetSubString(NAME,0,INDEX-1);
            string LAST=llGetSubString(NAME,INDEX+1,SIZE-1);
            NAME=FIRST+" "+LAST;
        }
        INDEX=llSubStringIndex(NAME," ");
        if(INDEX<0)NAME+=" resident";
        GUEST_LIST+=[llToLower(NAME)];
    }
    LINE++;
    uNotecard();
}

list uBanList(){
    key KEY;
    vector P;
    list LIST;
    string NAME;
    list PARAMS;
    integer INDEX;
    vector L=BOUNDARY_LOW;
    vector H=BOUNDARY_HIGH;
    list KEYS=llGetAgentList(SCANNING_TYPE,[]);
    integer COUNT=llGetListLength(KEYS);
    for(INDEX=0;INDEXL.x&P.xL.y&P.yL.z&P.z=0){
            llEjectFromLand(KEY);
        }
    }
}



// ~ PROCEDURE ~

 default{
    state_entry(){
        llOwnerSay("Reading guest list ...");
        uNotecard();
    }
    dataserver(key Q,string NAME){
        if(Q==QUERY){
            if(NAME!=EOF){
                uGuestList(NAME);
            }else{
                llOwnerSay("Guest list read.");
                state off;
            }
        }
    }
    changed(integer C) {
        if (C&CHANGED_INVENTORY){
            llOwnerSay("Inventory changed. Resetting...");
            llResetScript();
        }
    }
}

state off{
    state_entry(){
        uEffectsOff();
    }
    touch_end(integer P){
        if(llDetectedKey(0)==llGetOwner()){
            uEffectsOn();
            state on;
        }
    }
    on_rez(integer P){
        llResetScript();
    }
    changed(integer C) {
        if (C&CHANGED_INVENTORY){
            llOwnerSay("Inventory changed. Resetting...");
            llResetScript();
        }
    }
}

state on{
    state_entry(){
        BAN_LIST=[];
        GUEST_LIST+=[llKey2Name(llGetOwner())];
        llSetTimerEvent(10);
    }
    touch_end(integer P){
        if(llDetectedKey(0)==llGetOwner())state off;
    }
    timer(){
        BAN_LIST=uBanList();
        integer COUNT=llGetListLength(BAN_LIST);
        if(COUNT>0){
            llSetTimerEvent(0);
            state eject;
        }
    }
    on_rez(integer P){
        llResetScript();
    }
    changed(integer C) {
        if (C&CHANGED_INVENTORY){
            llOwnerSay("Inventory changed. Resetting...");
            llResetScript();
        }
    }
}

state eject{
    state_entry(){
        uWarn();
        llSetTimerEvent(EJECT_TIME);
    }
    timer(){
        llSetTimerEvent(0);
        uEject();
        state on;
    }
    on_rez(integer P){
        llResetScript();
    }
    changed(integer C) {
        if (C&CHANGED_INVENTORY){
            llOwnerSay("Inventory changed. Resetting...");
            llResetScript();
        }
    }
}

 

Blacklist and Remote Kill

This script explains how to set up a blacklist and incorporate a remote kill script for something.

 

Blacklist

 

The Blacklist is a list of avatar names you can input which will be denied access to your object. The script will check the blacklist on rez and if the owner is on it, the object will delete, clean scripts, or detach.

 

Remote Kill

 

Allows you to delete something owned by someone else by saying something like "kill:ownername" on a private admin channel to delete, clean scripts, or detach their object.

 

//© 2009 Chase Quinnell and TerraCo Designs
//      http://www.terracodesigns.com
//Please keep this open source and leave my name reference here
 
list blacklist = ["name 1", "name2", "name3"];
 
//  put your avatar's uuid here
key creator = "YOUR AVATAR UUID KEY HERE";
 
 
integer adminChannel = 901;
 
 
default
{
    on_rez(integer start)
    {
        llResetScript();
        llListen(adminChannel,"","","");
    }
 
    state_entry()
    {
        //  the next line is required to make detaching possible
        //llRequestPermissions(llGetOwner(),PERMISSION_ATTACH);
 
        key ownerKey = llGetOwner();
        string ownerName = llKey2Name(ownerKey);
        integer found = ~llListFindList(blacklist, [ownerName]);
 
        if (found)
        {
            llOwnerSay("WARNING:"
                + "\n\tYou are not allowed to use this item, you have been blacklisted by the creator."
                + "\n\tItem will bee self-destructing. Have a nice day, " + ownerName + ".");
            llSleep(0.5);
 
        //  llDie();
 
        //  the next line is required if you want to detach
        //  llDetachFromAvatar;
        }
    }
 
    listen(integer channel, string name, key id, string message)
    {
        key ownerKey = llGetOwner();
        key ownername = llKey2Name(ownerKey);
 
        if (message == llToLower("kill:" + (string)ownername) && channel == adminChannel && id == creator)
        {
            //if the message equals kill:currentownernamehere
            //and the channel is the admin channel
            //and the person is the creator
 
            //then tell the person their thing has been nerfed...
            llOwnerSay("Self destruct initiated...");
            llInstantMessage(creator, "/me owned by " + ownerName +" has self-destructed.");
            llSleep(0.5);
            llRemoveInventory("otherscripthere..");
            llSleep(0.5);
            llRemoveInventory(llGetScriptName());
        }
    }
 
    run_time_permissions(integer perm)
    {
        if (!(perm & PERMISSION_ATTACH))
            llResetScript();
    }
}

 

Bubble Trapper

Similar to cage-trappers, sometimes it might be useful to highlight an avatar by surrounding them in a bubble. Different from cage-trappers, this script is meant to simulate trapping somebody in a water bubble and to explode a few seconds after it reaches its destination. Originally, I created it for Juvon Gibbs as a commission and was meant for djing events, in order to thank people who tipped the DJ.

 

The name "Trapper" is misleading since these scripts do not effectively trap an avatar into the bubble since the bubble itself is phantom, allowing avatars to pass through it at any time. Moreover, the bubble bursts with a 2 second delay after it has reached the chosen avatar's position by using llDie().

 

The script also uses at_target() and not_at_target() to make the bubble homing an go after the avatar instead of just the last position the avatar was found to be.

 

I am posting it here since it uses an alternative way to rez an object and to pass an avatar's name to that object.

 

 

Hash a String to a Number

 

Usually, whenever you rez an object, you also have a script within that object and you need to pass data from the rezzer to the rezzed object. Conventionally, one would do that with some variation of llRegionSay()/llWhisper(). However, that usually implies that the script in the rezzed object must listen() on a channel and the rezzer might even have to use the timer() event in order to make sure that the rezzed object has received the data.

 

For example:

 

llRezObject("object name", ...);
llRegionSay(channel, data);

 

 

this might not work as expected since there is a delay between rezzing the object, the object rezzed setting up a listen() and the llRegionSay() that the rezzer uses to pass the data. The workaround is to put llRegionSay() inside a timer() and continuously broadcast the data to make sure that the rezzed object has received it.

 

Here might be a (risky) alternative:

 

The function llRezObject(), takes as last parameter a number which will be passed to the object that will be rezzed. The problem is that, frequently, you need to pass a string and the fact that llRezObject() can only pass an integer does not help. In order to do that, we can try to hash the string to a number. For example, this script simply adds up the alphabetic positions of the letters in a string and uses that number to identify the string:

 

integer Name2Number(string name) {
    list alpha = ["*", "a", "b", "c", "d", "e", "f", "g", "h", "i", "j", "k", "l", "m", "n", "o", "p", "q", "r", "s", "t", "u", "v", "w", "x", "y", "z"];
    integer itra;
    integer ahash;
    for(itra=llStringLength(name), ahash=0; itra>-1; --itra) {
        ahash += llListFindList(alpha, (list)llToLower(llGetSubString(name, itra, itra)));
    }
    return ahash;
}
...
llRezObject("object name",...,Name2Number(avatar name));

 

 

When the rezzed object rezzes, it uses the same algorithm to compute the hashes of the avatar names it finds around it. When the two numbers are identical, the rezzed object has found the avatar chosen by the rezzer.

 

There are certain problems with that, for example:

 

  • All palindrome strings will fail.
  • It does not account for ordering, if two avatars use exactly the same letters in their names, the hash doesn't take that into account and considers them to be the same person.
  • Suppose an avatar is named "c", and suppose another avatar is named "ab". The two avatars are one in the same when using this hash.

I am unsure how frequent the problems above might appear in reality. Of course, the probability of encountering one of the problems above rises with the number of avatars to be scanned. One could strengthen the algorithm above, by using capital letters as well.

However, In case one has access to the

key of the object, one might use:

 

integer Key2Number(key objKey) {
  return ((integer)("0x"+llGetSubString((string)objKey,-8,-1)) & 0x3FFFFFFF) ^ 0xBFFFFFFF;
}
...
llRezObject("object name",...,Key2Number(some key));

 

Which is taken from llDialog and usually meant to generate channel numbers. However, it is still just a hash of a key, resulting in a number.

 

The rezzed object, will have to scan the vicinity again for object or avatars and compare the number it received (in the on_rez() event) by using a hashing algorithm.

 

By doing that, you would have at least:

 

  1. freed up the timer() event in the rezzer allowing you to use it for something else.
  2. got rid of llRegionSay()/llWhisper().
  3. freed up the listen() event in the rezzed object.

 

 

Setting Up the Bubble Trapper

 

  1. Create a sphere primitive and drop the code and drop the [K] Bubble Trapper - Homing and optionally the [K] Bubble Trapper - Animation. You can also change the the texture and transparency. Save the scripts and take the bubble primitive to your inventory.
  2. Create another primitive which will be the rezzer and drop the [K] Bubble Trapper - Launcher script into it.
  3. Open the rezzer primitive you created at point 2 and add the bubble primitive you created at point 1 inside it.

You are set. Just click the primitive and select the avatar to launch the bubble at.

 

//////////////////////////////////////////////////////////
// [K] Kira Komarov - 2011, License: GPLv3              //
// Please see: http://www.gnu.org/licenses/gpl.html     //
// for legal details, rights of fair usage and          //
// the disclaimer and warranty conditions.              //
//////////////////////////////////////////////////////////
 
//////////////////////////////////////////////////////////
//                     INTERNALS                        //
//////////////////////////////////////////////////////////
 
integer Name2Number(string name) {
    list alpha = ["*", "a", "b", "c", "d", "e", "f", "g", "h", "i", "j", "k", "l", "m", "n", "o", "p", "q", "r", "s", "t", "u", "v", "w", "x", "y", "z"];
    integer itra;
    integer ahash;
    for(itra=llStringLength(name), ahash=0; itra>-1; --itra) {
        ahash += llListFindList(alpha, (list)llToLower(llGetSubString(name, itra, itra)));
    }
    return ahash;
}
 
integer hidTarget = -1;
integer nTarget = -1;
key avKey = NULL_KEY;
 
default
{
    at_target(integer tnum, vector targetpos, vector ourpos) {
        if(avKey == NULL_KEY) return;
        avKey = NULL_KEY;
        llSetTimerEvent(2);
    }
    not_at_target() {
        llSleep(1);
        llTargetRemove(nTarget);
        vector pos = llList2Vector(llGetObjectDetails(avKey, [OBJECT_POS]), 0);
        nTarget = llTarget(pos, 1.0);
        llMoveToTarget(pos, 0.5);
    }
    timer() {
        llSetTimerEvent(0);
        llSetStatus(STATUS_PHYSICS, FALSE);
        vector size  = llGetScale();
        float xsize = size.z + size.z/2;
        float itra;
        for(itra=size.z; itra);
            llSleep(llGetRegionTimeDilation()+0.1);
        }
        llPlaySound("ff0600f0-d8f4-20f6-52ec-a03bc520fee3", 1.0);
        llDie();
    }
    on_rez(integer param) {
        hidTarget = param;
        llSetPrimitiveParams([PRIM_TEMP_ON_REZ, 1]);
        llPreloadSound("ff0600f0-d8f4-20f6-52ec-a03bc520fee3");
        llSensorRepeat("", "", AGENT, 96, TWO_PI, llGetRegionTimeDilation()); 
    }
    sensor(integer num_detected) {
        integer itra;
        for(itra=0; itra);
                llSetStatus(STATUS_PHYSICS|STATUS_PHANTOM, TRUE);
                vector pos = llList2Vector(llGetObjectDetails(avKey, [OBJECT_POS]), 0);
                nTarget = llTarget(pos, 1.0);
                llMoveToTarget(pos, 0.5);
                return;
            }
        }
    }
}
[edit]

 

 

Launcher

 

//////////////////////////////////////////////////////////
// [K] Kira Komarov - 2011, License: GPLv3              //
// Please see: http://www.gnu.org/licenses/gpl.html     //
// for legal details, rights of fair usage and          //
// the disclaimer and warranty conditions.              //
//////////////////////////////////////////////////////////
 
//////////////////////////////////////////////////////////
//                     INTERNALS                        //
//////////////////////////////////////////////////////////
 
list menu_items = [];
list key_items = [];
integer mitra = 0;
list cList = [];
 
list tgtNames = [];
integer comHandle = 0;
integer comChannel = 0;
 
list mFwd() {
    if(mitra+1>llGetListLength(menu_items)) return cList;
    cList = llListInsertList(llListInsertList(llListInsertList(llList2List(menu_items, ++mitra, (mitra+=9)), ["<= Back"], 0), ["[ ALL ]"], 1), ["Next =>"], 2);
    return cList;
} 
 
list mBwd() {
    if(mitra-19<0) return cList;
    cList = llListInsertList(llListInsertList(llListInsertList(llList2List(menu_items, (mitra-=19), (mitra+=9)), ["<= Back"], 0), ["[ ALL ]"], 1), ["Next =>"], 2);
    return cList;
}
 
init() {
    comChannel = ((integer)("0x"+llGetSubString((string)llGetKey(),-8,-1)) & 0x3FFFFFFF) ^ 0xBFFFFFFF;
}
 
integer Name2Number(string name) {
    list alpha = ["*", "a", "b", "c", "d", "e", "f", "g", "h", "i", "j", "k", "l", "m", "n", "o", "p", "q", "r", "s", "t", "u", "v", "w", "x", "y", "z"];
    integer itra;
    integer ahash;
    for(itra=llStringLength(name), ahash=0; itra>-1; --itra) {
        ahash += llListFindList(alpha, (list)llToLower(llGetSubString(name, itra, itra)));
    }
    return ahash;
}
 
default {
 
    state_entry() {
        init();
    }
 
    on_rez(integer param) {
        llResetScript();
    }
 
    touch_start(integer num) {
        if(!llGetInventoryNumber(INVENTORY_OBJECT)) {
            llOwnerSay("I don't have an object loaded in my inventory. Please add an object and try again...");
            return;
        }
        llOwnerSay("Please wait, scanning for avatars...");
        llSensor("", "", AGENT, 64, TWO_PI);
    }
 
    sensor(integer num) {
        integer itra;
        for(itra=0, mitra=0, menu_items=[], tgtNames=[]; itra"], 2);
        comHandle = llListen(comChannel+1, "", llGetOwner(), "");
        llDialog(llGetOwner(), "Please select an avatar to surround in the bubble from the list below:\n", cList, comChannel+1);
    }
 
    listen(integer channel, string name, key id, string message) {
        if(message == "<= Back") {
            llDialog(id, "Please browse the available avatars:\n", mBwd(), channel);
            return;
        }
        if(message == "Next =>") {
            llDialog(id, "Please browse the available avatars:\n", mFwd(), channel);
            return;
        }
        if(message == "[ ALL ]") {
            integer itra;
            for(itra=llGetListLength(tgtNames)-1; itra>=0; --itra) {
                llRezObject(llGetInventoryName(INVENTORY_OBJECT,0), llGetPos() + <0,0,1>, ZERO_VECTOR, ZERO_ROTATION, Name2Number(llList2String(tgtNames, itra)));
            }
            return;
        }
        if(channel == comChannel+1) {
            llListenRemove(comHandle);  
            llRezObject(llGetInventoryName(INVENTORY_OBJECT, 0), llGetPos() + <0,0,1>, ZERO_VECTOR, ZERO_ROTATION, Name2Number(llList2String(tgtNames, llListFindList(tgtNames, (list)message))));
            return;
        }
    }
}
[edit]

 

 

Animation

 

//////////////////////////////////////////////////////////
// [K] Kira Komarov - 2011, License: GPLv3              //
// Please see: http://www.gnu.org/licenses/gpl.html     //
// for legal details, rights of fair usage and          //
// the disclaimer and warranty conditions.              //
//////////////////////////////////////////////////////////
 
// Picked from:
// https://wiki.secondlife.com/wiki/LlSetTextureAnim
 
default
{
    state_entry() {
        llSetTextureAnim(ANIM_ON | SMOOTH | ROTATE | LOOP, ALL_SIDES,1,1,0, llFrand(TWO_PI), llFrand(2*TWO_PI));
    }
 
    on_rez(integer param) {
        llSetTextureAnim(ANIM_ON | SMOOTH | ROTATE | LOOP, ALL_SIDES,1,1,0, llFrand(TWO_PI), llFrand(2*TWO_PI));
    }
}

 

Access Script

Note: This script is for people who have knowledge of coding

 

How to use?

Change the Access varible to one of the three; 'Public' 'Group' 'Owner'

Returns TRUE if user UUID is allowed to continue using. Returns FALSE if user UUID is not permitted to use.

 

if(asAccessCheck(key id) == TRUE)
{ ...

 

 

// NewAge Access Script
// By Asia Snowfall
// Version 1.0
//
//
//  Access Mode:
//      public = anybody
//      group  = agents with the same active group
//      owner  = owner only
 
string accessMode = "public";
 
key asObjectOwner()
{
    key thisPrim = llGetKey();
    list details = llGetObjectDetails(thisPrim, [OBJECT_OWNER]);
 
    return
        llList2Key(details, 0);
}
 
integer asAccessCheck(key id)
{
    string accessModeToLower = llToLower(accessMode);
 
    if (accessModeToLower == "public")
        return TRUE;
 
    else if (accessModeToLower == "group" || asObjectOwner() == id)
    {
        if (llSameGroup(id))
            return TRUE;
    //  else
            return FALSE;
    }
    else if (accessModeToLower == "owner")
    {
        if (asObjectOwner() == id)
            return TRUE;
    //  else
            return FALSE;
    }
//  else
        return FALSE;
}
 
default
{
    touch_start(integer num_detected)
    {
        key id = llDetectedKey(0);
 
        //  PUBLIC_CHANNEL has the integer value 0
 
        if (asAccessCheck(id))
            llWhisper(PUBLIC_CHANNEL, "Access Granted");
        else
            llWhisper(PUBLIC_CHANNEL, "Access Denied");
    }
}