ff_u_v_autoclose

Source code

// @code

#include "ff_i_core"


const string AUTOCLOSE = "AUTOCLOSE";

const string AUTOCLOSE_DURATION = "AUTOCLOSE_DURATION";

const int DEFAULT_DURATION = 30; // Seconds

// -----------------------------------------------------------------------------

//! @brief Return TRUE if oObject is a visible door with the AUTOCLOSE flag set.
//! @param oObject An object.
//! @param sVariable Flag variable name (AUTOCLOSE).
int IsEligible(object oObject, string sVariable);
int IsEligible(object oObject, string sVariable)
{
  int nValue = GetObjectFlag(oObject, AUTOCLOSE, FALSE);
  if (!nValue)
    return FALSE;

  int nType = GetObjectType(oObject);
  if (nType != OBJECT_TYPE_DOOR)
    return FALSE;

  if (!NWNX_Object_GetDoorHasVisibleModel(oObject))
    return FALSE;

  return TRUE;
}


// -----------------------------------------------------------------------------

//! @brief Close oDoor if it is still valid.
//! @param oDoor A door object.
void CloseDoor(object oDoor);
void CloseDoor(object oDoor)
{
  if (!GetIsObjectValid(oDoor))
    return;
  ActionCloseDoor(oDoor);
}


// =============================================================================

void main()
{
  string sEvent = GetCurrentEvent();

  if (sEvent == ON_REGISTER)
    SubscribeToEvent(ON_OBJECT_CREATED, __FILE__);
  else if (sEvent == ON_OBJECT_CREATED && IsEligible(OBJECT_SELF, AUTOCLOSE))
    SubscribeToEvent(ON_DEFAULT_OBJECT_OPENED, __FILE__, OBJECT_SELF);
  else if (sEvent == ON_DEFAULT_OBJECT_OPENED)
  {
    object oSelf = OBJECT_SELF;
    int nValue = GetRecursiveInt(oSelf, AUTOCLOSE_DURATION, DEFAULT_DURATION);
    nValue = max(nValue, 1);
    DelayCommand(IntToFloat(nValue), CloseDoor(oSelf));
  }
}