You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
365 lines
12 KiB
365 lines
12 KiB
---Tracks spells casted by enemies and adds them to the dataset
|
|
local db
|
|
local f
|
|
local MDT = MDT
|
|
|
|
MDT.DataCollection = {}
|
|
local DC = MDT.DataCollection
|
|
function DC:Init()
|
|
db = MDT:GetDB()
|
|
db.dataCollection = db.dataCollection or {}
|
|
db.dataCollectionCC = db.dataCollectionCC or {}
|
|
db.dataCollectionGUID = db.dataCollectionGUID or {}
|
|
f = CreateFrame("Frame")
|
|
f:RegisterEvent("COMBAT_LOG_EVENT_UNFILTERED")
|
|
f:RegisterEvent("CHALLENGE_MODE_START")
|
|
f:RegisterEvent("CHALLENGE_MODE_COMPLETED")
|
|
f:RegisterEvent("PLAYER_ENTERING_WORLD")
|
|
f:SetScript("OnEvent", function(self, event, ...)
|
|
return DC[event](self,...)
|
|
end)
|
|
DC:AddCollectedDataToEnemyTable()
|
|
|
|
end
|
|
|
|
function DC:AddCollectedDataToEnemyTable()
|
|
--add spells/characteristics from db to dungeonEnemies
|
|
for i=29,36 do
|
|
if db.dataCollection[i] then
|
|
for id,spells in pairs(db.dataCollection[i]) do
|
|
local enemies = MDT.dungeonEnemies[i]
|
|
for enemyIdx,enemy in pairs(enemies) do
|
|
if enemy.id == id then
|
|
enemy.spells = enemy.spells or {}
|
|
for spellId,_ in pairs(spells) do
|
|
enemy.spells[spellId] = enemy.spells[spellId] or {}
|
|
end
|
|
end
|
|
|
|
end
|
|
end
|
|
end
|
|
if db.dataCollectionCC[i] then
|
|
for id,characteristics in pairs(db.dataCollectionCC[i]) do
|
|
local enemies = MDT.dungeonEnemies[i]
|
|
for enemyIdx,enemy in pairs(enemies) do
|
|
if enemy.id == id then
|
|
enemy.characteristics = enemy.characteristics or {}
|
|
for characteristic,_ in pairs(characteristics) do
|
|
enemy.characteristics[characteristic] = true
|
|
end
|
|
end
|
|
end
|
|
end
|
|
end
|
|
end
|
|
end
|
|
|
|
local trackedEvents = {
|
|
["SPELL_CAST_SUCCESS"]=true,
|
|
["SPELL_CAST_START"]=true,
|
|
["SPELL_MISSED"]=true,
|
|
["SPELL_DAMAGE"]=true,
|
|
["SPELL_AURA_REMOVED"]=true,
|
|
["SPELL_AURA_APPLIED"]=true,
|
|
}
|
|
local characteristicsSpells = {
|
|
["Slow"] = {
|
|
[3409] = true; --Crippling Poison
|
|
[45524] = true; --Chains of Ice
|
|
};
|
|
["Stun"] ={
|
|
[1833] = true, --Cheap Shot
|
|
[408] = true, --Kidney Shot
|
|
[179057] = true, --Chaos Nova
|
|
[119381] = true, --Leg Sweep
|
|
[30283] = true, --Shadowfury
|
|
[108194] = true, --Asphyxiate
|
|
},
|
|
["Sap"] ={
|
|
[6770] = true,
|
|
},
|
|
["Imprison"] = {
|
|
[217832] = true,
|
|
},
|
|
["Incapacitate"] ={
|
|
[1776] = true, --Gouge
|
|
[115078] = true, --Paralysis
|
|
},
|
|
["Repentance"] ={
|
|
[20066] = true,
|
|
},
|
|
["Disorient"] ={
|
|
[2094] = true, --Blind
|
|
[31661] = true, --Dragon's breath
|
|
},
|
|
["Banish"] ={
|
|
[710] = true, --Banish
|
|
},
|
|
["Fear"] = {
|
|
[118699] = true, --Fear
|
|
[8122] = true, --Psychich Scream
|
|
[5246] = true, --Intimidating Shout
|
|
[207685] = true, --Sigil of Misery
|
|
},
|
|
["Root"] = {
|
|
[122] = true, --Frost Nova
|
|
[339] = true, --Entangling Roots
|
|
[102359] = true, --Mass Root
|
|
[117526] = true, --Binding Shot
|
|
},
|
|
["Polymorph"] ={
|
|
[161354] = true,
|
|
[126819] = true,
|
|
[61780] = true,
|
|
[118] = true,
|
|
[277787] = true,
|
|
[277792] = true,
|
|
[161355] = true,
|
|
[161372] = true,
|
|
[61721] = true,
|
|
[61305] = true,
|
|
[28271] = true,
|
|
[28272] = true,
|
|
[33786] = true,
|
|
[20066] = true,
|
|
[5782] = true,
|
|
[51514] = true,
|
|
[277778] = true,
|
|
[277784] = true,
|
|
[269352] = true,
|
|
[211004] = true,
|
|
[211010] = true,
|
|
[211015] = true,
|
|
[210873] = true,
|
|
},
|
|
["Shackle Undead"] ={
|
|
[9484] = true,
|
|
},
|
|
["Mind Control"] ={
|
|
[605] = true,
|
|
[205364] = true,
|
|
},
|
|
["Grip"] = {},
|
|
["Knock"] ={},
|
|
["Silence"] ={
|
|
[15487] = true, --Silence
|
|
[204490] = true, --Sigil of Silence
|
|
},
|
|
["Taunt"] ={
|
|
[56222] = true, --Dark Command
|
|
[355] = true, --Taunt
|
|
[185245] = true, --Torment
|
|
[116189] = true, --Provoke
|
|
},
|
|
["Control Undead"] ={
|
|
[111673] = true,
|
|
},
|
|
["Subjugate Demon"] ={
|
|
[1098] = true,
|
|
},
|
|
}
|
|
local cmsTimeStamp
|
|
function DC.CHALLENGE_MODE_START(self,...)
|
|
local _, timeCM = GetWorldElapsedTime(1)
|
|
if timeCM>0 then return end
|
|
cmsTimeStamp = GetTime()
|
|
end
|
|
function DC.CHALLENGE_MODE_COMPLETED(self,...)
|
|
cmsTimeStamp = nil
|
|
end
|
|
function DC.PLAYER_ENTERING_WORLD(self,...)
|
|
if C_ChallengeMode.IsChallengeModeActive() then return end
|
|
cmsTimeStamp = nil
|
|
end
|
|
|
|
function DC.COMBAT_LOG_EVENT_UNFILTERED(self,...)
|
|
local timestamp,subevent,hideCaster,sourceGUID,sourceName,sourceFlags,sourceRaidFlags,destGUID,destName,destFlags,destRaidFlags,spellId,spellName,spellSchool = CombatLogGetCurrentEventInfo()
|
|
--enemy spells
|
|
if trackedEvents[subevent] then
|
|
local unitType,_,serverId,instanceId,zoneId,id,spawnUid = strsplit("-", sourceGUID)
|
|
id = tonumber(id)
|
|
--dungeon
|
|
for i=29,36 do
|
|
local enemies = MDT.dungeonEnemies[i]
|
|
--enemy
|
|
for enemyIdx,enemy in pairs(enemies) do
|
|
if enemy.id == id then
|
|
db.dataCollection[i] = db.dataCollection[i] or {}
|
|
db.dataCollection[i][id] = db.dataCollection[i][id] or {}
|
|
db.dataCollection[i][id][spellId] = {}
|
|
enemy.spells = enemy.spells or {}
|
|
enemy.spells[spellId] = enemy.spells[spellId] or {}
|
|
break
|
|
end
|
|
end
|
|
end
|
|
end
|
|
--characteristics
|
|
if subevent == "SPELL_AURA_APPLIED" then
|
|
local unitType,_,serverId,instanceId,zoneId,id,spawnUid = strsplit("-", destGUID)
|
|
id = tonumber(id)
|
|
|
|
--dungeon
|
|
for i=29,36 do
|
|
local enemies = MDT.dungeonEnemies[i]
|
|
--enemy
|
|
for enemyIdx,enemy in pairs(enemies) do
|
|
if enemy.id == id then
|
|
for characteristic,spells in pairs(characteristicsSpells) do
|
|
if spells[spellId] then
|
|
db.dataCollectionCC[i] = db.dataCollectionCC[i] or {}
|
|
db.dataCollectionCC[i][id] = db.dataCollectionCC[i][id] or {}
|
|
db.dataCollectionCC[i][id][characteristic] = true
|
|
enemy.characteristics = enemy.characteristics or {}
|
|
enemy.characteristics[characteristic] = true
|
|
end
|
|
end
|
|
break
|
|
end
|
|
|
|
end
|
|
|
|
end
|
|
end
|
|
|
|
|
|
end
|
|
|
|
---Request users in party/raid to distribute their collected data
|
|
function MDT:RequestDataCollectionUpdate()
|
|
--temporary lag fix
|
|
if true then return end
|
|
local distribution = self:IsPlayerInGroup()
|
|
if not distribution then return end
|
|
MDTcommsObject:SendCommMessage(self.dataCollectionPrefixes.request, "0", distribution, nil, "ALERT")
|
|
end
|
|
|
|
---Distribute collected data to party/raid
|
|
function DC:DistributeData()
|
|
--temporary lag fix
|
|
if true then return end
|
|
local distribution = MDT:IsPlayerInGroup()
|
|
if not distribution then return end
|
|
--throttle to 1 sync every 5 minutes
|
|
if not DC.lastDistribution or DC.lastDistribution < GetTime() - 300 then
|
|
DC.lastDistribution = GetTime()
|
|
db = MDT:GetDB()
|
|
local package = {
|
|
[1] = db.dataCollection,
|
|
[2] = db.dataCollectionCC
|
|
}
|
|
local export = MDT:TableToString(package,false,5)
|
|
MDTcommsObject:SendCommMessage(MDT.dataCollectionPrefixes.distribute, export, distribution, nil, "BULK",nil,nil)
|
|
end
|
|
end
|
|
|
|
---Merge received collected data into own data collection
|
|
function DC:MergeReceiveData(package)
|
|
--temporary lag fix
|
|
if true then return end
|
|
db = MDT:GetDB()
|
|
local collection,collectionCC = unpack(package)
|
|
--db.dataCollection[dungeonIdx][npcId][spellId]
|
|
for dungeonIdx,npcs in pairs(collection) do
|
|
if not db.dataCollection[dungeonIdx] then
|
|
db.dataCollection[dungeonIdx] = npcs
|
|
else
|
|
for npcId,spells in pairs(npcs) do
|
|
if not db.dataCollection[dungeonIdx][npcId] then
|
|
db.dataCollection[dungeonIdx][npcId] = spells
|
|
else
|
|
for spellId,tracked in pairs(spells) do
|
|
db.dataCollection[dungeonIdx][npcId][spellId] = true
|
|
end
|
|
end
|
|
end
|
|
end
|
|
end
|
|
--db.dataCollectionCC[dungeonIdx][npcId][characteristic]
|
|
for dungeonIdx,npcs in pairs(collectionCC) do
|
|
if not db.dataCollectionCC[dungeonIdx] then
|
|
db.dataCollectionCC[dungeonIdx] = npcs
|
|
else
|
|
for npcId,characteristics in pairs(npcs) do
|
|
if not db.dataCollectionCC[dungeonIdx][npcId] then
|
|
db.dataCollectionCC[dungeonIdx][npcId] = characteristics
|
|
else
|
|
for characteristic,tracked in pairs(characteristics) do
|
|
db.dataCollectionCC[dungeonIdx][npcId][characteristic] = true
|
|
end
|
|
end
|
|
end
|
|
end
|
|
end
|
|
DC:AddCollectedDataToEnemyTable()
|
|
end
|
|
|
|
---HealthTrack
|
|
local enemiesToScale
|
|
function DC:InitHealthTrack()
|
|
db = MDT:GetDB()
|
|
local enemyCount = 0
|
|
local totalEnemies = 0
|
|
local changedEnemies = {}
|
|
for _,enemy in pairs(MDT.dungeonEnemies[db.currentDungeonIdx]) do
|
|
totalEnemies = totalEnemies + 1
|
|
end
|
|
f = CreateFrame("Frame")
|
|
f:RegisterEvent("UPDATE_MOUSEOVER_UNIT")
|
|
f:SetScript("OnEvent", function(self, event, ...)
|
|
if event == "UPDATE_MOUSEOVER_UNIT" then
|
|
local unit = "mouseover"
|
|
local npcId
|
|
local guid = UnitGUID(unit)
|
|
if guid then
|
|
npcId = select(6,strsplit("-", guid))
|
|
end
|
|
if npcId then
|
|
local npcHealth = UnitHealthMax(unit)
|
|
for enemyIdx,enemy in pairs(MDT.dungeonEnemies[db.currentDungeonIdx]) do
|
|
if enemy.id == tonumber(npcId) then
|
|
if enemy.health ~= npcHealth then
|
|
print(npcHealth/enemy.health)
|
|
enemy.health = npcHealth
|
|
enemyCount = enemyCount + 1
|
|
changedEnemies[enemyIdx] = true
|
|
local enemiesLeft = " "
|
|
enemiesToScale = {}
|
|
for k,v in pairs(MDT.dungeonEnemies[db.currentDungeonIdx]) do
|
|
if not changedEnemies[k] then
|
|
enemiesLeft = enemiesLeft..v.name..", "
|
|
enemiesToScale[k] = true
|
|
end
|
|
end
|
|
print(enemyCount.."/"..totalEnemies..enemiesLeft)
|
|
end
|
|
break
|
|
end
|
|
end
|
|
end
|
|
end
|
|
end)
|
|
end
|
|
|
|
--season 4
|
|
function MDT:FinishHPTrack()
|
|
local multiplier = 1.526092251434
|
|
local constantNpcs = {
|
|
[155432]=15369884, --enchanted
|
|
[155433]=999042,
|
|
[155434]=614795,
|
|
[161243]=2151786, --sam
|
|
[161244]=2151786, --blood
|
|
[161241]=2151786, --spider
|
|
[161124]=2151786, --tank
|
|
}
|
|
for enemyIdx in pairs(enemiesToScale) do
|
|
local enemy = MDT.dungeonEnemies[db.currentDungeonIdx][enemyIdx]
|
|
if enemy.health>1 then
|
|
local newHealth = constantNpcs[enemy.id] or math.floor(enemy.health*multiplier)
|
|
enemy.health = newHealth
|
|
print(enemy.name)
|
|
end
|
|
end
|
|
end
|
|
|