WoR_PRC8/_module/nss/npc_clear.nss
Jaysyn904 b5e28e52f4 Initial commit
Initial commit [1.18]
2025-04-03 11:49:34 -04:00

99 lines
2.7 KiB
Plaintext

//::////////////////////////////////////////////////////////////////////////////
//::
//:: Script Name: npc_clear
//::
//:: Use: This script is used in conjuction with area_enter to clear the NPC's
//:: and trash from the area when the player leaves to reduce overhead on the
//:: system.
//::
//:: Created By: Birdman076
//::
//:: Created On: July 27, 2009
//::
//:: Note: This script is meant to be used in conjuction with "area_enter"
//::
//::////////////////////////////////////////////////////////////////////////////
// function removes all objects in inventory then object itself.
void TrashObject(object oObject)
{
/* search and destroy contents of body bag's, others just destroy */
if( GetHasInventory( oObject ) )
{
object oItem = GetFirstItemInInventory( oObject );
/* recursively trash all items inside container */
while( GetIsObjectValid( oItem ) )
{
TrashObject( oItem );
oItem = GetNextItemInInventory( oObject );
}
}
DestroyObject( oObject );
}
void main()
{
object oPC = GetExitingObject();
object oArea = OBJECT_SELF;
// only execute for PC's exiting an area
if( GetIsPC( oPC ) )
{
// Start up the loop, setting oPC now to the first PC
oPC = GetFirstPC();
// Continue looping until there are no more PCs left
while( oPC != OBJECT_INVALID )
{
// Check the Area against the Area of the current PC, and if they are the same
// exit the function, as we do not need to check anymore PCs
if( oArea == GetArea( oPC ) )
return;
// If not, continue to the next PC
else oPC = GetNextPC();
}
SetLocalInt( oArea, "NPC_AMT", 0 );
// If we've made it this far, we know that there aren't any PCs in the area
// Set oObject to the first object in the Area
object oObject = GetFirstObjectInArea( oArea );
// Continue looping until there are no more objects left
while( oObject != oArea && GetIsObjectValid( oObject ) )
{
// Test to see if oObject is a creature spawned from an encounter and if so,
// destroy the object
switch( GetObjectType( oObject ) )
{
case OBJECT_TYPE_ITEM:
TrashObject( oObject );
break;
case OBJECT_TYPE_PLACEABLE:
if( GetTag( oObject ) == "BodyBag")
TrashObject( oObject );
break;
case OBJECT_TYPE_CREATURE:
if( GetMaster( oObject ) == OBJECT_INVALID )
{
AssignCommand( oObject, SetIsDestroyable( TRUE, FALSE, FALSE ) );
TrashObject( oObject );
}
break;
case OBJECT_TYPE_AREA_OF_EFFECT:
DestroyObject( oObject );
break;
}
// Move on to the next object
oObject = GetNextObjectInArea( oArea );
}
}
}