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