ff_i_pc

PC functions.

Helpers for player character management: level checks, ability scores, character export, and first-login detection.

Source code

// @code

#include "nwnx_admin"
#include "nwnx_player"
#include "nwnx_feedback"

#include "ff_i_message"

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

// TODO/FIXME: GetIsPC with GetMaster check

//! @brief Get brief information on the PC
//! @param oPC A player character.
string GetPCInfo(object oPC);
string GetPCInfo(object oPC)
{
  return GetName(oPC) + " (" + GetPCPublicCDKey(oPC) + ")";
}


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

//! @brief Get XP required for level
//! @param nLevel Level from 1 to 40
//! @returns 2da value from exptable.2da
int GetXPForLevel(int nLevel);
int GetXPForLevel(int nLevel)
{
  return StringToInt(Get2DAString("exptable", "XP", nLevel - 1));
}


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

//! @brief Get the PC level
//! @param oPC A player character. Sums levels from all three class positions.
int GetPCLevel(object oPC);
int GetPCLevel(object oPC)
{
  return GetLevelByPosition(1, oPC) + GetLevelByPosition(2, oPC) + GetLevelByPosition(3, oPC);
}


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

void _CancelLevelUp(object oPC)
{
  NWNX_Player_SetTlkOverride(oPC, 53242, "", FALSE);
  NWNX_Feedback_SetFeedbackMessageHidden(NWNX_FEEDBACK_EXPERIENCE_LOST, FALSE, oPC);
  NWNX_Feedback_SetFeedbackMessageHidden(NWNX_FEEDBACK_EXPERIENCE_GAINNED, FALSE, oPC);
}

//! @brief Cancel a level up
//! @param oPC The PC whose level-up to cancel.
//! @param sMessage If non-empty, overrides the "Level Up!" TLK string and is shown in red. Defaults to "".
void CancelLevelUp(object oPC, string sMessage = "");
void CancelLevelUp(object oPC, string sMessage = "")
{
  if (sMessage != "")
  {
    // 53242 => "Level Up!"
    NWNX_Player_SetTlkOverride(oPC, 53242, sMessage, FALSE);

    SendMessage(oPC, sMessage, STRING_COLOR_RED);
    NWNX_Feedback_SetFeedbackMessageHidden(NWNX_FEEDBACK_EXPERIENCE_LOST, TRUE, oPC);
    NWNX_Feedback_SetFeedbackMessageHidden(NWNX_FEEDBACK_EXPERIENCE_GAINNED, TRUE, oPC);

    DelayCommand(0.6f, _CancelLevelUp(oPC));
  }

  int nPreviousXP = GetXP(oPC);
  int nLevelXP = GetXPForLevel(GetHitDice(oPC)) - 1;
  SetXP(oPC, nLevelXP);

  DelayCommand(0.4f, SetXP(oPC, nPreviousXP));

}


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

//! @brief Delete the PC from server vault
//! @param oPC The PC to permanently delete.
//! @param sMessage Boot message shown to the player.
void EradicatePC(object oPC, string sMessage);
void EradicatePC(object oPC, string sMessage)
{
  NWNX_Administration_DeleteTURD(GetPCPlayerName(oPC), GetName(oPC));
  NWNX_Administration_DeletePlayerCharacter(oPC, TRUE, sMessage);
  BootPC(oPC, sMessage);
}