// @code
#include "ff_i_core"
const string FEEDBACK = "FEEDBACK";
const float DISTANCE = 3.0f;
// -----------------------------------------------------------------------------
//! @brief Return TRUE if oObject is a door or placeable with a non-empty FEEDBACK or NW_L_FEEDBACK value.
//! @param oObject An object.
int IsEligible(object oObject);
int IsEligible(object oObject)
{
int nType = GetObjectType(oObject);
if (nType != OBJECT_TYPE_DOOR && nType != OBJECT_TYPE_PLACEABLE)
return FALSE;
if (GetTag(oObject) == "")
return FALSE;
int nValue = GetLocalInt(oObject, NW_L_FEEDBACK);
if (nValue <= 0)
nValue = GetLocalInt(oObject, FEEDBACK);
if (nValue <= 0)
nValue = GetStringLength(GetLocalString(oObject, FEEDBACK));
if (nValue <= 0)
return FALSE;
return TRUE;
}
// -----------------------------------------------------------------------------
//! @brief Show the FEEDBACK message to the clicking PC.
//! @param oObject The door or placeable that failed to open.
//! @param sWhy Context string for debugging ("script" or "unlock").
void OnFailToOpen(object oObject, string sWhy);
void OnFailToOpen(object oObject, string sWhy)
{
if (!GetIsObjectValid(oObject))
return;
object oPC = GetClickingObject();
if (!GetIsPC(oPC))
return;
PrintString(sWhy);
NWNX_Feedback_SetFeedbackMessageHidden(NWNX_FEEDBACK_OBJECT_LOCKED, TRUE, oPC);
int nValue = GetLocalInt(oObject, FEEDBACK);
if (nValue)
{
// 53315: This door is barred from the other side.
// 58435: This door is presently barred from the other side...
FloatingTextStrRefOnCreature(nValue, oPC, FALSE);
return;
}
string sValue = GetLocalString(oObject, FEEDBACK);
if (sValue != "")
{
FloatingTextStringOnCreature(sValue, oPC, FALSE);
return;
}
}
// -----------------------------------------------------------------------------
void main()
{
string sEvent = GetCurrentEvent();
if (sEvent == ON_REGISTER)
{
SubscribeToEvent(ON_OBJECT_CREATED, __FILE__);
SubscribeToEvent(NWNX_ON_OBJECT_UNLOCK_BEFORE, __FILE__);
}
else if (sEvent == ON_OBJECT_CREATED && IsEligible(OBJECT_SELF))
SubscribeToEvent(ON_DEFAULT_OBJECT_FAIL_TO_OPEN, __FILE__, OBJECT_SELF);
else if (sEvent == ON_DEFAULT_OBJECT_FAIL_TO_OPEN)
OnFailToOpen(OBJECT_SELF, "script");
else if (sEvent == NWNX_ON_OBJECT_UNLOCK_BEFORE)
OnFailToOpen(OBJECT_SELF, "unlock");
}