ff_u_chat_emote

Allow emotes from chat commands.

Emotes will be available via /emote, /e`, or the action itself ``/bow. Chat /e help for help.

Variables

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

Source code

// @code

#include "ff_i_core"


const float EMOTE_DURATION_LOOPING = 86400.0f;

const string ENABLE__FF_U_CHAT_EMOTE = "ENABLE__FF_U_CHAT_EMOTE";


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

//! @brief Clear actions and play an animation on oPlayer.
//! @param oPlayer The creature to animate.
//! @param nEmote An ANIMATION_* constant.
//! @param fDuration Duration for looping animations. 0.0 for fire-and-forget. Defaults to 0.0f.
void DoEmote(object oPlayer, int nEmote, float fDuration = 0.0f);
void DoEmote(object oPlayer, int nEmote, float fDuration = 0.0f)
{
  AssignCommand(oPlayer, ClearAllActions());
  AssignCommand(oPlayer, ActionPlayAnimation(nEmote, 1.0, fDuration));
}


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

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

  SendMessageToPC(oSpeaker, _RGB("/e EMOTE: ", C1) + _RGB("Play an emote. '/e help' for list of emotes.", C2));
}


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

//! @brief Play the named emote for oSpeaker. Returns TRUE if the emote name was recognised.
//! @param oSpeaker The player character performing the emote.
//! @param sArg Emote name (e.g. "bow", "sit", "laugh").
int OnEmote(object oSpeaker, string sArg);
int OnEmote(object oSpeaker, string sArg)
{
  string C1 = CHAT_COLOR_DEBUG;
  string C2 = CHAT_COLOR_SERVER;

  if (sArg == "help")
    SendMessageToPC(oSpeaker, _RGB("Available Emotes: bow, duck, dodge, drink, greet, bored, scratch, read, salute, steal, taunt, victory (victory1, victory2, victory3), cast (cast1, cast2), deadback, deadfront, low, mid, meditate, drunk, tired, sit, spasm, forceful, laugh, talk, plead, worship", C2));
  else if (sArg == "bow")       DoEmote(oSpeaker, ANIMATION_FIREFORGET_BOW);
  else if (sArg == "duck")      DoEmote(oSpeaker, ANIMATION_FIREFORGET_DODGE_DUCK);
  else if (sArg == "dodge")     DoEmote(oSpeaker, ANIMATION_FIREFORGET_DODGE_SIDE);
  else if (sArg == "drink")     DoEmote(oSpeaker, ANIMATION_FIREFORGET_DRINK);
  else if (sArg == "greet")     DoEmote(oSpeaker, ANIMATION_FIREFORGET_GREETING);
  else if (sArg == "bored")     DoEmote(oSpeaker, ANIMATION_FIREFORGET_PAUSE_BORED);
  else if (sArg == "scratch")   DoEmote(oSpeaker, ANIMATION_FIREFORGET_PAUSE_SCRATCH_HEAD);
  else if (sArg == "read")      DoEmote(oSpeaker, ANIMATION_FIREFORGET_READ);
  else if (sArg == "salute")    DoEmote(oSpeaker, ANIMATION_FIREFORGET_SALUTE);
  else if (sArg == "steal")     DoEmote(oSpeaker, ANIMATION_FIREFORGET_STEAL);
  else if (sArg == "taunt")     DoEmote(oSpeaker, ANIMATION_FIREFORGET_TAUNT);
  else if (sArg == "victory")   DoEmote(oSpeaker, ANIMATION_FIREFORGET_VICTORY1);
  else if (sArg == "victory1")  DoEmote(oSpeaker, ANIMATION_FIREFORGET_VICTORY1);
  else if (sArg == "victory2")  DoEmote(oSpeaker, ANIMATION_FIREFORGET_VICTORY2);
  else if (sArg == "victory3")  DoEmote(oSpeaker, ANIMATION_FIREFORGET_VICTORY3);
  else if (sArg == "cast")      DoEmote(oSpeaker, ANIMATION_LOOPING_CONJURE1, EMOTE_DURATION_LOOPING);
  else if (sArg == "cast1")     DoEmote(oSpeaker, ANIMATION_LOOPING_CONJURE1, EMOTE_DURATION_LOOPING);
  else if (sArg == "cast2")     DoEmote(oSpeaker, ANIMATION_LOOPING_CONJURE2, EMOTE_DURATION_LOOPING);
  else if (sArg == "deadback")  DoEmote(oSpeaker, ANIMATION_LOOPING_DEAD_BACK, EMOTE_DURATION_LOOPING);
  else if (sArg == "deadfront") DoEmote(oSpeaker, ANIMATION_LOOPING_DEAD_FRONT, EMOTE_DURATION_LOOPING);
  else if (sArg == "low")       DoEmote(oSpeaker, ANIMATION_LOOPING_GET_LOW, EMOTE_DURATION_LOOPING);
  else if (sArg == "mid")       DoEmote(oSpeaker, ANIMATION_LOOPING_GET_MID, EMOTE_DURATION_LOOPING);
  else if (sArg == "meditate")  DoEmote(oSpeaker, ANIMATION_LOOPING_MEDITATE, EMOTE_DURATION_LOOPING);
  else if (sArg == "drunk")     DoEmote(oSpeaker, ANIMATION_LOOPING_PAUSE_DRUNK, EMOTE_DURATION_LOOPING);
  else if (sArg == "tired")     DoEmote(oSpeaker, ANIMATION_LOOPING_PAUSE_TIRED, EMOTE_DURATION_LOOPING);
  else if (sArg == "sit")       DoEmote(oSpeaker, ANIMATION_LOOPING_SIT_CROSS, EMOTE_DURATION_LOOPING);
  else if (sArg == "spasm")     DoEmote(oSpeaker, ANIMATION_LOOPING_SPASM, EMOTE_DURATION_LOOPING);
  else if (sArg == "forceful")  DoEmote(oSpeaker, ANIMATION_LOOPING_TALK_FORCEFUL, EMOTE_DURATION_LOOPING);
  else if (sArg == "laugh")     DoEmote(oSpeaker, ANIMATION_LOOPING_TALK_LAUGHING, EMOTE_DURATION_LOOPING);
  else if (sArg == "talk")      DoEmote(oSpeaker, ANIMATION_LOOPING_TALK_NORMAL, EMOTE_DURATION_LOOPING);
  else if (sArg == "plead")     DoEmote(oSpeaker, ANIMATION_LOOPING_TALK_PLEADING, EMOTE_DURATION_LOOPING);
  else if (sArg == "worship")   DoEmote(oSpeaker, ANIMATION_LOOPING_WORSHIP, EMOTE_DURATION_LOOPING);
  else
    return FALSE;
  return TRUE;
}


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

void OnChat();
void OnChat()
{
  object oSpeaker = GetPCChatSpeaker();
  string sMessage = GetPCChatMessage();
  string C1 = CHAT_COLOR_DEBUG;
  string C2 = CHAT_COLOR_SERVER;

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

  struct CLI_ARGUMENTS sArgs = GetArguments(sMessage);
  if (sArgs.sArg0 == "/e" || sArgs.sArg0 == "/emote")
  {
    OnEmote(oSpeaker, sArgs.sArg1);
    SetPCChatMessage("");
    return;
  }
  else if (GetSubStringEx(sArgs.sArg0, 0, 1) == "/")
  {
    sArgs.sArg0 = GetSubStringEx(sArgs.sArg0, 1);
    // Don't swallow the command line if it doesn't match.
    if (OnEmote(oSpeaker, sArgs.sArg0))
      SetPCChatMessage("");
    return;
  }
}


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

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

  string sEvent = 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();
}