local mod = klhtm local me = {} local petthreat local petincombat = false mod.pet = me --[[ PetMod.lua v1.0 by Ghost, public domain An extension to measure pet threat for warlocks (maybe hunters?) while solo playing. Just proof-of-concept code, based on the klhtm framework for making extensions. It seems to work with DE and EN client voidwalker, on levels 10-60, assuming all books have been bought. Have fun, but don't expect updates :-) Known bugs: -"prin" statements are for debugging purpose only but should not be executed -target of the pet is ignored -pet aggro display is not deleted when pet leaves combat -no talents or whatever are taken into account, only Damage+Torment+Suffering -no character can use the name Pet ]] ------------------------------------------------------------------------ -- Aggro for Warlocks Voidwalker -- ------------------------------------------------------------------------ me.myevents = { "CHAT_MSG_SPELL_PET_DAMAGE", "CHAT_MSG_COMBAT_PET_HITS", "CHAT_MSG_COMBAT_HOSTILE_DEATH", "PET_ATTACK_START"} --[[ onupdate() function, called from Core.lua ]] me.onupdate = function() -- update combat state if UnitAffectingCombat("pet") then if petincombat == false then petincombat = true end else if petincombat == true then petincombat = false mod.table.raiddata[UnitName("pet")] = nil KLHTM_RequestRedraw("raid") end end end me.onevent = function() --prin(string.format("Received the event %s: %s", event, arg1)) -- if (mod.my.states.incombat.value == false) then -- mod.table.raiddata["Pet"] = nil -- end -- This is stage one: local output = mod.regex.parse(me.parserset, arg1, event) if output.hit == nil then return end if output.final[1] ~= UnitName("pet") then return end if output.parser.identifier == "petattack" then me.addpetthreat(output.final[3]) elseif output.parser.identifier == "petcastaggro" then if me.getenglishspell(output.final[2]) == "Torment" then me.addpetthreat(me.getthreatvalue(output.final[2])) elseif me.getenglishspell(output.final[2]) == "Suffering" then if UnitName("target") == output.final[3] then me.addpetthreat(me.getthreatvalue(output.final[2])) end elseif me.getenglishspell(output.final[2]) == "Growl" then me.addpetthreat(me.getthreatvalue(output.final[2])) elseif me.getenglishspell(output.final[2]) == "Intimidation" then me.addpetthreat(me.getthreatvalue(output.final[2]),True) end elseif output.parser.identifier == "petspell" then me.addpetthreat(output.final[4]) end end --me.onloadcomplete = function() -- prin("KTM PetMod loaded!!") --end -- show pet threat value in raid display me.addpetthreat = function(value) -- if not value then prin("no pet threat value to add"); return; end if mod.table.raiddata[UnitName("pet")] == nil then petthreat = 0 end petthreat = petthreat + value mod.table.updateplayerthreat(UnitName("pet"), petthreat) KLHTM_RequestRedraw("raid") return end ---- BEGIN spell data -- minimum player level for each rank local spellaggrolevel = { ["Torment"] = { 60, 50, 40, 30, 20, 10 }, ["Suffering"] = { 60, 48, 36, 24 }, ["Growl"] = { 60, 50, 40, 30, 20, 10, 1 }, ["Intimidation"] = { 1 } } -- aggro value for each rank local spellaggro = { ["Torment"] = { 395, 300, 215, 125, 75, 45 }, ["Suffering"] = { 600, 450, 300, 150 }, ["Growl"] = { 415, 320, 240, 170, 110, 65, 50 }, ["Intimidation"] = { 580 } } me.getthreatvalue = function(spellname) spellname = me.getenglishspell(spellname) if not spellaggrolevel[spellname] then prin("key not found in spelldata "..spellname); return 0; end local i = 1 while UnitLevel('pet') < spellaggrolevel[spellname][i] do i = i + 1 end return spellaggro[spellname][i] end me.getenglishspell = function(spellname) -- translate localised spell name to english version, to match spellaggro data above if GetLocale() == "deDE" then if spellname == "Qual" then return "Torment" elseif spellname == "Leiden" then return "Suffering" -- additional translations could be added end end if GetLocale() == "koKR" then if spellname == "고문" then return "Torment" elseif spellname == "고통" then return "Suffering" elseif spellname == "포효" then return "Growl" elseif spellname == "위협" then return "Intimidation" -- additional translations could be added end end return spellname end ---- END spell data me.parserset = { } me.onload = function() local parserdata for _, parserdata in me.parserconstructor do mod.regex.addparsestring(me.parserset, parserdata[1], parserdata[2], parserdata[3]) end end --[[ List of all the parsers we use. The first value is the identifier, the second value is the name of the variable defined in GlobalStrings.lua, and the third variable is the event the parser works on. ]] me.parserconstructor = { {"petcastaggro", "SPELLCASTGOOTHERTARGETTED", "CHAT_MSG_SPELL_PET_DAMAGE"}, -- %1$s wirkt %2$s auf %3$s. "You hit %s for %d." {"petcastaggro", "SIMPLECASTOTHEROTHER", "CHAT_MSG_SPELL_PET_DAMAGE"}, {"petattack", "COMBATHITCRITOTHEROTHER", "CHAT_MSG_COMBAT_PET_HITS"}, -- %1$s trifft %2$s fA¼r %3$d Schaden. "You crit %s for %d." {"petattack", "COMBATHITOTHEROTHER", "CHAT_MSG_COMBAT_PET_HITS"}, -- %1$s trifft %2$s fA¼r %3$d Schaden. "You crit %s for %d." {"petspell", "SPELLLOGCRITSCHOOLOTHEROTHER", "CHAT_MSG_SPELL_PET_DAMAGE"}, -- "%ss %s trifft %s kritisch fA¼r %d %s Schaden." {"petspell", "SPELLLOGSCHOOLOTHEROTHER", "CHAT_MSG_SPELL_PET_DAMAGE"}, {"petspell", "SPELLLOGOTHEROTHER", "CHAT_MSG_SPELL_PET_DAMAGE"}, -- "%ss %s trifft %s kritisch fA¼r %d %s Schaden." {"petspell", "SPELLLOGCRITOTHEROTHER", "CHAT_MSG_SPELL_PET_DAMAGE"}, -- {"abilityhit", "SPELLLOGSELFOTHER", "CHAT_MSG_SPELL_SELF_DAMAGE"}, -- "Your %s hits %s for %d." -- {"abilitycrit", "SPELLLOGCRITSELFOTHER", "CHAT_MSG_SPELL_SELF_DAMAGE"}, -- "Your %s crits %s for %d." }