Under Age Boot

From Second Life Wiki
Revision as of 10:18, 28 October 2015 by Casper Warden (talk | contribs)
(diff) ← Older revision | Latest revision (diff) | Newer revision → (diff)
Jump to navigation Jump to search
The printable version is no longer supported and may have rendering errors. Please update your browser bookmarks and please use the default browser print function instead.

Security device example to teleport home accounts below a minimum age limit; can be useful in combating free griefer accounts.

Place this script into a single prim and decorate to taste.

Requirements:

  1. Deed to match the land group
  2. Place the prim reasonably close to the parcel landing point
  3. Set the prim description field to be the minimum age accounts; must be in days

Operation:

  1. No special instructions. It operates stand alone once installed.
//////////////////////////////////////////////////////////////////////////////////////
//
//    Version 1.0 Release
//    Copyright (C) 2007, Chance Unknown
//
//    This library is free software; you can redistribute it and/or
//    modify it under the terms of the GNU Lesser General Public License
//    as published by the Free Software Foundation; either
//    version 2.1 of the License, or (at your option) any later version.
//
//    This library 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 Lesser General Public License for more details.
//
//    You should have received a copy of the GNU Lesser General Public License
//    along with this library; if not, write to the Free Software
//    Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
//
//////////////////////////////////////////////////////////////////////////////////////

// Set the age in the description field of the prim to reflect the SL account age
// of individuals to boot.

integer AGE_LIMIT;
list agent_list;

integer date2days(string data)
{
    integer result;
    list parse_date = llParseString2List(data, ["-"], []);
    integer year = llList2Integer(parse_date, 0);

    result = (year - 2000) * 365; // Bias Number to year 2000 (SL Avatars Born After Date)
    list days = [ 0, 31, 59, 90, 120, 151, 181, 212, 243, 273, 304, 334 ];

    result += llList2Integer(days, (llList2Integer(parse_date, 1) - 1));
    
    //Fixed the leap year calculation below  ~Casper Warden, 28/10/2015.
    //if (year/4 == llRound(year/4)) result += 1;
    result += llFloor((year-2000) / 4);

    result += llList2Integer(parse_date, 2);

    return result;
}

default
{
    on_rez(integer param)
    {
        llResetScript();
    }

    state_entry()
    {
        AGE_LIMIT = (integer)llGetObjectDesc();

        if (AGE_LIMIT < 2)
        {
            AGE_LIMIT = 2;
        }

        llSetObjectName("Unknown Underage Boot - " + llGetRegionName());
        llVolumeDetect(TRUE);
        if (llOverMyLand(llGetKey()) == FALSE)
        {
            llSay(0, "Requires proper group deeds to work on this land.");
        }
        llSensorRepeat("", "", AGENT, 100.0, PI, 1.0);
        llOwnerSay("Set Avatar age in the description, currently it is set for " +
            (string)AGE_LIMIT + " days.");
    }

    sensor(integer num_detected)
    {
        if (llOverMyLand(llGetKey()) == FALSE)
        {
            return;
        }

        integer i;

        for (i = 0; i < num_detected; i++)
        {
            key agent = llDetectedKey(i);
            if (llSameGroup(agent) == FALSE)
            {
                if (llListFindList(agent_list, [ agent ]) < 0)
                {
                    if (llGetListLength(agent_list) == 0)
                    {
                        agent_list += agent;
                        llRequestAgentData(llList2Key(agent_list, 0), DATA_BORN);
                    }
                    else
                    {
                        agent_list += agent;
                    }
                }
            }
        }
    }

    dataserver(key queryid, string data)
    {
        AGE_LIMIT = (integer)llGetObjectDesc();

        integer today = date2days(llGetDate());
        integer age = date2days(data);
        key agent = llList2Key(agent_list, 0);
        string name = llKey2Name(agent);

        if (AGE_LIMIT < 2)
        {
            AGE_LIMIT = 2;
            llSetObjectDesc((string)AGE_LIMIT + " : SET AGE LIMIT HERE");
        }

        if (name != "")
        {
            if ((today - age) < AGE_LIMIT)
            {
                if (llOverMyLand(agent))
                {
                    llSay(0, name + ", you are too young to be here.");
                    llTeleportAgentHome(agent);
                }
            }
            else
            {
            }
        }
        else
        {
            llTeleportAgentHome(agent);
        }

        agent_list = llDeleteSubList(agent_list, 0, 0);
        if (llGetListLength(agent_list) != 0)
        {
            llRequestAgentData(llList2Key(agent_list, 0), DATA_BORN);
        }
    }
}