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