ff_u_chat_pc_dbg

Enables standard actions in debug mode.

Todo

Final review of ff_u_chat_pc_dbg.nss

Enables standard actions via chat commands when in debug mode.

Enables /debug <dmpassword>` set PC in debug mode Enables ``/give <resref> give object to PC Enables /givegold <number> give number gold to PC Enables /givexp <number> give number xp to PC Enables /goto <area> goto WP_GOTO in area Enables /haste set haste on PC Enables /identify identify all items Enables /level set level Enables /spawn <resref> spawn a creature Enables /time <number> add number hours to game

Variables

ENABLE__FF_U_CHAT_DBG: (int) (opt-out) Set to -1 on module to disable unit.

Source code

// @code


#include "ff_i_core"

const string ENABLE__FF_U_CHAT_DBG = "ENABLE__FF_U_CHAT_DBG";


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

void OnHelp();
void OnHelp()
{
  object oSpeaker = GetPCChatSpeaker();
  string C1 = CHAT_COLOR_DEBUG;
  string C2 = CHAT_COLOR_SERVER;

  if (!GetIsDebug())
    return;

  SendMessageToPC(oSpeaker, _RGB("/dump STRING: ", C1) + _RGB("Dump [i]nventory, [v]ariables", C2));
  SendMessageToPC(oSpeaker, _RGB("/give STRING: ", C1) + _RGB("Create item on PC.", C2));
  SendMessageToPC(oSpeaker, _RGB("/gold INT: ", C1) + _RGB("Give *integer* gold.", C2));
  SendMessageToPC(oSpeaker, _RGB("/goto STRING: ", C1) + _RGB("Goto area.", C2));
  SendMessageToPC(oSpeaker, _RGB("/identify: ", C1) + _RGB("Execute identify all", C2));
  SendMessageToPC(oSpeaker, _RGB("/level INT: ", C1) + _RGB("Set PC level to INT", C2));
  SendMessageToPC(oSpeaker, _RGB("/time INT: ", C1) + _RGB("Add or remove hours.", C2));
}


// -----------------------------------------------------------------------------
void OnChat();
void OnChat()
{
  object oModule = GetModule();
  object oSpeaker = GetPCChatSpeaker();
  string sMessage = GetPCChatMessage();

  sMessage = GetStringTrim(GetStringLowerCase(sMessage));
  if (sMessage == "")
    return;

  struct CLI_ARGUMENTS sArgs = GetArguments(sMessage);

  // =========================
  if (!(GetIsDebug()))
    return;
  // =========================

  if (sArgs.sArg0 == "/dump")
  {
    if (sArgs.sArg1 == "i")
    {
      object oItem = GetFirstItemInInventory(oSpeaker);
      while (GetIsObjectValid(oItem))
      {
        NWNX_Util_RawPrint(GetObjectInfo(oItem));
        oItem = GetNextItemInInventory(oSpeaker);
      }
    }
    else if (sArgs.sArg1 == "v")
      LogLocalVars(oSpeaker);
    SetPCChatMessage("");
  }

  /* TODO
  if (sArgs.sArg0 == "/give")
  {
    string sResRef = sArgs.sArg1;
    object oItem = CreateItemOnObjectEx(sResRef, oSpeaker);

    LogWarning("Player " + GetObjectInfo(oSpeaker) + " /gave object '" + sResRef + "'");
    SetPCChatMessage("");
    return;
  }
  */

  if (sArgs.sArg0 == "/gold")
  {
    string sGold = sArgs.sArg1;
    GiveGoldToCreature(oSpeaker, StringToInt(sGold));

    LogWarning("Player " + GetObjectInfo(oSpeaker) + " /gave " + sGold + " gold");
    SetPCChatMessage("");
    return;
  }


  if (sArgs.sArg0 == "/identify")
  {
    object oItem = GetFirstItemInInventory(oSpeaker);
    while (GetIsObjectValid(oItem))
    {
      SetIdentified(oItem, TRUE);
      oItem = GetNextItemInInventory(oSpeaker);
    }

    SetPCChatMessage("");
    return;
  }

  if (sArgs.sArg0 == "/level")
  {
    int nLevel = StringToInt(sArgs.sArg1);
    if (nLevel < 0 || nLevel > 40)
      SendFailureMessage(oSpeaker, "error: '" + IntToString(nLevel) + "' is not a valid number.");
    else
    {
      NWNX_Events_PushEventData("XP_SKIP_EVENT", "Y");
      SetXP(oSpeaker, GetXPForLevel(nLevel));
    }

    LogWarning("Player " + GetObjectInfo(oSpeaker) + " /level " + IntToString(nLevel));
    SetPCChatMessage("");
    return;
  }


  if (sArgs.sArg0 == "/time")
  {
    if (GetStringIsInt(sArgs.sArg1) && StringToInt(sArgs.sArg1))
    {
      int nHour = GetTimeHour() + StringToInt(sArgs.sArg1);
      int nMinute  = GetTimeMinute();
      int nSeconds = GetTimeSecond();

      // Avoid time events with a pause, and a extra second
      // SetGameActivePause(2); FIXME
      SetTime(nHour, nMinute, nSeconds + 1, 0);
      // SetGameActivePause(0); // FIXME
      NWNX_Events_SignalEvent(ON_CALENDAR_TIME_CHANGED, GetModule());

      LogWarning("Player " + GetObjectInfo(oSpeaker) + " /time " + IntToString(nHour));
    }

    string sMessage = "Current datetime: " + GetGameDate() + " " + GetGameTime();
    SendMessage(oSpeaker, sMessage, MESSAGE_COLOR_SUCCESS);

    SetPCChatMessage("");
    return;
  }
}


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

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

  if (!GetIsDebug())
    return;

  string sEvent = NWNX_Events_GetCurrentEvent();
  if (sEvent == ON_REGISTER)
  {
    SubscribeToEvent(ON_DEFAULT_PLAYER_CHAT, __FILE__);
    SubscribeToEvent(ON_DEFAULT_PLAYER_CHAT_HELP, __FILE__);
  }
  else if (sEvent == ON_DEFAULT_PLAYER_CHAT)
    OnChat();
  else if (sEvent == ON_DEFAULT_PLAYER_CHAT_HELP)
    OnHelp();
}