--GB_Old_UIErrorsFrame_OnEvent = UIErrorsFrame_OnEvent; --function UIErrorsFrame_OnEvent(event, message) -- GB_Old_UIErrorsFrame_OnEvent(event, message); -- if (GB_ISCASTING or GB_INSTANTCASTING) then --SpellStopTargeting(); -- end --end function GB_CheckForInvalidSpells() local idtype, name, rank; for index in GB_UNITS_ARRAY do for i=1, 20 do idtype = GB_Settings[GB_INDEX][index].Button[i].idType; name = GB_Settings[GB_INDEX][index].Button[i].name; rank = GB_Settings[GB_INDEX][index].Button[i].rank; if (idtype == "spell") then if (not GB_SPELLS[name][rank]) then GB_Settings[GB_INDEX][index].Button[i] = GB_Get_DefaultButtonSettings(); GB_ActionButton_Initialize(index, i); end end end end end function GB_DisableGB() if (GB_Settings[GB_INDEX].Disable) then GB_Settings[GB_INDEX] = {}; GB_Settings[GB_INDEX].Disable = true; GB_INITIALIZED = false; for _,box in GB_CLICKBOXES do getglobal(box):Hide(); getglobal(box.."_Texture"):Hide(); end for i=1,4 do local partyBar = getglobal(GB_Get_UnitBar("party"..i)); local petBar = getglobal(GB_Get_UnitBar("partypet"..i)); partyBar.noshow = true; petBar.noshow = true; partyBar:Hide(); petBar:Hide(); end for i=1,40 do local raidbar = getglobal(GB_Get_UnitBar("raid"..i)); raidbar.noshow = true; raidbar:Hide(); end GB_LowestHealthBar:Hide(); GB_HostileTargetBar:Hide(); GB_FriendlyTargetBar:Hide(); GB_PlayerBar:Hide(); else GB_Settings[GB_INDEX] = {}; GB_Settings[GB_INDEX].Undisable = true; GB_Feedback("Reloading the UI."); GB_MacroBox:SetText("/console reloadui"); ChatEdit_SendText(GB_MacroBox); end end function GB_Initialize() if (GB_INITIALIZED) then return; end for i=2,30 do local left = getglobal("GBAuraTooltipTextLeft"..i) for i,v in left do if (type(v) == "function") then left[i] = function() end end end local left = getglobal("GBAuraTooltipTextRight"..i) for i,v in left do if (type(v) == "function") then left[i] = function() end end end end for i,v in GBAuraTooltipTextLeft1 do if (type(v) == "function" and i ~= "GetText" and i ~= "SetText" and i ~= "Hide" and i ~= "Show") then GBAuraTooltipTextLeft1[i] = function() end end end for i,v in GBAuraTooltipTextRight1 do if (type(v) == "function" and i ~= "GetText" and i ~= "SetText" and i ~= "Hide" and i ~= "Show") then GBAuraTooltipTextRight1[i] = function() end end end GB_INDEX = UnitName("player").."::"..GetCVar("realmName"); _,GB_PLAYER_CLASS = UnitClass("player") GBTooltip:SetOwner(WorldFrame, "ANCHOR_NONE"); GBAuraTooltip:SetOwner(WorldFrame, "ANCHOR_NONE"); if (GB_Settings and GB_Settings[GB_INDEX]) then if (GB_Settings[GB_INDEX].Disable) then GB_Settings[GB_INDEX] = {}; GB_Settings[GB_INDEX].Disable = true; GB_MiscOptions_DisableGB:SetChecked(1); GroupButtonsFrame:UnregisterEvent("BAG_UPDATE"); for _,box in GB_CLICKBOXES do getglobal(box):Hide(); getglobal(box.."_Texture"):Hide(); end for i=1,4 do local partyBar = getglobal(GB_Get_UnitBar("party"..i)); local petBar = getglobal(GB_Get_UnitBar("partypet"..i)); partyBar.noshow = true; petBar.noshow = true; partyBar:Hide(); petBar:Hide(); end for i=1,40 do local raidbar = getglobal(GB_Get_UnitBar("raid"..i)); raidbar.noshow = true; raidbar:Hide(); end GB_LowestHealthBar:Hide(); GB_HostileTargetBar:Hide(); GB_FriendlyTargetBar:Hide(); GB_PlayerBar:Hide(); return; end end GB_Hook_Functions(); if (GetLocale() == "deDE") then if (UnitClass("player") == GB_TEXT.Shaman) then GB_CURES.CurePoison.text = "Vergiftung heilen"; end end GB_RaidMemberSelect1:ClearAllPoints(); GB_RaidMemberSelect1:SetPoint("TOPLEFT", "GB_RaidMemberSelect", "TOPLEFT", 10, -35); GB_RaidMemberSelect1_Label:SetText("Raid Member 1"); local prm; for i=2,20 do prm = "GB_RaidMemberSelect"..(i - 1); getglobal("GB_RaidMemberSelect"..i):ClearAllPoints(); getglobal("GB_RaidMemberSelect"..i):SetPoint("TOPLEFT", prm, "BOTTOMLEFT", 0, 0); end GB_RaidMemberSelect21:ClearAllPoints(); GB_RaidMemberSelect21:SetPoint("TOPLEFT", "GB_RaidMemberSelect", "TOPLEFT", 270, -35); GB_RaidMemberSelect21_Label:SetText("Raid Member 21"); for i=22,40 do prm = "GB_RaidMemberSelect"..(i - 1); getglobal("GB_RaidMemberSelect"..i):ClearAllPoints(); getglobal("GB_RaidMemberSelect"..i):SetPoint("TOPLEFT", prm, "BOTTOMLEFT", 0, 0); end if (not GB_Settings) then GB_Settings = {}; end if (not GB_Settings[GB_INDEX]) then GB_Initialize_DefaultSettings(); elseif (GB_Settings[GB_INDEX].Undisable) then GB_Initialize_DefaultSettings(); end GB_Initialize_NewSettings(); GB_INITIALIZED = true; if (DUF_TargetOfTargetFrame) then GB_Settings[GB_INDEX].hideClickboxes = true; end GB_Update_FrameLocations(); GB_UnitFrames_Initialize(); GB_Update_Spells(); GB_Update_InventoryItems(); GB_Update_ContainerItems(1); GB_Update_Macros(); GB_CheckForInvalidSpells(); GB_Spellbook_Initialize(); GB_Initialize_BarOptions("player"); GB_Initialize_Labels(); GB_Initialize_Toggles(); GB_Initialize_AllBars(); GB_Initialize_Menus(); GB_Initialize_AnnounceOptions(); GB_Initialize_ThresholdsOptions(); GB_Initialize_MiscOptions(); GB_Update_Bindings(); GB_Update_RaidMemberSelect(); GB_Bars_Raise(); if (not GB_Get("partypet", "hide")) then if (UnitName("pet")) then GB_PetBar0:Show(); end end for i=1, GetNumPartyMembers() do getglobal("GB_PartyBar"..i).noshow = false; GB_LowestHealthBar.noshow = false; if (not GB_Get("party", "hide")) then getglobal("GB_PartyBar"..i):Show(); if (not GB_Get("partypet", "hide")) then if (UnitName("partypet"..i)) then getglobal("GB_PetBar"..i).noshow = false; getglobal("GB_PetBar"..i):Show(); end end end if (not GB_Get("lowesthealth", "hide")) then GB_LowestHealthBar:Show(); end end if (not GB_Settings[GB_INDEX].Disable) then GB_Initialize_AllBars(); end if (not GB_Settings[GB_INDEX].Disable) then for _,box in GB_CLICKBOXES do getglobal(box):Hide(); getglobal(box.."_Texture"):Hide(); end if (not GB_Get("hideClickboxes")) then GB_PlayerClickbox:Show(); if (UnitName("target")) then GB_TargetClickbox:Show(); end if (UnitName("pet")) then GB_Pet0Clickbox:Show(); end for i=1,GetNumPartyMembers() do getglobal("GB_Party"..i.."Clickbox"):Show(); if (UnitName("partypet"..i)) then getglobal("GB_Pet"..i.."Clickbox"):Show(); end end end end end function GB_Initialize_NewSettings() if (not GB_Settings[GB_INDEX].HealingBonus) then GB_Settings[GB_INDEX].HealingBonus = 0; end if (not GB_Settings[GB_INDEX].Initialized["4.11"]) then GB_Settings[GB_INDEX].disablePartyRange = true; end if (not GB_Settings[GB_INDEX].Initialized["4.3"]) then for bar in GB_UNITS_ARRAY do if (GB_Settings[GB_INDEX][bar]) then GB_Settings[GB_INDEX][bar].oldLeftClick = "l"; GB_Settings[GB_INDEX][bar].oldRightClick = "r"; for i = 1, GB_UNITS_ARRAY[bar].buttons do if (GB_Settings[GB_INDEX][bar].Button[i].preventOverhealing) then GB_Settings[GB_INDEX][bar].Button[i].cancelHeal = true; else GB_Settings[GB_INDEX][bar].Button[i].cancelHeal = false; end end end end end if (not GB_Settings[GB_INDEX].Initialized["4.5"]) then GB_Settings[GB_INDEX].frameLocs = {}; GB_Settings[GB_INDEX].partypet = { Button = {}, alpha = 1, buttonSize = 30, hide = false, rows = 1, collapse = false, spacing = 0, attach = false, attachPoint = "TOPLEFT", attachTo = "BOTTOMLEFT", xoffset = 0, yoffset = 0, mouseover = false, clickCast = {}, Clickbox = { x1=0, x2=0, y1=0, y2=0 }, oldLeftClick = "l", oldRightClick = "r" }; GB_Settings[GB_INDEX].raid = { Button = {}, alpha = 1, buttonSize = 30, hide = false, rows = 1, collapse = false, spacing = 0, attach = false, attachPoint = "TOPLEFT", attachTo = "BOTTOMLEFT", xoffset = 0, yoffset = 0, mouseover = false, clickCast = {}, Clickbox = { x1=0, x2=0, y1=0, y2=0 }, oldLeftClick = "l", oldRightClick = "r" }; for i=1, 20 do GB_Settings[GB_INDEX].partypet.Button[i] = GB_Get_DefaultButtonSettings(); GB_Settings[GB_INDEX].raid.Button[i] = GB_Get_DefaultButtonSettings(); GB_Settings[GB_INDEX].party.Button[i].OOCoption = "hide"; GB_Settings[GB_INDEX].friendlytarget.Button[i].OOCoption = "hide"; GB_Settings[GB_INDEX].hostiletarget.Button[i].OOCoption = "hide"; GB_Settings[GB_INDEX].player.Button[i].OOCoption = "hide"; GB_Settings[GB_INDEX].lowesthealth.Button[i].OOCoption = "hide"; end end if (not GB_Settings[GB_INDEX].Initialized["4.6"]) then GB_Settings[GB_INDEX].OOMcolor = {r=.2, g=.2, b=1}; GB_Settings[GB_INDEX].OORcolor = {r=1, g=.2, b=.2}; GB_Settings[GB_INDEX].greycolor = {r=.4, g=.4, b=.4}; end if (not GB_Settings[GB_INDEX].Initialized["4.7"]) then GB_Settings[GB_INDEX].announcements[4] = ""; GB_Settings[GB_INDEX].announcements[5] = ""; GB_Settings[GB_INDEX].pet = {}; GB_Copy_Table(GB_Settings[GB_INDEX].partypet, GB_Settings[GB_INDEX].pet); end if (not GB_Settings[GB_INDEX].Initialized["4.95"]) then GB_Settings[GB_INDEX].modifybyUIscale = true; GB_Settings[GB_INDEX].announceChannel = ""; end if (not GB_Settings[GB_INDEX].announceChannel) then GB_Settings[GB_INDEX].announceChannel = ""; end GB_Settings[GB_INDEX].Initialized["4.95"] = true; GB_Settings[GB_INDEX].Initialized["4.7"] = true; GB_Settings[GB_INDEX].Initialized["4.6"] = true; GB_Settings[GB_INDEX].Initialized["4.5"] = true; GB_Settings[GB_INDEX].Initialized["4.3"] = true; GB_Settings[GB_INDEX].Initialized["4.11"] = true; end function GB_Initialize_AnchorsMenu() local width = 0; for i=1,9 do local optiontext = getglobal("GB_Menu_Anchors_Option"..i.."_Text"); optiontext:SetText(GB_ANCHOR_POINTS[i].text); getglobal("GB_Menu_Anchors_Option"..i).value = GB_ANCHOR_POINTS[i].value; if (optiontext:GetWidth() > width) then width = optiontext:GetWidth(); end end for i=1,9 do getglobal("GB_Menu_Anchors_Option"..i):SetWidth(width); end GB_Menu_Anchors:SetWidth(width + 20); end function GB_Initialize_AnnounceNumMenu() for i=1,5 do getglobal("GB_Menu_Announce_Option"..i.."_Text"):SetText(i); getglobal("GB_Menu_Announce_Option"..i):SetWidth(20); end GB_Menu_Announce:SetWidth(30); end function GB_Initialize_AnnounceOptions() GB_AnnounceOptions_Text1:SetText(GB_Settings[GB_INDEX].announcements[1]); GB_AnnounceOptions_Text2:SetText(GB_Settings[GB_INDEX].announcements[2]); GB_AnnounceOptions_Text3:SetText(GB_Settings[GB_INDEX].announcements[3]); GB_AnnounceOptions_Text4:SetText(GB_Settings[GB_INDEX].announcements[4]); GB_AnnounceOptions_Text5:SetText(GB_Settings[GB_INDEX].announcements[5]); GB_AnnounceOptions_FailedText:SetText(GB_Get("failedText")); GB_AnnounceOptions_InterruptedText:SetText(GB_Get("interruptedText")); if (not GB_Settings[GB_INDEX].announceChannel) then GB_Settings[GB_INDEX].announceChannel = ""; end GB_AnnounceOptions_AnnounceChannel:SetText(GB_Get("announceChannel")); if (GB_Get("announceInterrupted")) then GB_AnnounceOptions_AnnounceInterrupts:SetChecked(1); end if (GB_Get("sendToChannel")) then GB_AnnounceOptions_SendToChannel:SetChecked(1); end if (GB_Get("announceFailed")) then GB_AnnounceOptions_AnnounceFailures:SetChecked(1); end if (GB_Get("doNotUseSay")) then GB_AnnounceOptions_DoNotUseSay:SetChecked(1); end if (GB_Get("doNotUseParty")) then GB_AnnounceOptions_DoNotUseParty:SetChecked(1); end if (GB_Get("doNotUseRaid")) then GB_AnnounceOptions_DoNotUseRaid:SetChecked(1); end if (GB_Get("doNotAnnounceSolo")) then GB_AnnounceOptions_DoNotAnnounceSolo:SetChecked(1); end if (GB_Get("announceDisabled")) then GB_AnnounceOptions_TurnOffAllAnnouncements:SetChecked(1); end end function GB_Initialize_ClickboxMenu() local width = 0; for i, v in GB_CLICKBOX_MENU do local option = getglobal("GB_Menu_Clickboxes_Option"..i); option.index = v.value; getglobal(option:GetName().."_Text"):SetText(v.text); local textwidth = getglobal(option:GetName().."_Text"):GetWidth(); if (textwidth > width) then width = textwidth; end end for i=1,5 do getglobal("GB_Menu_Clickboxes_Option"..i):SetWidth(width); end GB_Menu_Clickboxes:SetWidth(width + 20); end function GB_Initialize_ContextMenu() local width = 0; for i, value in GB_CONTEXTS do local option = getglobal("GB_Menu_Contexts_Option"..i); option.index = value.index; getglobal(option:GetName().."_Text"):SetText(value.text); local textwidth = getglobal(option:GetName().."_Text"):GetWidth(); if (textwidth > width) then width = textwidth; end end for i=1,15 do getglobal("GB_Menu_Contexts_Option"..i):SetWidth(width); end GB_Menu_Contexts:SetWidth(width + 20); end function GB_Initialize_CopyBarMenu() local width = 0; for i,v in GB_COPYBAR_MENU do getglobal("GB_Menu_CopyBar_Option"..i).value = v.value; local option = getglobal("GB_Menu_CopyBar_Option"..i.."_Text"); option:SetText(v.text); if (option:GetWidth() > width) then width = option:GetWidth(); end end for i=1,5 do getglobal("GB_Menu_CopyBar_Option"..i):SetWidth(width); end GB_Menu_CopyBar:SetWidth(width + 20); end function GB_Initialize_DefaultSettings() GB_Settings[GB_INDEX] = { Initialized = { ["4.0"] = true }, barsLocked = true, buttonsLocked = true, showLabels = false, showEmpty = false, hideAllBlessings = false, hideClickboxes = false, hideBaseBindings = false, hideDynamicBindings = false, healthThresholds = {0,0,0,0}, manaThreshold = 0, aeThreshold = 0, numPastAEThreshold = 3, POthreshold = 0, cancelHealThreshold = 0, announcements = { GB_DEFAULT_ANNOUNCE_TEXT, "", "" }, announceFailed = true, announceInterrupted = true, failedText = GB_TEXT.DefaultFailedText, interruptedText = GB_TEXT.DefaultInterruptedText, doNotUseSay = true, doNotUseParty = false, doNotUseRaid = false, disableTooltip = false, dontAttack = false, dontTargetPet = false, disableGBSpam = false, disableCantDoYetSpam = false, disableActionInProgressSpam = false, disableOutOfRangeSpam = false, announceDisabled = false, Undisable = nil }; for unit in GB_UNITS_ARRAY do GB_Settings[GB_INDEX][unit] = { Button = {}, alpha = 1, buttonSize = 30, hide = false, rows = 1, collapse = false, spacing = 0, attach = false, attachPoint = "TOPLEFT", attachTo = "BOTTOMLEFT", xoffset = 0, yoffset = 0, mouseover = false, clickCast = {}, Clickbox = { x1=0, x2=0, y1=0, y2=0 } }; for i=1, 20 do GB_Settings[GB_INDEX][unit].Button[i] = GB_Get_DefaultButtonSettings(); end end end function GB_Initialize_FormsMenu() local numForms = GetNumShapeshiftForms(); getglobal("GB_Menu_Forms_Option0_Text"):SetText(GB_TEXT.NoForm); local width = getglobal("GB_Menu_Forms_Option0_Text"):GetWidth(); for i=1, 10 do local option = getglobal("GB_Menu_Forms_Option"..i.."_Text"); if (i > numForms) then getglobal("GB_Menu_Forms_Option"..i):Hide(); else local _, name = GetShapeshiftFormInfo(i); option:SetText(name); if (option:GetWidth() > width) then width = option:GetWidth() end end end for i=0, 10 do getglobal("GB_Menu_Forms_Option"..i):SetWidth(width); end getglobal("GB_Menu_Forms_Option99"):SetWidth(width); if (width == 0) then width = 50; numForms = 1; end GB_Menu_Forms:SetWidth(width + 20); GB_Menu_Forms:SetHeight((numForms + 2) * 15 + 20); end function GB_Initialize_Labels() local label, labeltext, text, name; for unit, value in GB_UNITS_ARRAY do for index in value.frames do label = getglobal(value.frames[index].."_Label"); labeltext = getglobal(value.frames[index].."_Label_Text"); text = value.labels[index]; if (unit == "raid") then name = UnitName("raid"..index); if (name) then text = name; end end labeltext:SetText(text); label:SetWidth(labeltext:GetWidth() + 10); end end end function GB_Initialize_Menus() GB_Initialize_AnchorsMenu(); GB_Initialize_AnnounceNumMenu(); GB_Initialize_ClickboxMenu(); GB_Initialize_ContextMenu(); GB_Initialize_CopyBarMenu(); GB_Initialize_FormsMenu(); GB_Initialize_NumPartyMenu(); GB_Initialize_OutOfContextMenu(); end function GB_Initialize_MiscOptions() if (GB_Get("dontAttack")) then GB_MiscOptions_DoNotAttack:SetChecked(1); end if (GB_Get("dontTargetPet")) then GB_MiscOptions_DoNotTargetPet:SetChecked(1); end if (GB_Get("disableTooltip")) then GB_MiscOptions_DisableTooltip:SetChecked(1); end if (GB_Get("disableGBSpam")) then GB_MiscOptions_DisableGroupButtonsSpam:SetChecked(1); end if (GB_Get("disableCantDoYetSpam")) then GB_MiscOptions_DisableCantDoYetSpam:SetChecked(1); end if (GB_Get("disableActionInProgressSpam")) then GB_MiscOptions_DisableActionInProgressSpam:SetChecked(1); end if (GB_Get("disableOutOfRangeSpam")) then GB_MiscOptions_DisableOutOfRangeSpam:SetChecked(1); end if (GB_Get("hideBaseBindings")) then GB_MiscOptions_HideBaseKeybindings:SetChecked(1); end if (GB_Get("hideDynamicBindings")) then GB_MiscOptions_HideDynamicKeybindings:SetChecked(1); end if (GB_Get("disablePartyRange")) then GB_MiscOptions_DisablePartyRange:SetChecked(1); end if (GB_Get("includePets")) then GB_MiscOptions_IncludePets:SetChecked(1); end if (GB_Get("includeRaid")) then GB_MiscOptions_IncludeRaid:SetChecked(1); end if (GB_Get("showCooldown")) then GB_MiscOptions_ShowCooldown:SetChecked(1); end if (GB_Get("applyPOonCtrl")) then GB_MiscOptions_ApplyPOonCtrl:SetChecked(1); end if (GB_Get("hideInRaid")) then GB_MiscOptions_HideInRaid:SetChecked(1); end if (GB_Get("changeTarget")) then GB_MiscOptions_ChangeTarget:SetChecked(1); end if (GB_Get("modifybyUIscale")) then GB_MiscOptions_ModifyByUIScale:SetChecked(1); end if (GB_Get("autoleaveform")) then GB_MiscOptions_AutoCancelForm:SetChecked(1); end if (GB_Get("limitlhrange")) then GB_MiscOptions_LimitLHRange:SetChecked(1); end if (GB_Get("limitaerange")) then GB_MiscOptions_LimitARange:SetChecked(1); end GB_MiscOptions_OORColor:SetBackdropColor(GB_Settings[GB_INDEX].OORcolor.r, GB_Settings[GB_INDEX].OORcolor.g, GB_Settings[GB_INDEX].OORcolor.b); GB_MiscOptions_OOMColor:SetBackdropColor(GB_Settings[GB_INDEX].OOMcolor.r, GB_Settings[GB_INDEX].OOMcolor.g, GB_Settings[GB_INDEX].OOMcolor.b); GB_MiscOptions_GreyColor:SetBackdropColor(GB_Settings[GB_INDEX].greycolor.r, GB_Settings[GB_INDEX].greycolor.g, GB_Settings[GB_INDEX].greycolor.b); GB_MiscOptions_HealingBonus:SetText(GB_Settings[GB_INDEX].HealingBonus); end function GB_Initialize_NumPartyMenu() for i=1,5 do getglobal("GB_Menu_NumParty_Option"..i.."_Text"):SetText(i); getglobal("GB_Menu_NumParty_Option"..i):SetWidth(30); end GB_Menu_NumParty:SetWidth(30); end function GB_Initialize_OutOfContextMenu() local width = 0; for i=1,3 do local optiontext = getglobal("GB_Menu_OutOfContext_Option"..i.."_Text"); optiontext:SetText(GB_OOC_MENU[i].text); getglobal("GB_Menu_OutOfContext_Option"..i).value = GB_OOC_MENU[i].value; if (optiontext:GetWidth() > width) then width = optiontext:GetWidth(); end end for i=1,3 do getglobal("GB_Menu_OutOfContext_Option"..i):SetWidth(width); end GB_Menu_OutOfContext:SetWidth(width + 20); end function GB_Initialize_ThresholdsOptions() GB_ThresholdsOptions_HealthThreshold1:SetText(GB_Settings[GB_INDEX].healthThresholds[1]); GB_ThresholdsOptions_HealthThreshold2:SetText(GB_Settings[GB_INDEX].healthThresholds[2]); GB_ThresholdsOptions_HealthThreshold3:SetText(GB_Settings[GB_INDEX].healthThresholds[3]); GB_ThresholdsOptions_HealthThreshold4:SetText(GB_Settings[GB_INDEX].healthThresholds[4]); GB_ThresholdsOptions_ManaThreshold:SetText(GB_Get("manaThreshold")); GB_ThresholdsOptions_AreaHealThreshold:SetText(GB_Get("aeThreshold")); GB_ThresholdsOptions_NumPartyToCheck_Setting:SetText(GB_Get("numPastAEThreshold")); GB_ThresholdsOptions_CancelHealThreshold:SetText(GB_Get("cancelHealThreshold")); end function GB_Initialize_Toggles() if (not GB_Get("barsLocked")) then GB_LockBars_Button:SetText(GB_TEXT.LockBars); end if (not GB_Get("buttonsLocked")) then GB_LockButtons_Button:SetText(GB_TEXT.LockButtons); end if (GB_Get("showEmpty")) then GB_ShowEmpty_Button:SetText(GB_TEXT.HideEmpty); end if (GB_Get("showLabels")) then GB_Labels_Show(); GB_ShowLabels_Button:SetText(GB_TEXT.HideLabels); end if (GB_Get("hideClickboxes")) then GB_Set("hideClickboxes", false); GB_Toggle_Clickboxes(); end end function GB_Parse_Tooltip(filter) local value; for i = 1, 30 do local textleft = getglobal("GBTooltipTextLeft"..i):GetText(); local textright = getglobal("GBTooltipTextRight"..i):GetText(); local text; if (textleft and textright) then text = textleft.." "..textright elseif (textleft) then text = textleft elseif (textright) then text = textright end if (text) then _,_,value = string.find(text, filter); end if (value) then break; end end return value; end function GB_RegisterWithMyAddons() if (myAddOnsFrame) then myAddOnsList.GroupButtons = { name = "Group Buttons", description = "Adds hotbars connected to different targets", version = GB_VERSION, category = MYADDONS_CATEGORY_BARS, frame = "GroupButtonsFrame", optionsframe = "GB_Options"}; end end function GB_Update_ContainerItems(counttoggle) if (not GB_INITIALIZED) then return; end GB_ITEMS = {}; for bag = 0, 4 do local bagslots = GetContainerNumSlots(bag); if (bagslots) then for slot = 1, bagslots do local itemName = GB_Get_ItemName(bag, slot); if (itemName) then GB_ITEMS[itemName] = { bag = bag, slot = slot}; end end end end if (not counttoggle) then for bar in GB_UNITS_ARRAY do for button = 1, 20 do local idType = GB_Settings[GB_INDEX][bar].Button[button].idType; local name = GB_Settings[GB_INDEX][bar].Button[button].name; if (idType == "inv" and (not GB_INVENTORY[name])) then if (GB_ITEMS[name]) then GB_Settings[GB_INDEX][bar].Button[button].idType = "item"; else GB_Settings[GB_INDEX][bar].Button[button] = GB_Get_DefaultButtonSettings(); end elseif (idType == "item" and (not GB_ITEMS[name])) then if (GB_INVENTORY[name]) then GB_Settings[GB_INDEX][bar].Button[button].idType = "inv"; else GB_Settings[GB_INDEX][bar].Button[button] = GB_Get_DefaultButtonSettings(); end end if (idType == "item" or idType == "inv") then GB_ActionButton_SetCount(bar, button); end end end end end function GB_Update_FrameLocations() for frame, offset in GB_Settings[GB_INDEX].frameLocs do getglobal(frame):ClearAllPoints(); getglobal(frame):SetPoint("TOPLEFT", "UIParent", "BOTTOMLEFT", offset.x, offset.y); end end function GB_Update_InventoryItems() if (not GB_INITIALIZED) then return; end GB_INVENTORY = {}; local slots = { "HeadSlot", "NeckSlot", "ShoulderSlot", "BackSlot", "ChestSlot", "ShirtSlot", "TabardSlot", "WristSlot", "HandsSlot", "WaistSlot", "LegsSlot", "FeetSlot", "Finger0Slot", "Finger1Slot", "Trinket0Slot", "Trinket1Slot", "MainHandSlot", "SecondaryHandSlot", "RangedSlot", "AmmoSlot" }; for _,slot in slots do local slotId, texture = GetInventorySlotInfo(slot); local name = GB_Get_ItemName(slotId); if (name) then local count = GetInventoryItemCount("player", slotId); GB_INVENTORY[name] = { slot = slot, id = slotId, texture = texture, count = count }; end end end function GB_Update_Macros() GB_MACROS = {}; local base, character = GetNumMacros(); for i=1, base do local name, texture, body = GetMacroInfo(i); if (name) then GB_MACROS[name] = { id=i, texture = texture, body = body }; end end for i=19, 18 + character do local name, texture, body = GetMacroInfo(i); if (name) then GB_MACROS[name] = { id=i, texture = texture, body = body }; end end end function GB_Update_RaidMemberSelect() local unit, rms, name, class, level, fileName, color; for i=1,40 do unit = "raid"..i; rms = "GB_RaidMemberSelect"..i; if (UnitExists(unit) and UnitName(unit)) then getglobal(rms):Show(); name = UnitName(unit); _, _, _, level, class, fileName = GetRaidRosterInfo(i); color = RAID_CLASS_COLORS[fileName]; if (color) then getglobal(rms.."_Label"):SetTextColor(color.r, color.g, color.b); end if (not level) then level = ""; end if (not class) then class = ""; end getglobal(rms.."_Label"):SetText(name.." ("..level.." "..class..")"); if (GB_RAID_MEMBERS[name]) then getglobal(rms):SetChecked(1); else getglobal(rms):SetChecked(0); end else getglobal(rms):Hide(); end end GB_RAID_MEMBERS = {nil}; for i=1,GetNumRaidMembers() do rms = getglobal("GB_RaidMemberSelect"..i); if (rms:GetChecked()) then if (UnitName("raid"..i)) then GB_RAID_MEMBERS[UnitName("raid"..i)] = true; else rms:SetChecked(0); end end end end function GB_Update_Spells(forceupdate) if (not GB_INITIALIZED) then return; end local spellID = 1; while true do local spellName, spellRank = GetSpellName(spellID, BOOKTYPE_SPELL); if not spellName then do break end end local skipspell; if (not GB_SPELLS[spellName]) then GB_SPELLS[spellName] = {}; elseif (GB_SPELLS[spellName][spellRank]) then GB_SPELLS[spellName][spellRank].id = spellID; skipspell = 1; end if (forceupdate or (not skipspell)) then local spellMana, spellRage, spellEnergy, spellType, spellMin, spellMax, spellCastingTime, spellAvg, spellDuration, otamt; GBTooltip:SetSpell(spellID, SpellBookFrame.bookType); local textleft, textright, text; for i = 1, 30 do if (getglobal("GBTooltipTextLeft"..i):IsShown()) then textleft = getglobal("GBTooltipTextLeft"..i):GetText(); else textleft = nil; end if (getglobal("GBTooltipTextRight"..i):IsShown()) then textright = getglobal("GBTooltipTextRight"..i):GetText(); else textright = nil; end if (textleft and textright) then text = textleft.." "..textright elseif (textleft) then text = textleft elseif (textright) then text = textright end if (text) then if (not spellMana) then _,_,spellMana = string.find(text, GB_FILTERS.Mana); end if (not spellRage) then _,_,spellRage = string.find(text, GB_FILTERS.Rage); end if (not spellEnergy) then _,_,spellEnergy = string.find(text, GB_FILTERS.Energy); end if (not spellMin) then _,_,spellMin,spellMax = string.find(text, GB_FILTERS.To); if (spellMin and spellMax) then string.gsub(spellMin, ',', '.'); string.gsub(spellMax, ',', '.'); spellMin = tonumber(spellMin); spellMax = tonumber(spellMax); end end if (string.find(string.upper(text), GB_FILTERS.Heal)) then if (string.find(text, GB_FILTERS.HealOverTime)) then _,_,otamt,spellDuration = string.find(text, GB_FILTERS.HealOverTime); if (otamt) then string.gsub(otamt, ',', '.'); end otamt = tonumber(otamt); if (otamt) then spellType = "HoT"; if (not spellMax) then spellMin, spellMax = otamt, otamt; elseif (spellType ~= "HoT") then spellType = "heal"; end end elseif (string.find(text, GB_FILTERS.DruidHealOverTime)) then _,_,otamt,spellDuration = string.find(text, GB_FILTERS.DruidHealOverTime); if (otamt) then string.gsub(otamt, ',', '.'); end otamt = tonumber(otamt); if (otamt) then spellType = "HoT"; if (not spellMax) then spellMin, spellMax = otamt, otamt; elseif (spellType ~= "HoT") then spellType = "heal"; end end elseif (spellType ~= "HoT") then spellType = "heal"; end elseif (string.find(text, GB_FILTERS.Damage) or string.find(string.upper(text), GB_FILTERS.Damage)) then if (string.find(text, GB_FILTERS.DamageOverTime)) then _,_,otamt,spellDuration = string.find(text, GB_FILTERS.DamageOverTime); if (otamt) then string.gsub(otamt, ',', '.'); end otamt = tonumber(otamt); if (otamt) then spellType = "DoT"; if (not spellMax) then spellMin, spellMax = otamt, otamt; elseif (spellType ~= "DoT") then spellType = "damage"; end end elseif (spellType ~= "DoT") then spellType = "damage"; end end if (not spellCastingTime) then _,_,spellCastingTime = string.find(text, GB_FILTERS.CastingTime); end end end if (not spellMana) then if (spellRage) then spellMana = spellRage; elseif (spellEnergy) then spellMana = spellEnergy; end end if (not spellMana) then spellMana = 0; else spellMana = tonumber(spellMana); end if (not spellCastingTime) then spellCastingTime = 0; else string.gsub(spellCastingTime, ',', '.'); spellCastingTime = tonumber(spellCastingTime); if (not spellCastingTime) then spellCastingTime = 0; end end spellMin = tonumber(spellMin); if (not spellMin) then spellMin = 0; end spellMax = tonumber(spellMax); if (not spellMax) then spellMax = 0; end if (spellType == "heal" or spellType == "HoT") then local ct = spellCastingTime; if (ct == 0) then ct = 3.5; end local bonus = (spellCastingTime / 3.5) * GB_Settings[GB_INDEX].HealingBonus; spellMin = spellMin + bonus; spellMax = spellMax + bonus; end spellAvg = (spellMin + spellMax) / 2; if (not spellDuration) then spellDuration = 0; end for _,v in GB_CURES do if (v.text == spellName) then spellType = "cure"; break; end end if (spellType ~= "cure" and spellType ~= "HoT") then for _,v in GB_MINLVL_SPELLS do if (v == spellName) then spellType="buff"; break; end end end GB_SPELLS[spellName][spellRank] = { id = spellID, mana = spellMana, type = spellType, min = spellMin, max = spellMax, avg = spellAvg, castingTime = spellCastingTime, duration = spellDuration }; end spellID = spellID + 1; end GB_SPELLS_COUNT = spellID - 1; GB_Update_SpellRanges(); for bar, value in GB_UNITS_ARRAY do for button = 1, 20 do if (GB_Settings[GB_INDEX][bar].Button[button].idType == "spell") then if (not GB_SPELLS[GB_Settings[GB_INDEX][bar].Button[button].name]) then GB_Settings[GB_INDEX][bar].Button[button] = GB_Get_DefaultButtonSettings(); GB_ActionButton_Initialize(bar, button); end end end end end function GB_Update_SpellRanges(forceupdate) local match; for spellname, ranks in GB_SPELLS do for spellrank,spell in ranks do if (forceupdate or (not GB_SPELLS[spellname][spellrank].range)) then local texture = GetSpellTexture(spell.id, "BOOKTYPE_SPELL"); GBTooltip:ClearLines(); GBTooltip:SetSpell(spell.id, SpellBookFrame.bookType); local range = GB_Parse_Tooltip(GB_FILTERS.Range); GB_SPELLS[spellname][spellrank].rangeinyds = range; for i=120, 1, -1 do local abtexture = GetActionTexture(i); if (abtexture == texture) then match = i; break; end GBTooltip:ClearLines(); GBTooltip:SetAction(i); local abrange = GB_Parse_Tooltip(GB_FILTERS.Range); if (abrange == range) then match = i; end end GB_SPELLS[spellname][spellrank].range = match; end end end end