Author Sticky: Post Working Scripts Here
Lokmar Iskaran Posted: Wednesday, 26 June 07:13PM
These scripts are designed to run a routine every 10 rounds (1 minute) and remove all items from an area that have been sitting on the floor for 5 minutes.

The first script is for the module's OnHeartbeat function. It goes through player inventory and sets a custom tag called "Age" to zero. This makes sure that any player-dropped item gets it's counters set to zero.

Code:
// Lokmar Iskaran's clean-up scripts

//

// This is the MODULE OnHeartbeat script, which makes sure all PC held items have

// reset "Age" tags.

void main()

{

    int modulecounter1 = 0;

    modulecounter1 = GetLocalInt(OBJECT_SELF, "modulecounter1");

    if (modulecounter1 == 0)

    {

        SetLocalInt(OBJECT_SELF, "modulecounter1", 2);

        // First tick, so first six seconds have already passed, thus we set it to 2

        // we're counting from 1 to 11 rather than 0 to 10, because 0 is the result

        // returned if the LocalInt does not exist... (as was tested above.)

    }

    else

    {

        modulecounter1++;

        if (modulecounter1 < 11)  // since counter starts at 1, need to go to 11 for 10 rounds

        {

            SetLocalInt(OBJECT_SELF, "modulecounter1", modulecounter1);

        }

        else

        {

            SetLocalInt(OBJECT_SELF, "modulecounter1", 1);

            // here we go through player inventory and reset all items' "Age" tag to zero.

            // this way, if they pick up items, it resets the age, so they have a correct

            // lifespan when dropped again

            // this code should go in the world/module heartbeat function

            object charObj = OBJECT_INVALID;

            object invObj = OBJECT_INVALID;

            charObj = GetFirstPC();

            while (charObj != OBJECT_INVALID)

            {

                if (GetArea(charObj) == OBJECT_SELF)

                {

                    invObj = GetFirstItemInInventory(charObj);

                    while (invObj != OBJECT_INVALID)

                    {

                        SetLocalInt(invObj, "Age", 0);

                        invObj = GetNextItemInInventory(charObj);

                    }

                }

            charObj = GetNextPC();

            }

        }

    }

}



The next is an area OnHeartbeat script that should be used in any area that you wish to have automatically cleaned of old items. (Useful in persisten worlds.)

Code:
// Lokmar Iskaran's clean-up scripts

//

// This is the AREA OnHeartbeat script that should be used for any area where

// you want items left on the floor to be deleted after the "Age" variable reaches

// a certain limit.  The codes fires every 10 rounds, which is one minute... and

// the item "Age" limit is current set to "< 5" (5 minutes, essentially) which

// can be altered below.

// Or, you could just set a module variable for the age limit and modify that in

// just the one spot.  It's up to you.



void main()

{

    int areacounter = 0;

    areacounter = GetLocalInt(OBJECT_SELF, "AreaCounter1");

    if (areacounter == 0)

    {

        SetLocalInt(OBJECT_SELF, "AreaCounter1", 2);

        // First tick, so first six seconds have already passed, thus we set it to 2

        // we're counting from 1 to 11 rather than 0 to 10, because 0 is the result

        // returned if the LocalInt does not exist... (as was tested above.)

    }

    else

    {

        areacounter++;

        if (areacounter < 11)  // since area counter starts at 1, need to go to 11 for 10 rounds

        {

            SetLocalInt(OBJECT_SELF, "AreaCounter1", areacounter);

        }

        else

        {

            SetLocalInt(OBJECT_SELF, "AreaCounter1", 1);

            object testObj = OBJECT_INVALID;

            location baseloc = Location(OBJECT_SELF, Vector (),0.0);

            int objAge = 0;

            int obcounter = 1;

            testObj = GetNearestObjectToLocation(OBJECT_TYPE_ITEM, baseloc, obcounter);

            while (testObj != OBJECT_INVALID)

            {

                objAge = GetLocalInt(testObj, "Age");

                objAge++;

                if (objAge < 5)

                {

                    SetLocalInt(testObj, "Age", objAge);

                }

                else

                {

                    DestroyObject(testObj, 0.0);

                }

                obcounter++;

                testObj = GetNearestObjectToLocation(OBJECT_TYPE_ITEM, baseloc, obcounter);

            }

        }

    }

}



This should help those of you who want persistent worlds where dropped items keep cluttering up the joint.