Вопросы по Lua, XML, WoW API.  
Автор Сообщение

0
Сообщение Вопросы по Lua, XML, WoW API.

На 13, прошу прощения.



01 апр 2012, 14:24
Профиль Skype



<Имя Говорит Само за Себя>


Сервер: Гордунни
0
Сообщение Вопросы по Lua, XML, WoW API.

Daniel писал(а):

На 13, прошу прощения.

ты не там ищешь проблему Bye скобочка эта на 27 строке

вот что творится с фреймами:

 



01 апр 2012, 14:31
Профиль

0
Сообщение Вопросы по Lua, XML, WoW API.

Не совсем понимаю логику, зачем ты делаешь это:

 

local _, instanceType = IsInInstance()
      if instanceType == "arena" or "pvp" then

 

Выходит, что твой скрипт не будет включатся до тех пор пока ты не войдешь на бг или арену? Но после того как зашел он будет работать везде, и в данжах тоже. Какой в этом смысл?



01 апр 2012, 14:39
Профиль



<Имя Говорит Само за Себя>


Сервер: Гордунни
0
Сообщение Вопросы по Lua, XML, WoW API.

Отрицание писал(а):

Не совсем понимаю логику, зачем ты делаешь это:

 

local _, instanceType = IsInInstance()
      if instanceType == "arena" or "pvp" then

 

Выходит, что твой скрипт не будет включатся до тех пор пока ты не войдешь на бг или арену? Но после того как зашел он будет работать везде, и в данжах тоже. Какой в этом смысл?

возможно, но если их убрать проблема останется



01 апр 2012, 14:44
Профиль

0
Сообщение Вопросы по Lua, XML, WoW API.

Вообще что этот скрипт должен делать?

Окрашивать по классу пати фреймы, убирать некоторый хлам с пати фреймов и менять положение петов для пати?

В теории должно работать так

 

Код:
local f = CreateFrame("Frame")
f:SetScript("OnEvent",function(self, event)
for i=1,4
do
local v,s,f,p,bar,color;
if UnitExists("party"..i) then
f=_G["PartyMemberFrame"..i];
s=_G["PartyMemberFrame"..i.."Speaker"]:SetAlpha(0);
v=_G["PartyMemberFrame"..i.."PVPIcon"]:SetAlpha(0);
bar = _G["PartyMemberFrame"..i.."HealthBar"]
color = RAID_CLASS_COLORS[select(2,UnitClass(""..i))]
bar:SetStatusBarColor(color.r,color.g,color.b)
if UnitExists("partypet"..i) then
p=_G["PartyMemberFrame"..i.."PetFrame"];
p:SetPoint("TOPLEFT", f, "TOPLEFT", 23, -43);
end
end
end
end)
f:RegisterEvent("PLAYER_ENTERING_WORLD")
f:RegisterEvent("PARTY_MEMBERS_CHANGED")
f:RegisterEvent("UNIT_FACTION")

 

А все остальное там лишнее.

Но можешь еще заодно протестировать так:

 

Код:
local f = CreateFrame("Frame")
f:SetScript("OnUpdate",function(self, event)
for i=1,4
do
local v,s,f,p,bar,color;
if UnitExists("party"..i) then
f=_G["PartyMemberFrame"..i];
s=_G["PartyMemberFrame"..i.."Speaker"]:SetAlpha(0);
v=_G["PartyMemberFrame"..i.."PVPIcon"]:SetAlpha(0);
bar = _G["PartyMemberFrame"..i.."HealthBar"]
color = RAID_CLASS_COLORS[select(2,UnitClass(""..i))]
bar:SetStatusBarColor(color.r,color.g,color.b)
if UnitExists("partypet"..i) then
p=_G["PartyMemberFrame"..i.."PetFrame"];
p:SetPoint("TOPLEFT", f, "TOPLEFT", 23, -43);
end
end
end
end)

 

Но второй вариант это не подходящее для постоянной работы решение, это чисто потестить некоторую возможность, что-бы понять где проблема.

 



01 апр 2012, 15:04
Профиль



<Имя Говорит Само за Себя>


Сервер: Гордунни
0
Сообщение Вопросы по Lua, XML, WoW API.

не работает

