ff_u_area_visibi
Set the visible distance of every created object.
When a creature or a non-static object is created, its visible distance is set to VISIBILITY meters. Doors and non-static placeables already in an area are updated when a player first enters the area.
Variables
ENABLE__FF_U_AREA_VISIBI or ENABLE__FF_U_AREA_VISIBILITY: (string) (opt-out) Set either to "N" on module to disable the unit.
VISIBILITY: (int) Visible distance, in meters. Read from the object,
then its area, then the module. Defaults to 45.
Source code
// @code
#include "ff_i_core"
const string ENABLE__FF_U_AREA_VISIBI = "ENABLE__FF_U_AREA_VISIBI";
const string ENABLE__FF_U_AREA_VISIBILITY = "ENABLE__FF_U_AREA_VISIBILITY";
const string VISIBILITY = "VISIBILITY";
const int DEFAULT_VISIBILITY = 45; // Meters
// -----------------------------------------------------------------------------
//! @brief Set the visible distance of oObject from its VISIBILITY variable.
//! Static placeables are left as is.
//! @param oObject An object.
void SetVisibility(object oObject);
void SetVisibility(object oObject)
{
if (!GetIsObjectValid(oObject))
return;
if (GetObjectType(oObject) == OBJECT_TYPE_PLACEABLE
&& NWNX_Object_GetPlaceableIsStatic(oObject))
return;
int nDistance = GetRecursiveInt(oObject, VISIBILITY, DEFAULT_VISIBILITY);
if (!nDistance)
return;
SetObjectVisibleDistance(oObject, IntToFloat(nDistance));
}
// -----------------------------------------------------------------------------
//! @brief Call SetVisibility on every door and placeable in oArea.
//! @param oArea An area.
void OnArea(object oArea);
void OnArea(object oArea)
{
object oObject = GetFirstObjectInArea(oArea);
while (GetIsObjectValid(oObject))
{
int nObjectType = GetObjectType(oObject);
if (nObjectType == OBJECT_TYPE_DOOR || nObjectType == OBJECT_TYPE_PLACEABLE)
SetVisibility(oObject);
oObject = GetNextObjectInArea(oArea);
}
}
// -----------------------------------------------------------------------------
void main()
{
string sEvent = NWNX_Events_GetCurrentEvent();
if (sEvent == ON_REGISTER)
{
if (!GetModuleFlag(ENABLE__FF_U_AREA_VISIBI, TRUE) || !GetModuleFlag(ENABLE__FF_U_AREA_VISIBILITY, TRUE))
return;
SubscribeToEvent(NWNX_ON_CREATE_OBJECT_AFTER, __FILE__);
SubscribeToEvent(ON_DEFAULT_AREA_ENTER_ONCE, __FILE__);
}
else if (sEvent == NWNX_ON_CREATE_OBJECT_AFTER)
SetVisibility(StringToObject(NWNX_Events_GetEventData("OBJECT")));
else if (sEvent == ON_DEFAULT_AREA_ENTER_ONCE)
OnArea(OBJECT_SELF);
}