ff_u_v_feedback

Source code

// @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");
}