Message: Interface\AddOns\NeilyoScript\NeilyoScript.lua:513: attempt to index local 'color' (a nil value)
Time: 04/01/12 16:21:52
Count: 408
Stack: Interface\AddOns\NeilyoScript\NeilyoScript.lua:513: in function <Interface\AddOns\NeilyoScript\NeilyoScript.lua:503>

Locals: self = <unnamed> {
0 = <userdata>
}
event = "PARTY_MEMBERS_CHANGED"
(for index) = 1
(for limit) = 4
(for step) = 1
i = 1
v = nil
s = nil
f = PartyMemberFrame1 {
0 = <userdata>
portrait = PartyMemberFrame1Portrait {
}
statusSign = -1
unit = "party1"
debuffTotal = 0
statusCounter = 0
healthbar = PartyMemberFrame1HealthBar {
}
menu = <function> defined @Interface\FrameXML\PartyMemberFrame.lua:105
manabar = PartyMemberFrame1ManaBar {
}
phasingIcon = PartyMemberFrame1PhasingIcon {
}
unitHPPercent = 1
threatIndicator = PartyMemberFrame1Flash {
}
state = "player"
myHealPredictionBar = PartyMemberFrame1MyHealPredictionBar {
}
noTextPrefix = true
debuffCountdown = 30
OnEvent = <function> defined *:OnEvent:1
numDebuffs = 0
otherHealPredictionBar = PartyMemberFrame1OtherHealPredictionBar {
}
name = PartyMemberFrame1Name {
}
}
p = nil
bar = PartyMemberFrame1HealthBar {
0 = <userdata>
currValue = 152073
frequentUpdates = true
textLockable = 1
forceHideText = false
cvarLabel = "STATUS_TEXT_PARTY"
capNumericDisplay = true
TextString = PartyMemberFrame1HealthBarText {
}
zeroText = "цель мертва"
disconnected = false
unit = "party1"
lockShow = 0
cvar = "partyStatusText"
}
color = nil
(*temporary) = <function> defined =[C]:-1
(*temporary) = PartyMemberFrame1HealthBar {
0 = <userdata>
currValue = 152073
frequentUpdates = true
textLockable = 1
forceHideText = false
cvarLabel = "STATUS_TEXT_PARTY"
capNumericDisplay = true
TextString = PartyMemberFrame1HealthBarText {
}
zeroText = "цель мертва"
disconnected = false
unit = "party1"
lockShow = 0
cvar = "partyStatusText"
}
(*temporary) = 2
(*temporary) = nil
(*temporary) = nil
(*temporary) = nil
(*temporary) = nil
(*temporary) = "attempt to index local 'color' (a nil value)"

Отрицание писал(а):

Вообще что этот скрипт должен делать?

Окрашивать по классу пати фреймы, убирать некоторый хлам с пати фреймов и менять положение петов для пати?

Показывает пати фреймы в рейде. Но проблема в том, что просто Show(); не работает как нужно,

фреймы могут пропадать, когда игрок садится на машину на острове завоеваний или еще что-нибудь подобное.

 



01 апр 2012, 15:22
Профиль

0
Сообщение Вопросы по Lua, XML, WoW API.

:Show() работает как нужно, просто фреймы пропадают потому-что где-то в коде близзов к ним применяется :Hide()

Можно заблокировать применение :Hide(), но тогда нужно писать свой код который будет скрывать фреймы когда ты не в пати и не в рейде, или-же читать код близзов и разбиратся когда и в связи с чем применяется :Hide() и перехватывать каждый отдельно.



01 апр 2012, 20:08
Профиль



<Имя Говорит Само за Себя>


Сервер: Гордунни
0
Сообщение Вопросы по Lua, XML, WoW API.

Отрицание писал(а):

:Show() работает как нужно, просто фреймы пропадают потому-что где-то в коде близзов к ним применяется :Hide()

Можно заблокировать применение :Hide(), но тогда нужно писать свой код который будет скрывать фреймы когда ты не в пати и не в рейде, или-же читать код близзов и разбиратся когда и в связи с чем применяется :Hide() и перехватывать каждый отдельно.

Проблему со скрытием фреймов я решил более-менее, но вот с цветом большие проблемы.

Он постоянно меняеться на зеленый, иногда даже мелькает очень быстро. Sad



