RATDOG/_module/nss/otres_cleanup_oe.nss
Jaysyn904 909da8ff18 Added helms and dynamic goblins
Added  helms and dynamic goblins.  Added onEnter spawner scripts to all dungeon areas.  Fixed the Dishonest Patrol to be dynamic & more like PnP.  Full compile.

Co-Authored-By: Draygoth <65428430+Draygoth@users.noreply.github.com>
2022-11-30 00:45:38 -05:00

100 lines
3.5 KiB
Plaintext

//::///////////////////////////////////////////////
//:: Name Area Auto-cleaner
//:: FileName areaclean
//:: Copyright (c) 2001 Bioware Corp.
//:://////////////////////////////////////////////
/*
Place this script in the OnExit field of an area's event
tab. This will wait a few minutes after the last PC has
left the area then destroy all non-plot items dropped by
a PC or a slain NPC.
It will never perform a cleaning while a PC is in the area.
*/
//:://////////////////////////////////////////////
//:: Created By: Undivine
//:: Created On: November 2002
//:://////////////////////////////////////////////
void DestroyAllItems();
int GetIsAreaOccupied(object oArea);
void main()
{
if ((!GetIsAreaOccupied(OBJECT_SELF)) && (GetIsPC(GetExitingObject())))
{
float Wait = 0.0; // How many seconds to delay after PC has left area
int Rounds = GetLocalInt(OBJECT_SELF, "PrepClean") + 1;
/*
Rounds counts how many times the delayed DestroyAllItems fires.
This accounts for when a PC leaves and comes back and leaves again.
*/
SetLocalInt(OBJECT_SELF, "PrepClean", Rounds);
Rounds = GetLocalInt(OBJECT_SELF, "PrepClean");
DelayCommand(Wait, DestroyAllItems());
}
}
void DestroyAllItems()
{
int Rounds = GetLocalInt(OBJECT_SELF, "PrepClean");
if (!GetIsAreaOccupied(OBJECT_SELF))
{
// If this is in reaction to the most recent instance of a PC leaving the area, clean up.
if (Rounds == 1)
{
object oItem = GetFirstObjectInArea(OBJECT_SELF);
// When an NPC dies, they drop an object, not an item... like a treasure chest.
while (oItem != OBJECT_INVALID)
{
//
//if (GetTag(oItem) == "Body Bag")
// {
object oLookIn = GetFirstItemInInventory(oItem);
// Destroy everything in it except plot items.
while (oLookIn != OBJECT_INVALID)
{
// if (!GetPlotFlag(oLookIn)) uncomment to not destroy plot items
DestroyObject(oLookIn);
oLookIn = GetNextItemInInventory(oItem);
}
// }
// else
if (((GetObjectType(oItem) == OBJECT_TYPE_ITEM)||(GetObjectType(oItem) == OBJECT_TYPE_CREATURE)) && (!GetPlotFlag(oItem))) //modified to clear out creatures smo
DestroyObject(oItem);
oItem = GetNextObjectInArea(OBJECT_SELF);
}
SetLocalInt(OBJECT_SELF, "PrepClean", 0);
SetLocalInt(OBJECT_SELF, "iInUse", 0);//for PW support
}
else
{
// If this is not from the most recent instance of a PC leaving an area, decriment.
Rounds--;
SetLocalInt(OBJECT_SELF, "PrepClean", Rounds);
}
}
else
{
Rounds--;
SetLocalInt(OBJECT_SELF, "PrepClean", Rounds);
}
}
/*
This function returns TRUE if oArea currently
has a PC in it and FALSE if it doesn't.
*Note: Returns FALSE if oArea is not valid.
*/
int GetIsAreaOccupied(object oArea)
{
if (GetIsObjectValid(oArea))
{
object oPlayer = GetFirstPC();
while ((GetArea(oPlayer) != oArea) && (oPlayer != OBJECT_INVALID))
oPlayer = GetNextPC();
if (oPlayer != OBJECT_INVALID)
return TRUE;
else
return FALSE;
}
else
return FALSE;
}