--[[ Healers Assist by Kiki of European Cho'gall (Alliance) Communication module (parse/send) ]] --------------- Shared variables --------------- HA_CMD_SPELL_START = "01"; HA_CMD_SPELL_COMPLETE = "02"; HA_CMD_SPELL_FAILED = "03"; HA_CMD_SPELL_DELAYED = "04"; HA_CMD_SPELL_COOLDOWN = "05"; HA_CMD_COOLDOWN_UPDATE = "06"; HA_CMD_SPELL_OVERTIME = "07"; HA_CMD_SPELL_INSTANT = "08"; HA_CMD_SPELL_REQUEST = "09"; HA_CMD_SPELL_REQUEST_DENIED = "10"; HA_CMD_REGEN_MODE = "11"; HA_CMD_GOT_POWER_INFUSION = "12"; HA_CMD_SPELL_STOP = "13"; HA_CMD_ANNOUNCE = "14"; HA_CMD_PLUGIN_CMD = "15"; HA_CMD_VERSION = "16"; HA_CMD_SPELL_HOT_TICK = "17"; HA_ADDON_PREFIX = "HealAss"; --------------- Local variables --------------- local HA_COM_VERSION = "7"; local _HA_TOKEN = '\30'; local _HA_TOKEN_EMPTY = '\28'; local _HA_PARSE_PATTERN = "([^".._HA_TOKEN.."]+)"; local _HAComm_Dispatch = {}; --------------- Internal functions --------------- local function _HA_COM_SendMessage(cmd,...) local msg = ""..cmd; for i=1, arg.n do local val = arg[i]; if(val == nil) then val = _HA_TOKEN_EMPTY; elseif(type(val) == "string") then if(val == "") then val = _HA_TOKEN_EMPTY; end elseif(type(val) == "boolean") then if(val) then val = 1; else val = 0; end; end; msg = msg.._HA_TOKEN..val; end HA_ChatDebug(HA_DEBUG_PROTOCOL,"_HA_COM_SendMessage : Sending "..msg); SendAddonMessage(HA_ADDON_PREFIX,msg,"RAID"); --SendAddonMessage(HA_ADDON_PREFIX,msg.._HA_TOKEN,"RAID"); end --[[ function HA_COM_ParseMessage Channel parsing function. ]] function HA_COM_ParseMessage(from,message) if(from == HA_PlayerName) then return; end; -- Not interested by messages from me --HA_CheckPlayerJoined(from); local _,i,version,cmd = string.find(message,"^]+)>(%d+)"); if(version == nil or cmd == nil) then return; end; -- Check version if(version ~= HA_COM_VERSION) then if(version > HA_COM_VERSION) then if(HA_OldVersion == false) then HA_ChatPrint(HA_TEXT_UPGRADE_NEEDED); HA_OldVersion = true; end else --HA_ChatDebug(HA_DEBUG_GLOBAL,from.." is using an old major version of HA."); end return; end local msg = strsub(message,i+1); if(_HAComm_Dispatch[cmd] == nil) then HA_ChatDebug(HA_DEBUG_PROTOCOL,"Unknown command : "..cmd.." from "..from.." : "..type(cmd)); return; end local params = {}; for w in string.gfind(msg,_HA_PARSE_PATTERN) do if(w == nil or w == _HA_TOKEN_EMPTY) then table.insert(params,""); else table.insert(params,w); end end HA_ChatDebug(HA_DEBUG_PROTOCOL,"HA_COM_ParseMessage : Dispatching command "..cmd.." from "..from.." : "..message); _HAComm_Dispatch[cmd](from,params); end --------------- Process functions --------------- --[[ Process SpellStart : Params[1] = SpellCode (INT) Params[2] = TargetName (STRING) -- Can be empty string Params[3] = CastTime (INT) Params[4] = Estimated (INT) Params[5] = WillCrit (BOOL) Params[6] = Rank (INT) -- Can be empty ]] local function _HA_COM_Process_CmdSpellStart(from,params) local spellCode = tonumber(params[1],10); local targetName = params[2]; local castTime = tonumber(params[3],10); local estimated = tonumber(params[4],10); local willcrit = tonumber(params[5],10); local spellRank = tonumber(params[6],10); if(willcrit) then if(willcrit == 1) then willcrit = true; else willcrit = false; end; end if(spellRank == nil) then spellRank = 0; end if(spellCode == nil or targetName == nil or castTime == nil) then HA_ChatWarning("_HA_COM_Process_CmdSpellStart : From="..from.." : VALUES ARE NIL ("..tostring(spellCode).." - "..tostring(targetName).." - "..tostring(castTime)..")"); return; end if(estimated == nil) then estimated = 0; end HA_ChatDebug(HA_DEBUG_PROTOCOL,"_HA_COM_Process_CmdSpellStart : From="..from.." Spell="..spellCode.." Target="..targetName.." CastTime="..castTime.." Estimated="..tostring(estimated)); HA_GUI_Process_SpellStart(from,spellCode,targetName,castTime,estimated,willcrit,spellRank); end --[[ Process SpellStop : ]] local function _HA_COM_Process_CmdSpellStop(from,params) HA_ChatDebug(HA_DEBUG_PROTOCOL,"_HA_COM_Process_CmdSpellStop : From="..from); HA_GUI_Process_SpellStop(from); end --[[ Process SpellComplete : Params[1] = SpellCode (INT) Params[2] = TargetName (STRING) Params[3] = Value (INT) Params[4] = Crit (BOOL) ]] local function _HA_COM_Process_CmdSpellComplete(from,params) local spellCode = tonumber(params[1],10); local targetName = params[2]; local value = tonumber(params[3],10); local crit = tonumber(params[4],10); if(crit) then if(crit == 1) then crit = true; else crit = false; end; end if(spellCode == nil or targetName == nil or value == nil or crit == nil) then HA_ChatWarning("_HA_COM_Process_CmdSpellComplete : From="..from.." : VALUES ARE NIL ("..tostring(spellCode).." - "..tostring(targetName).." - "..tostring(value).." - "..tostring(crit)..")"); return; end HA_ChatDebug(HA_DEBUG_PROTOCOL,"_HA_COM_Process_CmdSpellComplete : From="..from.." Spell="..spellCode.." Target="..targetName.." Value="..value.." Crit="..tostring(crit)); HA_GUI_Process_SpellHit(from,spellCode,targetName,value,crit); end --[[ Process SpellFailed : Params[1] = SpellCode (INT) Params[2] = IReason (INT) Params[3] = Reason (STRING) ]] local function _HA_COM_Process_CmdSpellFailed(from,params) local spellCode = tonumber(params[1],10); local ireason = tonumber(params[2],10); local reason = params[3]; if(spellCode == nil or ireason == nil or reason == nil) then HA_ChatWarning("_HA_COM_Process_CmdSpellFailed : From="..from.." : VALUES ARE NIL ("..tostring(spellCode).." - "..tostring(ireason).." - "..tostring(reason)..")"); return; end HA_ChatDebug(HA_DEBUG_PROTOCOL,"_HA_COM_Process_CmdSpellFailed : From="..from.." Spell="..spellCode.." IReason="..ireason.." Reason="..reason); HA_GUI_Process_SpellFailed(from,spellCode,ireason,reason); end --[[ Process SpellDelayed : Params[1] = Value (INT) -- Delayed value in msec ]] local function _HA_COM_Process_CmdSpellDelayed(from,params) local value = tonumber(params[1],10); if(value == nil) then HA_ChatWarning("_HA_COM_Process_CmdSpellDelayed : From="..from.." : VALUES ARE NIL ("..tostring(value)..")"); return; end HA_ChatDebug(HA_DEBUG_PROTOCOL,"_HA_COM_Process_CmdSpellDelayed : From="..from.." Delay="..value); HA_GUI_Process_SpellDelayed(from,value); end --[[ Process SpellCooldown : Params[1] = SpellCode (INT) Params[2] = TargetName (STRING) -- Can be empty string ]] local function _HA_COM_Process_CmdSpellCooldown(from,params) local spellCode = tonumber(params[1],10); local targetName = params[2]; if(spellCode == nil) then HA_ChatWarning("_HA_COM_Process_CmdSpellCooldown : From="..from.." : VALUES ARE NIL ("..tostring(spellCode)..")"); return; end HA_ChatDebug(HA_DEBUG_PROTOCOL,"_HA_COM_Process_CmdSpellCooldown : From="..from.." To="..targetName); HA_GUI_Process_SpellCooldown(from,spellCode,targetName); end --[[ Process SpellCooldown : Params[1] = SpellCode (INT) Params[2] = Cooldown (INT) -- Cooldown in sec ]] local function _HA_COM_Process_CmdCooldownUpdate(from,params) local spellCode = tonumber(params[1],10); local cooldown = tonumber(params[2],10); if(spellCode == nil or cooldown == nil) then HA_ChatWarning("_HA_COM_Process_CmdCooldownUpdate : From="..from.." : VALUES ARE NIL ("..tostring(spellCode).." - "..tostring(cooldown)..")"); return; end HA_ChatDebug(HA_DEBUG_PROTOCOL,"_HA_COM_Process_CmdCooldownUpdate : From="..from.." SpellCode="..spellCode.." Cooldown="..cooldown); HA_GUI_Process_CooldownUpdate(from,spellCode,cooldown); end --[[ Process SpellOvertime : Params[1] = SpellCode (INT) Params[2] = TargetName (STRING) -- Can be empty string Params[3] = Duration (INT) Params[4] = Estimated (INT) Params[5] = Rank (INT) -- Can be empty ]] local function _HA_COM_Process_CmdSpellOvertime(from,params) local spellCode = tonumber(params[1],10); local targetName = params[2]; local duration = tonumber(params[3],10); local estimated = tonumber(params[4],10); local spellRank = tonumber(params[5],10); if(spellRank == nil) then spellRank = 0; end if(spellCode == nil or duration == nil) then HA_ChatWarning("_HA_COM_Process_CmdSpellOvertime : From="..from.." : VALUES ARE NIL ("..tostring(spellCode).." - "..tostring(duration)..")"); return; end if(estimated == nil) then estimated = 0; end HA_ChatDebug(HA_DEBUG_PROTOCOL,"_HA_COM_Process_CmdSpellOvertime : From="..from.." Spell="..spellCode.." Target="..targetName.." Duration="..duration.." Estimated="..tostring(estimated)); HA_GUI_Process_SpellOvertime(from,spellCode,targetName,duration,estimated,spellRank); end --[[ Process SpellInstant : Params[1] = SpellCode (INT) Params[2] = TargetName (STRING) -- Can be empty string Params[3] = Rank (INT) -- Can be empty ]] local function _HA_COM_Process_CmdSpellInstant(from,params) local spellCode = tonumber(params[1],10); local targetName = params[2]; local spellRank = tonumber(params[3],10); if(spellRank == nil) then spellRank = 0; end if(spellCode == nil) then HA_ChatWarning("_HA_COM_Process_CmdSpellInstant : From="..from.." : VALUES ARE NIL ("..tostring(spellcode)..")"); return; end HA_ChatDebug(HA_DEBUG_PROTOCOL,"_HA_COM_Process_CmdSpellInstant : From="..from.." Spell="..spellCode.." Target="..targetName); HA_GUI_Process_SpellInstant(from,spellCode,targetName,spellRank); end --[[ Process SpellRequest : Params[1] = SpellCode (INT) Params[2] = TargetName (STRING) ]] local function _HA_COM_Process_CmdSpellRequest(from,params) local spellCode = tonumber(params[1],10); local targetName = params[2]; if(spellCode == nil or targetName == nil) then HA_ChatWarning("_HA_COM_Process_CmdSpellRequest : From="..from.." : VALUES ARE NIL ("..tostring(spellCode).." - "..tostring(targetName)..")"); return; end HA_ChatDebug(HA_DEBUG_PROTOCOL,"_HA_COM_Process_CmdSpellRequest : From="..from.." Spell="..spellCode.." To="..targetName); if(targetName == HA_PlayerName) -- A request for me ? then HA_GUI_Process_SpellRequest(from,spellCode); end end --[[ Process SpellRequestDenied : Params[1] = SpellCode (INT) Params[2] = TargetName (STRING) Params[3] = ReasonCode (INT) ]] local function _HA_COM_Process_CmdSpellRequestDenied(from,params) local spellCode = tonumber(params[1],10); local targetName = params[2]; local reasonCode = tonumber(params[3],10); if(spellCode == nil or targetName == nil or reasonCode == nil) then HA_ChatWarning("_HA_COM_Process_CmdSpellRequestDenied : From="..from.." : VALUES ARE NIL ("..tostring(spellCode).." - "..tostring(targetName).." - "..tostring(reasonCode)..")"); return; end HA_ChatDebug(HA_DEBUG_PROTOCOL,"_HA_COM_Process_CmdSpellRequestDenied : From="..from.." Spell="..spellCode.." To="..targetName); if(targetName == HA_PlayerName) -- A request for me ? then HA_GUI_Process_SpellRequestDenied(from,spellCode,reasonCode); end end --[[ Process RegenMode : Params[1] = IsInRegen (BOOL) ]] local function _HA_COM_Process_CmdRegenMode(from,params) local isinregen = tonumber(params[1],10); if(isinregen) then if(isinregen == 1) then isinregen = true; else isinregen = false; end; else HA_ChatWarning("_HA_COM_Process_CmdRegenMode : From="..from.." : VALUES ARE NIL ("..tostring(isinregen)..")"); return; end HA_ChatDebug(HA_DEBUG_PROTOCOL,"_HA_COM_Process_CmdRegenMode : From="..from.." IsInRegen="..tostring(isinregen)); HA_GUI_Process_RegenMode(from,isinregen); end --[[ Process GotPowerInfusion : ]] local function _HA_COM_Process_CmdGotPowerInfusion(from) HA_ChatDebug(HA_DEBUG_PROTOCOL,"_HA_COM_Process_CmdGotPowerInfusion : From="..from); HA_GUI_Process_GotPowerInfusion(from); end --[[ Process Announce : Params[1] = Message (STRING) ]] local function _HA_COM_Process_CmdAnnounce(from,params) local msg = params[1]; if(msg == nil) then HA_ChatWarning("_HA_COM_Process_CmdAnnounce : From="..from.." : VALUES ARE NIL ("..tostring(msg)..")"); return; end HA_ChatDebug(HA_DEBUG_PROTOCOL,"_HA_COM_Process_CmdAnnounce : From="..from.." Message="..msg); HA_GUI_Process_Announce(from,msg); end --[[ Process PluginCmd : Params[1] = PluginName (STRING) Params[...] = Plugin params ]] local function _HA_COM_Process_CmdPluginCmd(from,params) local name = params[1]; if(name == nil) then HA_ChatWarning("_HA_COM_Process_CmdPluginCmd : From="..from.." : VALUES ARE NIL ("..tostring(name)..")"); return; end HA_ChatDebug(HA_DEBUG_PROTOCOL,"_HA_COM_Process_CmdPluginCmd : From="..from.." PluginName="..name); -- Call plugins for _,pl in HA_ActivePlugins do if(pl.Name == name and pl.OnPluginMessage) then pl.OnPluginMessage(from,params); end end end --[[ Process Version : Params[1] = Version (STRING) ]] local function _HA_COM_Process_CmdVersion(from,params) local version = params[1]; if(version == nil) then HA_ChatWarning("_HA_COM_Process_CmdVersion : From="..from.." : VALUES ARE NIL ("..tostring(version)..")"); return; end HA_ChatDebug(HA_DEBUG_PROTOCOL,"_HA_COM_Process_CmdVersion : From="..from.." Version="..version); HA_GUI_Process_Version(from,version); end --[[ Process SpellHotTick : Params[1] = SpellCode (INT) Params[2] = TargetName (STRING) Params[3] = Value (INT) ]] local function _HA_COM_Process_CmdSpellHotTick(from,params) local spellCode = tonumber(params[1],10); local targetName = params[2]; local value = tonumber(params[3],10); if(spellCode == nil or targetName == nil or value == nil) then HA_ChatWarning("_HA_COM_Process_CmdSpellHotTick : From="..from.." : VALUES ARE NIL ("..tostring(spellCode).." - "..tostring(targetName).." - "..tostring(value)..")"); return; end HA_ChatDebug(HA_DEBUG_PROTOCOL,"_HA_COM_Process_CmdSpellHotTick : From="..from.." Spell="..spellCode.." Target="..targetName.." Value="..value); HA_GUI_Process_SpellHotTick(from,spellCode,targetName,value); end --------------- GUI Exported functions --------------- --[[ - GUI ENTRY POINT function HA_COM_SpellStart : - SpellCode : Int -- International code of the spell - TargetName : String -- Target of the heal - CastTime : Int -- Casttime of the spell - Estimated : Int -- Estimated spell value - WillCrit : Bool -- If you are sure the spell will crit (Estimated is crit value) - SpellRank : Int -- Rank of the spell (can be nil) ]] function HA_COM_SpellStart(SpellCode,TargetName,CastTime,Estimated,WillCrit,SpellRank) if(SpellCode) then _HA_COM_SendMessage(HA_CMD_SPELL_START,SpellCode,TargetName,CastTime,Estimated,WillCrit,SpellRank); end end --[[ - GUI ENTRY POINT function HA_COM_SpellStop : ]] function HA_COM_SpellStop() _HA_COM_SendMessage(HA_CMD_SPELL_STOP); end --[[ - GUI ENTRY POINT function HA_COM_SpellComplete : - SpellCode : Int -- International code of the spell - TargetName : String -- Target of the heal - Value : Int -- Healed value - Crit : Bool -- Heal has crit ]] function HA_COM_SpellComplete(SpellCode,TargetName,Value,Crit) if(SpellCode) then _HA_COM_SendMessage(HA_CMD_SPELL_COMPLETE,SpellCode,TargetName,Value,Crit); end end --[[ - GUI ENTRY POINT function HA_COM_SpellFailed : - SpellCode : Int -- International code of the spell - IReason : Int -- Reason code of failure - Reason : String -- Reason text of failure (nil if IReason ~= 0) ]] function HA_COM_SpellFailed(SpellCode,IReason,Reason) if(SpellCode) then _HA_COM_SendMessage(HA_CMD_SPELL_FAILED,SpellCode,IReason,Reason); end end --[[ - GUI ENTRY POINT function HA_COM_SpellDelayed : - Value : Int -- Delayed value in msec ]] function HA_COM_SpellDelayed(Value) _HA_COM_SendMessage(HA_CMD_SPELL_DELAYED,Value); end --[[ - GUI ENTRY POINT function HA_COM_SpellCooldown : - SpellCode : Int -- International code of the spell - TargetName : String -- Target of the spell ]] function HA_COM_SpellCooldown(SpellCode,TargetName) _HA_COM_SendMessage(HA_CMD_SPELL_COOLDOWN,SpellCode,TargetName); end --[[ - GUI ENTRY POINT function HA_COM_CooldownUpdate : - SpellCode : Int -- International code of the spell - Cooldown : Int -- number of sec before it's up (0 = up) ]] function HA_COM_CooldownUpdate(SpellCode,Cooldown) _HA_COM_SendMessage(HA_CMD_COOLDOWN_UPDATE,SpellCode,Cooldown); end --[[ - GUI ENTRY POINT function HA_COM_SpellOvertime : - SpellCode : Int -- International code of the spell - TargetName : String -- Target of the heal - Duration : Int -- Duration of the spell - Estimated : Int -- Estimated spell value - SpellRank : Int -- Rank of the spell (can be nil) ]] function HA_COM_SpellOvertime(SpellCode,TargetName,Duration,Estimated,SpellRank) if(SpellCode) then _HA_COM_SendMessage(HA_CMD_SPELL_OVERTIME,SpellCode,TargetName,Duration,Estimated,SpellRank); end end --[[ - GUI ENTRY POINT function HA_COM_SpellInstant : - SpellCode : Int -- International code of the spell - TargetName : String -- Target of the heal - SpellRank : Int -- Rank of the spell (can be nil) ]] function HA_COM_SpellInstant(SpellCode,TargetName,SpellRank) if(SpellCode) then _HA_COM_SendMessage(HA_CMD_SPELL_INSTANT,SpellCode,TargetName,SpellRank); end end --[[ - GUI ENTRY POINT function HA_COM_SpellRequest : - SpellCode : Int -- International code of the spell - TargetName : String -- Request spell to ]] function HA_COM_SpellRequest(SpellCode,TargetName) if(SpellCode and TargetName and TargetName ~= "") then _HA_COM_SendMessage(HA_CMD_SPELL_REQUEST,SpellCode,TargetName); end end --[[ - GUI ENTRY POINT function HA_COM_SpellRequestDenied : - SpellCode : Int -- International code of the spell - TargetName : String -- Request spell from - ReasonCode : Int -- Reason ]] function HA_COM_SpellRequestDenied(SpellCode,TargetName,ReasonCode) if(SpellCode and TargetName and TargetName ~= "") then _HA_COM_SendMessage(HA_CMD_SPELL_REQUEST_DENIED,SpellCode,TargetName,ReasonCode); end end --[[ - GUI ENTRY POINT function HA_COM_RegenMode : - IsInRegen : Bool -- If I go in regen mode ]] function HA_COM_RegenMode(IsInRegen) _HA_COM_SendMessage(HA_CMD_REGEN_MODE,IsInRegen); end --[[ - GUI ENTRY POINT function HA_COM_GotPowerInfusion : ]] function HA_COM_GotPowerInfusion() _HA_COM_SendMessage(HA_CMD_GOT_POWER_INFUSION); end --[[ - GUI ENTRY POINT function HA_COM_Announce : - Message : String -- Message to show ]] function HA_COM_Announce(Message) _HA_COM_SendMessage(HA_CMD_ANNOUNCE,Message); end --[[ - GUI ENTRY POINT function HA_COM_PluginCommand : - PluginName : String -- Message to show - ... : Any -- Plugins command params ]] function HA_COM_PluginCommand(PluginName,...) _HA_COM_SendMessage(HA_CMD_PLUGIN_CMD,PluginName,unpack(arg)); end --[[ - GUI ENTRY POINT function HA_COM_SendVersion : ]] function HA_COM_SendVersion() _HA_COM_SendMessage(HA_CMD_VERSION,HA_VERSION); end --[[ - GUI ENTRY POINT function HA_COM_SpellHotTick : - SpellCode : Int -- International code of the spell - TargetName : String -- Target of the heal - Value : Int -- Healed value ]] function HA_COM_SpellHotTick(SpellCode,TargetName,Value) if(SpellCode) then _HA_COM_SendMessage(HA_CMD_SPELL_HOT_TICK,SpellCode,TargetName,Value); end end --------------- Init dispatch table --------------- _HAComm_Dispatch[HA_CMD_SPELL_START] = _HA_COM_Process_CmdSpellStart; _HAComm_Dispatch[HA_CMD_SPELL_STOP] = _HA_COM_Process_CmdSpellStop; _HAComm_Dispatch[HA_CMD_SPELL_COMPLETE] = _HA_COM_Process_CmdSpellComplete; _HAComm_Dispatch[HA_CMD_SPELL_FAILED] = _HA_COM_Process_CmdSpellFailed; _HAComm_Dispatch[HA_CMD_SPELL_DELAYED] = _HA_COM_Process_CmdSpellDelayed; _HAComm_Dispatch[HA_CMD_SPELL_COOLDOWN] = _HA_COM_Process_CmdSpellCooldown; _HAComm_Dispatch[HA_CMD_COOLDOWN_UPDATE] = _HA_COM_Process_CmdCooldownUpdate; _HAComm_Dispatch[HA_CMD_SPELL_OVERTIME] = _HA_COM_Process_CmdSpellOvertime; _HAComm_Dispatch[HA_CMD_SPELL_INSTANT] = _HA_COM_Process_CmdSpellInstant; _HAComm_Dispatch[HA_CMD_SPELL_REQUEST] = _HA_COM_Process_CmdSpellRequest; _HAComm_Dispatch[HA_CMD_SPELL_REQUEST_DENIED] = _HA_COM_Process_CmdSpellRequestDenied; _HAComm_Dispatch[HA_CMD_REGEN_MODE] = _HA_COM_Process_CmdRegenMode; _HAComm_Dispatch[HA_CMD_GOT_POWER_INFUSION] = _HA_COM_Process_CmdGotPowerInfusion; _HAComm_Dispatch[HA_CMD_ANNOUNCE] = _HA_COM_Process_CmdAnnounce; _HAComm_Dispatch[HA_CMD_PLUGIN_CMD] = _HA_COM_Process_CmdPluginCmd; _HAComm_Dispatch[HA_CMD_VERSION] = _HA_COM_Process_CmdVersion; _HAComm_Dispatch[HA_CMD_SPELL_HOT_TICK] = _HA_COM_Process_CmdSpellHotTick;