01 апр 2012, 21:27
Профиль

0
Сообщение Вопросы по Lua, XML, WoW API.

Код:
color = RAID_CLASS_COLORS[select(2,UnitClass(""..i))]

А тут так и задумано, что в функцию передаются цифры, или не ?



01 апр 2012, 21:52
Профиль WWW



<Имя Говорит Само за Себя>


Сервер: Гордунни
0
Сообщение Вопросы по Lua, XML, WoW API.

Вобщем сделал скрипт, за несколько БГ багов не обнаружил, но скорее всего они будут вылезать иногда.

Код:

local f = CreateFrame("Frame")
f:RegisterEvent("PLAYER_ENTERING_WORLD")
f:RegisterEvent("PLAYER_TARGET_CHANGED")
f:RegisterEvent("PLAYER_FOCUS_CHANGED")
f:RegisterEvent("PLAYER_GAINS_VEHICLE_DATA")
f:RegisterEvent("PLAYER_LOSES_VEHICLE_DATA")
f:RegisterEvent("PLAYER_ENTERING_BATTLEGROUND")
f:RegisterEvent("PARTY_MEMBERS_CHANGED")
f:RegisterEvent("PARTY_LEADER_CHANGED")
f:RegisterEvent("PARTY_LOOT_METHOD_CHANGED")
f:RegisterEvent("MUTELIST_UPDATE")
f:RegisterEvent("IGNORELIST_UPDATE")
f:RegisterEvent("UNIT_FACTION")
f:RegisterEvent("UNIT_AURA")
f:RegisterEvent("UNIT_CONNECTION")
f:RegisterEvent("UNIT_PET")
f:RegisterEvent("VARIABLES_LOADED")
f:RegisterEvent("READY_CHECK")
f:RegisterEvent("READY_CHECK_CONFIRM")
f:RegisterEvent("READY_CHECK_FINISHED")
f:RegisterEvent("UNIT_ENTERED_VEHICLE")
f:RegisterEvent("UNIT_MODEL_CHANGED")
f:RegisterEvent("UNIT_EXITED_VEHICLE")
f:RegisterEvent("UNIT_HEALTH")
f:RegisterEvent("UNIT_MAXHEALTH")
--f:RegisterEvent("PARTY_MEMBER_ENABLE")
--f:RegisterEvent("PARTY_MEMBER_DISABLE")
f:RegisterEvent("UNIT_PHASE");
f:SetScript("OnEvent",function()
for i=1,4 do local v,f,p,s,d;
f=_G["PartyMemberFrame"..i];
p=_G["PartyMemberFrame"..i.."PetFrame"];
v=_G["PartyMemberFrame"..i.."PVPIcon"]:SetAlpha(0);
s=_G["PartyMemberFrame"..i.."Speaker"]:SetAlpha(0);
d=_G["PartyMemberFrame"..i.."Disconnect"]:SetAlpha(0);
if UnitExists("party"..i) then
f:Show();
if UnitExists("partypet"..i) then
p:SetPoint("TOPLEFT", f, "TOPLEFT", 23, -43);
p:SetAlpha(0)end end end
end)


local UnitIsPlayer,UnitPlayerOrPetInParty,
UnitIsConnected, UnitClass, RAID_CLASS_COLORS =
UnitIsPlayer, UnitPlayerOrPetInParty, UnitIsConnected,
UnitClass, RAID_CLASS_COLORS
local _, class, c
local function colour(statusbar, unit)
if UnitIsPlayer(unit) and
UnitPlayerOrPetInParty(unit) and
UnitIsConnected(unit) and
unit == statusbar.unit and
UnitClass(unit) then
_, class = UnitClass(unit)
c = CUSTOM_CLASS_COLORS and
CUSTOM_CLASS_COLORS[class] or
RAID_CLASS_COLORS[class]
statusbar:SetStatusBarColor(c.r, c.g, c.b)
end
end
hooksecurefunc("UnitFrameHealthBar_Update", colour)
hooksecurefunc("HealthBar_OnValueChanged", function(self)
colour(self, self.unit)
end)
local sb = _G.GameTooltipStatusBar
local addon = CreateFrame("Frame", "StatusColour")
addon:RegisterEvent("UPDATE_MOUSEOVER_UNIT")
addon:SetScript("OnEvent", function()
colour(sb, "mouseover")
end)

 



