-- удалите тему
-- удалите тему
Последний раз редактировалось decemberx; 05.01.2016 в 15:32.
Ну такой подход не верен.
Так выглядит итератор у близзард:
А так кто то пробовал перебирать ауры?PHP код:
for i = 1, 40 do
...
end
Возможно просто индекс твоей ауры выходит за предел итератора и поэтому ауру не выводит?PHP код:
local i = 1
while true do
local name, _, _, _, _, _, _, _, isStealable = UnitBuff("target", i)
if not name then break end
i = i + 1
end
-- удалите тему
Последний раз редактировалось decemberx; 05.01.2016 в 15:32.
Давай сделаю фильтр , который будет выводить только твои дебафы в определенном окошке , протестишь , если будет проглатывать ауры то дело уже в боссах.
UnitDebuff и UnitBuff это то же самое , что и UnitAura, реализована UnitBuff так:
PHP код:
function UnitBuff(...)
local unit, index = ...
return UnitAura(unit, index, "HELPFUL")
end
-- удалите тему
Последний раз редактировалось decemberx; 05.01.2016 в 15:32.
-- удалите тему
Последний раз редактировалось decemberx; 05.01.2016 в 15:32.
Блин , методы? Не не слышал) Создай обьект , мету или фрейму , для него сделай методы , это будет прототип твоего бафа , после чего создай еще мету , обзави ее к примеру спелл_бд и там уже заполняй поля типа класс->spel->spell
- - - Updated - - -
нужно каким то образом получать инфу со спела (тот текст который появляется при наведении мышкой) и получать без тутипа ...
- - - Updated - - -
Имею в виду общий формат строки для GetSpellLink(spellId) , который будет возвращать только время ...
Лови получение "времени весения"
PHP код:
local GetDuration;
do
local m_scaner = CreateFrame("GameTooltip", "ff%ds23e2cx", nil, "GameTooltipTemplate")
m_scaner:SetOwner(WorldFrame, "ANCHOR_NONE")
local m_text, tonumber, select = "", tonumber, select
GetDuration = function(spellID)
m_scaner:SetSpellByID(spellID)
for i = 1, m_scaner:GetNumRegions() do
local region = select(i, m_scaner:GetRegions())
if region and region:GetObjectType() == "FontString" then
m_text = region:GetText()
if m_text then
m_text = m_text:match("%d+ сек.")
if m_text then
return tonumber(m_text:match("%d+"))
end
end
end
end
end
end
-- удалите тему
Последний раз редактировалось decemberx; 05.01.2016 в 15:32.
Зачем? к примеру палец у шп:
1) Получаем duration из тултипа
2) duration - (duration * %haste)
- - - Updated - - -
Зачем? к примеру палец у шп:
1) Получаем duration из тултипа
2) duration - (duration * %haste)
Разумеется это не будет работать для игроков , у которых есть таланты понижающие время действия определенного типа дебафа.
- - - Updated - - -
Ну смари , там 1 к 1 хаста режет палец и тд у шп и это только в облике тьмы. Уверен у всех остальных классов аналогичные особенности.
Вышла минутка свободная , думаю дальше догадаешься , осталось самое простое , но емкое , это иконки сделать . Т.е при событии UNIT_AURA (не путать с API UnitAura) нужно делать перебор __auras и создавать ауры через CreateIcon , ее набросал тоже. Для этого нужна переменная id в самой иконке (ее при регистре будешь вешать на фрейм и для соответствующей ауры в мете), ну а дальше сопоставить 2 масива , массив с фреймами и массив с аурами , в случае если есть фрейма и нету id , привязывать ид лишнего ключа, если нет фреймы и есть лишний ключ - создать фрейму через CreateIcon . Ограничить количество иконок можно бряком , когда будешь сопоставлять 2 массив , у тебя будет итератор i = 1 , #__auras , если i больше нужного количества выводимых аур , тогда прервать работу итератора (break).
PHP код:
local __auras, __base = {},{
["WARRIOR"] = {
-- кровопускание
[47465] = false,
}
};
local GetDuration;
do
local m_scaner = CreateFrame("GameTooltip", "m_scaner", nil, "GameTooltipTemplate")
m_scaner:SetOwner(WorldFrame, "ANCHOR_NONE")
local m_text, tonumber, select = "", tonumber, select
GetDuration = function(spellID)
m_scaner:SetSpellByID(spellID)
for i = 1, m_scaner:GetNumRegions() do
local region = select(i, m_scaner:GetRegions())
if region and region:GetObjectType() == "FontString" then
m_text = region:GetText()
if m_text then
m_text = m_text:match("%d+ сек.")
if m_text then
return tonumber(m_text:match("%d+"))
end
end
end
end
end
end
local RegisterAura
do
local GetSpellInfo, GetTime = GetSpellInfo, GetTime
local _, class = UnitClass("player")
RegisterAura = function(destGUID, spellID)
local spellName, spellRank, spellIcon = GetSpellInfo(spellID)
if not __auras[destGUID] then __auras[destGUID] = {} end
local currentTime, duration = GetTime(), __base[class][spellID]
__auras[destGUID][spellID] = {
id = destGUID..spellID,
spellID = spellID,
spellIcon = spellIcon,
startTime = currentTime,
endTime = currentTime + duration,
duration = duration,
elapsed = 0,
remaining = duration
}
end
end
local CreateIcon = function(self)
local t = CreateFrame("frame", nil, self)
t:Hide()
t:SetFrameStrata("MEDIUM")
t:SetClampedToScreen(true)
local ti = t:CreateTexture(nil, "BORDER")
ti:SetAllPoints()
ti:SetTexCoord(0.07, 0.93, 0.07, 0.93)
t.icon = ti
local cooldown = CreateFrame("Cooldown", nil, t, "CooldownFrameTemplate")
cooldown:SetReverse(false)
cooldown:SetAllPoints()
t.cooldown = cooldown
local tt = cooldown:CreateFontString(nil, "OVERLAY")
tt:SetFont("Fonts\\FRIZQT__.TTF", 11, "OUTLINE")
tt:SetPoint("BOTTOM", t, 0, 1)
tt:SetJustifyH("RIGHT")
t.timeText = tt
return t
end
local f = CreateFrame("frame", nil, UIParent)
local OnEvent
do
local _, class = UnitClass("player")
OnEvent = function(self, event, ...)
if event=="COMBAT_LOG_EVENT" then
local timestamp, event, sourceGUID, sourceName, sourceFlags, destGUID, destName, destFlags, spellID = ...
if event=="SPELL_AURA_APPLIED" or event=="SPELL_AURA_REFRESH" then
if sourceName ~= destName then
if __base[class] and not __base[class][spellID] then
__base[class][spellID] = GetDuration(spellID)
end
if __base[class] and __base[class][spellID] then
RegisterAura(destGUID, spellID)
end
end
end
end
end
end
f:RegisterEvent("COMBAT_LOG_EVENT")
f:SetScript("OnEvent", OnEvent)
decemberx (28.11.2015)
-- удалите тему
Последний раз редактировалось decemberx; 05.01.2016 в 15:32.