ff_u_plc_gc
Placeable garbage collector.
Destroys items that have been in a placeable longer than GC_PLC_DURATION real hours.
Items are stamped when the placeable is closed, and checked when it is opened or destroyed.
Variables
ENABLE__FF_U_PLC_GC: (string) (opt-out) Set to "N" on module to disable the unit.
GARBAGE_COLLECT: (string) Flag. Set on the placeable to enable garbage collection.
GC_PLC_DURATION: (int) Maximum age in real hours before an item is destroyed. Read from the
placeable, its area, then the module. Defaults to 168 (7 days), at least 1.
Source code
// @code
#include "ff_i_core"
const string ENABLE__FF_U_PLC_GC = "ENABLE__FF_U_PLC_GC";
const string FF_U_PLC_GC__TIMESTAMP = "__FF_U_PLC_GC__TIMESTAMP";
const string GC_PLC_DURATION = "GC_PLC_DURATION";
const int DEFAULT_DURATION = 7 * 24; // 7 realtime days, in hours
const int SECONDS_PER_HOUR = 3600;
const string GARBAGE_COLLECT = "GARBAGE_COLLECT";
// -----------------------------------------------------------------------------
//! @brief Return TRUE if oObject is a non-static placeable with inventory and the GARBAGE_COLLECT flag set.
//! @param oObject An object.
int IsEligible(object oObject);
int IsEligible(object oObject)
{
if (GetObjectType(oObject) != OBJECT_TYPE_PLACEABLE)
return FALSE;
if (!GetHasInventory(oObject))
return FALSE;
if (NWNX_Object_GetPlaceableIsStatic(oObject))
return FALSE;
return GetObjectFlag(oObject, GARBAGE_COLLECT);
}
// -----------------------------------------------------------------------------
//! @brief Destroy items in oObject that have exceeded GC_PLC_DURATION hours.
//! @param oObject An eligible placeable.
void DeleteItems(object oObject);
void DeleteItems(object oObject)
{
if (!IsEligible(oObject))
return;
DeleteGCItems(oObject, FF_U_PLC_GC__TIMESTAMP, GC_PLC_DURATION, DEFAULT_DURATION, SECONDS_PER_HOUR);
}
// -----------------------------------------------------------------------------
//! @brief Stamp a GC timestamp on every untracked item in oObject.
//! @param oObject An eligible placeable.
void TrackItems(object oObject);
void TrackItems(object oObject)
{
if (!IsEligible(oObject))
return;
TrackGCInventory(oObject, FF_U_PLC_GC__TIMESTAMP);
}
// -----------------------------------------------------------------------------
void main()
{
string sEvent = NWNX_Events_GetCurrentEvent();
if (sEvent == ON_REGISTER)
{
if (!GetModuleFlag(ENABLE__FF_U_PLC_GC, TRUE))
return;
SubscribeToEvent(ON_DEFAULT_PLACEABLE_OPEN, __FILE__);
SubscribeToEvent(ON_DEFAULT_PLACEABLE_CLOSED, __FILE__);
SubscribeToEvent(ON_DEFAULT_PLACEABLE_DEATH, __FILE__);
SubscribeToEvent(ON_DELAYED_REGISTER, __FILE__);
}
// Avoid ON_DEFAULT_ITEM_ACQUIRE events during startup
else if (sEvent == ON_DELAYED_REGISTER)
{
SubscribeToEvent(ON_DEFAULT_ITEM_ACQUIRE, __FILE__);
}
else if (sEvent == ON_DEFAULT_ITEM_ACQUIRE)
UntrackGCObject(GetModuleItemAcquired(), FF_U_PLC_GC__TIMESTAMP);
else if (sEvent == ON_DEFAULT_PLACEABLE_CLOSED)
TrackItems(OBJECT_SELF);
else if (sEvent == ON_DEFAULT_PLACEABLE_OPEN || sEvent == ON_DEFAULT_PLACEABLE_DEATH)
DeleteItems(OBJECT_SELF);
}