01 апр 2012, 21:53
Профиль



<Имя Говорит Само за Себя>


Сервер: Гордунни
0
Сообщение Вопросы по Lua, XML, WoW API.

Такой вопрос, как самым простым способом реализовать зависимость прозрачности иконки спелла от оставшегося кд.

Например есть код

Код:
USD="UNIT_SPELLCAST_SUCCEEDED";

OT="OnEvent";

FR="Frame";

RF=CreateFrame;

RD="Border";

UE=UnitName

GR=RF(FR) GR.c=RF("Cooldown","GAR",GR.t) GR:RegisterEvent(USD)
GR.c:SetAllPoints(GR)

GR:SetPoint("TOPRIGHT",FocusFrame,-1,1)

GR:SetSize(22,22)GR.t=GR:CreateTexture(nil,RD)

GR.t:SetAllPoints()GR.t:SetTexture("Interface\\Icons\\spell_frost_iceshock")
GR:SetScript(OT,function(self,event,...)

if UE(select(1,...))==UE("player")and select(5,...)==703 then

GAR:SetCooldown(GetTime(),23)

end end)

Мне надо, чтобы например, когда кд не запущен прозрачность была 0.5, а когда кд запустился 1, затем снова 0.5.



10 апр 2012, 16:24
Профиль



<Школа Хогвартс>


Сервер: Страж Смерти
Рейтинг поля боя: 2146
2х2: 1830
3х3: 1969
5х5: 1530
0
Сообщение Вопросы по Lua, XML, WoW API.

напишите пожалуйста макрос на изменение размера баффов врага в таргете таргете



10 апр 2012, 22:52
Профиль Skype

1
Сообщение Вопросы по Lua, XML, WoW API.

wit4er писал(а):

Такой вопрос, как самым простым способом реализовать зависимость прозрачности иконки спелла от оставшегося кд.

Мне надо, чтобы например, когда кд не запущен прозрачность была 0.5, а когда кд запустился 1, затем снова 0.5.

 

Вот такой вариант:

 

Код:

GR = CreateFrame("Frame")
GR:SetAlpha(0.5)

GR.c = CreateFrame("Cooldown", "GAR", GR.t)
GR.c:SetAllPoints(GR)
GR:SetPoint("TOPRIGHT", FocusFrame, -1, 1)
GR:SetSize(22, 22)

GR.t = GR:CreateTexture(nil, "Border")
GR.t:SetAllPoints()
GR.t:SetTexture("Interface\\Icons\\spell_frost_iceshock")

GR:SetScript("OnEvent",function(self, event, ...)
if UnitName(select(1, ...)) == UnitName("player") and select(5, ...) == 703 then
GAR:SetCooldown(GetTime(), 23)
GR:SetAlpha(1)
end
end)
GR:RegisterEvent("UNIT_SPELLCAST_SUCCEEDED")

 

Будет делать это, но только 1 раз.

То есть вначале иконка будет полупрозрачно, после того, как запустилось кд она станет полностью не прозрачной, но по окончании первого кд она не станет снова полупрозрачной, и останется полностью видимой до следующего /reload

 

А вот что-бы она становилась прозрачной по окончанию кд тебе при старте кд нужно запускать таймер который будет длится столько-же сколько длится кд, и привязывать к этому таймеру соответствующий фрейм, и что-бы по окончанию таймера он сбрасывал альфу в 0.5

 

Поидее это так:

 

Код:

GR = CreateFrame("Frame")
GR:SetAlpha(0.5)

GR.c = CreateFrame("Cooldown", "GAR", GR.t)
GR.c:SetAllPoints(GR)
GR:SetPoint("TOPRIGHT", FocusFrame, -1, 1)
GR:SetSize(22, 22)

GR.t = GR:CreateTexture(nil, "Border")
GR.t:SetAllPoints()
GR.t:SetTexture("Interface\\Icons\\spell_frost_iceshock")

