ff_i_object

General object functions.

Helpers for object type detection, info formatting, and common object operations applicable to any game object type.

PLACEABLE_STATE_INVALID
PLACEABLE_STATE_OPEN
PLACEABLE_STATE_CLOSE
PLACEABLE_STATE_ACTIVATED
PLACEABLE_STATE_DEACTIVATED
X2_L_PLC_ACTIVATED_STATE
X2_L_PLC_OPEN_STATE
string GetObjectInfo(object oObject)
Parameters:
  • oObject – An object.

Return a display string for oObject (currently its name).

int GetIsObjectState(object oObject, int nEvent)
Parameters:
  • oObject – A placeable.

  • nEvent – A PLACEABLE_STATE_* constant.

Return TRUE if oObject’s current animation matches the given PLACEABLE_STATE_*.

void SetObjectState(object oObject, int nEvent)
Parameters:
  • oObject – A placeable.

  • nEvent – A PLACEABLE_STATE_* constant.

Drive oObject to a new PLACEABLE_STATE_*, playing the animation and setting state variables.

object CreateObjectEx(int nObjectType, string sTemplate, location lLocation, int bUseAppearAnimation = FALSE, string sNewTag = "")
Parameters:
  • nObjectType – An OBJECT_TYPE_* constant.

  • sTemplate – Blueprint resref.

  • lLocation – Spawn location.

  • bUseAppearAnimation – Play appear animation. Defaults to FALSE.

  • sNewTag – Overrides the template tag when non-empty. Defaults to “”.

Create an object and fire ON_OBJECT_CREATED.

Source code

// @code

#include "ff_i_events"
#include "ff_i_consts"

#include "nwnx_object"
#include "nwnx_events"
#include "nwnx_util"


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


const int PLACEABLE_STATE_INVALID     = -1;
const int PLACEABLE_STATE_OPEN        =  4055;
const int PLACEABLE_STATE_CLOSE       = -4055;
const int PLACEABLE_STATE_ACTIVATED   = ANIMATION_PLACEABLE_ACTIVATE;
const int PLACEABLE_STATE_DEACTIVATED = ANIMATION_PLACEABLE_DEACTIVATE;

const string X2_L_PLC_ACTIVATED_STATE = "X2_L_PLC_ACTIVATED_STATE";
const string X2_L_PLC_OPEN_STATE      = "X2_L_PLC_OPEN_STATE";


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

//! @brief Return a display string for oObject (currently its name).
//! @param oObject An object.
string GetObjectInfo(object oObject);
string GetObjectInfo(object oObject)
{
  // TODO/FIXME
  return GetName(oObject);
}


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

// Return TRUE if current state == nEvent;
// Return -1 if error
//! @brief Return TRUE if oObject's current animation matches the given PLACEABLE_STATE_*.
//! @param oObject A placeable.
//! @param nEvent A PLACEABLE_STATE_* constant.
int GetIsObjectState(object oObject, int nEvent);
int GetIsObjectState(object oObject, int nEvent)
{
  if (!GetIsObjectValid(oObject))
    return -1;

  // https://github.com/nwnxee/unified/blob/master/NWNXLib/API/Constants/Animation.hpp
  //
  //  PlaceableActivated   = 73,
  //  PlaceableDeactivated = 74,
  //  PlaceableOpened      = 75,
  //  PlaceableClosed      = 76,
  switch (nEvent)
  {
    case PLACEABLE_STATE_OPEN:        return (NWNX_Object_GetCurrentAnimation(oObject) == 75);
    case PLACEABLE_STATE_CLOSE:       return (NWNX_Object_GetCurrentAnimation(oObject) == 76);
    case PLACEABLE_STATE_ACTIVATED:   return (NWNX_Object_GetCurrentAnimation(oObject) == 73);
    case PLACEABLE_STATE_DEACTIVATED: return (NWNX_Object_GetCurrentAnimation(oObject) == 74);
  }
  return PLACEABLE_STATE_INVALID;
}


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

