ff_u_v_daycycle
Activate the placeable at specific times (dawn, day, dusk, night).
Variables
DAWN: (int) 1 if placeable is to be active at dawn.
DAY: (int) 1 if placeable is to be active during the day.
DUSK: (int) 1 if placeable is to be active at dusk.
NIGHT: (int) 1 if placeable is to be active during the night.
Examples
Having a torch bracket light the torch during the night, and deactivating it during the day.
Source code
// @code
#include "ff_i_core"
const string ENABLE__FF_U_V_DAYCYCLE = "ENABLE__FF_U_V_DAYCYCLE";
// -----------------------------------------------------------------------------
//! @brief Activate or deactivate oObject based on DAWN/DAY/DUSK/NIGHT local variables and current time.
//! @param oObject A placeable.
void ActivateObject(object oObject);
void ActivateObject(object oObject)
{
if (GetObjectType(oObject) != OBJECT_TYPE_PLACEABLE)
return;
int nDawn = GetLocalInt(oObject, "DAWN");
int nDay = GetLocalInt(oObject, "DAY");
int nDusk = GetLocalInt(oObject, "DUSK");
int nNight = GetLocalInt(oObject, "NIGHT");
if (nDawn || nDay || nDusk || nNight)
{}
else
return;
int nActivate = FALSE;
nActivate |= (GetIsDawn() && nDawn);
nActivate |= (GetIsDay() && nDay);
nActivate |= (GetIsDusk() && nDusk);
nActivate |= (GetIsNight() && nNight);
if (nActivate)
SetObjectState(oObject, PLACEABLE_STATE_ACTIVATED);
else
SetObjectState(oObject, PLACEABLE_STATE_DEACTIVATED);
}
// -----------------------------------------------------------------------------
//! @brief Call ActivateObject on every object in oArea (skipped when area is empty).
//! @param oArea An area.
void ActivateArea(object oArea);
void ActivateArea(object oArea)
{
int nCount = NWNX_Area_GetNumberOfPlayersInArea(oArea);
if (nCount == 0)
return;
object oObject = GetFirstObjectInArea(oArea);
while (GetIsObjectValid(oObject))
{
ActivateObject(oObject);
oObject = GetNextObjectInArea(oArea);
}
}
// -----------------------------------------------------------------------------
void ActivateModule();
void ActivateModule()
{
object oArea = GetFirstArea();
while (GetIsObjectValid(oArea))
{
ActivateArea(oArea);
oArea = GetNextArea();
}
}
// -----------------------------------------------------------------------------
void main()
{
object oModule = GetModule();
if (!GetModuleFlag(ENABLE__FF_U_V_DAYCYCLE, TRUE))
return;
string sEvent = GetCurrentEvent();
if (sEvent == ON_REGISTER)
{
SubscribeToEvent(ON_DEFAULT_AREA_ENTER, __FILE__);
SubscribeToEvent(ON_CALENDAR_HOUR, __FILE__);
SubscribeToEvent(ON_CALENDAR_TIME_CHANGED, __FILE__);
}
else if (sEvent == ON_DEFAULT_AREA_ENTER)
ActivateArea(OBJECT_SELF);
else if (sEvent == ON_CALENDAR_HOUR)
ActivateModule();
else if (sEvent == ON_CALENDAR_TIME_CHANGED) // This event is only sent manually.
ActivateModule();
}