kgPanels

Sample Scripts

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

You must login to post a comment. Don't have an account? Register to get one!

  • Avatar of kagaro kagaro Apr 14, 2012 at 21:34 UTC - 0 likes

    Phanx, 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

  • Avatar of Phanx Phanx Feb 21, 2012 at 01:19 UTC - 0 likes

    The 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.

  • Avatar of Hurtlock Hurtlock Sep 10, 2011 at 11:42 UTC - 0 likes

    I 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?

  • Avatar of zero_fenix zero_fenix Aug 11, 2011 at 03:17 UTC - 0 likes

    Referencing a remote panel by name.

    local myMapPanel = kgPanels:FetchFrame("mapPanel") myMapPanel:Hide()

  • Avatar of steste78 steste78 Mar 16, 2011 at 00:06 UTC - 0 likes

    please someone help i want to click a panel to target my self

  • Avatar of WGSXFrank WGSXFrank Feb 01, 2011 at 15:41 UTC - 0 likes

    Is 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.

  • Avatar of FaelynneMarie FaelynneMarie Nov 14, 2010 at 16:37 UTC - 0 likes

    How would I make a panel show/hide based on whether I have active cooldowns? (To use with SexyCooldown) Thanks!

  • Avatar of Eilensar Eilensar Nov 08, 2010 at 10:27 UTC - 0 likes

    @ Magieus

    try this:

    OnLoad

    self:RegisterEvent("PLAYER_ENTERING_WORLD");
    self:RegisterEvent("PLAYER_MONEY");
    

    OnEvent

    local copper = GetMoney()
    self.text:SetText(("%dg %ds %dc"):format(copper / 100 / 100, (copper / 100) % 100, copper % 100));
    

    This will display something like 342g 32s 54c, but only AFTER you reload UI or make/lose money for the first time to update.

  • Avatar of dyaeblca dyaeblca Nov 05, 2010 at 09:08 UTC - 0 likes

    I'd like to show/hide an addon that recycles frames (so they can only be accessed as variables), there is no normal frame name etc. Is it possible with kgpanels?

    It's good to be bad

  • Avatar of Magieus Magieus Oct 30, 2010 at 23:00 UTC - 0 likes

    i would make a panel with my gold info. i have create a testpanel with the "Make your own spell damage display Create a panel OnLoad self:RegisterEvent("PLAYER_AURAS_CHANGED") OnEvent: dmg = GetSpellBonusDamage(6); self.text:SetText(dmg)"

    ...settings, but this script dont working :( I dont become a error or other infos.

    what is the current settings or what is the mistake ?

    Sorry for my bad englisch :(