// Set object state to nEvent STATE_* after interaction with it
// Sets LAST_OPENED_EVENT, LAST_CLOSED_EVENT, LAST_ACTIVATION_EVENT, LAST_DEACTIVATION_EVENT
// Plays animation if needed for open/close, always for activation
// If bQueryState is true, it will check current state before playing animation
//! @brief Drive oObject to a new PLACEABLE_STATE_*, playing the animation and setting state variables.
//! @param oObject A placeable.
//! @param nEvent A PLACEABLE_STATE_* constant.
void SetObjectState(object oObject, int nEvent);
void SetObjectState(object oObject, int nEvent)
{
  if (!GetIsObjectValid(oObject))
    return;

  switch (nEvent)
  {
    case PLACEABLE_STATE_OPEN:
      if (!GetIsObjectState(oObject, ANIMATION_PLACEABLE_OPEN))
        AssignCommand(oObject, PlayAnimation(ANIMATION_PLACEABLE_OPEN));
      SetLocalInt(oObject, X2_L_PLC_OPEN_STATE, TRUE);
      break;

    case PLACEABLE_STATE_CLOSE:
      if (!GetIsObjectState(oObject, ANIMATION_PLACEABLE_CLOSE))
        AssignCommand(oObject, PlayAnimation(ANIMATION_PLACEABLE_CLOSE));
      SetLocalInt(oObject, X2_L_PLC_OPEN_STATE, FALSE);
      break;

    case PLACEABLE_STATE_ACTIVATED:
      if (!GetIsObjectState(oObject, ANIMATION_PLACEABLE_ACTIVATE))
        AssignCommand(oObject, PlayAnimation(ANIMATION_PLACEABLE_ACTIVATE));
      SetLocalInt(oObject, "NW_L_AMION", TRUE); // "AM I ON?"
      SetLocalInt(oObject, X2_L_PLC_ACTIVATED_STATE, TRUE);
      break;

    case PLACEABLE_STATE_DEACTIVATED:
      if (!GetIsObjectState(oObject, ANIMATION_PLACEABLE_DEACTIVATE))
        AssignCommand(oObject, PlayAnimation(ANIMATION_PLACEABLE_DEACTIVATE));
      SetLocalInt(oObject, "NW_L_AMION", FALSE); // "AM I ON?"
      SetLocalInt(oObject, X2_L_PLC_ACTIVATED_STATE, FALSE);
      break;
  }
}


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

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

// Create an object of the specified type at lLocation.
// - nObjectType: OBJECT_TYPE_ITEM, OBJECT_TYPE_CREATURE, OBJECT_TYPE_PLACEABLE,
//   OBJECT_TYPE_STORE, OBJECT_TYPE_WAYPOINT
// - sTemplate
// - lLocation
// - bUseAppearAnimation
// - sNewTag - if this string is not empty, it will replace the default tag from the template
//! @brief Create an object and fire ON_OBJECT_CREATED.
//! @param nObjectType An OBJECT_TYPE_* constant.
//! @param sTemplate Blueprint resref.
//! @param lLocation Spawn location.
//! @param bUseAppearAnimation Play appear animation. Defaults to FALSE.
//! @param sNewTag Overrides the template tag when non-empty. Defaults to "".
object CreateObjectEx(int nObjectType, string sTemplate, location lLocation, int bUseAppearAnimation=FALSE, string sNewTag="");
object CreateObjectEx(int nObjectType, string sTemplate, location lLocation, int bUseAppearAnimation=FALSE, string sNewTag="")
{
  object oObject = OBJECT_INVALID;

  if (nObjectType == OBJECT_TYPE_DOOR)
    oObject = NWNX_Util_CreateDoor(sTemplate, lLocation);
  else
     oObject = CreateObject(nObjectType, sTemplate, lLocation, bUseAppearAnimation, sNewTag);

  if (GetIsObjectValid(oObject))
    NWNX_Events_SignalEvent(ON_OBJECT_CREATED, oObject);
  return oObject;
}