// ~ 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.x L.y&P.y L.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(); } } }