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