GR:SetScript("OnEvent", function(self, event, ...)
if UnitName(select(1, ...)) == UnitName("player") and select(5, ...) == 703 then
GAR:SetCooldown(GetTime(), 23)

GR:SetAlpha(1)
GR.elapsed = 0
GR:SetScript('OnUpdate', function(self, elapsed)
if self.elapsed > 23 then
self:SetScript('OnUpdate', nil)
self:SetAlpha(0.5)
else
self.elapsed = self.elapsed + elapsed
end
end)

end
end)
GR:RegisterEvent("UNIT_SPELLCAST_SUCCEEDED")

 

Правда я не понял смысл твоего скрипта, он зачем-то показывает 23-секундное кд после того как ты поюзал гарроту, какой в этом смысл.



11 апр 2012, 00:22
Профиль



<Имя Говорит Само за Себя>


Сервер: Гордунни
0
Сообщение Вопросы по Lua, XML, WoW API.

Отрицание писал(а):
 

 

Будет делать это, но только 1 раз.

То есть вначале иконка будет полупрозрачно, после того, как запустилось кд она станет полностью не прозрачной, но по окончании первого кд она не станет снова полупрозрачной, и останется полностью видимой до следующего /reload 

А вот что-бы она становилась прозрачной по окончанию кд тебе при старте кд нужно запускать таймер который будет длится столько-же сколько длится кд, и привязывать к этому таймеру соответствующий фрейм, и что-бы по окончанию таймера он сбрасывал альфу в 0.5

Этот вариант у меня получался :D

Отрицание писал(а):
 Поидее это так:

Спасибо попробую

 

Отрицание писал(а):
 

Правда я не понял смысл твоего скрипта, он зачем-то показывает 23-секундное кд после того как ты поюзал гарроту, какой в этом смысл.

Просто диминишинг 18+5 секунд.

 


 

 

 

 



11 апр 2012, 00:30
Профиль

0
Сообщение Вопросы по Lua, XML, WoW API.

Диминишинг вроде 15-18 секунд, 18 это максимум.



11 апр 2012, 00:42
Профиль



<Имя Говорит Само за Себя>


Сервер: Гордунни
0
Сообщение Вопросы по Lua, XML, WoW API.

Отрицание писал(а):

Диминишинг вроде 15-18 секунд, 18 это максимум.

да, но чтобы не подключать специальные библиотеки берут максимальный для простоты



11 апр 2012, 00:47
Профиль

0
Сообщение Вопросы по Lua, XML, WoW API.

А, понял, я просто забыл про длительность самой гарроты.



11 апр 2012, 00:49
Профиль






Сервер: Outland
Рейтинг поля боя: 1859
2х2: 2438
3х3: 2441
0
Сообщение Вопросы по Lua, XML, WoW API.

Возник вопрос, насколько сложно написать аддон, который отображает на абилке время её действия.

Допустим есть аддон/cкрипт BuffTracker

Код:

bl={57934,73651,5171,51713,5277,2983,74001,31224,13877}
bs=21;xb=0;yb=55;br=6;bdr="BORDER"be="UNIT_AURA"cbf=CreateFrame;gi=GetSpellInfo;bm=math.ceil;fm=math.floor;st=STANDARD_TEXT_FONT;function cu(s) return UnitBuff("player",gi(s))end
function Cb(i,s)local _,_,t3=gi(s)local f=cbf("Frame")f:SetSize(bs,bs)f.t=f:CreateTexture(nil,bdr)f.t:SetAllPoints(true)f.t:SetTexture(t3)f.f=f:CreateFontString(nil,bdr)f.f:SetFont(st,11,"OUTLINE")f.f:SetPoint("BOTTOMRIGHT",0,0)return f;end
function vb(s,i,row)local b1,_,_,b4=cu(s)local f=_G["B"..i]if b1 then f:Show()f:SetPoint("TOP",PlayerFrame,xb+(bs+2)*bm((row-1)%br),yb-(bs+16)*bm(row/br))if(b4>1)then f.f:SetText(b4)end row=row+1;end return row;end
function ub()for i,s in ipairs(bl)do local b,_,_,_,_,_,k=cu(s)if b then local vt=fm(k-GetTime())if (vt>=60)then vt=bm(vt/60)_G["B"..i].c:SetText(vt.."m")elseif vt >= 0 then _G["B"..i].c:SetText(vt.."")end end end end
function Cc(f)f.c=f:CreateFontString(nil,bdr)f.c:SetFont(st,11,"OUTLINE")f.c:SetPoint("CENTER",0,-16)end function db()for i in ipairs(bl)do _G["B"..i]:Hide()end end
for i,s in ipairs(bl)do _G["B"..i]=Cb(i,s)Cc(_G["B"..i])_G["B"..i]:Hide()end function bb()db()local bw=1;for i,s in ipairs(bl)do bw=vb(s,i,bw)end end bk=cbf("Frame")bk:SetScript("OnEvent",bb)bk:SetScript("OnUpdate",ub)bk:RegisterEvent(be)

