areacleanup.nss
[i]/* areacleanup script
checks the area that it was called for for the presence of pc's,
if there aren't any then it systematically cleans up the area
of extra encounters and loot
*/
void debug(string dstring)
{
int isdebug = 0;
if (isdebug == 1)
SendMessageToPC(GetFirstPC(), dstring);
}
void TrashObject(object oObject)
{
debug(GetTag(oObject) + " is in trashobject");
if (GetObjectType(oObject) == OBJECT_TYPE_PLACEABLE) {
object oItem = GetFirstItemInInventory(oObject);
while (GetIsObjectValid(oItem))
{
debug(GetTag(oItem) + " is in trashobject");
TrashObject(oItem);
oItem = GetNextItemInInventory(oObject);
}
}
else
debug(GetTag(oObject) + " failed to pass as inventory type placeable is getting destroyed");
AssignCommand(oObject, SetIsDestroyable(TRUE, FALSE, FALSE));
DestroyObject(oObject);
}
void main()
{
object oPC;
oPC = GetFirstPC();
object tPC = oPC;
debug("We're starting area cleanup");
while (oPC != OBJECT_INVALID)
{
if (OBJECT_SELF == GetArea(oPC))
return;
else oPC = GetNextPC();
}
object oObject = GetFirstObjectInArea(OBJECT_SELF);
while (oObject != OBJECT_INVALID)
{
debug(GetTag(oObject));
if (GetIsEncounterCreature(oObject) && FindSubString(GetTag(oObject), "_BOSS") > -1)
DestroyObject(oObject);
int iObjectType = GetObjectType(oObject);
switch (iObjectType) {
case OBJECT_TYPE_PLACEABLE:
if (GetTag(oObject) != "BodyBag") {
break; }
case OBJECT_TYPE_ITEM:
TrashObject(oObject); }
oObject = GetNextObjectInArea(OBJECT_SELF);
}
}[/i]
then place this on area exit event / under area properties
[i]/* onexit script:
This script is placed in the onexit event handler for each area.
Its purpose is to check for the presence of remaining pc's in
and area and if it finds none then it activates a delayed call
to an areacleanup script which cleans the area
*/
void main()
{
float cleanupdelay = 30.0; //if you change this it alters how long before
// the area cleans up, if you do change it INCLUDE THE DECIMAL, or it won't
// work
if(!GetIsPC(GetExitingObject()) ) {
return; }
object oPC = GetExitingObject();
if (!GetIsPC(oPC))
return;
oPC = GetFirstPC();
while (oPC != OBJECT_INVALID)
{
if (OBJECT_SELF == GetArea(oPC))
return;
else oPC = GetNextPC();
}
DelayCommand(cleanupdelay, ExecuteScript("areacleanup", OBJECT_SELF));
}[/i]
Don't run a heartbeat script. It just is not necessary.
Modifié par Supreme_Pizza, 16 janvier 2013 - 07:18 .