ff_u_pc_skin

On PC creation, add a creature skin to be able to add feats.

Variables

ENABLE__FF_U_PC_SKIN: (string) (opt-out) Set to “N” on module to disable.

Source code

// @code

#include "ff_i_core"

const string ENABLE__FF_U_PC_SKIN = "ENABLE__FF_U_PC_SKIN";

const string CREATURE_SKIN = "x2_it_emptyskin";

const string SKIN_OBJECT = "__FF_U_PC_SKIN__OBJECT";


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

//! @brief Equip the empty creature skin on oPC, creating it if absent.
//! @param oPC A player character.
object Equip(object oPC)
{
  object oSkin = GetItemInSlot(INVENTORY_SLOT_CARMOUR, oPC);
  if (GetIsObjectValid(oSkin))
  {
    LogNotice("PC " + GetPCInfo(oPC) + " already has a skin/hide.");
    return oSkin;
  }

  oSkin = CreateItemOnObject(CREATURE_SKIN, oPC);
  if (!GetIsObjectValid(oSkin))
  {
    LogError("Failed to create/load chest skin/hide item on PC: " + GetPCInfo(oPC));
    return OBJECT_INVALID;
  }

  SetIdentified(oSkin, TRUE);
  SetHiddenWhenEquipped(oSkin, TRUE);
  NWNX_Creature_RunEquip(oPC, oSkin, INVENTORY_SLOT_CARMOUR);
  LogNotice("Created skin/hide item on PC: " + GetPCInfo(oPC));
  return oSkin;
}


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

//! @brief Equip the skin on login and fire ON_DEFAULT_PC_SKIN_EQUIPPED.
//! @param oPC The entering player character.
void OnClientEnter(object oPC)
{
  if (!GetIsPC(oPC))
    return;

  NWNX_Feedback_SetFeedbackMessageHidden(NWNX_FEEDBACK_ITEM_RECEIVED, TRUE, oPC);
  NWNX_Feedback_SetFeedbackMessageHidden(NWNX_FEEDBACK_ITEM_LOST, TRUE, oPC);

  object oSkin = Equip(oPC);
  SendEvent(ON_DEFAULT_PC_SKIN_EQUIPPED, oPC);

  // Use AFTER event
  NWNX_Feedback_SetFeedbackMessageHidden(NWNX_FEEDBACK_ITEM_RECEIVED, FALSE, oPC);
  NWNX_Feedback_SetFeedbackMessageHidden(NWNX_FEEDBACK_ITEM_LOST, FALSE, oPC);
}


// =============================================================================

void main()
{
  if (!GetModuleFlag(ENABLE__FF_U_PC_SKIN, TRUE))
    return;

  string sEvent = GetCurrentEvent();
  if (sEvent == ON_REGISTER)
    SubscribeToEvent(ON_DEFAULT_CLIENT_ENTER, __FILE__);
  else if (sEvent == ON_DEFAULT_CLIENT_ENTER)
    OnClientEnter(GetEnteringObject());
}