Код:

/run bl={52127,32734,324,61295,55277,8178,73685,96230}

/run bs=30;xb=-360;yb=-140;br=6;bdr="BORDER"be="UNIT_AURA"cbf=CreateFrame;gi=GetSpellInfo;bm=math.ceil;fm=math.floor;st=STANDARD_TEXT_FONT;function cu(s)returnUnitBuff("player",gi(s))end

/run functionCb(i,s)local _,_,t3=gi(s)local f=cbf("Frame")f:SetSize(bs,bs)f.t=f:CreateTexture(nil,bdr)f.t:SetAllPoints(true)f.t:SetTexture(t3)f.f=f:CreateFontString(nil,bdr)f.f:SetFont(st,12,"OUTLINE")f.f:SetPoint("BOTTOMRIGHT",0,0)return f;end

/run function vb(s,i,row)local b1,_,_,b4=cu(s)local f=_G["B"..i]if b1 then f:Show()f:SetPoint("CENTER",xb+(bs+5)*bm((row-1)%br),yb-(bs+10)*bm(row/br))if(b4>1)then f.f:SetText(b4)end row=row+1;endreturn row;end

/run function ub()for i,s in ipairs(bl)dolocal b,_,_,_,_,_,k=cu(s)if b thenlocal vt=fm(k-GetTime())if(vt>=60)then vt=bm(vt/60)_G["B"..i].c:SetText(vt.."m")elseif vt >=0then _G["B"..i].c:SetText(vt.."s")endendendend

/run functionCc(f)f.c=f:CreateFontString(nil,bdr)f.c:SetFont(st,12,"OUTLINE")f.c:SetPoint("CENTER",0,-20)endfunction db()for i in ipairs(bl)do _G["B"..i]:Hide()endend

/run for i,s in ipairs(bl)do _G["B"..i]=Cb(i,s)Cc(_G["B"..i])_G["B"..i]:Hide()endfunction bb()db()local bw=1;for i,s in ipairs(bl)do bw=vb(s,i,bw)endend bk=cbf("Frame")bk:SetScript("OnEvent",bb)bk:SetScript("OnUpdate",ub)bk:RegisterEvent(be)

Он создает новый фрейм и показывает на нем время действия баффа.

Нужен аддон наподобии Dominos_Bufftimes.Он ставит таймер "кд" на абилку(бафф), а OmniCC уже допиливает на неё кд в виде текста.Хотелось бы увидеть либо просто кд в виде цифр (без дефолтной анимации таймера), либо просто таймер, а OmniCC сделает кд в виде текста.Ну и реально ли отображать таким же способов время действия дебаффа на таргете.Желательно, чтобы спелы заносились по SpellId

Dominos_Bufftimes:

#266

 

 



17 апр 2012, 16:06
Профиль

0
Сообщение Вопросы по Lua, XML, WoW API.

Писать с нуля не очень хочеться, за 5 минут не выйдет, но можно как-то подправить что-то в Dominos_Bufftimes.


Но я немного не понял проблему, если ты будешь юзать доминос+Dominos_Bufftimes+омницц, то как будут отображаться эти кд?

Если так, как у тебя на картинке, то есть цифры "делает" омницц то спираль кдшки можно скрывать в его опциях.

А если кд в виде цифр показывает сам Dominos_Bufftimes без омницц, то что в таком случае будет если поставить омницц, они что будут цифры в 2 слоя показывать?



19 апр 2012, 19:30
Профиль

0
Сообщение Вопросы по Lua, XML, WoW API.

Есть вот такой аддон:

Код:

border = 1 -- Aura Border
spacing = 1 -- Buff Spacing


