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.

901 lines
28 KiB

local GlobalAddonName, ExRT = ...
local UnitName, UnitGUID, GetRaidTargetIndex, SetRaidTarget, math_frexp, tonumber, IsEncounterInProgress = UnitName, UnitGUID, GetRaidTargetIndex, SetRaidTarget, math.frexp, tonumber, IsEncounterInProgress
local wipe, sort = wipe, sort
local GetSpellInfo = ExRT.F.GetSpellInfo or GetSpellInfo
local VMRT = nil
local ELib,L = ExRT.lib,ExRT.L
local module = ExRT:New("AutoMarks",L.panelmarks)
local UpdateData
function module.options:Load()
self:CreateTilte()
self.decorationLine = CreateFrame("Frame",nil,self)
self.decorationLine:SetPoint("TOPLEFT",self,0,-25)
self.decorationLine:SetPoint("BOTTOMRIGHT",self,"TOPRIGHT",0,-45)
ELib:Texture(self.decorationLine,1,1,1,1,"BACKGROUND"):Point('x'):Gradient("VERTICAL",.24,.25,.30,1,.27,.28,.33,1)
self.t = ELib:Tabs(self,0,L.panelmarksTab1,L.panelmarksTab2,L.panelmarksTab3):Point(0,-45):Size(690,570):SetTo(3)
self.t:SetBackdropBorderColor(0,0,0,0)
self.t:SetBackdropColor(0,0,0,0)
local function Tab1EditBoxOnChange(self)
local text = self:GetText()
if strtrim(text) == "" then
text = nil
end
VMRT.MarksSimple.names[self.index] = text
end
self.editbox = {}
for i=1,4 do
self.editbox[i] = {}
for j=1,8 do
local index = (i-1)*8+j
self.editbox[i][j] = ELib:Edit(self.t.tabs[1]):Size(130,20):Text(VMRT.MarksSimple.names[index] or ""):OnChange(Tab1EditBoxOnChange)
if i <= 2 then
self.editbox[i][j]:Point("TOPRIGHT",self.t.tabs[1],"TOP",-5-140*(2-i),-34-(j-1)*25)
else
self.editbox[i][j]:Point("TOPLEFT",self.t.tabs[1],"TOP",5+140*(i-3),-34-(j-1)*25)
end
self.editbox[i][j].index = index
if i==1 then
ELib:Icon(self.t.tabs[1],"Interface\\TargetingFrame\\UI-RaidTargetingIcon_"..j,16):Point("RIGHT",self.editbox[i][j],"LEFT",-10,0)
end
end
ELib:Text(self.t.tabs[1],i,14,"GameFontNormal"):Point("BOTTOM",self.editbox[i][1],"TOP",0,5):Left():Color()
end
self.buttonclear = ELib:Button(self.t.tabs[1],L.panelmarksclear):Size(150,20):Point("TOP",0,-240):OnClick(function()
for i=1,4 do
for j=1,8 do
module.options.editbox[i][j]:SetText("")
VMRT.MarksSimple.names[(i-1)*8+j] = nil
end
end
end)
ELib:Text(self.t.tabs[1],L.panelmarkstooltip,11,"GameFontNormal"):Point("TOP",self.buttonclear,"BOTTOM",0,-10):Point("LEFT",10,0):Point("RIGHT",-10,0):Color()
----------------------------------
self.autoMarkChkEnable = ELib:Check(self.t.tabs[2],L.Enable,VMRT.MarksSimple.autoMarkEnabled):AddColorState():Point(10,-10):OnClick(function(self)
if self:GetChecked() then
VMRT.MarksSimple.autoMarkEnabled = true
else
VMRT.MarksSimple.autoMarkEnabled = nil
end
module:UpdateState()
end)
local npcIDtoName = {}
local npcIDawait = {}
local function Tab2LineUpdate(self,isFull)
local num = self._i
if isFull then
self.edit:SetText(VMRT.MarksSimple.autoMarkNames[num] or "")
self.marks.state = VMRT.MarksSimple.autoMarkState[num] or "87654321"
end
for i=1,#self.marks.list do
local mark = self.marks.state:sub(i,i)
if mark ~= "" then
self.marks.list[i]:SetTexture([[Interface\TargetingFrame\UI-RaidTargetingIcons]])
SetRaidTargetIconTexture(self.marks.list[i], tonumber(mark,19))
else
self.marks.list[i]:SetTexture()
end
if mark == self.marks.picked_mark then
self.marks.list[i]:SetAlpha(.7)
else
self.marks.list[i]:SetAlpha(1)
end
self.marks.list[i]:SetShown(i <= 8 or self.isExpand)
end
if self.isExpand and not self.isExpanded then
self.marks:SetWidth(20*17)
self.edit:Size(470-20*8,20)
self.isExpanded = true
elseif not self.isExpand and self.isExpanded then
self.marks:SetWidth(20*9)
self.edit:Size(470,20)
self.isExpanded = false
end
end
local function Tab2EditboxNPCID(self)
local text = self:GetText()
local npcName
if text and tonumber(text) then
npcName = npcIDtoName[text]
if not npcName and C_TooltipInfo then
local tooltip = C_TooltipInfo.GetHyperlink("unit:Creature-0-0-0-0-"..text)
if tooltip and tooltip.lines and tooltip.lines[1] and tooltip.lines[1].leftText ~= "" then
npcName = tooltip.lines[1].leftText
npcIDtoName[text] = npcName
elseif not npcIDawait[text] then
npcIDawait[text] = true
C_Timer.After(0.5,function()
Tab2EditboxNPCID(self)
end)
end
end
end
if npcName then
self.backgroundText2:SetText(npcName)
else
self.backgroundText2:SetText("")
end
end
local function Tab2EditboxOnChange(self,isUser)
Tab2EditboxNPCID(self)
if not isUser then return end
local text = self:GetText()
if strtrim(text) == "" then text = nil end
VMRT.MarksSimple.autoMarkNames[self._i] = text
UpdateData()
self:GetParent():Update()
end
local function Tab2MarksOnUpdate(self)
if not IsMouseButtonDown(1) then
self:SetScript("OnUpdate",nil)
self.picked = nil
self.picked_mark = nil
VMRT.MarksSimple.autoMarkState[self:GetParent()._i] = self.state
self:GetParent():Update()
UpdateData()
return
end
local currCursor = 1
for i=1,self.state_len do
local x,y = ExRT.F.GetCursorPos(self.list[i])
if x < 0 then
break
end
currCursor = i
end
local newState = self.saved_state:gsub(self.saved_state:sub(self.picked,self.picked),""):sub(1,currCursor-1) .. self.saved_state:sub(self.picked,self.picked) .. self.saved_state:gsub(self.saved_state:sub(self.picked,self.picked),""):sub(currCursor,-1)
if newState ~= self.state then
self.state = newState
self:GetParent():Update()
end
end
local function Tab2MarksOnMouseDown(self,button)
self.picked_mark = nil
if button == "LeftButton" then
local x,y = ExRT.F.GetCursorPos(self.list.refresh)
if x >= 0 and x <= 19 then
self.state = self:GetParent().isExpand and "876543219ABCDEFG" or "87654321"
VMRT.MarksSimple.autoMarkState[self:GetParent()._i] = self.state
self:GetParent():Update()
UpdateData()
return
end
self.picked = nil
for i=1,#self.list do
if self.list[i]:IsShown() then
local x,y = ExRT.F.GetCursorPos(self.list[i])
if x >= 0 and x <= 19 then
self.picked = i
self.saved_state = self.state
self.state_len = self.state:len()
if self.state_len < i then
return
end
break
end
end
end
if self.picked then
self.picked_mark = self.saved_state:sub(self.picked,self.picked)
self:SetScript("OnUpdate",Tab2MarksOnUpdate)
self:GetParent():Update()
end
elseif button == "RightButton" then
local x,y = ExRT.F.GetCursorPos(self.list.refresh)
if x >= 0 and x <= 19 then
--self:GetParent().isExpand = not self:GetParent().isExpand
self:GetParent():Update()
return
end
for i=1,#self.list do
if self.list[i]:IsShown() then
local x,y = ExRT.F.GetCursorPos(self.list[i])
if x >= 0 and x <= 19 then
local newState = self.state:sub(1,i-1)..self.state:sub(i+1,-1)
self.state = newState
VMRT.MarksSimple.autoMarkState[self:GetParent()._i] = newState
self:GetParent():Update()
UpdateData()
break
end
end
end
end
end
local function Tab2MarksListOnEnter(self)
self:GetParent().Background:Show()
end
local function Tab2MarksListOnLeave(self)
self:GetParent().Background:Hide()
end
local MARK_PAGE_COUNT = 20
self.autoMarkLine = {}
for i=1,MARK_PAGE_COUNT do
local line = CreateFrame("Frame",nil,self.t.tabs[2])
self.autoMarkLine[i] = line
line:SetPoint("TOP",0,-35-(i-1)*25)
line:SetPoint("LEFT",5,0)
line:SetPoint("RIGHT",-25,0)
line:SetHeight(25)
line._i = i
local edit = ELib:Edit(line):Size(460,20):Point("LEFT",5,0):Tooltip(L.panelmarksAutoMarkMobName):OnChange(Tab2EditboxOnChange):Text(VMRT.MarksSimple.autoMarkNames[i] or "")
edit.backgroundText2 = ELib:Text(edit,"",12,"ChatFontNormal"):Point("LEFT",2,0):Point("RIGHT",-2,0):Color(.5,.5,.5):Right()
edit._i = i
line.edit = edit
local marks = CreateFrame("Frame",nil,line)
marks:EnableMouse(true)
ELib:Border(marks,1,0.24,0.25,0.3,1,1)
marks.Background = marks:CreateTexture(nil,"BACKGROUND")
marks.Background:SetColorTexture(0,0,0,.3)
marks.Background:SetPoint("TOPLEFT")
marks.Background:SetPoint("BOTTOMRIGHT")
marks:SetPoint("RIGHT",-5,0)
marks:SetSize(20*9,20)
marks.list = {}
for i=1,16 do
marks.list[i] = marks:CreateTexture(nil,"ARTWORK")
marks.list[i]:SetPoint("LEFT",(i-1)*20,0)
marks.list[i]:SetSize(18,18)
marks.list[i]:SetTexture([[Interface\TargetingFrame\UI-RaidTargetingIcons]])
SetRaidTargetIconTexture(marks.list[i], i)
marks.list[i]:SetShown(i <= 8)
end
marks.list.refresh = marks:CreateTexture(nil,"ARTWORK")
marks.list.refresh:SetPoint("RIGHT",0,0)
marks.list.refresh:SetSize(18,18)
marks.list.refresh:SetTexture([[Interface\AddOns\MRT\media\DiesalGUIcons16x256x128]])
marks.list.refresh:SetTexCoord(0.125,0.1875,0.5,0.625)
marks.list.refresh:SetVertexColor(1,1,1,0.7)
marks:SetScript("OnMouseDown",Tab2MarksOnMouseDown)
marks.state = VMRT.MarksSimple.autoMarkState[i] or "87654321"
line.marks = marks
line.Update = Tab2LineUpdate
line:Update()
line.Background = line:CreateTexture(nil,"BACKGROUND")
line.Background:SetColorTexture(1,1,1,.15)
line.Background:SetPoint("TOPLEFT",-5)
line.Background:SetPoint("BOTTOMRIGHT",5)
line.Background:Hide()
marks:SetScript("OnEnter",Tab2MarksListOnEnter)
marks:SetScript("OnLeave",Tab2MarksListOnLeave)
end
local function UpdateMarkPage()
local newPointer = floor( self.t.tabs[2].scrollBar:GetValue() + 0.5 )
if self.markPagePointer == newPointer and self.markPageMax == VMRT.MarksSimple.markMax then
return
end
self.markPagePointer = newPointer
self.markPageMax = VMRT.MarksSimple.markMax
if newPointer == select(2,self.t.tabs[2].scrollBar:GetMinMaxValues()) then
self.markAddMore:Show()
self.autoMarkLine[MARK_PAGE_COUNT]:Hide()
else
self.markAddMore:Hide()
self.autoMarkLine[MARK_PAGE_COUNT]:Show()
end
for i=1,MARK_PAGE_COUNT do
local line = self.autoMarkLine[i]
line._i = newPointer+i-1
line.edit._i = newPointer+i-1
line:Update(true)
end
end
self.markAddMore = ELib:Button(self.t.tabs[2],L.panelmarksBuffAddMore):Point(self.autoMarkLine[MARK_PAGE_COUNT]):Shown(false):OnClick(function()
if type(VMRT.MarksSimple.markMax) ~= "number" then
VMRT.MarksSimple.markMax = 100
end
VMRT.MarksSimple.markMax = VMRT.MarksSimple.markMax + 50
if VMRT.MarksSimple.markMax > 1000 then
VMRT.MarksSimple.markMax = 1000
end
UpdateMarkPage()
local pointer = self.markPagePointer
self.t.tabs[2].scrollBar:Range(1,max(1,(type(VMRT.MarksSimple.markMax)=="number" and VMRT.MarksSimple.markMax or 100)-MARK_PAGE_COUNT+1)+1):SetTo(pointer)
end)
self.t.tabs[2].scrollBar = ELib:ScrollBar(self.t.tabs[2]):Size(16,25*MARK_PAGE_COUNT):Point("TOPLEFT",self.autoMarkLine[1],"TOPRIGHT",5,0):Range(1,max(1,(type(VMRT.MarksSimple.markMax)=="number" and VMRT.MarksSimple.markMax or 100)-MARK_PAGE_COUNT+1)+1):OnChange(function(scrollBar)
UpdateMarkPage()
end)
self.t.tabs[2]:SetScript("OnMouseWheel",function(_,delta)
delta = -delta
self.t.tabs[2].scrollBar:SetValue(tonumber(self.t.tabs[2].scrollBar:GetValue())+delta)
end)
ELib:Text(self.t.tabs[2],L.panelmarksTab2Tooltip,11,"GameFontNormal"):Point("TOP",self.autoMarkLine[#self.autoMarkLine],"BOTTOM",0,-10):Point("LEFT",10,0):Point("RIGHT",-10,0):Color()
----------------------------------
self.buffMarkChkEnable = ELib:Check(self.t.tabs[3],L.Enable,VMRT.MarksSimple.buffMarkEnabled):AddColorState():Point(10,-10):OnClick(function(self)
if self:GetChecked() then
VMRT.MarksSimple.buffMarkEnabled = true
else
VMRT.MarksSimple.buffMarkEnabled = nil
end
module:UpdateState()
end)
local function Tab3LineUpdate(self,isFull)
local num = self._i
if isFull then
self.edit:SetText(VMRT.MarksSimple.buffMarks[num] or "")
self.marks.state = VMRT.MarksSimple.buffMarksState[num] or "12345678"
end
local spellID = VMRT.MarksSimple.buffMarks[num]
if type(spellID)=='string' then
spellID = spellID:gsub("%D","")
end
spellID = tonumber(spellID or "?")
if not spellID then
self.texture:SetTexture("Interface\\Icons\\INV_MISC_QUESTIONMARK")
self.text:SetText("")
else
local spellName,_,spellTexture = GetSpellInfo( spellID )
self.texture:SetTexture(spellTexture)
self.text:SetText(spellName)
end
for i=1,8 do
local mark = self.marks.state:sub(i,i)
if mark ~= "" then
self.marks.list[i]:SetTexture("Interface\\TargetingFrame\\UI-RaidTargetingIcon_"..mark)
else
self.marks.list[i]:SetTexture()
end
if mark == self.marks.picked_mark then
self.marks.list[i]:SetAlpha(.7)
else
self.marks.list[i]:SetAlpha(1)
end
end
end
local function Tab3EditboxOnChange(self,isUser)
if not isUser then return end
local text = self:GetText()
if strtrim(text) == "" then text = nil end
VMRT.MarksSimple.buffMarks[self._i] = text
UpdateData()
self:GetParent():Update()
end
local function Tab3MarksOnUpdate(self)
if not IsMouseButtonDown(1) then
self:SetScript("OnUpdate",nil)
self.picked = nil
self.picked_mark = nil
VMRT.MarksSimple.buffMarksState[self:GetParent()._i] = self.state
self:GetParent():Update()
UpdateData()
return
end
local currCursor = 1
for i=1,self.state_len do
local x,y = ExRT.F.GetCursorPos(self.list[i])
if x < 0 then
break
end
currCursor = i
end
local newState = self.saved_state:gsub(self.saved_state:sub(self.picked,self.picked),""):sub(1,currCursor-1) .. self.saved_state:sub(self.picked,self.picked) .. self.saved_state:gsub(self.saved_state:sub(self.picked,self.picked),""):sub(currCursor,-1)
if newState ~= self.state then
self.state = newState
self:GetParent():Update()
end
end
local function Tab3MarksOnMouseDown(self,button)
self.picked_mark = nil
if button == "LeftButton" then
local x,y = ExRT.F.GetCursorPos(self.list[9])
if x >= 0 and x <= 19 then
VMRT.MarksSimple.buffMarksState[self:GetParent()._i] = nil
self.state = "12345678"
self:GetParent():Update()
UpdateData()
return
end
self.picked = nil
for i=1,8 do
local x,y = ExRT.F.GetCursorPos(self.list[i])
if x >= 0 and x <= 19 then
self.picked = i
self.saved_state = self.state
self.state_len = self.state:len()
if self.state_len < i then
return
end
break
end
end
if self.picked then
self.picked_mark = self.saved_state:sub(self.picked,self.picked)
self:SetScript("OnUpdate",Tab3MarksOnUpdate)
self:GetParent():Update()
end
elseif button == "RightButton" then
for i=1,8 do
local x,y = ExRT.F.GetCursorPos(self.list[i])
if x >= 0 and x <= 19 then
local newState = self.state:sub(1,i-1)..self.state:sub(i+1,-1)
self.state = newState
VMRT.MarksSimple.buffMarksState[self:GetParent()._i] = newState
self:GetParent():Update()
UpdateData()
break
end
end
end
end
local function Tab3EditboxOnEnter(self)
ELib.Tooltip.Std(self)
if self:GetText() and tonumber(self:GetText()) then
ELib.Tooltip:Add("spell:"..self:GetText())
end
end
local function Tab3EditboxOnLeave(self)
ELib.Tooltip.Hide(self)
ELib.Tooltip:HideAdd()
end
local function Tab3MarksListOnEnter(self)
self:GetParent().Background:Show()
end
local function Tab3MarksListOnLeave(self)
self:GetParent().Background:Hide()
end
local BUFF_PAGE_COUNT = 20
self.buffMarkLine = {}
for i=1,BUFF_PAGE_COUNT do
local line = CreateFrame("Frame",nil,self.t.tabs[3])
self.buffMarkLine[i] = line
line:SetPoint("TOP",0,-35-(i-1)*25)
line:SetPoint("LEFT",5,0)
line:SetPoint("RIGHT",-25,0)
line:SetHeight(25)
line._i = i
local edit = ELib:Edit(line):Size(140,20):Point("LEFT",5,0):Tooltip(L.panelmarksBuffMarkTooltip):OnChange(Tab3EditboxOnChange):Text(VMRT.MarksSimple.buffMarks[i] or "")
edit._i = i
edit:SetScript("OnEnter",Tab3EditboxOnEnter)
edit:SetScript("OnLeave",Tab3EditboxOnLeave)
line.edit = edit
local texture = line:CreateTexture(nil, "BACKGROUND")
texture:SetPoint("LEFT",edit,"RIGHT",11,0)
texture:SetSize(24,24)
line.texture = texture
local text = ELib:Text(line,"",11):Point("LEFT",texture,"RIGHT",5):Color():Size(290,0)
line.text = text
local marks = CreateFrame("Frame",nil,line)
marks:EnableMouse(true)
ELib:Border(marks,1,0.24,0.25,0.3,1,1)
marks.Background = marks:CreateTexture(nil,"BACKGROUND")
marks.Background:SetColorTexture(0,0,0,.3)
marks.Background:SetPoint("TOPLEFT")
marks.Background:SetPoint("BOTTOMRIGHT")
marks:SetPoint("RIGHT",-5,0)
marks:SetSize(20*9,20)
marks.list = {}
for i=1,9 do
marks.list[i] = marks:CreateTexture(nil,"ARTWORK")
marks.list[i]:SetPoint("LEFT",(i-1)*20,0)
marks.list[i]:SetSize(18,18)
marks.list[i]:SetTexture(i <= 8 and "Interface\\TargetingFrame\\UI-RaidTargetingIcon_"..i or [[Interface\AddOns\MRT\media\DiesalGUIcons16x256x128]])
if i == 9 then
marks.list[i]:SetTexCoord(0.125,0.1875,0.5,0.625)
marks.list[i]:SetVertexColor(1,1,1,0.7)
end
end
marks:SetScript("OnMouseDown",Tab3MarksOnMouseDown)
marks.state = VMRT.MarksSimple.buffMarksState[i] or "12345678"
line.marks = marks
line.Update = Tab3LineUpdate
line:Update()
line.Background = line:CreateTexture(nil,"BACKGROUND")
line.Background:SetColorTexture(1,1,1,.15)
line.Background:SetPoint("TOPLEFT",0,0)
line.Background:SetPoint("BOTTOMRIGHT",0,0)
line.Background:Hide()
marks:SetScript("OnEnter",Tab3MarksListOnEnter)
marks:SetScript("OnLeave",Tab3MarksListOnLeave)
end
local function UpdateBuffPage()
local newPointer = floor( self.t.tabs[3].scrollBar:GetValue() + 0.5 )
if self.buffPagePointer == newPointer and self.buffPageMax == VMRT.MarksSimple.buffMax then
return
end
self.buffPagePointer = newPointer
self.buffPageMax = VMRT.MarksSimple.buffMax
if newPointer == select(2,self.t.tabs[3].scrollBar:GetMinMaxValues()) then
self.buffAddMore:Show()
self.buffMarkLine[BUFF_PAGE_COUNT]:Hide()
else
self.buffAddMore:Hide()
self.buffMarkLine[BUFF_PAGE_COUNT]:Show()
end
for i=1,BUFF_PAGE_COUNT do
local line = self.buffMarkLine[i]
line._i = newPointer+i-1
line.edit._i = newPointer+i-1
line:Update(true)
end
end
self.buffAddMore = ELib:Button(self.t.tabs[3],L.panelmarksBuffAddMore):Point(self.buffMarkLine[BUFF_PAGE_COUNT]):Shown(false):OnClick(function()
if type(VMRT.MarksSimple.buffMax) ~= "number" then
VMRT.MarksSimple.buffMax = 100
end
VMRT.MarksSimple.buffMax = VMRT.MarksSimple.buffMax + 50
if VMRT.MarksSimple.buffMax > 1000 then
VMRT.MarksSimple.buffMax = 1000
end
UpdateBuffPage()
local pointer = self.buffPagePointer
self.t.tabs[3].scrollBar:Range(1,max(1,(type(VMRT.MarksSimple.buffMax)=="number" and VMRT.MarksSimple.buffMax or 100)-BUFF_PAGE_COUNT+1)+1):SetTo(pointer)
end)
self.t.tabs[3].scrollBar = ELib:ScrollBar(self.t.tabs[3]):Size(16,25*BUFF_PAGE_COUNT):Point("TOPLEFT",self.buffMarkLine[1],"TOPRIGHT",5,0):Range(1,max(1,(type(VMRT.MarksSimple.buffMax)=="number" and VMRT.MarksSimple.buffMax or 100)-BUFF_PAGE_COUNT+1)+1):OnChange(function(scrollBar)
UpdateBuffPage()
end)
self.t.tabs[3]:SetScript("OnMouseWheel",function(_,delta)
delta = -delta
self.t.tabs[3].scrollBar:SetValue(tonumber(self.t.tabs[3].scrollBar:GetValue())+delta)
end)
ELib:Text(self.t.tabs[3],L.panelmarksTab3Tooltip,11,"GameFontNormal"):Point("TOP",self.buffMarkLine[BUFF_PAGE_COUNT],"BOTTOM",0,-10):Point("LEFT",10,0):Point("RIGHT",-10,0):Color()
end
local data_buffs,data_buffs_state,data_names,data_names_state = {},{},{},{}
function UpdateData()
wipe(data_buffs)
wipe(data_buffs_state)
if type(VMRT.MarksSimple.buffMax) ~= "number" or VMRT.MarksSimple.buffMax < 100 then
VMRT.MarksSimple.buffMax = 100
end
if type(VMRT.MarksSimple.buffMax) == "number" and VMRT.MarksSimple.buffMax > 1000 then
VMRT.MarksSimple.buffMax = 1000
end
local lastNonZeroIndex = 0
for i=1,VMRT.MarksSimple.buffMax do
if VMRT.MarksSimple.buffMarks[i] then
local spellID = tonumber(VMRT.MarksSimple.buffMarks[i])
if spellID then
data_buffs[spellID] = true
data_buffs_state[spellID] = VMRT.MarksSimple.buffMarksState[i] or "12345678"
end
lastNonZeroIndex = i
end
end
if lastNonZeroIndex < 100 then
lastNonZeroIndex = 100
end
VMRT.MarksSimple.buffMax = ceil(lastNonZeroIndex / 50) * 50
wipe(data_names)
wipe(data_names_state)
if type(VMRT.MarksSimple.markMax) ~= "number" or VMRT.MarksSimple.markMax < 100 then
VMRT.MarksSimple.markMax = 100
end
if type(VMRT.MarksSimple.markMax) == "number" and VMRT.MarksSimple.markMax > 1000 then
VMRT.MarksSimple.markMax = 1000
end
local lastNonZeroIndex = 0
for i=1,VMRT.MarksSimple.markMax do
local name = VMRT.MarksSimple.autoMarkNames[i]
if name and name ~= "" then
if name:find("^%-") then
name = name:gsub("^%-","")
end
data_names[ (name):lower() ] = true
data_names_state[ (name):lower() ] = VMRT.MarksSimple.autoMarkState[i] or "87654321"
lastNonZeroIndex = i
end
end
if lastNonZeroIndex < 100 then
lastNonZeroIndex = 100
end
VMRT.MarksSimple.markMax = ceil(lastNonZeroIndex / 50) * 50
end
local VMRT_MarksSimple_buffMarkEnabled, VMRT_MarksSimple_autoMarkEnabled
function module:UpdateState()
UpdateData()
VMRT_MarksSimple_buffMarkEnabled = VMRT.MarksSimple.buffMarkEnabled
VMRT_MarksSimple_autoMarkEnabled = VMRT.MarksSimple.autoMarkEnabled
module:UnregisterEvents('UNIT_TARGET','UPDATE_MOUSEOVER_UNIT','NAME_PLATE_UNIT_ADDED','INSTANCE_ENCOUNTER_ENGAGE_UNIT','UNIT_NAME_UPDATE','COMBAT_LOG_EVENT_UNFILTERED')
if VMRT_MarksSimple_autoMarkEnabled then
module:RegisterEvents('UNIT_TARGET','UPDATE_MOUSEOVER_UNIT','NAME_PLATE_UNIT_ADDED','INSTANCE_ENCOUNTER_ENGAGE_UNIT','UNIT_NAME_UPDATE')
end
if VMRT_MarksSimple_autoMarkEnabled or VMRT_MarksSimple_buffMarkEnabled then
module:RegisterEvents('COMBAT_LOG_EVENT_UNFILTERED')
end
module:RegisterEvents('ENCOUNTER_END','ENCOUNTER_START')
end
function module.main:ADDON_LOADED()
VMRT = _G.VMRT
VMRT.MarksSimple = VMRT.MarksSimple or {}
VMRT.MarksSimple.names = VMRT.MarksSimple.names or {}
VMRT.MarksSimple.autoMarkNames = VMRT.MarksSimple.autoMarkNames or {}
VMRT.MarksSimple.autoMarkState = VMRT.MarksSimple.autoMarkState or {}
VMRT.MarksSimple.buffMarks = VMRT.MarksSimple.buffMarks or {}
VMRT.MarksSimple.buffMarksState = VMRT.MarksSimple.buffMarksState or {}
module:UpdateState()
module:RegisterSlash()
module:RegisterAddonMessage()
end
function module:slash(arg)
if arg:find("^mark ") then
local patt = arg:match("^mark (%d+)")
patt = tonumber(patt or "?")
if patt and patt ~= 5 then
for i=1,8 do
local index = (patt-1)*8+i
if VMRT.MarksSimple.names[index] then
SetRaidTarget(VMRT.MarksSimple.names[index], i)
end
end
elseif patt == 5 then
module:RegisterEvents('RAID_TARGET_UPDATE')
for i=1,8 do
SetRaidTarget("player", i)
end
end
end
end
function module.main:RAID_TARGET_UPDATE()
if GetRaidTargetIndex("player") == 8 then
SetRaidTarget("player", 0)
module:UnregisterEvents('RAID_TARGET_UPDATE')
end
end
local addon_msg_antispam = {}
function module:addonMessage(sender, prefix, ...)
if prefix == "marks" then
local spellID,eType = ...
spellID = tonumber(spellID or "-")
if type(spellID)~='number' or spellID < 1000000 then
return
end
local t = GetTime()
if (addon_msg_antispam[sender] or 0) >= t then
return
end
addon_msg_antispam[sender] = t + 1
local event = "SPELL_AURA_APPLIED"
if eType == "2" then
event = "SPELL_AURA_REMOVED"
end
sender = ExRT.F.delUnitNameServer(sender)
module.main.COMBAT_LOG_EVENT_UNFILTERED(nil,event,nil,nil,nil,nil,nil,nil,sender,nil,nil,spellID)
end
end
local guidToMark = {}
local marksUsed = {}
local FIX_UNIT_DEATH_ENCOUNTER = false
local FIX_NOT_UNIT_DEATH_ENCOUNTER = false
local FIX_RANGE_LIMIT = false
local FIX_CN_GENERALS = false
local function FreeMark(name)
local state = data_names_state[name]
for i=1,state:len() do
local m = tonumber(state:sub(i,i),19)
if m and not marksUsed[m] then
return m
end
end
return 0
end
local function ClearMark()
wipe(marksUsed)
end
local function placeOnTargetOrMouseover(unit)
local guid = UnitGUID(unit)
if guid and not guidToMark[guid] then
local name = UnitName(unit):lower()
local type,_,serverID,instanceID,zoneUID,mobID,spawnID = strsplit("-", guid)
if data_names[ name ] then
local mark = FreeMark(name)
if mark > 0 then
guidToMark[guid] = mark
if GetRaidTargetIndex(unit) ~= mark then
SetRaidTarget(unit, mark)
end
marksUsed[mark] = true
if FIX_UNIT_DEATH_ENCOUNTER then
C_Timer.After(20,function()
marksUsed[mark] = nil
end)
end
end
elseif (mobID and data_names[ mobID ]) then
if FIX_RANGE_LIMIT and not UnitInRange(unit) then
return
elseif FIX_CN_GENERALS and mobID == "169601" then
return
end
local mark = FreeMark(mobID)
if mark > 0 then
guidToMark[guid] = mark
if GetRaidTargetIndex(unit) ~= mark then
SetRaidTarget(unit, mark)
end
marksUsed[mark] = true
if FIX_UNIT_DEATH_ENCOUNTER then
C_Timer.After(20,function()
marksUsed[mark] = nil
end)
end
end
end
end
end
function module.main:UNIT_TARGET(unit)
placeOnTargetOrMouseover(unit.."target")
end
function module.main:UPDATE_MOUSEOVER_UNIT()
placeOnTargetOrMouseover("mouseover")
end
function module.main:NAME_PLATE_UNIT_ADDED(unitID)
placeOnTargetOrMouseover(unitID)
end
function module.main:INSTANCE_ENCOUNTER_ENGAGE_UNIT()
for i=1,8 do
placeOnTargetOrMouseover("boss"..i)
end
end
function module.main:UNIT_NAME_UPDATE(unit)
placeOnTargetOrMouseover(unit)
end
local currentMarkBuffData = {}
function module.main.COMBAT_LOG_EVENT_UNFILTERED(_,event,_,sourceGUID,_,_,_,_,destName,_,destFlags2,spellId,spellName)
if (event == "SPELL_AURA_APPLIED" or event == "SPELL_AURA_APPLIED_DOSE") then
if data_buffs[ spellId ] and VMRT_MarksSimple_buffMarkEnabled then
if not currentMarkBuffData[spellId] then
currentMarkBuffData[spellId] = 1
end
local currentMarkBuff = currentMarkBuffData[spellId]
local currentMark = tonumber(data_buffs_state[spellId]:sub(currentMarkBuff,currentMarkBuff),19)
if not currentMark then
return
end
if GetRaidTargetIndex(destName) ~= currentMark then
SetRaidTarget(destName, currentMark)
end
currentMarkBuffData[spellId] = currentMarkBuffData[spellId] + 1
C_Timer.After(2, function()
currentMarkBuffData[spellId] = 1
end)
end
elseif event == "SPELL_AURA_REMOVED" then
if data_buffs[ spellId ] and VMRT_MarksSimple_buffMarkEnabled then
SetRaidTarget(destName, 0)
elseif spellId == 343135 then --CN: generals
ClearMark()
wipe(currentMarkBuffData)
FIX_CN_GENERALS = true
C_Timer.After(2,function()
FIX_CN_GENERALS = false
end)
--[=[
elseif spellId == 244894 then --Aggramar
wipe(marksUsed)
]=]
end
--[[
elseif event == "SPELL_CAST_START" then --Xanesh
if spellId == 312336 then
ClearMark()
end
elseif event == "SPELL_CAST_SUCCESS" then
if spellId == 210781 then --Illgynoth
ClearMark()
elseif spellId == 209471 then --Illgynoth
local m = guidToMark[sourceGUID]
if m then
marksUsed[m] = nil
end
elseif spellId == 207513 then --Trillax
ClearMark()
elseif spellId == 208863 then --Elisande
ClearMark()
end
]]
elseif event == "UNIT_DIED" then
if destFlags2 > 0 and VMRT_MarksSimple_autoMarkEnabled and not FIX_NOT_UNIT_DEATH_ENCOUNTER then
local h,u = math_frexp(destFlags2)
marksUsed[u] = nil
end
end
end
function module.main:ENCOUNTER_END()
ClearMark()
FIX_UNIT_DEATH_ENCOUNTER = false
FIX_RANGE_LIMIT = false
wipe(currentMarkBuffData)
end
function module.main:ENCOUNTER_START(eID)
ClearMark()
if eID == 2051 then
FIX_UNIT_DEATH_ENCOUNTER = true
elseif eID == 2008 then
--FIX_UNIT_DEATH_ENCOUNTER = true
elseif eID == 2269 then
FIX_UNIT_DEATH_ENCOUNTER = true
elseif eID == 2328 then
FIX_NOT_UNIT_DEATH_ENCOUNTER = true
elseif eID == 2417 then
--FIX_RANGE_LIMIT = true
elseif eID == 2422 then
FIX_UNIT_DEATH_ENCOUNTER = true
end
wipe(currentMarkBuffData)
end