-- Constants TITAN_PANEL_UPDATE_BUTTON = 1; TITAN_PANEL_UDPATE_TOOLTIP = 2; TITAN_PANEL_UPDATE_ALL = 3; TITAN_PANEL_LABEL_SEPARATOR = " " TITAN_PANEL_BUTTON_TYPE_TEXT = 1; TITAN_PANEL_BUTTON_TYPE_ICON = 2; TITAN_PANEL_BUTTON_TYPE_COMBO = 3; TITAN_PANEL_BUTTON_TYPE_CUSTOM = 4; TITAN_STANCESETS_ID = "StanceSets"; TITAN_STANCESETS_FREQUENCY = 1; STANCESET_INDEX = 0; STANCESET_MAX_STANCES = 5 BINDING_HEADER_STANCESETS = "Stance Sets" BINDING_NAME_TOGGLESTANCESETSDLG = "Toggle Configuration Pane"; BINDING_NAME_STANCESETNEXT = "Equip Next Weapon Set"; StanceSetsOptions = {}; --UIPanelWindows["StanceSetsFrame"] = { area = "left", pushable = 5 }; function TitanOptionSlider_TooltipText(text, value) return text .. GREEN_FONT_COLOR_CODE .. value .. FONT_COLOR_CODE_CLOSE; end function TitanPanelStanceSetsButton_OnLoad() this:RegisterEvent("VARIABLES_LOADED"); -- register plugin this.registry = { id = TITAN_STANCESETS_ID, menuText = STANCESETS_LOCALE["menu"], buttonTextFunction = "TitanPanelStanceSetsButton_GetButtonText", tooltipTitle = STANCESETS_LOCALE["tooltip"], tooltipTextFunction = "TitanPanelStanceSetsButton_GetTooltipText", frequency = TITAN_STANCESETS_FREQUENCY, icon = "Interface\\Icons\\Ability_Warrior_ShieldWall", iconWidth = 16, savedVariables = { ShowIcon = 1, ShowLabelText = 1, ShowColoredText = TITAN_NIL } }; end function TitanPanelStanceSetsButton_OnEvent() if(event == "VARIABLES_LOADED") then if (StanceSetsOptions.StanceSetsLocked == nil) then StanceSetsOptions.StanceSetsLocked = false; end if (StanceSetsOptions.ShowStance == nil) then StanceSetsOptions.ShowStance = true; end end end function TitanPanelStanceSetsButton_GetButtonText(id) local retstr = ""; -- supports turning off labels if (TitanGetVar(TITAN_STANCESETS_ID, "ShowLabelText")) then if (StanceSetsOptions.ShowStance) then retstr = STANCESETS_LOCALE["button"]; else retstr = STANCESETS_LOCALE["cbutton"]; end end if (StanceSetsOptions.ShowStance) then if (TitanGetVar(TITAN_STANCESETS_ID, "ShowColoredText")) then retstr = retstr .. TitanUtils_GetGreenText(StanceSets_GetCurrentForm()); else retstr = retstr .. TitanUtils_GetNormalText(StanceSets_GetCurrentForm()); end end return retstr; end function TitanPanelStanceSetsButton_GetTooltipText() local retstr = TitanUtils_GetGreenText("Hint: Left click to open Stance Sets"); return retstr; end function TitanPanelRightClickMenu_PrepareStanceSetsMenu() TitanPanelRightClickMenu_AddTitle(TitanPlugins[TITAN_STANCESETS_ID].menuText); info = {}; info.text = ATLAS_OPTIONS_SHOWSTANCE; info.func = StanceSetOptions_ShowStanceToggle; info.value = ATLAS_OPTIONS_SHOWSTANCE; info.checked = StanceSetsOptions.ShowStance; UIDropDownMenu_AddButton(info, UIDROPDOWNMENU_MENU_LEVEL); info = {}; TitanPanelRightClickMenu_AddSpacer(); TitanPanelRightClickMenu_AddToggleIcon(TITAN_STANCESETS_ID); TitanPanelRightClickMenu_AddToggleLabelText(TITAN_STANCESETS_ID); TitanPanelRightClickMenu_AddToggleColoredText(TITAN_STANCESETS_ID); TitanPanelRightClickMenu_AddSpacer(); TitanPanelRightClickMenu_AddCommand(TITAN_PANEL_MENU_HIDE, TITAN_STANCESETS_ID, TITAN_PANEL_MENU_FUNC_HIDE); end function TitalPanelStanceSetsButton_OnClick(button) if ( button == "LeftButton" ) then StanceSets_Toggle(); end end function StanceSetOptions_ShowStanceToggle() if(StanceSetsOptions.ShowStance) then StanceSetsOptions.ShowStance = false; else StanceSetsOptions.ShowStance = true; end end function StanceSets_StartMoving() if(not StanceSetsOptions.StanceSetsLocked) then StanceSetsFrame:StartMoving(); end end function StanceSets_ToggleLock() if(StanceSetsOptions.StanceSetsLocked) then StanceSetsOptions.StanceSetsLocked = false; StanceSets_UpdateLock(); else StanceSetsOptions.StanceSetsLocked = true; StanceSets_UpdateLock(); end end function StanceSets_UpdateLock() if(StanceSetsOptions.StanceSetsLocked) then StanceSetsLockNorm:SetTexture("Interface\\AddOns\\Titan\\TitanStanceSets\\Images\\LockButton-Locked-Up"); StanceSetsLockPush:SetTexture("Interface\\AddOns\\Titan\\TitanStanceSets\\Images\\LockButton-Locked-Down"); else StanceSetsLockNorm:SetTexture("Interface\\AddOns\\Titan\\TitanStanceSets\\Images\\LockButton-Unlocked-Up"); StanceSetsLockPush:SetTexture("Interface\\AddOns\\Titan\\TitanStanceSets\\Images\\LockButton-Unlocked-Down"); end end function StanceSets_OnLoad() this:RegisterEvent("UPDATE_BONUS_ACTIONBAR"); this:RegisterEvent("SPELLS_CHANGED"); this:RegisterEvent("VARIABLES_LOADED"); tinsert(UISpecialFrames, "StanceSetsFrame"); UIPanelWindows["StanceSetsFrame"] = nil; StanceSetsFrame:RegisterForDrag("LeftButton"); SlashCmdList["STANCESETS"] = StanceSets_SlashCmd; SLASH_STANCESETS1 = "/stancesets"; StanceSets = { }; end function StanceSets_OnShow() return StanceSets_UpdateAllStances(); end function StanceSets_OnEvent(event, arg1) if event == "UPDATE_BONUS_ACTIONBAR" then return StanceSets_FormChanged(); elseif event == "SPELLS_CHANGED" then return StanceSets_SpellsChanged(); elseif event == "VARIABLES_LOADED" then StanceSets_UpdateLock(); end end function StanceSets_SlashCmd(cmd) if cmd and cmd == "next" then return StanceSets_Next(); end return StanceSets_Toggle(); end function StanceSets_Toggle() if StanceSetsFrame:IsVisible() then HideUIPanel(StanceSetsFrame); else ShowUIPanel(StanceSetsFrame); end end function StanceSets_SpellsChanged() -- Spells have changed, this may mean that we've got a new shapeshift form if StanceSetsFrame:IsVisible() then return StanceSets_UpdateAllStances(); end end function StanceSet_SetButtonTextureAndName(suffix,texture,itemName) local btn = getglobal("StanceSetsFrameSet"..suffix); if btn then SetItemButtonTexture(btn, texture); btn.itemName = itemName; end end function StanceSet_FindAndSetButtonTexture(suffix, itemName) if itemName and itemName ~= "" then local bag, slot = WeaponQuickSwap_FindItem(itemName); if bag and slot then local texture; if bag == -1 then texture = GetInventoryItemTexture("player", slot); else texture = GetContainerItemInfo(bag, slot); end StanceSet_SetButtonTextureAndName(suffix, texture, itemName); else -- if not found, just use a generic icon StanceSet_SetButtonTextureAndName(suffix, "Interface\\Icons\\INV_Misc_Gift_01", itemName); end else -- no item name, no icon StanceSet_SetButtonTextureAndName(suffix, nil, itemName); end end function StanceSets_UpdateAllStances() local allstances = StanceSets_GetAllForms(); for i=1,STANCESET_MAX_STANCES do local stanceName = allstances[i]; local frameStance = getglobal("StanceSetsFrameSet"..i); local frameLabel = getglobal("StanceSetsFrameSet"..i.."Title"); if frameStance then local chkForceFirst = getglobal(frameStance:GetName().."ForceFirst"); if stanceName then frameStance.StanceName = stanceName; frameStance:Show(); if frameLabel then frameLabel:SetText(stanceName); end local playerName = UnitName("player"); local setName = playerName.."_"..stanceName; local stanceSet = StanceSets[setName]; if StanceSets[setName.."_ForceFirst"] then chkForceFirst:SetChecked(1); else chkForceFirst:SetChecked(nil); end if stanceSet then StanceSet_FindAndSetButtonTexture(i.."MainHand1", stanceSet[1]); StanceSet_FindAndSetButtonTexture(i.."OffHand1", stanceSet[2]); StanceSet_FindAndSetButtonTexture(i.."MainHand2", stanceSet[3]); StanceSet_FindAndSetButtonTexture(i.."OffHand2", stanceSet[4]); StanceSet_FindAndSetButtonTexture(i.."MainHand3", stanceSet[5]); StanceSet_FindAndSetButtonTexture(i.."OffHand3", stanceSet[6]); else StanceSet_SetButtonTextureAndName(i.."MainHand1", nil, nil); StanceSet_SetButtonTextureAndName(i.."OffHand1", nil, nil); StanceSet_SetButtonTextureAndName(i.."MainHand2", nil, nil); StanceSet_SetButtonTextureAndName(i.."OffHand2", nil, nil); StanceSet_SetButtonTextureAndName(i.."MainHand3", nil, nil); StanceSet_SetButtonTextureAndName(i.."OffHand3", nil, nil); end else frameStance:Hide(); end end -- if frame found end -- for i 1,MAX end function StanceSets_GetCurrentStanceSet() if not StanceSets then return end local currentForm = StanceSets_GetCurrentForm(); local playerName = UnitName("player"); if not playerName then return; end -- player name might not be defined if not logged yet local setName = playerName.."_"..currentForm; return StanceSets[setName], setName; end function StanceSets_Next() local playerFormSet = StanceSets_GetCurrentStanceSet(); if playerFormSet then for i = 1,6 do if not playerFormSet[i] and playerFormSet[i+1] then playerFormSet[i] = ""; end end return WeaponSwap(unpack(playerFormSet)); end end function StanceSets_FormChanged() local playerFormSet, setName = StanceSets_GetCurrentStanceSet(); if playerFormSet then if StanceSets[setName.."_ForceFirst"] then -- must have at least one thing to do a swap if playerFormSet[1] or playerFormSet[2] then return WeaponSwap(playerFormSet[1], playerFormSet[2]); end elseif table.getn(playerFormSet) > 0 then -- If not forcing a set, only swap if we don't already a known set currently engaged local matchingsetidx = WeaponQuickSwap_FindCurrentSetIndex(16, 17, 1, playerFormSet); if not matchingsetidx then return WeaponSwap(unpack(playerFormSet)); end end end end function StanceSets_GetCurrentForm() for i=1,GetNumShapeshiftForms(),1 do local _, name, isActive = GetShapeshiftFormInfo(i); if isActive then return name; end end return "Default"; end function StanceSets_GetAllForms() local retVal = { }; table.insert(retVal, "Default"); for i=1,GetNumShapeshiftForms() do local _, name = GetShapeshiftFormInfo(i); table.insert(retVal, name); end return retVal; end function StanceSetSlot_OnEnter() if this.itemName and this.itemName ~= "" then GameTooltip:SetOwner(this, "ANCHOR_RIGHT"); local bag,slot = WeaponQuickSwap_FindItem(this.itemName); if bag and slot then if bag == -1 then GameTooltip:SetInventoryItem("player", slot); else GameTooltip:SetBagItem(bag,slot); end else GameTooltip:SetText(this.itemName, 1.0, 1.0, 1.0); end GameTooltip:Show(); end end function StanceSetSlot_IDToSlotID(id) if id == 1 or id == 3 or id == 5 then return 16; else return 17; end end function StanceSetSlot_OnDragStart() local frmParent = this:GetParent(); local playerName = UnitName("player"); local setName = playerName.."_"..frmParent.StanceName; local stanceSet = StanceSets[setName]; if stanceSet then stanceSet[this:GetID()] = nil; ResetCursor(); StanceSets_UpdateAllStances(); end end function StanceSetSlot_TakeItemOffCursor(srcBag, srcSlot) if srcBag == -1 then PickupInventoryItem(srcSlot); else PickupContainerItem(srcBag, srcSlot); end end function StanceSetSlot_OnReceiveDrag() StanceSetSlot_OnClick("LeftButton"); end function StanceSetSlot_OnClick(arg1) local slotID = StanceSetSlot_IDToSlotID(this:GetID()); arg1 = arg1 or ""; if arg1 == "LeftButton" then if CursorHasItem() and StanceSets_PickedupItem then local itemName = WeaponQuickSwap_GetItemName(StanceSets_PickedupItem.bag, StanceSets_PickedupItem.slot); if CursorCanGoInSlot(slotID) then local frmParent = this:GetParent(); local playerName = UnitName("player"); local setName = playerName.."_"..frmParent.StanceName; local stanceSet = StanceSets[setName]; if not stanceSet then stanceSet = {}; end stanceSet[this:GetID()] = itemName; StanceSets[setName] = stanceSet; StanceSets_UpdateAllStances(); else Print(itemName.." can not go in that slot!"); end ResetCursor(); StanceSetSlot_TakeItemOffCursor(StanceSets_PickedupItem.bag,StanceSets_PickedupItem.slot); end -- if has item and we know where it came from StanceSets_PickedupItem = nil; end -- if left button end local StanceSets_Save_PickupContainerItem = PickupContainerItem; PickupContainerItem = function (bag,slot) StanceSets_PickedupItem = { }; StanceSets_PickedupItem.bag = bag; StanceSets_PickedupItem.slot = slot; return StanceSets_Save_PickupContainerItem(bag,slot); end local StanceSets_Save_PickupInventoryItem = PickupInventoryItem; PickupInventoryItem = function (slot) StanceSets_PickedupItem = { }; StanceSets_PickedupItem.bag = -1; StanceSets_PickedupItem.slot = slot; return StanceSets_Save_PickupInventoryItem(slot); end function StanceSetsForceCheck_OnClick() local frmParent = this:GetParent(); local playerName = UnitName("player"); local setName = playerName.."_"..frmParent.StanceName.."_ForceFirst"; if not StanceSets then StanceSets = { }; end if (this:GetChecked()) then StanceSets[setName] = true; PlaySound("igMainMenuOptionCheckBoxOff"); else StanceSets[setName] = nil; PlaySound("igMainMenuOptionCheckBoxOn"); end end function DebugReport(msg, color, bSecondChatWindow) local r = 0.50; local g = 0.50; local b = 1.00; if (color) then r = color.r; g = color.g; b = color.b; end local frame = DEFAULT_CHAT_FRAME; if (bSecondChatWindow) then frame = ChatFrame2; end if (frame) then frame:AddMessage(msg,r,g,b); end end