--buffs
b_growthvertical = 1 -- Growth Direction. 1 = down, 2 = up
b_growthhorizontal = 1 -- Growth Direction. 1 = left, 2 = right

buffsperrow = 4 -- Buffs Per Row
buttonsize = 22 -- Buff Size


--debuffs
d_growthvertical = 2 -- Growth Direction. 1 = down, 2 = up
d_growthhorizontal = 1 -- Growth Direction. 1 = left, 2 = right

debuffsperrow = 5 -- DeBuffs Per Row
debuffsize = 22 -- Debuff Size

b_stackfontsize = 12
b_durafontsize = 7

d_stackfontsize = 12
d_durafontsize = 7

font = "Fonts\\DORISPP.TTF"

-- Default Spawn Positions
local positions = {
[1] = { p = "TOPRIGHT", a = UIParent, x = 0, y = -10 }, -- Buff Anchor
[2] = { p = "TOPRIGHT", a = UIParent, x = 0, y = -60 }, -- Debuff Anchor
[3] = { p = "TOPRIGHT", a = UIParent, x = 0, y = -110 }, -- Enchant Anchor
}
--End Config

local function anchor(frame, r, g, b, pos, anchor, x, y)
frame:SetBackdrop({bgFile = 'Interface\\Buttons\\WHITE8x8'})
frame:SetBackdropColor(r, g, b, 0.4)
---------------
if r==1 then
bsize = debuffsize
else
bsize = buttonsize
end
frame:SetHeight(bsize+20)
frame:SetWidth(bsize+20)
-------------
frame:SetPoint(pos, anchor, pos, x, y)
frame:EnableMouse(true)
frame:SetMovable(true)
frame:SetUserPlaced(true)
frame:SetFrameStrata("BACKGROUND")
frame:SetClampedToScreen(true)
frame:SetAlpha(0)
end

local function MoveFunc(frame)
if movebars==1 then
frame:SetAlpha(1)
frame:RegisterForDrag("LeftButton","RightButton")
frame:SetScript("OnDragStart", function(self) self:StartMoving() end)
frame:SetScript("OnDragStop", function(self) self:StopMovingOrSizing() end)
frame:SetFrameStrata("DIALOG")
elseif movebars==0 then
frame:SetAlpha(0)
frame:SetScript("OnDragStart", function(self) self:StopMovingOrSizing() end)
frame:SetScript("OnDragStop", function(self) self:StopMovingOrSizing() end)
frame:SetFrameStrata("BACKGROUND")
end
end

local buffholder = CreateFrame("Frame", "Buffs", UIParent)
anchor(buffholder, 0, 1, 0, positions[1].p, positions[1].a, positions[1].x, positions[1].y)
local debuffholder = CreateFrame("Frame", "Debuffs", UIParent)
anchor(debuffholder, 1, 0, 0, positions[2].p, positions[2].a, positions[2].x, positions[2].y)
local enchantholder = CreateFrame("Frame", "TempEnchants", UIParent)
anchor(enchantholder, 0, 0, 1, positions[3].p, positions[3].a, positions[3].x, positions[3].y)

SlashCmdList["MOVEBUFFS"] = function()
if movebars~=1 then movebars = 1
else movebars = 0 end
MoveFunc(buffholder)
MoveFunc(debuffholder)
MoveFunc(enchantholder)
end
SLASH_MOVEBUFFS1 = "/movebuffs"

local function makeitgrow(button, index, anchor, framekind)
for i = 1, BUFF_ACTUAL_DISPLAY do
------------------------------------------------------------
if framekind == 2 then
bla = debuffsize
row = debuffsperrow
gverti = d_growthvertical
ghori = d_growthhorizontal

else
bla = buttonsize
row = buffsperrow
gverti = b_growthvertical
ghori = b_growthhorizontal
end
if gverti == 1 then
if ghori == 1 then
if index == ((row*i)+1) then _G[button..index]:SetPoint("TOPRIGHT", anchor, "TOPRIGHT", 0, -(bla+spacing+4)*i) end
else
if index == ((row*i)+1) then _G[button..index]:SetPoint("TOPLEFT", anchor, "TOPLEFT", 0, -(bla+spacing+4)*i) end
end
else
if ghori == 1 then
if index == ((row*i)+1) then _G[button..index]:SetPoint("TOPRIGHT", anchor, "TOPRIGHT", 0, (bla+spacing+4)*i) end
else
if index == ((row*i)+1) then _G[button..index]:SetPoint("TOPLEFT", anchor, "TOPLEFT", 0, (bla+spacing+4)*i) end
end
end
end
--------------------------------------------------------------
if ghori == 1 then
_G[button..index]:SetPoint("RIGHT", _G[button..(index-1)], "LEFT", -(spacing+4), 0)
else
_G[button..index]:SetPoint("LEFT", _G[button..(index-1)], "RIGHT", (spacing+4), 0)
end
end

