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