Sample scripts culled from the forums, credits to thos who posted in the kgPanel thread.
Adjusting Panels based on Raid or 5 Main party
In each Panel set the OnLoad script
self:RegisterEvent("PLAYER_ENTERING_WORLD")
self:RegisterEvent("PARTY_MEMBERS_CHANGED")
self:RegisterEvent("RAID_ROSTER_UPDATE")
Then in each Panel OnEvent script:
local pmems = GetNumPartyMembers()
local rmems = GetNumRaidMembers()
if (pmems < 1 and rmems < 1) or (pmems > 0 and pmems < 6 and rmems < 6) then
self:Hide()
else
self:Show()
end
Using a onClick handler
Be sure you enable mouse clicks on your panel Example: Hide/Show recount when you click the panel
if Recount.MainWindow:IsVisible() then Recount.MainWindow:Hide() else Recount.MainWindow:Show() end
Changing a frame based on Target
OnLoad
self:RegisterEvent("UNIT_TARGET")
self:Hide()
OnEvent
if UnitExists("target") == nil then
self:Hide()
return
end
local cl = UnitClassification("target")
if (cl == "elite") or (cl == "worldboss") or (cl == "rareeleite") then
self:SetBackdropColor(0.1, 0.1, 0.1, 0.1)
self:Show()
else
self:SetBackdropColor(1, 1, 1, 1)
self:Show()
end
Hooking another frame to control your own frame
Examples uses Violation Script Dependacy: Violation OnLoad
local myPanel = self
if Violation0 then
Violation0:SetScript("OnShow",function(frame)
myPanel:Show()
end)
Violation0:SetScript("OnHide",function(frame)
myPanel:Hide()
end)
end
if Violation0:IsVisible() then self:Show() else self:Hide() end
Controlling a panel based on entering a major city
OnLoad
self:RegsiterEvent('CHAT_MSG_CHANNEL_NOTICE')
OnEvent:
if event == "CHAT_MSG_CHANNEL_NOTICE" then
-- arg1 is either "YOU JOINED", "YOU LEFT" or "THROTTLED"
-- arg7 is channel type (trade is type 2)
-- so
if arg1 == "YOU_JOINED" and arg7 == 2 then
self:Show()
end
if arg1 == "YOU_LEFT" and arg7 == 2 then
self:Hide()
end
end
Make your own spell damage display
Create a panel OnLoad
self:RegisterEvent("PLAYER_AURAS_CHANGED")
OnEvent:
dmg = GetSpellBonusDamage(6); self.text:SetText(dmg)
Change a frame color based on your class
OnLoad
local _, class = UnitClass("player");
if class == "WARRIOR" then
self.bg:SetVertexColor(0.95, 0.23, 0.23, self.bg:GetAlpha())
elseif class == "PRIEST" then
self.bg:SetVertexColor(1, 0.96, 0.98, self.bg:GetAlpha())
elseif class == "MAGE" then
self.bg:SetVertexColor(0.00, 1, 1, self.bg:GetAlpha())
elseif class == "DRUID" then
self.bg:SetVertexColor(1, 0.49, 0.04, self.bg:GetAlpha())
elseif class == "PALADIN" then
self.bg:SetVertexColor(0.92, 0.22, 0.46, self.bg:GetAlpha())
elseif class == "HUNTER" then
self.bg:SetVertexColor(0.33, 0.86, 0.00, self.bg:GetAlpha())
elseif class == "ROGUE" then
self.bg:SetVertexColor(1, 0.94, 0.16, self.bg:GetAlpha())
elseif class == "SHAMAN" then
self.bg:SetVertexColor(0.13, 0.42, 1, self.bg:GetAlpha())
elseif class == "WARLOCK" then
self.bg:SetVertexColor(0.36, 0.18, 1, self.bg:GetAlpha())
end
Show a panel based on being in combat
OnLoad
self:RegisterEvent("PLAYER_REGEN_DISABLED")
self:RegisterEvent("PLAYER_REGEN_ENABLED")
OnEvent
if event == "PLAYER_REGEN_ENABLED" then self:Hide() elseif event == "PLAYER_REGEN_DISABLED" then self:Show() end
How to get 8 value tex coords form 4 value examples
For instance you want to use the raid icons blizz provides as a texture. foirst add teh texture to your art library or add it to sharedmedia up to you.
On a Mac ive found use the / slash when entering items is much easier.
Now lets use the status icon as an exmaple
I used onLoad to quickly get the information i wanted.
-- coords found in the FrameXML files
-- left,right,top,bottom
self.bg:SetTexCoord(0.5,1,0,0.5)
local ULx,ULy,LLx,LLy,URx,URy,LRx,LRy = self.bg:GetTexCoord()
print(" ULX: "..ULx)
print(" ULy:"..ULy)
print(" LLX:"..LLx)
print(" LLy:"..LLy)
print(" URx: "..URx)
print(" URy:"..URy)
print(" LRx:"..LRx)
print(" LRy:"..LRy)
Now i have the 8 position coords for the combat icon which is UL(0.5,0) LL(0.5,0.5) UR(1,0) LR(1,0.5)
Its a little bit of a pain, but the 8 coord setup allows for so much more flexibility as you can do transforms. The 4 position method only allows you to make rectangles.
Healer mana warning by warlocomotif
OnLoad
self:RegisterEvent("PLAYER_REGEN_ENABLED")
HEALERWARNING_TIME = 5
HEALERWARNING_PERCENT = 20
HWSHOWTIMER = 0
self:Hide()
OnEvent
if UnitGroupRolesAssigned("player") then
for i=1,GetNumPartyMembers() do
if select(2, UnitGroupRolesAssigned("party"..i)) then
if (UnitPower("party"..i) / UnitPowerMax("party"..i)) < (HEALERWARNING_PERCENT / 100) then
self:Show()
HWSHOWTIMER = GetTime()
end
break
end
end
end
OnUpdate
if HWSHOWTIMER ~= 0 then
if (GetTime() - HWSHOWTIMER) > HEALERWARNING_TIME then
HWSHOWTIMER = 0
self:Hide()
end
end
Facts
- Date created
- Oct 11, 2008
- Last updated
- Apr 14, 2012
- Reply
- #39
ThuBz Oct 12, 2012 at 14:30 UTC - 0 likesHey guys,
here a little script i found to find out what frame your mouse is over, handy to attach artwork to unitframes/minimap and so on.. works for realy everything!
/run local e,m,n,f=EnumerateFrames,MouseIsOver;ChatFrame1:AddMessage("The mouse is over the following frames:")f=e()while f do n=f:GetName()if n and f:IsVisible()and m(f)then ChatFrame1:AddMessage(" - "..n)end;f=e(f)end
i did not write this my self but couldnt find any other script macro's for it. Enjoy
- Reply
- #38
DrabAngel Sep 29, 2012 at 08:55 UTC - 0 likes** that's not the way it is here **
Controlling a panel based on entering a major city
OnLoad
self:RegsiterEvent('CHAT_MSG_CHANNEL_NOTICE')
OnEvent:
if event == "CHAT_MSG_CHANNEL_NOTICE" then
-- arg1 is either "YOU JOINED", "YOU LEFT" or "THROTTLED"
-- arg7 is channel type (trade is type 2)
-- so
if arg1 == "YOU_JOINED" and arg7 == 2 then
self:Show()
end
if arg1 == "YOU_LEFT" and arg7 == 2 then
self:Hide()
end
end
- Reply
- #36
steste78 Sep 13, 2012 at 16:40 UTC - 0 likesI m trying to hide and show the xp bar and rep bar in bartender4 but every time the xp bar updates it shows and everytime the rep bar updates it shows now I m looking at a way to disable them and enable them in the db file for bartender please help?
- Reply
- #35
kagaro Apr 14, 2012 at 21:34 UTC - 0 likesPhanx, fixed your right that script was very bad and shouldn't have been up there. most of the samples were from the forum and i just pasted them in here for a quick reference
- Reply
- #34
Phanx Feb 21, 2012 at 01:19 UTC - 0 likesThe OnUpdate script under "Resizing your panel on the fly" is very poorly written. Most significantly, it fails to set the "self.resized" flag after setting the script, so it will create a new function and set it as ChatFrame1's OnSizeChanged script every time a new video frame is drawn, which can occur over 100 times per second depending on your hardware and settings. Also, it's a poor example in the first place, as no scripts at all are necessary to achieve the result. The panel should simply be parented to ChatFrame1, with two points set anchoring it to the frame's opposing corners (eg. TOPLEFT and BOTTOMRIGHT) so that its size automatically changes along with the frame.
- Reply
- #33
Hurtlock Sep 10, 2011 at 11:42 UTC - 0 likesI now have the Onclick working to show my bars but when im in combat i cant hide or show the bars any script needed for that to work?
- Reply
- #32
zero_fenix Aug 11, 2011 at 03:17 UTC - 0 likesReferencing a remote panel by name.
local myMapPanel = kgPanels:FetchFrame("mapPanel") myMapPanel:Hide()
- Reply
- #29
WGSXFrank Feb 01, 2011 at 15:41 UTC - 0 likesIs there any way to make a single graphic continuously spin around in a circle (like a wheel) at all times? I want to create a spinning spiral in my UI... but I suck at scripting.
- Reply
- #28
FaelynneMarie Nov 14, 2010 at 16:37 UTC - 0 likesHow would I make a panel show/hide based on whether I have active cooldowns? (To use with SexyCooldown) Thanks!
- Reply
- #27
Eilensar Nov 08, 2010 at 10:27 UTC - 0 likes@ Magieus
try this:
OnLoad
OnEvent
This will display something like 342g 32s 54c, but only AFTER you reload UI or make/lose money for the first time to update.