/FrameXML/ChatFrame.lua
Lua | 4879 lines | 4228 code | 518 blank | 133 comment | 837 complexity | d9363641afb215a2b682230b8fec8f1d MD5 | raw file
Large files files are truncated, but you can click here to view the full file
- MESSAGE_SCROLLBUTTON_INITIAL_DELAY = 0;
- MESSAGE_SCROLLBUTTON_SCROLL_DELAY = 0.05;
- CHAT_BUTTON_FLASH_TIME = 0.5;
- CHAT_TELL_ALERT_TIME = 300;
- NUM_CHAT_WINDOWS = 10;
- DEFAULT_CHAT_FRAME = ChatFrame1;
- NUM_REMEMBERED_TELLS = 10;
- MAX_WOW_CHAT_CHANNELS = 10;
- CHAT_TIMESTAMP_FORMAT = nil; -- gets set from Interface Options
- CHAT_SHOW_IME = false;
- MAX_CHARACTER_NAME_BYTES = 48;
- --DEBUG FIXME FOR TESTING
- CHAT_OPTIONS = {
- ONE_EDIT_AT_A_TIME = "old"
- };
- -- Table for event indexed chatFilters.
- -- Format ["CHAT_MSG_SYSTEM"] = { function1, function2, function3 }
- -- filter, arg1, arg2, arg3, arg4, arg5, arg6, arg7, arg8, arg9, arg10, arg11 = function1 (self, event, ...) if filter then return true end return false, ... end
- local chatFilters = {};
- -- These hash tables are to improve performance of common lookups
- -- if you change what these tables point to (ie slash command, emote, chat)
- -- then you need to invalidate the entry in the hash table
- local hash_SecureCmdList = {}
- --Note: These need to remain global for AddOns
- hash_SlashCmdList = {} --[localizedCommand] -> function
- hash_EmoteTokenList = {}
- hash_ChatTypeInfoList = {} --[localizedCommand] -> identifier (Stores all slash commands)
- ChatTypeInfo = { };
- ChatTypeInfo["SYSTEM"] = { sticky = 0, flashTab = false, flashTabOnGeneral = false };
- ChatTypeInfo["SAY"] = { sticky = 1, flashTab = false, flashTabOnGeneral = false };
- ChatTypeInfo["PARTY"] = { sticky = 1, flashTab = false, flashTabOnGeneral = false };
- ChatTypeInfo["RAID"] = { sticky = 1, flashTab = false, flashTabOnGeneral = false };
- ChatTypeInfo["GUILD"] = { sticky = 1, flashTab = false, flashTabOnGeneral = false };
- ChatTypeInfo["OFFICER"] = { sticky = 1, flashTab = false, flashTabOnGeneral = false };
- ChatTypeInfo["YELL"] = { sticky = 0, flashTab = false, flashTabOnGeneral = false };
- ChatTypeInfo["WHISPER"] = { sticky = 1, flashTab = true, flashTabOnGeneral = true };
- ChatTypeInfo["SMART_WHISPER"] = ChatTypeInfo["WHISPER"];
- ChatTypeInfo["WHISPER_INFORM"] = { sticky = 0, flashTab = false, flashTabOnGeneral = false };
- ChatTypeInfo["REPLY"] = { sticky = 0, flashTab = false, flashTabOnGeneral = false };
- ChatTypeInfo["EMOTE"] = { sticky = 0, flashTab = false, flashTabOnGeneral = false };
- ChatTypeInfo["TEXT_EMOTE"] = { sticky = 0, flashTab = false, flashTabOnGeneral = false };
- ChatTypeInfo["MONSTER_SAY"] = { sticky = 0, flashTab = false, flashTabOnGeneral = false };
- ChatTypeInfo["MONSTER_PARTY"] = { sticky = 0, flashTab = false, flashTabOnGeneral = false };
- ChatTypeInfo["MONSTER_YELL"] = { sticky = 0, flashTab = false, flashTabOnGeneral = false };
- ChatTypeInfo["MONSTER_WHISPER"] = { sticky = 0, flashTab = true, flashTabOnGeneral = true };
- ChatTypeInfo["MONSTER_EMOTE"] = { sticky = 0, flashTab = false, flashTabOnGeneral = false };
- ChatTypeInfo["CHANNEL"] = { sticky = 1, flashTab = false, flashTabOnGeneral = false };
- ChatTypeInfo["CHANNEL_JOIN"] = { sticky = 0, flashTab = false, flashTabOnGeneral = false };
- ChatTypeInfo["CHANNEL_LEAVE"] = { sticky = 0, flashTab = false, flashTabOnGeneral = false };
- ChatTypeInfo["CHANNEL_LIST"] = { sticky = 0, flashTab = false, flashTabOnGeneral = false };
- ChatTypeInfo["CHANNEL_NOTICE"] = { sticky = 0, flashTab = false, flashTabOnGeneral = false };
- ChatTypeInfo["CHANNEL_NOTICE_USER"] = { sticky = 0, flashTab = false, flashTabOnGeneral = false };
- ChatTypeInfo["TARGETICONS"] = { sticky = 0, flashTab = false, flashTabOnGeneral = false };
- ChatTypeInfo["AFK"] = { sticky = 0, flashTab = false, flashTabOnGeneral = false };
- ChatTypeInfo["DND"] = { sticky = 0, flashTab = false, flashTabOnGeneral = false };
- ChatTypeInfo["IGNORED"] = { sticky = 0, flashTab = false, flashTabOnGeneral = false };
- ChatTypeInfo["SKILL"] = { sticky = 0, flashTab = false, flashTabOnGeneral = false };
- ChatTypeInfo["LOOT"] = { sticky = 0, flashTab = false, flashTabOnGeneral = false };
- ChatTypeInfo["CURRENCY"] = { sticky = 0, flashTab = false, flashTabOnGeneral = false };
- ChatTypeInfo["MONEY"] = { sticky = 0, flashTab = false, flashTabOnGeneral = false };
- ChatTypeInfo["OPENING"] = { sticky = 0, flashTab = false, flashTabOnGeneral = false };
- ChatTypeInfo["TRADESKILLS"] = { sticky = 0, flashTab = false, flashTabOnGeneral = false };
- ChatTypeInfo["PET_INFO"] = { sticky = 0, flashTab = false, flashTabOnGeneral = false };
- ChatTypeInfo["COMBAT_MISC_INFO"] = { sticky = 0, flashTab = false, flashTabOnGeneral = false };
- ChatTypeInfo["COMBAT_XP_GAIN"] = { sticky = 0, flashTab = false, flashTabOnGeneral = false };
- ChatTypeInfo["COMBAT_HONOR_GAIN"] = { sticky = 0, flashTab = false, flashTabOnGeneral = false };
- ChatTypeInfo["COMBAT_FACTION_CHANGE"] = { sticky = 0, flashTab = false, flashTabOnGeneral = false };
- ChatTypeInfo["BG_SYSTEM_NEUTRAL"] = { sticky = 0, flashTab = false, flashTabOnGeneral = false };
- ChatTypeInfo["BG_SYSTEM_ALLIANCE"] = { sticky = 0, flashTab = false, flashTabOnGeneral = false };
- ChatTypeInfo["BG_SYSTEM_HORDE"] = { sticky = 0, flashTab = false, flashTabOnGeneral = false };
- ChatTypeInfo["RAID_LEADER"] = { sticky = 0, flashTab = false, flashTabOnGeneral = false };
- ChatTypeInfo["RAID_WARNING"] = { sticky = 0, flashTab = false, flashTabOnGeneral = false };
- ChatTypeInfo["RAID_BOSS_WHISPER"] = { sticky = 0, flashTab = false, flashTabOnGeneral = false };
- ChatTypeInfo["RAID_BOSS_EMOTE"] = { sticky = 0, flashTab = false, flashTabOnGeneral = false };
- ChatTypeInfo["QUEST_BOSS_EMOTE"] = { sticky = 0, flashTab = false, flashTabOnGeneral = false };
- ChatTypeInfo["FILTERED"] = { sticky = 0, flashTab = false, flashTabOnGeneral = false };
- ChatTypeInfo["INSTANCE_CHAT"] = { sticky = 1, flashTab = false, flashTabOnGeneral = false };
- ChatTypeInfo["INSTANCE_CHAT_LEADER"] = { sticky = 0, flashTab = false, flashTabOnGeneral = false };
- ChatTypeInfo["RESTRICTED"] = { sticky = 0, flashTab = false, flashTabOnGeneral = false };
- ChatTypeInfo["CHANNEL1"] = { sticky = 1, flashTab = false, flashTabOnGeneral = false };
- ChatTypeInfo["CHANNEL2"] = { sticky = 1, flashTab = false, flashTabOnGeneral = false };
- ChatTypeInfo["CHANNEL3"] = { sticky = 1, flashTab = false, flashTabOnGeneral = false };
- ChatTypeInfo["CHANNEL4"] = { sticky = 1, flashTab = false, flashTabOnGeneral = false };
- ChatTypeInfo["CHANNEL5"] = { sticky = 1, flashTab = false, flashTabOnGeneral = false };
- ChatTypeInfo["CHANNEL6"] = { sticky = 1, flashTab = false, flashTabOnGeneral = false };
- ChatTypeInfo["CHANNEL7"] = { sticky = 1, flashTab = false, flashTabOnGeneral = false };
- ChatTypeInfo["CHANNEL8"] = { sticky = 1, flashTab = false, flashTabOnGeneral = false };
- ChatTypeInfo["CHANNEL9"] = { sticky = 1, flashTab = false, flashTabOnGeneral = false };
- ChatTypeInfo["CHANNEL10"] = { sticky = 1, flashTab = false, flashTabOnGeneral = false };
- ChatTypeInfo["ACHIEVEMENT"] = { sticky = 0, flashTab = false, flashTabOnGeneral = false };
- ChatTypeInfo["GUILD_ACHIEVEMENT"] = { sticky = 0, flashTab = false, flashTabOnGeneral = false };
- ChatTypeInfo["PARTY_LEADER"] = { sticky = 0, flashTab = false, flashTabOnGeneral = false };
- ChatTypeInfo["BN_WHISPER"] = { sticky = 1, flashTab = true, flashTabOnGeneral = true };
- ChatTypeInfo["BN_WHISPER_INFORM"] = { sticky = 0, flashTab = false, flashTabOnGeneral = false };
- ChatTypeInfo["BN_CONVERSATION"] = { sticky = 1, flashTab = true, flashTabOnGeneral = false };
- ChatTypeInfo["BN_CONVERSATION_NOTICE"] = { sticky = 0, flashTab = true, flashTabOnGeneral = false };
- ChatTypeInfo["BN_CONVERSATION_LIST"] = { sticky = 0, flashTab = true, flashTabOnGeneral = false };
- ChatTypeInfo["BN_ALERT"] = { sticky = 0, flashTab = false, flashTabOnGeneral = false };
- ChatTypeInfo["BN_BROADCAST"] = { sticky = 0, flashTab = false, flashTabOnGeneral = false };
- ChatTypeInfo["BN_BROADCAST_INFORM"] = { sticky = 0, flashTab = false, flashTabOnGeneral = false };
- ChatTypeInfo["BN_INLINE_TOAST_ALERT"] = { sticky = 0, flashTab = true, flashTabOnGeneral = false };
- ChatTypeInfo["BN_INLINE_TOAST_BROADCAST"] = { sticky = 0, flashTab = true, flashTabOnGeneral = false };
- ChatTypeInfo["BN_INLINE_TOAST_BROADCAST_INFORM"] = { sticky = 0, flashTab = true, flashTabOnGeneral = false };
- ChatTypeInfo["BN_INLINE_TOAST_CONVERSATION"] = { sticky = 0, flashTab = true, flashTabOnGeneral = false };
- ChatTypeInfo["BN_WHISPER_PLAYER_OFFLINE"] = { sticky = 0, flashTab = false, flashTabOnGeneral = false };
- ChatTypeInfo["COMBAT_GUILD_XP_GAIN"] = { sticky = 0, flashTab = false, flashTabOnGeneral = false };
- ChatTypeInfo["PET_BATTLE_COMBAT_LOG"] = { sticky = 0, flashTab = false, flashTabOnGeneral = false };
- ChatTypeInfo["PET_BATTLE_INFO"] = { sticky = 0, flashTab = false, flashTabOnGeneral = false };
- --NEW_CHAT_TYPE -Add the info here.
- ChatTypeGroup = {};
- ChatTypeGroup["SYSTEM"] = {
- "CHAT_MSG_SYSTEM",
- "TIME_PLAYED_MSG",
- "PLAYER_LEVEL_UP",
- "UNIT_LEVEL",
- "CHARACTER_POINTS_CHANGED",
- "CHAT_MSG_BN_WHISPER_PLAYER_OFFLINE",
- };
- ChatTypeGroup["SAY"] = {
- "CHAT_MSG_SAY",
- };
- ChatTypeGroup["EMOTE"] = {
- "CHAT_MSG_EMOTE",
- "CHAT_MSG_TEXT_EMOTE",
- };
- ChatTypeGroup["YELL"] = {
- "CHAT_MSG_YELL",
- };
- ChatTypeGroup["WHISPER"] = {
- "CHAT_MSG_WHISPER",
- "CHAT_MSG_WHISPER_INFORM",
- "CHAT_MSG_AFK",
- "CHAT_MSG_DND",
- };
- ChatTypeGroup["PARTY"] = {
- "CHAT_MSG_PARTY",
- "CHAT_MSG_MONSTER_PARTY",
- };
- ChatTypeGroup["PARTY_LEADER"] = {
- "CHAT_MSG_PARTY_LEADER",
- };
- ChatTypeGroup["RAID"] = {
- "CHAT_MSG_RAID",
- };
- ChatTypeGroup["RAID_LEADER"] = {
- "CHAT_MSG_RAID_LEADER",
- };
- ChatTypeGroup["RAID_WARNING"] = {
- "CHAT_MSG_RAID_WARNING",
- };
- ChatTypeGroup["INSTANCE_CHAT"] = {
- "CHAT_MSG_INSTANCE_CHAT",
- };
- ChatTypeGroup["INSTANCE_CHAT_LEADER"] = {
- "CHAT_MSG_INSTANCE_CHAT_LEADER",
- };
- ChatTypeGroup["GUILD"] = {
- "CHAT_MSG_GUILD",
- "GUILD_MOTD",
- "UNIT_GUILD_LEVEL",
- };
- ChatTypeGroup["OFFICER"] = {
- "CHAT_MSG_OFFICER",
- };
- ChatTypeGroup["MONSTER_SAY"] = {
- "CHAT_MSG_MONSTER_SAY",
- };
- ChatTypeGroup["MONSTER_YELL"] = {
- "CHAT_MSG_MONSTER_YELL",
- };
- ChatTypeGroup["MONSTER_EMOTE"] = {
- "CHAT_MSG_MONSTER_EMOTE",
- };
- ChatTypeGroup["MONSTER_WHISPER"] = {
- "CHAT_MSG_MONSTER_WHISPER",
- };
- ChatTypeGroup["MONSTER_BOSS_EMOTE"] = {
- "CHAT_MSG_RAID_BOSS_EMOTE",
- };
- ChatTypeGroup["MONSTER_BOSS_WHISPER"] = {
- "CHAT_MSG_RAID_BOSS_WHISPER",
- };
- ChatTypeGroup["ERRORS"] = {
- "CHAT_MSG_RESTRICTED",
- "CHAT_MSG_FILTERED",
- };
- ChatTypeGroup["AFK"] = {
- "CHAT_MSG_AFK",
- };
- ChatTypeGroup["DND"] = {
- "CHAT_MSG_DND",
- };
- ChatTypeGroup["IGNORED"] = {
- "CHAT_MSG_IGNORED",
- };
- ChatTypeGroup["BG_HORDE"] = {
- "CHAT_MSG_BG_SYSTEM_HORDE",
- };
- ChatTypeGroup["BG_ALLIANCE"] = {
- "CHAT_MSG_BG_SYSTEM_ALLIANCE",
- };
- ChatTypeGroup["BG_NEUTRAL"] = {
- "CHAT_MSG_BG_SYSTEM_NEUTRAL",
- };
- ChatTypeGroup["COMBAT_XP_GAIN"] = {
- "CHAT_MSG_COMBAT_XP_GAIN";
- }
- ChatTypeGroup["COMBAT_HONOR_GAIN"] = {
- "CHAT_MSG_COMBAT_HONOR_GAIN";
- }
- ChatTypeGroup["COMBAT_FACTION_CHANGE"] = {
- "CHAT_MSG_COMBAT_FACTION_CHANGE";
- };
- ChatTypeGroup["SKILL"] = {
- "CHAT_MSG_SKILL",
- };
- ChatTypeGroup["LOOT"] = {
- "CHAT_MSG_LOOT",
- };
- ChatTypeGroup["CURRENCY"] = {
- "CHAT_MSG_CURRENCY",
- };
- ChatTypeGroup["MONEY"] = {
- "CHAT_MSG_MONEY",
- };
- ChatTypeGroup["OPENING"] = {
- "CHAT_MSG_OPENING";
- };
- ChatTypeGroup["TRADESKILLS"] = {
- "CHAT_MSG_TRADESKILLS";
- };
- ChatTypeGroup["PET_INFO"] = {
- "CHAT_MSG_PET_INFO";
- };
- ChatTypeGroup["COMBAT_MISC_INFO"] = {
- "CHAT_MSG_COMBAT_MISC_INFO";
- };
- ChatTypeGroup["ACHIEVEMENT"] = {
- "CHAT_MSG_ACHIEVEMENT";
- };
- ChatTypeGroup["GUILD_ACHIEVEMENT"] = {
- "CHAT_MSG_GUILD_ACHIEVEMENT";
- };
- ChatTypeGroup["CHANNEL"] = {
- "CHAT_MSG_CHANNEL_JOIN",
- "CHAT_MSG_CHANNEL_LEAVE",
- "CHAT_MSG_CHANNEL_NOTICE",
- "CHAT_MSG_CHANNEL_NOTICE_USER",
- "CHAT_MSG_CHANNEL_LIST",
- };
- ChatTypeGroup["TARGETICONS"] = {
- "CHAT_MSG_TARGETICONS"
- };
- ChatTypeGroup["BN_WHISPER"] = {
- "CHAT_MSG_BN_WHISPER",
- "CHAT_MSG_BN_WHISPER_INFORM",
- };
- ChatTypeGroup["BN_CONVERSATION"] = {
- "CHAT_MSG_BN_CONVERSATION",
- "CHAT_MSG_BN_CONVERSATION_NOTICE",
- "CHAT_MSG_BN_CONVERSATION_LIST",
- };
- ChatTypeGroup["BN_INLINE_TOAST_ALERT"] = {
- "CHAT_MSG_BN_INLINE_TOAST_ALERT",
- "CHAT_MSG_BN_INLINE_TOAST_BROADCAST",
- "CHAT_MSG_BN_INLINE_TOAST_BROADCAST_INFORM",
- "CHAT_MSG_BN_INLINE_TOAST_CONVERSATION",
- };
- ChatTypeGroup["COMBAT_GUILD_XP_GAIN"] = {
- "CHAT_MSG_COMBAT_GUILD_XP_GAIN",
- };
- ChatTypeGroup["PET_BATTLE_COMBAT_LOG"] = {
- "CHAT_MSG_PET_BATTLE_COMBAT_LOG",
- };
- ChatTypeGroup["PET_BATTLE_INFO"] = {
- "CHAT_MSG_PET_BATTLE_INFO",
- };
- --NEW_CHAT_TYPE - Add the chat type above.
- ChatTypeGroupInverted = {};
- for group, values in pairs(ChatTypeGroup) do
- for _, value in pairs(values) do
- ChatTypeGroupInverted[value] = group;
- end
- end
- CHAT_CATEGORY_LIST = {
- PARTY = { "PARTY_LEADER", "PARTY_GUIDE", "MONSTER_PARTY" },
- RAID = { "RAID_LEADER", "RAID_WARNING" },
- GUILD = { "GUILD_ACHIEVEMENT" },
- WHISPER = { "WHISPER_INFORM", "AFK", "DND" },
- CHANNEL = { "CHANNEL_JOIN", "CHANNEL_LEAVE", "CHANNEL_NOTICE", "CHANNEL_USER" },
- INSTANCE_CHAT = { "INSTANCE_CHAT_LEADER" },
- BN_WHISPER = { "BN_WHISPER_INFORM" },
- BN_CONVERSATION = { "BN_CONVERSATION_NOTICE", "BN_CONVERSATION_LIST" },
- };
- CHAT_INVERTED_CATEGORY_LIST = {};
- for category, sublist in pairs(CHAT_CATEGORY_LIST) do
- for _, item in pairs(sublist) do
- CHAT_INVERTED_CATEGORY_LIST[item] = category;
- end
- end
- function Chat_GetChatCategory(chatType)
- return CHAT_INVERTED_CATEGORY_LIST[chatType] or chatType;
- end
- -- list of text emotes that we want to show on the Emote submenu (these have anims)
- EmoteList = {
- "WAVE",
- "BOW",
- "DANCE",
- "APPLAUD",
- "BEG",
- "CHICKEN",
- "CRY",
- "EAT",
- "FLEX",
- "KISS",
- "LAUGH",
- "POINT",
- "ROAR",
- "RUDE",
- "SALUTE",
- "SHY",
- "TALK",
- "STAND",
- "SIT",
- "SLEEP",
- "KNEEL",
- };
- -- list of text emotes that we want to show on the Speech submenu (these have sounds)
- TextEmoteSpeechList = {
- "HELPME",
- "INCOMING",
- "CHARGE",
- "FLEE",
- "ATTACKMYTARGET",
- "OOM",
- "FOLLOW",
- "WAIT",
- "HEALME",
- "CHEER",
- "OPENFIRE",
- "RASP",
- "HELLO",
- "BYE",
- "NOD",
- "NO",
- "THANK",
- "WELCOME",
- "CONGRATULATE",
- "FLIRT",
- "JOKE",
- "TRAIN",
- };
- -- These are text emote tokens - add new ones at the bottom of the list!
- EMOTE1_TOKEN = "AGREE";
- EMOTE2_TOKEN = "AMAZE";
- EMOTE3_TOKEN = "ANGRY";
- EMOTE4_TOKEN = "APOLOGIZE";
- EMOTE5_TOKEN = "APPLAUD";
- EMOTE6_TOKEN = "BASHFUL";
- EMOTE7_TOKEN = "BECKON";
- EMOTE8_TOKEN = "BEG";
- EMOTE9_TOKEN = "BITE";
- EMOTE10_TOKEN = "BLEED";
- EMOTE11_TOKEN = "BLINK";
- EMOTE12_TOKEN = "BLUSH";
- EMOTE13_TOKEN = "BONK";
- EMOTE14_TOKEN = "BORED";
- EMOTE15_TOKEN = "BOUNCE";
- EMOTE16_TOKEN = "BRB";
- EMOTE17_TOKEN = "BOW";
- EMOTE18_TOKEN = "BURP";
- EMOTE19_TOKEN = "BYE";
- EMOTE20_TOKEN = "CACKLE";
- EMOTE21_TOKEN = "CHEER";
- EMOTE22_TOKEN = "CHICKEN";
- EMOTE23_TOKEN = "CHUCKLE";
- EMOTE24_TOKEN = "CLAP";
- EMOTE25_TOKEN = "CONFUSED";
- EMOTE26_TOKEN = "CONGRATULATE";
- EMOTE27_TOKEN = "UNUSED";
- EMOTE28_TOKEN = "COUGH";
- EMOTE29_TOKEN = "COWER";
- EMOTE30_TOKEN = "CRACK";
- EMOTE31_TOKEN = "CRINGE";
- EMOTE32_TOKEN = "CRY";
- EMOTE33_TOKEN = "CURIOUS";
- EMOTE34_TOKEN = "CURTSEY";
- EMOTE35_TOKEN = "DANCE";
- EMOTE36_TOKEN = "DRINK";
- EMOTE37_TOKEN = "DROOL";
- EMOTE38_TOKEN = "EAT";
- EMOTE39_TOKEN = "EYE";
- EMOTE40_TOKEN = "FART";
- EMOTE41_TOKEN = "FIDGET";
- EMOTE42_TOKEN = "FLEX";
- EMOTE43_TOKEN = "FROWN";
- EMOTE44_TOKEN = "GASP";
- EMOTE45_TOKEN = "GAZE";
- EMOTE46_TOKEN = "GIGGLE";
- EMOTE47_TOKEN = "GLARE";
- EMOTE48_TOKEN = "GLOAT";
- EMOTE49_TOKEN = "GREET";
- EMOTE50_TOKEN = "GRIN";
- EMOTE51_TOKEN = "GROAN";
- EMOTE52_TOKEN = "GROVEL";
- EMOTE53_TOKEN = "GUFFAW";
- EMOTE54_TOKEN = "HAIL";
- EMOTE55_TOKEN = "HAPPY";
- EMOTE56_TOKEN = "HELLO";
- EMOTE57_TOKEN = "HUG";
- EMOTE58_TOKEN = "HUNGRY";
- EMOTE59_TOKEN = "KISS";
- EMOTE60_TOKEN = "KNEEL";
- EMOTE61_TOKEN = "LAUGH";
- EMOTE62_TOKEN = "LAYDOWN";
- EMOTE63_TOKEN = "MASSAGE";
- EMOTE64_TOKEN = "MOAN";
- EMOTE65_TOKEN = "MOON";
- EMOTE66_TOKEN = "MOURN";
- EMOTE67_TOKEN = "NO";
- EMOTE68_TOKEN = "NOD";
- EMOTE69_TOKEN = "NOSEPICK";
- EMOTE70_TOKEN = "PANIC";
- EMOTE71_TOKEN = "PEER";
- EMOTE72_TOKEN = "PLEAD";
- EMOTE73_TOKEN = "POINT";
- EMOTE74_TOKEN = "POKE";
- EMOTE75_TOKEN = "PRAY";
- EMOTE76_TOKEN = "ROAR";
- EMOTE77_TOKEN = "ROFL";
- EMOTE78_TOKEN = "RUDE";
- EMOTE79_TOKEN = "SALUTE";
- EMOTE80_TOKEN = "SCRATCH";
- EMOTE81_TOKEN = "SEXY";
- EMOTE82_TOKEN = "SHAKE";
- EMOTE83_TOKEN = "SHOUT";
- EMOTE84_TOKEN = "SHRUG";
- EMOTE85_TOKEN = "SHY";
- EMOTE86_TOKEN = "SIGH";
- EMOTE87_TOKEN = "SIT";
- EMOTE88_TOKEN = "SLEEP";
- EMOTE89_TOKEN = "SNARL";
- EMOTE90_TOKEN = "SPIT";
- EMOTE91_TOKEN = "STARE";
- EMOTE92_TOKEN = "SURPRISED";
- EMOTE93_TOKEN = "SURRENDER";
- EMOTE94_TOKEN = "TALK";
- EMOTE95_TOKEN = "TALKEX";
- EMOTE96_TOKEN = "TALKQ";
- EMOTE97_TOKEN = "TAP";
- EMOTE98_TOKEN = "THANK";
- EMOTE99_TOKEN = "THREATEN";
- EMOTE100_TOKEN = "TIRED";
- EMOTE101_TOKEN = "VICTORY";
- EMOTE102_TOKEN = "WAVE";
- EMOTE103_TOKEN = "WELCOME";
- EMOTE104_TOKEN = "WHINE";
- EMOTE105_TOKEN = "WHISTLE";
- EMOTE106_TOKEN = "WORK";
- EMOTE107_TOKEN = "YAWN";
- EMOTE108_TOKEN = "BOGGLE";
- EMOTE109_TOKEN = "CALM";
- EMOTE110_TOKEN = "COLD";
- EMOTE111_TOKEN = "COMFORT";
- EMOTE112_TOKEN = "CUDDLE";
- EMOTE113_TOKEN = "DUCK";
- EMOTE114_TOKEN = "INSULT";
- EMOTE115_TOKEN = "INTRODUCE";
- EMOTE116_TOKEN = "JK";
- EMOTE117_TOKEN = "LICK";
- EMOTE118_TOKEN = "LISTEN";
- EMOTE119_TOKEN = "LOST";
- EMOTE120_TOKEN = "MOCK";
- EMOTE121_TOKEN = "PONDER";
- EMOTE122_TOKEN = "POUNCE";
- EMOTE123_TOKEN = "PRAISE";
- EMOTE124_TOKEN = "PURR";
- EMOTE125_TOKEN = "PUZZLE";
- EMOTE126_TOKEN = "RAISE";
- EMOTE127_TOKEN = "READY";
- EMOTE128_TOKEN = "SHIMMY";
- EMOTE129_TOKEN = "SHIVER";
- EMOTE130_TOKEN = "SHOO";
- EMOTE131_TOKEN = "SLAP";
- EMOTE132_TOKEN = "SMIRK";
- EMOTE133_TOKEN = "SNIFF";
- EMOTE134_TOKEN = "SNUB";
- EMOTE135_TOKEN = "SOOTHE";
- EMOTE136_TOKEN = "STINK";
- EMOTE137_TOKEN = "TAUNT";
- EMOTE138_TOKEN = "TEASE";
- EMOTE139_TOKEN = "THIRSTY";
- EMOTE140_TOKEN = "VETO";
- EMOTE141_TOKEN = "SNICKER";
- EMOTE142_TOKEN = "TICKLE";
- EMOTE143_TOKEN = "STAND";
- EMOTE144_TOKEN = "VIOLIN";
- EMOTE145_TOKEN = "SMILE";
- EMOTE146_TOKEN = "RASP";
- EMOTE147_TOKEN = "GROWL";
- EMOTE148_TOKEN = "BARK";
- EMOTE149_TOKEN = "PITY";
- EMOTE150_TOKEN = "SCARED";
- EMOTE151_TOKEN = "FLOP";
- EMOTE152_TOKEN = "LOVE";
- EMOTE153_TOKEN = "MOO";
- EMOTE154_TOKEN = "COMMEND";
- EMOTE155_TOKEN = "TRAIN";
- EMOTE156_TOKEN = "HELPME";
- EMOTE157_TOKEN = "INCOMING";
- EMOTE158_TOKEN = "OPENFIRE";
- EMOTE159_TOKEN = "CHARGE";
- EMOTE160_TOKEN = "FLEE";
- EMOTE161_TOKEN = "ATTACKMYTARGET";
- EMOTE162_TOKEN = "OOM";
- EMOTE163_TOKEN = "FOLLOW";
- EMOTE164_TOKEN = "WAIT";
- EMOTE165_TOKEN = "FLIRT";
- EMOTE166_TOKEN = "HEALME";
- EMOTE167_TOKEN = "JOKE";
- EMOTE168_TOKEN = "WINK";
- EMOTE169_TOKEN = "PAT";
- EMOTE170_TOKEN = "GOLFCLAP";
- EMOTE171_TOKEN = "MOUNTSPECIAL";
- EMOTE304_TOKEN = "INCOMING";
- EMOTE306_TOKEN = "FLEE";
- EMOTE368_TOKEN = "BLAME"
- EMOTE369_TOKEN = "BLANK"
- EMOTE370_TOKEN = "BRANDISH"
- EMOTE371_TOKEN = "BREATH"
- EMOTE372_TOKEN = "DISAGREE"
- EMOTE373_TOKEN = "DOUBT"
- EMOTE374_TOKEN = "EMBARRASS"
- EMOTE375_TOKEN = "ENCOURAGE"
- EMOTE376_TOKEN = "ENEMY"
- EMOTE377_TOKEN = "EYEBROW"
- EMOTE380_TOKEN = "HIGHFIVE"
- EMOTE381_TOKEN = "ABSENT"
- EMOTE382_TOKEN = "ARM"
- EMOTE383_TOKEN = "AWE"
- EMOTE384_TOKEN = "BACKPACK"
- EMOTE385_TOKEN = "BADFEELING"
- EMOTE386_TOKEN = "CHALLENGE"
- EMOTE387_TOKEN = "CHUG"
- EMOTE389_TOKEN = "DING"
- EMOTE390_TOKEN = "FACEPALM"
- EMOTE391_TOKEN = "FAINT"
- EMOTE392_TOKEN = "GO"
- EMOTE393_TOKEN = "GOING"
- EMOTE394_TOKEN = "GLOWER"
- EMOTE395_TOKEN = "HEADACHE"
- EMOTE396_TOKEN = "HICCUP"
- EMOTE398_TOKEN = "HISS"
- EMOTE399_TOKEN = "HOLDHAND"
- EMOTE401_TOKEN = "HURRY"
- EMOTE402_TOKEN = "IDEA"
- EMOTE403_TOKEN = "JEALOUS"
- EMOTE404_TOKEN = "LUCK"
- EMOTE405_TOKEN = "MAP"
- EMOTE406_TOKEN = "MERCY"
- EMOTE407_TOKEN = "MUTTER"
- EMOTE408_TOKEN = "NERVOUS"
- EMOTE409_TOKEN = "OFFER"
- EMOTE410_TOKEN = "PET"
- EMOTE411_TOKEN = "PINCH"
- EMOTE413_TOKEN = "PROUD"
- EMOTE414_TOKEN = "PROMISE"
- EMOTE415_TOKEN = "PULSE"
- EMOTE416_TOKEN = "PUNCH"
- EMOTE417_TOKEN = "POUT"
- EMOTE418_TOKEN = "REGRET"
- EMOTE420_TOKEN = "REVENGE"
- EMOTE421_TOKEN = "ROLLEYES"
- EMOTE422_TOKEN = "RUFFLE"
- EMOTE423_TOKEN = "SAD"
- EMOTE424_TOKEN = "SCOFF"
- EMOTE425_TOKEN = "SCOLD"
- EMOTE426_TOKEN = "SCOWL"
- EMOTE427_TOKEN = "SEARCH"
- EMOTE428_TOKEN = "SHAKEFIST"
- EMOTE429_TOKEN = "SHIFTY"
- EMOTE430_TOKEN = "SHUDDER"
- EMOTE431_TOKEN = "SIGNAL"
- EMOTE432_TOKEN = "SILENCE"
- EMOTE433_TOKEN = "SING"
- EMOTE434_TOKEN = "SMACK"
- EMOTE435_TOKEN = "SNEAK"
- EMOTE436_TOKEN = "SNEEZE"
- EMOTE437_TOKEN = "SNORT"
- EMOTE438_TOKEN = "SQUEAL"
- EMOTE440_TOKEN = "SUSPICIOUS"
- EMOTE441_TOKEN = "THINK"
- EMOTE442_TOKEN = "TRUCE"
- EMOTE443_TOKEN = "TWIDDLE"
- EMOTE444_TOKEN = "WARN"
- EMOTE445_TOKEN = "SNAP"
- EMOTE446_TOKEN = "CHARM"
- EMOTE447_TOKEN = "COVEREARS"
- EMOTE448_TOKEN = "CROSSARMS"
- EMOTE449_TOKEN = "LOOK"
- EMOTE450_TOKEN = "OBJECT"
- EMOTE451_TOKEN = "SWEAT"
- EMOTE452_TOKEN = "YW"
- EMOTE453_TOKEN = "READ"
- local MAXEMOTEINDEX = 453;
- ICON_LIST = {
- "|TInterface\\TargetingFrame\\UI-RaidTargetingIcon_1:",
- "|TInterface\\TargetingFrame\\UI-RaidTargetingIcon_2:",
- "|TInterface\\TargetingFrame\\UI-RaidTargetingIcon_3:",
- "|TInterface\\TargetingFrame\\UI-RaidTargetingIcon_4:",
- "|TInterface\\TargetingFrame\\UI-RaidTargetingIcon_5:",
- "|TInterface\\TargetingFrame\\UI-RaidTargetingIcon_6:",
- "|TInterface\\TargetingFrame\\UI-RaidTargetingIcon_7:",
- "|TInterface\\TargetingFrame\\UI-RaidTargetingIcon_8:",
- }
- --Links tags from Global Strings to indicies for entries in ICON_LIST. This way addons can easily replace icons
- ICON_TAG_LIST =
- {
- [strlower(ICON_TAG_RAID_TARGET_STAR1)] = 1,
- [strlower(ICON_TAG_RAID_TARGET_STAR2)] = 1,
- [strlower(ICON_TAG_RAID_TARGET_CIRCLE1)] = 2,
- [strlower(ICON_TAG_RAID_TARGET_CIRCLE2)] = 2,
- [strlower(ICON_TAG_RAID_TARGET_DIAMOND1)] = 3,
- [strlower(ICON_TAG_RAID_TARGET_DIAMOND2)] = 3,
- [strlower(ICON_TAG_RAID_TARGET_TRIANGLE1)] = 4,
- [strlower(ICON_TAG_RAID_TARGET_TRIANGLE2)] = 4,
- [strlower(ICON_TAG_RAID_TARGET_MOON1)] = 5,
- [strlower(ICON_TAG_RAID_TARGET_MOON2)] = 5,
- [strlower(ICON_TAG_RAID_TARGET_SQUARE1)] = 6,
- [strlower(ICON_TAG_RAID_TARGET_SQUARE2)] = 6,
- [strlower(ICON_TAG_RAID_TARGET_CROSS1)] = 7,
- [strlower(ICON_TAG_RAID_TARGET_CROSS2)] = 7,
- [strlower(ICON_TAG_RAID_TARGET_SKULL1)] = 8,
- [strlower(ICON_TAG_RAID_TARGET_SKULL2)] = 8,
- [strlower(RAID_TARGET_1)] = 1,
- [strlower(RAID_TARGET_2)] = 2,
- [strlower(RAID_TARGET_3)] = 3,
- [strlower(RAID_TARGET_4)] = 4,
- [strlower(RAID_TARGET_5)] = 5,
- [strlower(RAID_TARGET_6)] = 6,
- [strlower(RAID_TARGET_7)] = 7,
- [strlower(RAID_TARGET_8)] = 8,
- }
- GROUP_TAG_LIST =
- {
- [strlower(GROUP1_CHAT_TAG1)] = 1,
- [strlower(GROUP1_CHAT_TAG2)] = 1,
- [strlower(GROUP2_CHAT_TAG1)] = 2,
- [strlower(GROUP2_CHAT_TAG2)] = 2,
- [strlower(GROUP3_CHAT_TAG1)] = 3,
- [strlower(GROUP3_CHAT_TAG2)] = 3,
- [strlower(GROUP4_CHAT_TAG1)] = 4,
- [strlower(GROUP4_CHAT_TAG2)] = 4,
- [strlower(GROUP5_CHAT_TAG1)] = 5,
- [strlower(GROUP5_CHAT_TAG2)] = 5,
- [strlower(GROUP6_CHAT_TAG1)] = 6,
- [strlower(GROUP6_CHAT_TAG2)] = 6,
- [strlower(GROUP7_CHAT_TAG1)] = 7,
- [strlower(GROUP7_CHAT_TAG2)] = 7,
- [strlower(GROUP8_CHAT_TAG1)] = 8,
- [strlower(GROUP8_CHAT_TAG2)] = 8,
- --Language independent:
- ["g1"] = 1;
- ["g2"] = 2;
- ["g3"] = 3;
- ["g4"] = 4;
- ["g5"] = 5;
- ["g6"] = 6;
- ["g7"] = 7;
- ["g8"] = 8;
- };
- GROUP_LANGUAGE_INDEPENDENT_STRINGS =
- {
- "g1",
- "g2",
- "g3",
- "g4",
- "g5",
- "g6",
- "g7",
- "g8",
- };
- -- Arena Team Helper Function
- function ArenaTeam_GetTeamSizeID(teamsizearg)
- local teamname, teamsize, id;
- for i=1, MAX_ARENA_TEAMS do
- teamname, teamsize = GetArenaTeam(i)
- if ( teamsizearg == teamsize ) then
- id = i;
- end
- end
- return id;
- end
- --
- -- CastSequence support
- --
- local CastSequenceManager;
- local CastSequenceTable = {};
- local CastSequenceFreeList = {};
- local function CreateCanonicalActions(entry, ...)
- entry.spells = {};
- entry.spellNames = {};
- entry.items = {};
- local count = 0;
- for i=1, select("#", ...) do
- local action = strlower(strtrim((select(i, ...))));
- if ( action and action ~="" ) then
- count = count + 1;
- if ( GetItemInfo(action) or select(3, SecureCmdItemParse(action)) ) then
- entry.items[count] = action;
- entry.spells[count] = strlower(GetItemSpell(action) or "");
- entry.spellNames[count] = entry.spells[count];
- else
- entry.spells[count] = action;
- entry.spellNames[count] = gsub(action, "!*(.*)", "%1");
- end
- end
- end
- end
- local function SetCastSequenceIndex(entry, index)
- entry.index = index;
- entry.pending = nil;
- end
- local function ResetCastSequence(sequence, entry)
- SetCastSequenceIndex(entry, 1);
- CastSequenceFreeList[sequence] = entry;
- CastSequenceTable[sequence] = nil;
- end
- local function SetNextCastSequence(sequence, entry)
- if ( entry.index == #entry.spells ) then
- ResetCastSequence(sequence, entry);
- else
- SetCastSequenceIndex(entry, entry.index + 1);
- end
- end
- local function CastSequenceManager_OnEvent(self, event, ...)
- -- Reset all sequences when the player dies
- if ( event == "PLAYER_DEAD" ) then
- for sequence, entry in pairs(CastSequenceTable) do
- ResetCastSequence(sequence, entry);
- end
- return;
- end
- -- Increment sequences for spells which succeed.
- if ( event == "UNIT_SPELLCAST_SENT" or
- event == "UNIT_SPELLCAST_SUCCEEDED" or
- event == "UNIT_SPELLCAST_INTERRUPTED" or
- event == "UNIT_SPELLCAST_FAILED" or
- event == "UNIT_SPELLCAST_FAILED_QUIET" ) then
- local unit, name, rank, castID, _;
- if ( event == "UNIT_SPELLCAST_SENT" ) then
- unit, name, rank, _, castID = ...;
- else
- unit, name, rank, castID = ...;
- end
- if ( not name ) then
- -- This was a server-side only spell affecting the player somehow, don't do anything with cast sequencing, just bail.
- return;
- end
- if ( unit == "player" or unit == "pet" ) then
- name, rank = strlower(name), strlower(rank);
- local nameplus = name.."()";
- local fullname = name.."("..rank..")";
- for sequence, entry in pairs(CastSequenceTable) do
- local entryName = entry.spellNames[entry.index];
- if ( entryName == name or entryName == nameplus or entryName == fullname ) then
- if ( event == "UNIT_SPELLCAST_SENT" ) then
- entry.pending = castID;
- elseif ( entry.pending == castID ) then
- entry.pending = nil;
- if ( event == "UNIT_SPELLCAST_SUCCEEDED" ) then
- SetNextCastSequence(sequence, entry);
- end
- end
- end
- end
- end
- return;
- end
- -- Handle reset events
- local reset = "";
- if ( event == "PLAYER_TARGET_CHANGED" ) then
- reset = "target";
- elseif ( event == "PLAYER_REGEN_ENABLED" ) then
- reset = "combat";
- end
- for sequence, entry in pairs(CastSequenceTable) do
- if ( strfind(entry.reset, reset, 1, true) ) then
- ResetCastSequence(sequence, entry);
- end
- end
- end
- local function CastSequenceManager_OnUpdate(self, elapsed)
- elapsed = self.elapsed + elapsed;
- if ( elapsed < 1 ) then
- self.elapsed = elapsed;
- return;
- end
- for sequence, entry in pairs(CastSequenceTable) do
- if ( entry.timeout ) then
- if ( elapsed >= entry.timeout ) then
- ResetCastSequence(sequence, entry);
- else
- entry.timeout = entry.timeout - elapsed;
- end
- end
- end
- self.elapsed = 0;
- end
- local function ExecuteCastSequence(sequence, target)
- if ( not CastSequenceManager ) then
- CastSequenceManager = CreateFrame("Frame");
- CastSequenceManager.elapsed = 0;
- CastSequenceManager:RegisterEvent("PLAYER_DEAD");
- CastSequenceManager:RegisterEvent("UNIT_SPELLCAST_SENT");
- CastSequenceManager:RegisterEvent("UNIT_SPELLCAST_SUCCEEDED");
- CastSequenceManager:RegisterEvent("UNIT_SPELLCAST_INTERRUPTED");
- CastSequenceManager:RegisterEvent("UNIT_SPELLCAST_FAILED");
- CastSequenceManager:RegisterEvent("UNIT_SPELLCAST_FAILED_QUIET");
- CastSequenceManager:RegisterEvent("PLAYER_TARGET_CHANGED");
- CastSequenceManager:RegisterEvent("PLAYER_REGEN_ENABLED");
- CastSequenceManager:SetScript("OnEvent", CastSequenceManager_OnEvent);
- CastSequenceManager:SetScript("OnUpdate", CastSequenceManager_OnUpdate);
- end
- local entry = CastSequenceTable[sequence];
- if ( not entry ) then
- entry = CastSequenceFreeList[sequence];
- if ( not entry ) then
- local reset, spells = strmatch(sequence, "^reset=([^%s]+)%s*(.*)");
- if ( not reset ) then
- spells = sequence;
- end
- entry = {};
- CreateCanonicalActions(entry, strsplit(",", spells));
- entry.reset = strlower(reset or "");
- end
- CastSequenceTable[sequence] = entry;
- entry.index = 1;
- end
- -- Don't do anything if this entry is still pending
- if ( entry.pending ) then
- return;
- end
- -- See if modified click restarts the sequence
- if ( (IsShiftKeyDown() and strfind(entry.reset, "shift", 1, true)) or
- (IsControlKeyDown() and strfind(entry.reset, "ctrl", 1, true)) or
- (IsAltKeyDown() and strfind(entry.reset, "alt", 1, true)) ) then
- SetCastSequenceIndex(entry, 1);
- end
- -- Reset the timeout each time the sequence is used
- local timeout = strmatch(entry.reset, "(%d+)");
- if ( timeout ) then
- entry.timeout = CastSequenceManager.elapsed + tonumber(timeout);
- end
- -- Execute the sequence!
- local item, spell = entry.items[entry.index], entry.spells[entry.index];
- if ( item ) then
- local name, bag, slot = SecureCmdItemParse(item);
- if ( slot ) then
- if ( name ) then
- spell = strlower(GetItemSpell(name) or "");
- else
- spell = "";
- end
- entry.spellNames[entry.index] = spell;
- end
- if ( IsEquippableItem(name) and not IsEquippedItem(name) ) then
- EquipItemByName(name);
- else
- SecureCmdUseItem(name, bag, slot, target);
- end
- else
- CastSpellByName(spell, target);
- end
- if ( spell == "" ) then
- SetNextCastSequence(sequence, entry);
- end
- end
- function QueryCastSequence(sequence)
- local index = 1;
- local item, spell;
- local entry = CastSequenceTable[sequence];
- if ( entry ) then
- if ( (IsShiftKeyDown() and strfind(entry.reset, "shift", 1, true)) or
- (IsControlKeyDown() and strfind(entry.reset, "ctrl", 1, true)) or
- (IsAltKeyDown() and strfind(entry.reset, "alt", 1, true)) ) then
- index = 1;
- else
- index = entry.index;
- end
- item, spell = entry.items[index], entry.spells[index];
- else
- entry = CastSequenceFreeList[sequence];
- if ( entry ) then
- item, spell = entry.items[index], entry.spells[index];
- else
- local reset, spells = strmatch(sequence, "^reset=([^%s]+)%s*(.*)");
- if ( not reset ) then
- spells = sequence;
- end
- local action = strlower(strtrim((strsplit(",", spells))));
- if ( GetItemInfo(action) or select(3, SecureCmdItemParse(action)) ) then
- item, spell = action, strlower(GetItemSpell(action) or "");
- else
- item, spell = nil, action;
- end
- end
- end
- if ( item ) then
- local name, bag, slot = SecureCmdItemParse(item);
- if ( slot ) then
- if ( name ) then
- spell = strlower(GetItemSpell(name) or "");
- else
- spell = "";
- end
- end
- end
- return index, item, spell;
- end
- local CastRandomManager;
- local CastRandomTable = {};
- local function CastRandomManager_OnEvent(self, event, ...)
- local unit, name, rank = ...;
- if ( not name ) then
- -- This was a server-side only spell affecting the player somehow, don't do anything with cast sequencing, just bail.
- return;
- end
- if ( unit == "player" ) then
- name, rank = strlower(name), strlower(rank);
- local nameplus = name.."()";
- local fullname = name.."("..rank..")";
- for sequence, entry in pairs(CastRandomTable) do
- if ( entry.pending and entry.value ) then
- local entryName = strlower(entry.value);
- if ( entryName == name or entryName == nameplus or entryName == fullname ) then
- entry.pending = nil;
- if ( event == "UNIT_SPELLCAST_SUCCEEDED" ) then
- entry.value = nil;
- end
- end
- end
- end
- end
- end
- local function ExecuteCastRandom(actions)
- if ( not CastRandomManager ) then
- CastRandomManager = CreateFrame("Frame");
- CastRandomManager:RegisterEvent("UNIT_SPELLCAST_SUCCEEDED");
- CastRandomManager:RegisterEvent("UNIT_SPELLCAST_INTERRUPTED");
- CastRandomManager:RegisterEvent("UNIT_SPELLCAST_FAILED");
- CastRandomManager:RegisterEvent("UNIT_SPELLCAST_FAILED_QUIET");
- CastRandomManager:SetScript("OnEvent", CastRandomManager_OnEvent);
- end
- local entry = CastRandomTable[actions];
- if ( not entry ) then
- entry = {};
- CreateCanonicalActions(entry, strsplit(",", actions));
- CastRandomTable[actions] = entry;
- end
- if ( not entry.value ) then
- entry.value = strtrim(GetRandomArgument(strsplit(",", actions)));
- end
- entry.pending = true;
- return entry.value;
- end
- function GetRandomArgument(...)
- return (select(random(select("#", ...)), ...));
- end
- -- Slash commands that are protected from tampering
- local SecureCmdList = { };
- function IsSecureCmd(command)
- command = strupper(command);
- -- first check the hash table
- if ( hash_SecureCmdList[command] ) then
- return true;
- end
- for index, value in pairs(SecureCmdList) do
- local i = 1;
- local cmdString = _G["SLASH_"..index..i];
- while ( cmdString ) do
- cmdString = strupper(cmdString);
- if ( cmdString == command ) then
- return true;
- end
- i = i + 1;
- cmdString = _G["SLASH_"..index..i];
- end
- end
- end
- function SecureCmdItemParse(item)
- if ( not item ) then
- return nil, nil, nil;
- end
- local bag, slot = strmatch(item, "^(%d+)%s+(%d+)$");
- if ( not bag ) then
- slot = strmatch(item, "^(%d+)$");
- end
- if ( bag ) then
- item = GetContainerItemLink(bag, slot);
- elseif ( slot ) then
- item = GetInventoryItemLink("player", slot);
- end
- return item, bag, slot;
- end
- function SecureCmdUseItem(name, bag, slot, target)
- if ( bag ) then
- UseContainerItem(bag, slot, target);
- elseif ( slot ) then
- UseInventoryItem(slot, target);
- else
- UseItemByName(name, target);
- end
- end
- SecureCmdList["STARTATTACK"] = function(msg)
- local action, target = SecureCmdOptionParse(msg);
- if ( action ) then
- if ( not target or target == "target" ) then
- target = action;
- end
- StartAttack(target);
- end
- end
- SecureCmdList["STOPATTACK"] = function(msg)
- if ( SecureCmdOptionParse(msg) ) then
- StopAttack();
- end
- end
- SecureCmdList["CAST"] = function(msg)
- local action, target = SecureCmdOptionParse(msg);
- if ( action ) then
- local name, bag, slot = SecureCmdItemParse(action);
- if ( slot or GetItemInfo(name) ) then
- SecureCmdUseItem(name, bag, slot, target);
- else
- CastSpellByName(action, target);
- end
- end
- end
- SecureCmdList["USE"] = SecureCmdList["CAST"];
- SecureCmdList["CASTRANDOM"] = function(msg)
- local actions, target = SecureCmdOptionParse(msg);
- if ( actions ) then
- local action = ExecuteCastRandom(actions);
- local name, bag, slot = SecureCmdItemParse(action);
- if ( slot or GetItemInfo(name) ) then
- SecureCmdUseItem(name, bag, slot, target);
- else
- CastSpellByName(action, target);
- end
- end
- end
- SecureCmdList["USERANDOM"] = SecureCmdList["CASTRANDOM"];
- SecureCmdList["CASTSEQUENCE"] = function(msg)
- local sequence, target = SecureCmdOptionParse(msg);
- if ( sequence and sequence ~= "" ) then
- ExecuteCastSequence(sequence, target);
- end
- end
- SecureCmdList["STOPCASTING"] = function(msg)
- if ( SecureCmdOptionParse(msg) ) then
- SpellStopCasting();
- end
- end
- SecureCmdList["STOPSPELLTARGET"] = function(msg)
- if ( SecureCmdOptionParse(msg) ) then
- SpellStopTargeting();
- end
- end
- SecureCmdList["CANCELAURA"] = function(msg)
- local spell = SecureCmdOptionParse(msg);
- if ( spell ) then
- local name, rank = strmatch(spell, "([^(]+)[(]([^)]+)[)]");
- if ( not name ) then
- name = spell;
- end
- CancelUnitBuff("player", name, rank);
- end
- end
- SecureCmdList["CANCELFORM"] = function(msg)
- if ( SecureCmdOptionParse(msg) ) then
- CancelShapeshiftForm();
- end
- end
- -- Allow friendly names for glyph slots (needs to be local)
- local GLYPH_SLOTS = {
- minor1 = GLYPH_ID_MINOR_1;
- minor2 = GLYPH_ID_MINOR_2;
- minor3 = GLYPH_ID_MINOR_3;
- major1 = GLYPH_ID_MAJOR_1;
- major2 = GLYPH_ID_MAJOR_2;
- major3 = GLYPH_ID_MAJOR_3;
- -- prime1 = GLYPH_ID_PRIME_1;
- -- prime2 = GLYPH_ID_PRIME_2;
- -- prime3 = GLYPH_ID_PRIME_3;
- };
- SecureCmdList["CASTGLYPH"] = function(msg)
- local action = SecureCmdOptionParse(msg);
- if ( action ) then
- local glyph, slot = strmatch(action, "^(%S+)%s+(%S+)$");
- slot = (slot and GLYPH_SLOTS[slot]) or tonumber(slot);
- local glyphID = tonumber(glyph);
- if ( glyphID and slot ) then
- CastGlyphByID(glyphID, slot);
- elseif ( glyph and slot ) then
- CastGlyphByName(glyph, slot);
- end
- end
- end
- SecureCmdList["EQUIP"] = function(msg)
- local item = SecureCmdOptionParse(msg);
- if ( item ) then
- EquipItemByName((SecureCmdItemParse(item)));
- end
- end
- SecureCmdList["EQUIP_TO_SLOT"] = function(msg)
- local action = SecureCmdOptionParse(msg);
- if ( action ) then
- local slot, item = strmatch(action, "^(%d+)%s+(.*)");
- if ( item ) then
- if ( PaperDoll_IsEquippedSlot(slot) ) then
- EquipItemByName(SecureCmdItemParse(item), slot);
- else
- -- user specified a bad slot number (slot that you can't equip an item to)
- ChatFrame_DisplayUsageError(format(ERROR_SLASH_EQUIP_TO_SLOT, EQUIPPED_FIRST, EQUIPPED_LAST));
- end
- elseif ( slot ) then
- -- user specified a slot but not an item
- ChatFrame_DisplayUsageError(format(ERROR_SLASH_EQUIP_TO_SLOT, EQUIPPED_FIRST, EQUIPPED_LAST));
- end
- end
- end
- SecureCmdList["CHANGEACTIONBAR"] = function(msg)
- local page = SecureCmdOptionParse(msg);
- if ( page and page ~= "" ) then
- page = tonumber(page);
- if (page and page >= 1 and page <= NUM_ACTIONBAR_PAGES) then
- ChangeActionBarPage(page);
- else
- ChatFrame_DisplayUsageError(format(ERROR_SLASH_CHANGEACTIONBAR, 1, NUM_ACTIONBAR_PAGES));
- end
- end
- end
- SecureCmdList["SWAPACTIONBAR"] = function(msg)
- local action = SecureCmdOptionParse(msg);
- if ( action ) then
- local a, b = strmatch(action, "(%d+)%s+(%d+)");
- if ( a and b ) then
- a = tonumber(a);
- b = tonumber(b);
- if ( ( a and a >= 1 and a <= NUM_ACTIONBAR_PAGES ) and ( b and b >= 1 and b <= NUM_ACTIONBAR_PAGES ) ) then
- if ( GetActionBarPage() == a ) then
- ChangeActionBarPage(b);
- else
- ChangeActionBarPage(a);
- end
- else
- ChatFrame_DisplayUsageError(format(ERROR_SLASH_SWAPACTIONBAR, 1, NUM_ACTIONBAR_PAGES));
- end
- end
- end
- end
- SecureCmdList["TARGET"] = function(msg)
- local action, target = SecureCmdOptionParse(msg);
- if ( action ) then
- if ( not target or target == "target" ) then
- target = action;
- end
- TargetUnit(target);
- end
- end
- SecureCmdList["TARGET_EXACT"] = function(msg)
- local action, target = SecureCmdOptionParse(msg);
- if ( action ) then
- if ( not target or target == "target" ) then
- target = action;
- end
- TargetUnit(target, 1);
- end
- end
- SecureCmdList["TARGET_NEAREST_ENEMY"] = function(msg)
- local action = SecureCmdOptionParse(msg);
- if ( action ) then
- TargetNearestEnemy(action);
- end
- end
- SecureCmdList["TARGET_NEAREST_ENEMY_PLAYER"] = function(msg)
- local action = SecureCmdOptionParse(msg);
- if ( action ) then
- TargetNearestEnemyPlayer(action);
- end
- end
- SecureCmdList["TARGET_NEAREST_FRIEND"] = function(msg)
- local action = SecureCmdOptionParse(msg);
- if ( action ) then
- TargetNearestFriend(action);
- end
- end
- SecureCmdList["TARGET_NEAREST_FRIEND_PLAYER"] = function(msg)
- local action = SecureCmdOptionParse(msg);
- if ( action ) then
- TargetNearestFriendPlayer(action);
- end
- end
- SecureCmdList["TARGET_NEAREST_PARTY"] = function(msg)
- local action = SecureCmdOptionParse(msg);
- if ( action ) then
- TargetNearestPartyMember(action);
- end
- end
- SecureCmdList["TARGET_NEAREST_RAID"] = function(msg)
- local action = SecureCmdOptionParse(msg);
- if ( action ) then
- TargetNearestRaidMember(action);
- end
- end
- SecureCmdList["CLEARTARGET"] = function(msg)
- if ( SecureCmdOptionParse(msg) ) then
- ClearTarget();
- end
- end
- SecureCmdList["TARGET_LAST_TARGET"] = function(msg)
- if ( SecureCmdOptionParse(msg) ) then
- TargetLastTarget();
- end
- end
- SecureCmdList["TARGET_LAST_ENEMY"] = function(msg)
- local action = SecureCmdOptionParse(msg);
- if ( action ) then
- TargetLastEnemy(action);
- end
- end
- SecureCmdList["TARGET_LAST_FRIEND"] = function(msg)
- local action = SecureCmdOptionParse(msg);
- if ( action ) then
- TargetLastFriend(action);
- end
- end
- SecureCmdList["ASSIST"] = function(msg)
- if ( msg == "" ) then
- AssistUnit();
- else
- local action, target = SecureCmdOptionParse(msg);
- if ( action ) then
- if ( not target ) then
- target = action;
- end
- AssistUnit(target);
- end
- end
- end
- SecureCmdList["FOCUS"] = function(msg)
- if ( msg == "" ) then
- FocusUnit();
- else
- local action, target = SecureCmdOptionParse(msg);
- if ( action ) then
- if ( not target or target == "focus" ) then
- target = action;
- end
- FocusUnit(target);
- end
- end
- end
- SecureCmdList["CLEARFOCUS"] = function(msg)
- if ( SecureCmdOptionParse(msg) ) then
- ClearFocus();
- end
- end
- SecureCmdList["MAINTANKON"] = function(msg)
- local action, target = SecureCmdOptionParse(msg);
- if ( action ) then
- if ( not target ) then
- target = action;
- end
- if ( target == "" ) then
- target = "target";
- end
- SetPartyAssignment("MAINTANK", target);
- end
- end
- SecureCmdList["MAINTANKOFF"] = function(msg)
- local action, target = SecureCmdOptionParse(msg);
- if ( action ) then
- if ( not target ) then
- target = action;
- end
- if ( target == "" ) then
- target = "target";
- end
- ClearPartyAssignment("MAINTANK", target);
- end
- end
- SecureCmdList["MAINASSISTON"] = function(msg)
- local action, target = SecureCmdOptionParse(msg);
- if ( action ) then
- if ( not target ) then
- target = action;
- end
- if ( target == "" ) then
- target = "target";
- end
- SetPartyAssignment("MAINASSIST", target);
- end
- end
- SecureCmdList["MAINASSISTOFF"] = function(msg)
- local action, target = SecureCmdOptionParse(msg);
- if ( action ) then
- if ( not target ) then
- target = action;
- end
- if ( target == "" ) then
- target = "target";
- end
- ClearPartyAssignment("MAINASSIST", target);
- end
- end
- SecureCmdList["DUEL"] = function(msg)
- StartDuel(msg)
- end
- SecureCmdList["DUEL_CANCEL"] = function(msg)
- CancelDuel()
- end
- SecureCmdList["PET_ATTACK"] = function(msg)
- local action, target = SecureCmdOptionParse(msg);
- if ( action ) then
- if ( not target or target == "pettarget" ) then
- target = action;
- end
- PetAttack(target);
- end
- end
- SecureCmdList["PET_FOLLOW"] = function(msg)
- if ( SecureCmdOptionParse(msg) ) then
- PetFollow();
- end
- end
- SecureCmdList["PET_MOVE_TO"] = function(msg)
- local action, target = SecureCmdOptionParse(msg);
- if ( action ) then
- PetMoveTo(target);
- end
- end
- SecureCmdList["PET_STAY"] = function(msg)
- if ( SecureCmdOptionParse(msg) ) then
- PetWait();
- end
- end
- SecureCmdList["PET_PASSIVE"] = function(msg)
- if ( SecureCmdOptionParse(msg) ) then
- PetPassiveMode();
- end
- end
- SecureCmdList["PET_DEFENSIVE"] = function(msg)
- if ( SecureCmdOptionParse(msg) ) then
- PetDefensiveMode();
- end
- end
- SecureCmdList["PET_AGGRESSIVE"] = function(msg)
- if ( SecureCmdOptionParse(msg) ) then
- PetAggressiveMode();
- end
- end
- SecureCmdList["PET_ASSIST"] = function(msg)
- if ( SecureCmdOptionParse(msg) ) then
- PetAssistMode();
- end
- end
- SecureCmdList["PET_AUTOCASTON"] = function(msg)
- local spell = SecureCmdOptionParse(msg);
- if ( spell ) then
- EnableSpellAutocast(spell);
- end
- end
- SecureCmdList["PET_AUTOCASTOFF"] = function(msg)
- local spell = SecureCmdOptionParse(msg);
- if ( spell ) then
- DisableSpellAutocast(spell);
- end
- end
- SecureCmdList["PET_AUTOCASTTOGGLE"] = function(msg)
- local spell = SecureCmdOptionParse(msg);
- if ( spell ) then
- ToggleSpellAutocast(spell);
- end
- end
- SecureCmdList["STOPMACRO"] = function(msg)
- if ( SecureCmdOptionParse(msg) ) then
- StopMacro();
- end
- end
- SecureCmdList["CANCELQUEUEDSPELL"] = function(msg)
- if ( SecureCmdOptionParse(msg) ) then
- SpellCancelQueuedSpell();
- end
- end
- SecureCmdList["CLICK"] = function(msg)
- local action = SecureCmdOptionParse(msg);
- if ( action and action ~= "" ) then
- local name, mouseButton, down = strmatch(action, "([^%s]+)%s+([^%s]+)%s*(.*)");
- if ( not name ) then
- name = action;
- end
- local button = GetClickFrame(name);
- if ( button and button:IsObjectType("Button") ) then
- button:Click(mouseButton, down);
- end
- end
- end
- SecureCmdList["EQUIP_SET"] = function(msg)
- local set = SecureCmdOptionParse(msg);
- if ( set and set ~= "" ) then
- EquipmentManager_EquipSet(set);
- end
- end
- SecureCmdList["WORLD_MARKER"] = function(msg)
- local marker = SecureCmdOptionParse(msg);
- if ( tonumber(marker) ) then
- PlaceRaidMarker(tonumber(marker));
- end
- end
- SecureCmdList["CLEAR_WORLD_MARKER"] = function(msg)
- local marker = SecureCmdOptionParse(msg);
- if ( tonumber(marker) ) then
- ClearRaidMarker(tonumber(marker));
- elseif ( type(marker) == "string" and strtrim(strlower(marker)) == strlower(ALL) ) then
- ClearRaidMarker(nil); --Clear all world markers.
- end
- end
- SecureCmdList["SUMMON_BATTLE_PET"] = function(msg)
- local pet = SecureCmdOptionParse(msg);
- if ( type(pet) == "string" ) then
- local _, petID = C_PetJournal.FindPetIDByName(string.trim(pet));
- if ( petID ) then
- C_PetJournal.SummonPetByGUID(petID);
- else
- C_PetJournal.SummonPetByGUID(pet);
- end
- end
- end
- SecureCmdList["RANDOMPET"] = function(msg)
- if ( SecureCmdOptionParse(msg) ) then
- C_PetJournal.SummonRandomPet(true);
- end
- end
- SecureCmdList["RANDOMFAVORITEPET"] = function(msg)
- if ( SecureCmdOptionParse(msg) ) then
- C_PetJournal.SummonRandomPet(false);
- end
- end
- SecureCmdList["DISMISSBATTLEPET"] = function(msg)
- if ( SecureCmdOptionParse(msg) ) then
- local petID = C_PetJournal.GetSummonedPetGUID();
- if ( petID ) then
- C_PetJournal.SummonPetByGUID(petID);
- end
- end
- end
- -- Pre-populate the secure command hash table
- for index, value in pairs(SecureCmdList) do
- local i = 1;
- local cmdString = _G["SLASH_"..index..i];
- while ( cmdString ) do
- cmdString = strupper(cmdString);
- hash_SecureCmdList[cmdString] = value; -- add to hash
- i = i + 1;
- cmdString = _G["SLASH_"..index..i];
- end
- end
- -- Slash commands
- SlashCmdList = { };
- SlashCmdList["CONSOLE"] = function(msg)
- ConsoleExec(msg);
- end
- SlashCmdList["CHATLOG"] = function(msg)
- local info = ChatTypeInfo["SYSTEM"];
- if ( LoggingChat() ) then
- LoggingChat(false);
- DEFAULT_CHAT_FRAME:AddMessage(CHATLOGDISABLED, info.r, info.g, info.b, info.id);
- else
- LoggingChat(true);
- DEFAULT_CHAT_FRAME:AddMessage(CHATLOGENABLED, info.r, info.g, info.b, info.id);
- end
- end
- SlashCmdList["COMBATLOG"] = function(msg)
- local info = ChatTypeInfo["SYSTEM"];
- if ( LoggingCombat() ) then
- LoggingCombat(false);
- DEFAULT_CHAT_FRAME:AddMessage(COMBATLOGDISABLED, info.r, info.g, info.b, info.id);
- else
- LoggingCombat(true);
- DEFAULT_CHAT_FRAME:AddMessage(COMBATLOGENABLED, info.r, info.g, info.b, info.id);
- end
- end
- SlashCmdList["INVITE"] = function(msg)
- if(msg == "") then
- msg = UnitName("target");
- end
- if( msg and (strlen(msg) > MAX_CHARACTER_NAME_BYTES) ) then
- ChatFrame_DisplayUsageError(ERR_NAME_TOO_LONG2);
- return;
- end
- InviteToGroup(msg);
- end
- SlashCmdList["UNINVITE"] = function(msg)
- if(msg == "") then
- msg = UnitName("target");
- end
- UninviteUnit(msg);
- end
- SlashCmdList["PROMOTE"] = function(msg)
- PromoteToLeader(msg);
- end
- SlashCmdList["REPLY"] = function(msg, editBox)
- local lastTell = ChatEdit_GetLastTellTarget();
- if ( lastTell ) then
- msg = SubstituteChatMessageBeforeSend(msg);
- SendChatMessage(msg, "WHISPER", editBox.languageID, lastTell);
- else
- -- error message
- end
- end
- SlashCmdList["HELP"] = function(msg)
- ChatFrame_DisplayHelpText(DEFAULT_CHAT_FRAME);
- end
- SlashCmdList["MACROHELP"] = function(msg)
- ChatFrame_DisplayMacroHelpText(DEFAULT_CHAT_FRAME);
- end
- SlashCmdList["TIME"] = function(msg)
- ChatFrame_DisplayGameTime(DEFAULT_CHAT_FRAME);
- end
- SlashCmdList["PLAYED"] = function(msg)
- RequestTimePlayed();
- end
- SlashCmdList["FOLLOW"] = function(msg)
- FollowUnit(msg);
- end
- SlashCmdList["TRADE"] = function(msg)
- InitiateTrade("target");
- end
- SlashCmdList["INSPECT"] = function(msg)
- InspectUnit("target");
- end
- SlashCmdList["LOGOUT"] = function(msg)
- Logout();
- end
- SlashCmdList["QUIT"] = function(msg)
- Quit();
- end
- SlashCmdList["JOIN"] = function(msg)
- local name = gsub(msg, "%s*([^%s]+).*", "%1");
- local password = gsub(msg, "%s*([^%s]+)%s*(.*)", "%2");
- if(strlen(name) <= 0) then
- local joinhelp = CHAT_JOIN_HELP;
- local info = ChatTypeInfo["SYSTEM"];
- DEFAULT_CHAT_FRAME:AddMessage(joinhelp, info.r, info.g, info.b, info.id);
- else
- local zoneChannel, channelName = JoinPermanentChannel(name, password, DEFAULT_CHAT_FRAME:GetID(), 1);
- if ( channelName ) then
- name = channelName;
- end
- if ( not zoneChannel ) then
- local info = ChatTypeInfo["CHANNEL"];
- DEFAULT_CHAT_FRAME:AddMessage(CHAT_INVALID_NAME_NOTICE, info.r, info.g, info.b, info.id);
- return;
- end
- local i = 1;
- while ( DEFAULT_CHAT_FRAME.channelList[i] ) do
- i = i + 1;
- end
- DEFAULT_CHAT_FRAME.channelList[i] = name;
- DEFAULT_CHAT_FRAME.zoneChannelList[i] = zoneChannel;
- end
- end
- SlashCmdList["LEAVE"] = function(msg)
- local name = strmatch(msg, "%s*([^%s]+)");
- if ( name ) then
- local nameNum = tonumber(name);
- if ( nameNum and nameNum > MAX_WOW_CHAT_CHANNELS ) then
- BNLeaveConversation(nameNum - MAX_WOW_CHAT_CHANNELS);
- else
- LeaveChannelByName(name);
- end
- end
-
- end
- SlashCmdList["LIST_CHANNEL"] = function(msg)
- local name = strmatch(msg, "%s*([^%s]+)");
- if ( name ) then
- local nameNum = tonumber(name);
- if ( nameNum and nameNum > MAX_WOW_CHAT_CHANNELS ) then
- BNListConversation(nameNum - MAX_WOW_CHAT_CHANNELS);
- else
- ListChannelByName(name);
- end
- else
- ListChannels();
- end
- end
- SlashCmdList["CHAT_HELP"] =
- function(msg)
- ChatFrame_DisplayChatHelp(DEFAULT_CHAT_FRAME)
- end
- SlashCmdList["CHAT_PASSWORD"] =
- function(msg)
- local name = gsub(msg, "%s*([^%s]+).*", "%1");
- local password = gsub(msg, "%s*([^%s]+)%s*(.*)", "%2");
- SetChannelPassword(name, password);
- end
- SlashCmdList["CHAT_OWNER"] =
- function(msg)
- local channel = gsub(msg, "%s*([^%s]+).*", "%1");
- local newOwner = gsub(msg, "%s*([^%s]+)%s*(.*)", "%2");
- if ( not channel or not newOwner ) then
- return;
- end
- local newOwnerLen = strlen(newOwner);
- if ( newOwnerLen > MAX_CHARACTER_NAME_BYTES ) then
- ChatFrame_DisplayUsageError(ERR_NAME_TOO_LONG2);
- return;
- end
- if ( strlen(channel) > 0 ) then
- if ( newOwnerLen > 0 ) then
- SetChannelOwner(channel, n…
Large files files are truncated, but you can click here to view the full file