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);
}