local function StyleBuffs(button, index, framekind, anchor)
local buff = button..index
_G[buff.."Icon"]:SetTexCoord(.1, .9, .1, .9)
_G[buff.."Icon"]:SetDrawLayer("OVERLAY")
_G[buff]:ClearAllPoints()
------------------------------------------
if framekind == 2 then
bsize = debuffsize
stackfontsize = d_stackfontsize
durafontsize = d_durafontsize
else
bsize = buttonsize
stackfontsize = b_stackfontsize
durafontsize = b_durafontsize
end
------------------------------------------
_G[buff]:SetHeight(bsize)
_G[buff]:SetWidth(bsize)

_G[buff]:SetBackdrop({bgFile = "Interface\\Buttons\\WHITE8x8", insets = { left = -border, right = -border, top = -border, bottom = -border}})

if framekind == 2 then _G[buff]:SetBackdropColor(.7,0,0,1)
elseif framekind == 3 then _G[buff]:SetBackdropColor(0,0,.5,1)
else _G[buff]:SetBackdropColor(0,0,0,1) end

_G[buff.."Count"]:SetFont(font, stackfontsize, "OUTLINE")
_G[buff.."Duration"]:SetFont(font, durafontsize, "OUTLINE")

_G[buff.."Count"]:ClearAllPoints()
_G[buff.."Count"]:SetPoint("TOPRIGHT", 2, 0)
_G[buff.."Count"]:SetDrawLayer("OVERLAY")

_G[buff.."Duration"]:ClearAllPoints()
_G[buff.."Duration"]:SetPoint("BOTTOM")
_G[buff.."Duration"]:SetDrawLayer("OVERLAY")
if _G[buff.."Border"] then _G[buff.."Border"]:Hide() end

if index == 1 then _G[buff]:SetPoint("TOPRIGHT", anchor, "TOPRIGHT", -10, -10) end
if index ~= 1 then makeitgrow(button, index, _G[button..1], framekind) end
end

local function UpdateBuff()
for i = 1, BUFF_ACTUAL_DISPLAY do
StyleBuffs("BuffButton", i, 1, buffholder)
end
for i = 1, BuffFrame.numEnchants do
StyleBuffs("TempEnchant", i, 3, enchantholder)
end
end
local function UpdateDebuff(buttonName, index)
StyleBuffs(buttonName, index, 2, debuffholder)
end

local function updateTime(button, timeLeft)
local duration = _G[button:GetName().."Duration"]
if SHOW_BUFF_DURATIONS == "1" and timeLeft then
duration:SetTextColor(1, 1, 1)
local d, h, m, s = ChatFrame_TimeBreakDown(timeLeft);
if d > 0 then
duration:SetFormattedText("%1dd", d)
elseif h > 0 then
duration:SetFormattedText("%1dh", h)
elseif m > 0 then
duration:SetFormattedText("%1dm", m)
else
duration:SetFormattedText("%1d", s)
end
end
end

hooksecurefunc("BuffFrame_UpdateAllBuffAnchors", UpdateBuff)
hooksecurefunc("DebuffButton_UpdateAnchors", UpdateDebuff)
hooksecurefunc("AuraButton_UpdateDuration", updateTime)
SetCVar("consolidateBuffs", 0)

Отрицание, сделай пожалуйста, чтобы якоря фреймов баффов не сбрасывались при отключении аддона.



19 апр 2012, 19:45
Профиль
Начать новую тему Ответить на тему


Перейти:  

На сайте использованы материалы, принадлежащие Blizzard Entertainment. Копирование материалов возможно только c разрешения портала. В противном случае это будет называться уже другим словом.
Рейтинг@Mail.ru