-- ================================================================================ -- -- EMA - ( Ebony's MultiBoxing Assistant ) -- -- Current Author: Jennifer Cally (Ebony) -- -- -- -- License: All Rights Reserved 2018-2019 Jennifer Cally -- -- -- -- Some Code Used from "Jamba" that is -- -- Released under the MIT License -- -- "Jamba" Copyright 2008-2015 Michael "Jafula" Miller -- -- -- -- ================================================================================ -- -- Create the addon using AceAddon-3.0 and embed some libraries. local EMA = LibStub( "AceAddon-3.0" ):NewAddon( "ItemUse", "Module-1.0", "AceConsole-3.0", "AceEvent-3.0", "AceHook-3.0", "AceTimer-3.0" ) -- Get the EMA Utilities Library. local EMAUtilities = LibStub:GetLibrary( "EbonyUtilities-1.0" ) local EMAHelperSettings = LibStub:GetLibrary( "EMAHelperSettings-1.0" ) local LibActionButton = LibStub( "EMALibActionButton-1.0" ) local LibBagUtils = LibStub:GetLibrary( "LibBagUtils-1.0" ) EMA.SharedMedia = LibStub( "LibSharedMedia-3.0" ) -- Constants and Locale for this module. EMA.moduleName = "ItemUse" EMA.settingsDatabaseName = "ItemUseProfileDB" EMA.chatCommand = "ema-itemuse" local L = LibStub( "AceLocale-3.0" ):GetLocale( "Core" ) EMA.parentDisplayName = L["DISPLAY"] EMA.moduleDisplayName = L["ITEM_USE"] -- Icon EMA.moduleIcon = "Interface\\Addons\\EMA\\Media\\ItemUseIcon.tga" -- order EMA.moduleOrder = 1 -- EMA key bindings. BINDING_HEADER_EMAITEMUSE = L["ITEM-USE"] BINDING_NAME_ITEMUSE1 = L["ITEM"]..L[" "]..L["1"] BINDING_NAME_ITEMUSE2 = L["ITEM"]..L[" "]..L["2"] BINDING_NAME_ITEMUSE3 = L["ITEM"]..L[" "]..L["3"] BINDING_NAME_ITEMUSE4 = L["ITEM"]..L[" "]..L["4"] BINDING_NAME_ITEMUSE5 = L["ITEM"]..L[" "]..L["5"] BINDING_NAME_ITEMUSE6 = L["ITEM"]..L[" "]..L["6"] BINDING_NAME_ITEMUSE7 = L["ITEM"]..L[" "]..L["7"] BINDING_NAME_ITEMUSE8 = L["ITEM"]..L[" "]..L["8"] BINDING_NAME_ITEMUSE9 = L["ITEM"]..L[" "]..L["9"] BINDING_NAME_ITEMUSE10 = L["ITEM"]..L[" "]..L["10"] BINDING_NAME_ITEMUSE11 = L["ITEM"]..L[" "]..L["11"] BINDING_NAME_ITEMUSE12 = L["ITEM"]..L[" "]..L["12"] BINDING_NAME_ITEMUSE13 = L["ITEM"]..L[" "]..L["13"] BINDING_NAME_ITEMUSE14 = L["ITEM"]..L[" "]..L["14"] BINDING_NAME_ITEMUSE15 = L["ITEM"]..L[" "]..L["15"] BINDING_NAME_ITEMUSE16 = L["ITEM"]..L[" "]..L["16"] BINDING_NAME_ITEMUSE17 = L["ITEM"]..L[" "]..L["17"] BINDING_NAME_ITEMUSE18 = L["ITEM"]..L[" "]..L["18"] BINDING_NAME_ITEMUSE19 = L["ITEM"]..L[" "]..L["19"] BINDING_NAME_ITEMUSE20 = L["ITEM"]..L[" "]..L["20"] -- Settings - the values to store and their defaults for the settings database. EMA.settings = { profile = { showItemUse = true, --showItemUseOnMasterOnly = false, --hideItemUseInCombat = false, showItemCount = true, borderStyle = L["BLIZZARD_TOOLTIP"], backgroundStyle = L["BLIZZARD_DIALOG_BACKGROUND"], itemUseScale = 1, itemUseTitleHeight = 3, itemUseVerticalSpacing = 3, itemUseHorizontalSpacing = 2, autoAddQuestItemsToBar = false, -- autoAddArtifactItemsToBar = false, -- autoAddSatchelsItemsToBar = false, hideClearButton = false, itemBarsSynchronized = true, numberOfItems = 10, numberOfRows = 2, messageArea = EMAApi.DefaultWarningArea(), itemsAdvanced = {}, itemsSoted = {}, framePoint = "BOTTOMRIGHT", frameRelativePoint = "BOTTOMRIGHT", frameXOffset = 0, frameYOffset = 70, frameAlpha = 1.0, frameBackgroundColourR = 1.0, frameBackgroundColourG = 1.0, frameBackgroundColourB = 1.0, frameBackgroundColourA = 1.0, frameBorderColourR = 1.0, frameBorderColourG = 1.0, frameBorderColourB = 1.0, frameBorderColourA = 1.0, }, } -- Configuration. function EMA:GetConfiguration() local configuration = { name = EMA.moduleDisplayName, handler = EMA, type = 'group', args = { config = { type = "input", name = L["OPEN_CONFIG"], desc = L["OPEN_CONFIG_HELP"], usage = "/ema-itemuse config", get = false, set = "", }, push = { type = "input", name = L["PUSH_SETTINGS"], desc = L["PUSH_SETTINGS_INFO"], usage = "/ema-itemuse push", get = false, set = "EMASendSettings", }, hide = { type = "input", name = L["HIDE_ITEM_BAR"], desc = L["HIDE_ITEM_BAR_HELP"], usage = "/ema-itemuse hide", get = false, set = "HideItemUseCommand", }, show = { type = "input", name = L["SHOW_ITEM_BAR"], desc = L["SHOW_ITEM_BAR_HELP"], usage = "/ema-itemuse show", get = false, set = "ShowItemUseCommand", }, clear = { type = "input", name = L["CLEAR_ITEM_BAR"], desc = L["CLEAR_ITEM_BAR_HELP"], usage = "/ema-itemuse clear", get = false, set = "ClearItemUseCommand", }, }, } return configuration end local function DebugMessage( ... ) --EMA:Print( ... ) end ------------------------------------------------------------------------------------------------------------- -- Command this module sends. ------------------------------------------------------------------------------------------------------------- EMA.COMMAND_ITEMBAR_BUTTON = "EMACommandItemBarButton" EMA.COMMAND_ITEMUSE_SYNC = "EMACommandItemBarSync" EMA.COMMAND_ITEM_COUNT = "EMACommandItemBarCount" ------------------------------------------------------------------------------------------------------------- -- Messages module sends. ------------------------------------------------------------------------------------------------------------- ------------------------------------------------------------------------------------------------------------- -- Variables used by module. ------------------------------------------------------------------------------------------------------------- EMA.globalFramePrefix = "EMAItemUse" EMA.itemContainer = {} EMA.itemUseCreated = false EMA.itemSize = 40 EMA.refreshItemUseControlsPending = false EMA.refreshUpdateItemsInBarPending = false EMA.refreshUpdateBindingsPending = false EMA.updateSettingsAfterCombat = false EMA.maximumNumberOfItems = 20 EMA.maximumNumberOfRows = 20 ------------------------------------------------------------------------------------------------------------- -- Item Bar. ------------------------------------------------------------------------------------------------------------- local function CanDisplayItemUse() local canShow = false if EMA.db.showItemUse == true then --if EMA.db.showItemUseOnMasterOnly == true then -- if EMAApi.IsCharacterTheMaster( EMA.characterName ) == true then -- canShow = true -- end --else canShow = true --end end return canShow end local function CreateEMAItemUseFrame() -- The frame. EMAItemUseWindowFrame local frame = CreateFrame("Frame", "EMAItemUseWindowFrame", UIParent, "SecureHandlerStateTemplate")Mixin(frame, BackdropTemplateMixin or {}) frame:SetAttribute("_onstate-page", [[ self:SetAttribute("state", newstate) control:ChildUpdate("state", newstate) ]]) RegisterStateDriver(frame, "page", "[mod:alt]0;0") frame.parentObject = EMA frame:SetFrameStrata( "LOW" ) frame:SetToplevel( true ) frame:SetClampedToScreen( true ) frame:EnableMouse( true ) frame:SetMovable( true ) frame:RegisterForDrag( "LeftButton" ) frame:SetScript( "OnDragStart", --function( this ) function( self,button ) if IsAltKeyDown() then self:StartMoving() end end ) frame:SetScript( "OnDragStop", --function( this ) function(self,button) self:StopMovingOrSizing() local point, relativeTo, relativePoint, xOffset, yOffset = self:GetPoint() EMA.db.framePoint = point EMA.db.frameRelativePoint = relativePoint EMA.db.frameXOffset = xOffset EMA.db.frameYOffset = yOffset end ) frame:SetBackdrop( { bgFile = "Interface\\DialogFrame\\UI-DialogBox-Background", edgeFile = "Interface\\Tooltips\\UI-Tooltip-Border", tile = true, tileSize = 10, edgeSize = 10, insets = { left = 3, right = 3, top = 3, bottom = 3 } } ) frame:ClearAllPoints() frame:SetPoint( EMA.db.framePoint, nil, EMA.db.frameRelativePoint, EMA.db.frameXOffset, EMA.db.frameYOffset ) -- Clear Button local updateButton = CreateFrame( "Button", "ButtonUpdate", frame, "UIPanelButtonTemplate" ) updateButton:SetScript( "OnClick", function() EMA.ClearButton() end ) updateButton:SetPoint( "TOPRIGHT", frame, "TOPRIGHT", -4, -3 ) updateButton:SetHeight( 20 ) updateButton:SetWidth( 65 ) updateButton:SetText( L["CLEAR_BUTT"] ) updateButton:SetScript("OnEnter", function(self) EMA:ShowTooltip(updateButton, "clear", true) end) updateButton:SetScript("OnLeave", function(self) GameTooltip:Hide() end) ClearUpdateButton = updateButton -- Sync Button local syncButton = CreateFrame( "Button", "ButtonSync", frame, "UIPanelButtonTemplate" ) syncButton:SetScript( "OnClick", function() EMA.SyncButton() end ) syncButton:SetPoint( "TOPRIGHT", frame, "TOPRIGHT", -71, -3 ) syncButton:SetHeight( 20 ) syncButton:SetWidth( 65 ) syncButton:SetText( L["SYNC_BUTT"] ) syncButton:SetScript("OnEnter", function(self) EMA:ShowTooltip(updateButton, "sync", true) end) syncButton:SetScript("OnLeave", function(self) GameTooltip:Hide() end) SyncUpdateButton = syncButton -- Set transparency of the the frame (and all its children). frame:SetAlpha(EMA.db.frameAlpha) -- Set the global frame reference for this frame. EMAItemUseFrame = frame -- Remove unsued items --test -- EMA:SettingsUpdateBorderStyle() EMA.itemUseCreated = true EMA.UpdateHeight() end function EMA:ShowTooltip(frame, info, show) if show then GameTooltip:SetOwner(frame, "ANCHOR_TOP") GameTooltip:SetPoint("TOPLEFT", frame, "TOPRIGHT", 16, 0) GameTooltip:ClearLines() if info == "clear" then GameTooltip:AddLine(L["TOOLTIP_NOLONGER_IN_BAGS"], 1, 0.82, 0, 1) elseif info == "sync" then GameTooltip:AddLine(L["TOOLTIP_SYNCHRONISE"], 1, 0.82, 0, 1) end GameTooltip:Show() else GameTooltip:Hide() end end function EMA:UpdateHeight() if EMA.db.hideClearButton == false then EMA.db.itemUseTitleHeight = 2 local newHeight = EMA.db.itemUseTitleHeight + 20 ClearUpdateButton:Show() SyncUpdateButton:Show() return newHeight else EMA.db.itemUseTitleHeight = 2 oldHeight = EMA.db.itemUseTitleHeight ClearUpdateButton:Hide() SyncUpdateButton:Hide() return oldHeight end end function EMA:ShowItemUseCommand() EMA.db.showItemUse = true EMA:SetItemUseVisibility() EMA:SettingsRefresh() end function EMA:HideItemUseCommand() EMA.db.showItemUse = false EMA:SetItemUseVisibility() EMA:SettingsRefresh() end function EMA:ClearItemUseCommand() EMAUtilities:ClearTable(EMA.db.itemsAdvanced) EMA:SettingsRefresh() EMA:Print(L["ITEM_BAR_CLEARED"]) end function EMA:SetItemUseVisibility() local frame = EMAItemUseFrame if CanDisplayItemUse() == true then frame:ClearAllPoints() frame:SetPoint( EMA.db.framePoint, UIParent, EMA.db.frameRelativePoint, EMA.db.frameXOffset, EMA.db.frameYOffset ) frame:SetAlpha( EMA.db.frameAlpha ) frame:Show() else frame:Hide() end end function EMA:SettingsUpdateBorderStyle() local borderStyle = EMA.SharedMedia:Fetch( "border", EMA.db.borderStyle ) local backgroundStyle = EMA.SharedMedia:Fetch( "background", EMA.db.backgroundStyle ) local frame = EMAItemUseFrame frame:SetBackdrop( { bgFile = backgroundStyle, edgeFile = borderStyle, tile = true, tileSize = frame:GetWidth(), edgeSize = 10, insets = { left = 3, right = 3, top = 3, bottom = 3 } } ) frame:SetBackdropColor( EMA.db.frameBackgroundColourR, EMA.db.frameBackgroundColourG, EMA.db.frameBackgroundColourB, EMA.db.frameBackgroundColourA ) frame:SetBackdropBorderColor( EMA.db.frameBorderColourR, EMA.db.frameBorderColourG, EMA.db.frameBorderColourB, EMA.db.frameBorderColourA ) end -- updates after the quest has been handed in, function EMA:UpdateQuestItemsInBar() local state = "0" for iterateItems = 1, EMA.maximumNumberOfItems, 1 do local itemContainer = EMA.itemContainer[iterateItems] if itemContainer == nil then EMA:CreateEMAItemUseItemContainer( iterateItems, parentFrame ) itemContainer = EMA.itemContainer[iterateItems] end local containerButton = itemContainer["container"] local itemInfo = EMA:GetItemFromItemDatabase( iterateItems ) local kind = itemInfo.kind local action = itemInfo.action if kind == "item" then --local itemLink,_,_,_,_,questItem = GetItemInfo( action ) --local text, text2 = EMAUtilities:TooltipScaner( action ) local _, _, _, _, _, _ , _, _, _, _, _, _, _, bindType = GetItemInfo( action ) local canUse = GetItemSpell( action ) --EMA:Print("Checking Item...", action, canUse, "a", bindType ) if ( canUse ) and ( bindType == 4 ) then local IsInInventory = EMA:IsInInventory( action ) if IsInInventory == false then --EMA:Print("NOT IN BAGS", IsInInventory, action) EMA.db.itemsAdvanced[iterateItems] = nil EMA:EMASendUpdate( iterateItems, "empty", nil ) end end end end end function EMA:UpdateItemsInBar() local state = "0" local parentFrame = EMAItemUseFrame for iterateItems = 1, EMA.maximumNumberOfItems, 1 do local itemContainer = EMA.itemContainer[iterateItems] if itemContainer == nil then EMA:CreateEMAItemUseItemContainer( iterateItems, parentFrame ) itemContainer = EMA.itemContainer[iterateItems] end local containerButton = itemContainer["container"] local itemInfo = EMA:GetItemFromItemDatabase( iterateItems ) local kind = itemInfo.kind local action = itemInfo.action if kind == "item" and not tonumber( action ) then action = action:sub(6) end --EMA:Print(state, kind, action) if kind == "mount" or kind == "battlepet" then containerButton:ClearStates() else containerButton:SetState(state, kind, action) end end end function EMA:AddItemToItemDatabase( itemNumber, kind, action ) if kind == "mount" or kind == "battlepet" then return end if EMA.db.itemsAdvanced[itemNumber] == nil then EMA.db.itemsAdvanced[itemNumber] = {} end EMA.db.itemsAdvanced[itemNumber].kind = kind EMA.db.itemsAdvanced[itemNumber].action = action end function EMA:GetItemFromItemDatabase( itemNumber ) if EMA.db.itemsAdvanced[itemNumber] == nil then EMA.db.itemsAdvanced[itemNumber] = {} EMA.db.itemsAdvanced[itemNumber].kind = "empty" EMA.db.itemsAdvanced[itemNumber].action = "empty" end return EMA.db.itemsAdvanced[itemNumber] end function EMA:OnButtonContentsChanged( event, button, state, type, value, ... ) if type == "mount" or type == "battlepet" then return end EMA:AddItemToItemDatabase( button.itemNumber, type, value ) EMA:EMASendUpdate(button.itemNumber, type, value ) EMA:SettingsRefresh() end function EMA:OnButtonUpdate( event, button, ... ) --EMA:Print( event, button, ...) end function EMA:OnButtonState( event, button, ... ) --EMA:Print( event, button, ...) end function EMA:OnButtonUsable( event, button, ... ) --EMA:Print( event, button, ...) end function EMA:CreateEMAItemUseItemContainer( itemNumber, parentFrame ) EMA.itemContainer[itemNumber] = {} local itemContainer = EMA.itemContainer[itemNumber] local containerButtonName = EMA.globalFramePrefix.."ContainerButton"..itemNumber local buttonConfig = { outOfRangeColoring = "button", tooltip = "enabled", showGrid = true, colors = { range = { 0.8, 0.1, 0.1 }, mana = { 0.5, 0.5, 1.0 } }, hideElements = { macro = false, hotkey = false, equipped = false, }, keyBoundTarget = false, clickOnDown = false, flyoutDirection = "UP", } local containerButton = LibActionButton:CreateButton( itemNumber, containerButtonName, EMAItemUseWindowFrame, buttonConfig ) containerButton:SetState( "0", "empty", nil) containerButton.itemNumber = itemNumber itemContainer["container"] = containerButton end --ebony test Using the wowapi and not the scanning of tooltips function EMA:CheckForQuestItemAndAddToBar() --for iterateQuests = 1, GetNumQuestLogEntries() do -- local questLogTitleText,_,_,isHeader, _, _, _, questID = GetQuestLogTitle(iterateQuests) local index = C_QuestLog.GetNumQuestLogEntries() for iterateQuests = 1, index do local info = C_QuestLog.GetInfo( iterateQuests ) if not info.isHeader then --EMA:Print("test", questItemLink, iterateQuests, questLogTitleText, questID ) local questItemLink, questItemIcon, questItemCharges = GetQuestLogSpecialItemInfo( iterateQuests ) if questItemLink ~= nil then local itemName = GetItemInfo(questItemLink) local questName, rank = GetItemSpell(questItemLink) -- Only means to detect if the item is usable if questName then --EMA:Print("addItem", questItemLink ) EMA:AddAnItemToTheBarIfNotExists( questItemLink, false) end end end end end -- Removes unused items. function EMA:ClearButton() local state = "0" for iterateItems = 1, EMA.db.numberOfItems, 1 do local itemContainer = EMA.itemContainer[iterateItems] if itemContainer == nil then EMA:CreateEMAItemUseItemContainer( iterateItems, parentFrame ) itemContainer = EMA.itemContainer[iterateItems] end local containerButton = itemContainer["container"] local itemInfo = EMA:GetItemFromItemDatabase( iterateItems ) local kind = itemInfo.kind local action = itemInfo.action if kind == "item" then local name, itemLink,_,_,_,itemType,questItem = GetItemInfo( action ) if itemLink and itemLink:match("item:%d") then local _ , tooltipTextTwo = EMAUtilities:TooltipScaner( itemLink ) if tooltipTextTwo == nil or tooltipTextTwo ~= "Unique" then if EMA:IsInInventory( action ) == false then EMA.db.itemsAdvanced[iterateItems] = nil EMA:EMASendUpdate( iterateItems, "empty", nil ) EMA:SettingsRefresh() end end end end end end -- Sync Buttion function EMA:SyncButton() local dataTable = {} for iterateItems = 1, EMA.db.numberOfItems, 1 do local itemContainer = EMA.itemContainer[iterateItems] if itemContainer == nil then EMA:CreateEMAItemUseItemContainer( iterateItems, parentFrame ) itemContainer = EMA.itemContainer[iterateItems] end local containerButton = itemContainer["container"] local itemInfo = EMA:GetItemFromItemDatabase( iterateItems ) local kind = itemInfo.kind local action = itemInfo.action data = {} data.button = iterateItems data.type = kind data.action = action table.insert( dataTable, data ) end EMA:EMASendCommandToTeam( EMA.COMMAND_ITEMUSE_SYNC, dataTable) if EMA.db.showItemCount == true then EMA:GetEMAItemCount() end end --[[ -- Add satchels to item bar. function EMA:CheckForSatchelsItemAndAddToBar() for bag = 0, NUM_BAG_SLOTS do for slot = 1, GetContainerNumSlots(bag) do local _, _, _, _, _, lootable = GetContainerItemInfo(bag, slot) if link then local tooltipText = EMAUtilities:TooltipScaner( link ) if lootable == true then if tooltipText ~= LOCKED then EMA:AddAnItemToTheBarIfNotExists( link, false ) end end end end end end -- NOWW VENDER TRASH 8.0 -- Adds artifact power items to item bar. function EMA:CheckForArtifactItemAndAddToBar() for bag = 0, NUM_BAG_SLOTS do for slot = 1, GetContainerNumSlots(bag) do local itemLink = GetContainerItemLink(bag, slot) if itemLink and itemLink:match("item:%d") then local tooltipText = EMAUtilities:TooltipScaner(itemLink) if tooltipText and tooltipText:match(ARTIFACT_POWER) then EMA:AddAnItemToTheBarIfNotExists( itemLink, false ) end end end end end ]] --Checks the item is in the Toon players bag 8.0.1 using min/min code! function EMA:IsInInventory(itemID) local InBags = false for bagID = 0, NUM_BAG_SLOTS do for slotID = 1,GetContainerNumSlots( bagID ),1 do --EMA:Print( "Bags OK. checking", itemLink ) local item = Item:CreateFromBagAndSlot(bagID, slotID) if ( item ) then local bagItemID = item:GetItemID() if ( bagItemID ) then local checkItemID = "item:"..bagItemID --EMA:Print("Check", checkItemID, "vs", itemID ) if checkItemID == itemID then --EMA:Print("We Have Item checkItemID in Bags" ) InBags = true break end end end end end return InBags end function EMA:AddAnItemToTheBarIfNotExists( itemLink, startsQuest) local itemInfo local barItemId local iterateItems local alreadyExists = false local itemId = EMAUtilities:GetItemIdFromItemLink( itemLink ) for iterateItems = 1, EMA.db.numberOfItems, 1 do local itemInfo = EMA:GetItemFromItemDatabase( iterateItems ) --EMA:Print("check", itemLink, itemInfo.action) if itemInfo.kind == "item" and itemInfo.action == itemId then alreadyExists = true -- EMA:Print("test", itemLink ) return end end if alreadyExists == false then --EMA:Print("test2", itemLink ) for iterateItems = 1, EMA.db.numberOfItems, 1 do itemInfo = EMA:GetItemFromItemDatabase( iterateItems ) --Checks the items we talking about is in the bags of the player. if itemInfo.kind == "empty" then EMA:AddItemToItemDatabase( iterateItems, "item", itemId ) EMA:EMASendUpdate( iterateItems, "item", itemId ) EMA:SettingsRefresh() -- TODO: to we need this? if startsQuest then EMA:EMASendMessageToTeam( EMA.db.messageArea, L["NEW_QUEST_ITEM"], false ) end return end end end end function EMA:RefreshItemUseControls() if InCombatLockdown() then EMA.refreshItemUseControlsPending = true return end local parentFrame = EMAItemUseFrame local positionLeft local positionTop local itemsPerRow = EMA.db.numberOfItems / EMA.db.numberOfRows local row local rowLeftModifier for iterateItems = 1, EMA.maximumNumberOfItems, 1 do local itemContainer = EMA.itemContainer[iterateItems] if itemContainer ~= nil then local containerButton = itemContainer["container"] containerButton:Hide() end end for iterateItems = 1, EMA.db.numberOfItems, 1 do local itemContainer = EMA.itemContainer[iterateItems] if itemContainer == nil then EMA:CreateEMAItemUseItemContainer( iterateItems, parentFrame ) itemContainer = EMA.itemContainer[iterateItems] end local containerButton = itemContainer["container"] row = math.floor((iterateItems - 1) / itemsPerRow) rowLeftModifier = math.floor((iterateItems-1) % itemsPerRow) positionLeft = 6 + (EMA.itemSize * rowLeftModifier) + (EMA.db.itemUseHorizontalSpacing * rowLeftModifier) local getHeight = EMA.UpdateHeight() positionTop = -getHeight - (EMA.db.itemUseVerticalSpacing * 2) - (row * EMA.itemSize) - (row * EMA.db.itemUseVerticalSpacing) containerButton:SetWidth( EMA.itemSize ) containerButton:SetHeight( EMA.itemSize ) containerButton:SetPoint( "TOPLEFT", parentFrame, "TOPLEFT", positionLeft, positionTop ) containerButton:Show() end EMA:UpdateEMAItemUseDimensions() end function EMA:UpdateEMAItemUseDimensions() local frame = EMAItemUseFrame local itemsPerRow = EMA.db.numberOfItems / EMA.db.numberOfRows frame:SetWidth( 5 + (EMA.db.itemUseHorizontalSpacing * (3 + itemsPerRow-1)) + (EMA.itemSize * itemsPerRow) ) local getHeight = EMA.UpdateHeight() frame:SetHeight( getHeight + (EMA.itemSize * EMA.db.numberOfRows) + (EMA.db.itemUseVerticalSpacing * EMA.db.numberOfRows) + (EMA.db.itemUseVerticalSpacing * 3)) frame:SetScale( EMA.db.itemUseScale ) end ------------------------------------------------------------------------------------------------------------- -- Communications ------------------------------------------------------------------------------------------------------------- function EMA:EMASendUpdate( button, type, action ) --EMA:Print("testDataDebug", button, type, action ) EMA:EMASendCommandToTeam( EMA.COMMAND_ITEMBAR_BUTTON, button, type, action ) end function EMA:ReceiveButtonData(characterName, button, type, action) --EMA:Print("ReceiveButtonDataDebug", button, type, action ) EMA:AddItemToItemDatabase( button, type, action ) EMA:SettingsRefresh() end function EMA:ReceiveSync(characterName, data) --EMA:Print("ReceiveSync", data) for id, data in pairs( data ) do --EMA:Print("ID", id, data.button, data.type, data.action ) EMA:AddItemToItemDatabase( data.button, data.type, data.action ) EMA:SettingsRefresh() end end ------------------------------------------------------------------------------------------------------------- -- Settings Dialogs. ------------------------------------------------------------------------------------------------------------- local function SettingsCreateOptions( top ) -- Get positions. local buttonHeight = EMAHelperSettings:GetButtonHeight() local checkBoxHeight = EMAHelperSettings:GetCheckBoxHeight() local editBoxHeight = EMAHelperSettings:GetEditBoxHeight() local dropdownHeight = EMAHelperSettings:GetDropdownHeight() local labelHeight = EMAHelperSettings:GetLabelHeight() local mediaHeight = EMAHelperSettings:GetMediaHeight() local sliderHeight = EMAHelperSettings:GetSliderHeight() local left = EMAHelperSettings:LeftOfSettings() local headingHeight = EMAHelperSettings:HeadingHeight() local headingWidth = EMAHelperSettings:HeadingWidth( false ) local horizontalSpacing = EMAHelperSettings:GetHorizontalSpacing() local verticalSpacing = EMAHelperSettings:GetVerticalSpacing() local halfWidth = (headingWidth - horizontalSpacing) / 2 local thirdWidth = (headingWidth - (horizontalSpacing * 2)) / 3 local column2left = left + halfWidth local left2 = left + thirdWidth local left3 = left + (thirdWidth * 2) local movingTop = top -- A blank to get layout to show right? EMAHelperSettings:CreateHeading( EMA.settingsControl, L[""], movingTop, false ) movingTop = movingTop - headingHeight EMAHelperSettings:CreateHeading( EMA.settingsControl, L["ITEM_USE_OPTIONS"], movingTop, false ) movingTop = movingTop - headingHeight EMA.settingsControl.displayOptionsCheckBoxShowItemUse = EMAHelperSettings:CreateCheckBox( EMA.settingsControl, headingWidth, left, movingTop, L["SHOW_ITEM_BAR"], EMA.SettingsToggleShowItemUse, L["SHOW_ITEM_BAR_HELP"] ) --[[ movingTop = movingTop - checkBoxHeight - verticalSpacing EMA.settingsControl.displayOptionsCheckBoxShowItemUseOnlyOnMaster = EMAHelperSettings:CreateCheckBox( EMA.settingsControl, headingWidth, left, movingTop, L["ONLY_ON_MASTER"], EMA.SettingsToggleShowItemUseOnlyOnMaster, L["ONLY_ON_MASTER_HELP"] ) ]] movingTop = movingTop - checkBoxHeight - verticalSpacing EMA.settingsControl.displayOptionsCheckBoxShowItemCount = EMAHelperSettings:CreateCheckBox( EMA.settingsControl, headingWidth, left, movingTop, L["SHOW_ITEM_COUNT"], EMA.SettingsToggleShowItemCount, L["SHOW_ITEM_COUNT_HELP"] ) movingTop = movingTop - checkBoxHeight - verticalSpacing EMA.settingsControl.displayOptionsCheckBoxItemBarsSynchronized = EMAHelperSettings:CreateCheckBox( EMA.settingsControl, headingWidth, left, movingTop, L["KEEP_BARS_SYNCHRONIZED"], EMA.SettingsToggleItemBarsSynchronized, L["KEEP_BARS_SYNCHRONIZED_HELP"] ) movingTop = movingTop - checkBoxHeight - verticalSpacing EMA.settingsControl.displayOptionsCheckBoxAutoAddQuestItem = EMAHelperSettings:CreateCheckBox( EMA.settingsControl, headingWidth, left, movingTop, L["ADD_QUEST_ITEMS_TO_BAR"], EMA.SettingsToggleAutoAddQuestItem, L["ADD_QUEST_ITEMS_TO_BAR_HELP"] ) --[[ movingTop = movingTop - checkBoxHeight - verticalSpacing EMA.settingsControl.displayOptionsCheckBoxAutoAddArtifactItem = EMAHelperSettings:CreateCheckBox( EMA.settingsControl, headingWidth, left, movingTop, L["ADD_ARTIFACT_ITEMS"], EMA.SettingsToggleAutoAddArtifactItem, L["ADD_ARTIFACT_ITEMS_HELP"] ) movingTop = movingTop - checkBoxHeight - verticalSpacing EMA.settingsControl.displayOptionsCheckBoxAutoAddSatchelsItem = EMAHelperSettings:CreateCheckBox( EMA.settingsControl, headingWidth, left, movingTop, L["ADD_SATCHEL_ITEMS"], EMA.SettingsToggleAutoAddSatchelsItem, L["ADD_SATCHEL_ITEMS_HELP"] ) ]] movingTop = movingTop - checkBoxHeight - verticalSpacing EMA.settingsControl.displayOptionsCheckBoxHideClearButton = EMAHelperSettings:CreateCheckBox( EMA.settingsControl, headingWidth, left, movingTop, L["HIDE_BUTTONS"], EMA.SettingsToggleHideClearButton, L["HIDE_BUTTONS_HELP"] ) movingTop = movingTop - checkBoxHeight - verticalSpacing --[[ EMA.settingsControl.displayOptionsCheckBoxHideItemUseInCombat = EMAHelperSettings:CreateCheckBox( EMA.settingsControl, headingWidth, left, movingTop, L["HIDE_IN_COMBAT"], EMA.SettingsToggleHideItemUseInCombat, L["HIDE_IN_COMBAT_HELP_IU"] ) movingTop = movingTop - checkBoxHeight - verticalSpacing ]] EMA.settingsControl.displayOptionsItemUseNumberOfItems = EMAHelperSettings:CreateSlider( EMA.settingsControl, headingWidth, left, movingTop, L["NUMBER_OF_ITEMS"] ) EMA.settingsControl.displayOptionsItemUseNumberOfItems:SetSliderValues( 1, EMA.maximumNumberOfItems, 1 ) EMA.settingsControl.displayOptionsItemUseNumberOfItems:SetCallback( "OnValueChanged", EMA.SettingsChangeNumberOfItems ) movingTop = movingTop - sliderHeight - verticalSpacing EMA.settingsControl.displayOptionsItemUseNumberOfRows = EMAHelperSettings:CreateSlider( EMA.settingsControl, headingWidth, left, movingTop, L["NUMBER_OF_ROWS"] ) EMA.settingsControl.displayOptionsItemUseNumberOfRows:SetSliderValues( 1, EMA.maximumNumberOfRows, 1 ) EMA.settingsControl.displayOptionsItemUseNumberOfRows:SetCallback( "OnValueChanged", EMA.SettingsChangeNumberOfRows ) movingTop = movingTop - sliderHeight - verticalSpacing EMAHelperSettings:CreateHeading( EMA.settingsControl, L["APPEARANCE_LAYOUT_HEALDER"], movingTop, false ) movingTop = movingTop - headingHeight EMA.settingsControl.displayOptionsItemUseScaleSlider = EMAHelperSettings:CreateSlider( EMA.settingsControl, headingWidth, left, movingTop, L["SCALE"] ) EMA.settingsControl.displayOptionsItemUseScaleSlider:SetSliderValues( 0.5, 2, 0.01 ) EMA.settingsControl.displayOptionsItemUseScaleSlider:SetCallback( "OnValueChanged", EMA.SettingsChangeScale ) movingTop = movingTop - sliderHeight - verticalSpacing EMA.settingsControl.displayOptionsItemUseTransparencySlider = EMAHelperSettings:CreateSlider( EMA.settingsControl, headingWidth, left, movingTop, L["TRANSPARENCY"] ) EMA.settingsControl.displayOptionsItemUseTransparencySlider:SetSliderValues( 0, 1, 0.01 ) EMA.settingsControl.displayOptionsItemUseTransparencySlider:SetCallback( "OnValueChanged", EMA.SettingsChangeTransparency ) movingTop = movingTop - sliderHeight - verticalSpacing EMA.settingsControl.displayOptionsItemUseMediaBorder = EMAHelperSettings:CreateMediaBorder( EMA.settingsControl, halfWidth, left, movingTop, L["BORDER_STYLE"] ) EMA.settingsControl.displayOptionsItemUseMediaBorder:SetCallback( "OnValueChanged", EMA.SettingsChangeBorderStyle ) EMA.settingsControl.displayOptionsBorderColourPicker = EMAHelperSettings:CreateColourPicker( EMA.settingsControl, halfWidth, column2left + 15, movingTop - 15, L["BORDER COLOUR"] ) EMA.settingsControl.displayOptionsBorderColourPicker:SetHasAlpha( true ) EMA.settingsControl.displayOptionsBorderColourPicker:SetCallback( "OnValueConfirmed", EMA.SettingsBorderColourPickerChanged ) movingTop = movingTop - mediaHeight - verticalSpacing EMA.settingsControl.displayOptionsItemUseMediaBackground = EMAHelperSettings:CreateMediaBackground( EMA.settingsControl, halfWidth, left, movingTop, L["BACKGROUND"] ) EMA.settingsControl.displayOptionsItemUseMediaBackground:SetCallback( "OnValueChanged", EMA.SettingsChangeBackgroundStyle ) EMA.settingsControl.displayOptionsBackgroundColourPicker = EMAHelperSettings:CreateColourPicker( EMA.settingsControl, halfWidth, column2left + 15, movingTop - 15, L["BG_COLOUR"] ) EMA.settingsControl.displayOptionsBackgroundColourPicker:SetHasAlpha( true ) EMA.settingsControl.displayOptionsBackgroundColourPicker:SetCallback( "OnValueConfirmed", EMA.SettingsBackgroundColourPickerChanged ) movingTop = movingTop - mediaHeight - verticalSpacing EMAHelperSettings:CreateHeading( EMA.settingsControl, L["MESSAGES_HEADER"], movingTop, false ) movingTop = movingTop - headingHeight EMA.settingsControl.dropdownMessageArea = EMAHelperSettings:CreateDropdown( EMA.settingsControl, headingWidth, left, movingTop, L["MESSAGE_AREA"] ) EMA.settingsControl.dropdownMessageArea:SetList( EMAApi.MessageAreaList() ) EMA.settingsControl.dropdownMessageArea:SetCallback( "OnValueChanged", EMA.SettingsSetMessageArea ) movingTop = movingTop - dropdownHeight - verticalSpacing EMAHelperSettings:CreateHeading( EMA.settingsControl, L["CLEAR_ITEM_BAR"], movingTop, false ) movingTop = movingTop - headingHeight EMA.settingsControl.buttonClearItemBar = EMAHelperSettings:CreateButton( EMA.settingsControl, headingWidth, left, movingTop, L["CLEAR_ITEM_BAR"], EMA.ClearItemUseCommand, L["CLEAR_ITEM_BAR_HELP"] ) movingTop = movingTop - buttonHeight - verticalSpacing return movingTop end function EMA:OnMessageAreasChanged( message ) EMA.settingsControl.dropdownMessageArea:SetList( EMAApi.MessageAreaList() ) end local function SettingsCreate() EMA.settingsControl = {} EMAHelperSettings:CreateSettings( EMA.settingsControl, EMA.moduleDisplayName, EMA.parentDisplayName, EMA.SettingsPushSettingsClick, EMA.moduleIcon, EMA.moduleOrder ) local bottomOfOptions = SettingsCreateOptions( EMAHelperSettings:TopOfSettings() ) EMA.settingsControl.widgetSettings.content:SetHeight( -bottomOfOptions ) -- Help local helpTable = {} EMAHelperSettings:CreateHelp( EMA.settingsControl, helpTable, EMA:GetConfiguration() ) end ------------------------------------------------------------------------------------------------------------- -- Settings Populate. ------------------------------------------------------------------------------------------------------------- function EMA:BeforeEMAProfileChanged() end function EMA:OnEMAProfileChanged() EMA:SettingsRefresh() end function EMA:SettingsRefresh() -- Values. EMA.settingsControl.displayOptionsCheckBoxShowItemUse:SetValue( EMA.db.showItemUse ) --EMA.settingsControl.displayOptionsCheckBoxShowItemUseOnlyOnMaster:SetValue( EMA.db.showItemUseOnMasterOnly ) --EMA.settingsControl.displayOptionsCheckBoxHideItemUseInCombat:SetValue( EMA.db.hideItemUseInCombat ) EMA.settingsControl.displayOptionsCheckBoxShowItemCount:SetValue( EMA.db.showItemCount ) EMA.settingsControl.displayOptionsItemUseNumberOfItems:SetValue( EMA.db.numberOfItems ) EMA.settingsControl.displayOptionsItemUseNumberOfRows:SetValue( EMA.db.numberOfRows ) EMA.settingsControl.displayOptionsCheckBoxAutoAddQuestItem:SetValue( EMA.db.autoAddQuestItemsToBar ) --EMA.settingsControl.displayOptionsCheckBoxAutoAddArtifactItem:SetValue( EMA.db.autoAddArtifactItemsToBar ) --EMA.settingsControl.displayOptionsCheckBoxAutoAddSatchelsItem:SetValue( EMA.db.autoAddSatchelsItemsToBar ) EMA.settingsControl.displayOptionsCheckBoxHideClearButton:SetValue( EMA.db.hideClearButton ) EMA.settingsControl.displayOptionsCheckBoxItemBarsSynchronized:SetValue( EMA.db.itemBarsSynchronized ) EMA.settingsControl.displayOptionsItemUseScaleSlider:SetValue( EMA.db.itemUseScale ) EMA.settingsControl.displayOptionsItemUseTransparencySlider:SetValue( EMA.db.frameAlpha ) EMA.settingsControl.displayOptionsItemUseMediaBorder:SetValue( EMA.db.borderStyle ) EMA.settingsControl.displayOptionsItemUseMediaBackground:SetValue( EMA.db.backgroundStyle ) EMA.settingsControl.dropdownMessageArea:SetValue( EMA.db.messageArea ) EMA.settingsControl.displayOptionsBackgroundColourPicker:SetColor( EMA.db.frameBackgroundColourR, EMA.db.frameBackgroundColourG, EMA.db.frameBackgroundColourB, EMA.db.frameBackgroundColourA ) EMA.settingsControl.displayOptionsBorderColourPicker:SetColor( EMA.db.frameBorderColourR, EMA.db.frameBorderColourG, EMA.db.frameBorderColourB, EMA.db.frameBorderColourA ) -- State. -- Trying to change state in combat lockdown causes taint. Let's not do that. Eventually it would be nice to have a "proper state driven item list", -- but this workaround is enough for now. if not InCombatLockdown() then --EMA.settingsControl.displayOptionsCheckBoxShowItemUseOnlyOnMaster:SetDisabled( not EMA.db.showItemUse ) --EMA.settingsControl.displayOptionsCheckBoxHideItemUseInCombat:SetDisabled( not EMA.db.showItemUse ) EMA.settingsControl.displayOptionsCheckBoxShowItemCount:SetDisabled( not EMA.db.showItemUse ) EMA.settingsControl.displayOptionsItemUseNumberOfItems:SetDisabled( not EMA.db.showItemUse ) EMA.settingsControl.displayOptionsItemUseNumberOfRows:SetDisabled( not EMA.db.showItemUse ) EMA.settingsControl.displayOptionsCheckBoxAutoAddQuestItem:SetDisabled( not EMA.db.showItemUse ) --EMA.settingsControl.displayOptionsCheckBoxAutoAddArtifactItem:SetDisabled( not EMA.db.showItemUse ) --EMA.settingsControl.displayOptionsCheckBoxAutoAddSatchelsItem:SetDisabled( not EMA.db.showItemUse ) EMA.settingsControl.displayOptionsCheckBoxHideClearButton:SetDisabled( not EMA.db.showItemUse ) EMA.settingsControl.displayOptionsCheckBoxItemBarsSynchronized:SetDisabled( not EMA.db.showItemUse ) EMA.settingsControl.displayOptionsItemUseScaleSlider:SetDisabled( not EMA.db.showItemUse ) EMA.settingsControl.displayOptionsItemUseTransparencySlider:SetDisabled( not EMA.db.showItemUse ) EMA.settingsControl.displayOptionsItemUseMediaBorder:SetDisabled( not EMA.db.showItemUse ) EMA.settingsControl.displayOptionsItemUseMediaBackground:SetDisabled( not EMA.db.showItemUse ) EMA.settingsControl.dropdownMessageArea:SetDisabled( not EMA.db.showItemUse ) EMA.settingsControl.displayOptionsBackgroundColourPicker:SetDisabled( not EMA.db.showItemUse ) EMA.settingsControl.displayOptionsBorderColourPicker:SetDisabled( not EMA.db.showItemUse ) if EMA.itemUseCreated == true then EMA:RefreshItemUseControls() -- EMA:SettingsUpdateBorderStyle() EMA:SetItemUseVisibility() EMA:UpdateItemsInBar() EMA:UpdateHeight() end else EMA.updateSettingsAfterCombat = true end end function EMA:SettingsPushSettingsClick( event ) EMA:EMASendSettings() end function EMA:SettingsToggleShowItemUse( event, checked ) EMA.db.showItemUse = checked EMA:SettingsRefresh() end function EMA:SettingsToggleHideItemUseInCombat( event, checked ) EMA.db.hideItemUseInCombat = checked EMA:SettingsRefresh() end function EMA:SettingsToggleShowItemCount( event, checked ) EMA.db.showItemCount = checked EMA:SettingsRefresh() end function EMA:SettingsToggleShowItemUseOnlyOnMaster( event, checked ) EMA.db.showItemUseOnMasterOnly = checked EMA:SettingsRefresh() end function EMA:SettingsToggleAutoAddQuestItem( event, checked ) EMA.db.autoAddQuestItemsToBar = checked EMA:SettingsRefresh() end --[[ function EMA:SettingsToggleAutoAddArtifactItem( event, checked ) EMA.db.autoAddArtifactItemsToBar = checked EMA:SettingsRefresh() end function EMA:SettingsToggleAutoAddSatchelsItem( event, checked ) EMA.db.autoAddSatchelsItemsToBar = checked EMA:SettingsRefresh() end ]] function EMA:SettingsToggleHideClearButton(event, checked ) EMA.db.hideClearButton = checked EMA:SettingsRefresh() end function EMA:SettingsToggleItemBarsSynchronized( event, checked ) EMA.db.itemBarsSynchronized = checked EMA:SettingsRefresh() end function EMA:SettingsChangeNumberOfItems( event, value ) EMA.db.numberOfItems = tonumber( value ) EMA:SettingsRefresh() end function EMA:SettingsChangeNumberOfRows( event, value ) EMA.db.numberOfRows= tonumber( value ) EMA:SettingsRefresh() end function EMA:SettingsChangeScale( event, value ) EMA.db.itemUseScale = tonumber( value ) EMA:SettingsRefresh() end function EMA:SettingsChangeTransparency( event, value ) EMA.db.frameAlpha = tonumber( value ) EMA:SettingsRefresh() end function EMA:SettingsChangeBorderStyle( event, value ) EMA.db.borderStyle = value EMA:SettingsRefresh() end function EMA:SettingsChangeBackgroundStyle( event, value ) EMA.db.backgroundStyle = value EMA:SettingsRefresh() end function EMA:SettingsSetMessageArea( event, value ) EMA.db.messageArea = value EMA:SettingsRefresh() end function EMA:OnMasterChanged( message, characterName ) EMA:SettingsRefresh() end function EMA:SettingsBackgroundColourPickerChanged( event, r, g, b, a ) EMA.db.frameBackgroundColourR = r EMA.db.frameBackgroundColourG = g EMA.db.frameBackgroundColourB = b EMA.db.frameBackgroundColourA = a EMA:SettingsRefresh() end function EMA:SettingsBorderColourPickerChanged( event, r, g, b, a ) EMA.db.frameBorderColourR = r EMA.db.frameBorderColourG = g EMA.db.frameBorderColourB = b EMA.db.frameBorderColourA = a EMA:SettingsRefresh() end ------------------------------------------------------------------------------------------------------------- -- Addon initialization, enabling and disabling. ------------------------------------------------------------------------------------------------------------- -- Initialise the module. function EMA:OnInitialize() -- Create the settings control. SettingsCreate() -- Initialise the EMAModule part of this module. EMA:EMAModuleInitialize( EMA.settingsControl.widgetSettings.frame ) -- Populate the settings. EMA:SettingsRefresh() -- Create the item use frame. CreateEMAItemUseFrame() EMA:RefreshItemUseControls() -- EMA:SettingsUpdateBorderStyle() EMA:SetItemUseVisibility() EMA:UpdateItemsInBar() EMA.sharedInvData = {} end -- Called when the addon is enabled. function EMA:OnEnable() EMA:RegisterEvent( "PLAYER_REGEN_ENABLED" ) EMA:RegisterEvent( "PLAYER_REGEN_DISABLED" ) EMA:RegisterEvent( "BAG_UPDATE_DELAYED" ) --EMA:RegisterEvent( "ITEM_PUSH" ) -- Using Bag Update this seems to be running a little more then it did < 8.0.3 EMA:RegisterEvent( "PLAYER_ENTERING_WORLD" ) EMA:RegisterEvent( "UNIT_QUEST_LOG_CHANGED", "QUEST_UPDATE" ) EMA.SharedMedia.RegisterCallback( EMA, "LibSharedMedia_Registered" ) EMA.SharedMedia.RegisterCallback( EMA, "LibSharedMedia_SetGlobal" ) EMA:RegisterMessage( EMAApi.MESSAGE_TEAM_MASTER_CHANGED, "OnMasterChanged" ) EMA:RegisterMessage( EMAApi.MESSAGE_MESSAGE_AREAS_CHANGED, "OnMessageAreasChanged" ) EMA:RefreshItemUseControls() EMA:UpdateItemsInBar() EMA.keyBindingFrame = CreateFrame( "Frame", nil, UIParent ) EMA:RegisterEvent( "UPDATE_BINDINGS" ) EMA:UPDATE_BINDINGS() LibActionButton.RegisterCallback( EMA, "OnButtonContentsChanged", "OnButtonContentsChanged" ) LibActionButton.RegisterCallback( EMA, "OnButtonUpdate", "OnButtonUpdate" ) LibActionButton.RegisterCallback( EMA, "OnButtonState", "OnButtonState" ) LibActionButton.RegisterCallback( EMA, "OnButtonUsable", "OnButtonUsable" ) EMA:SecureHook( GameTooltip , "SetHyperlink", "AddTooltipInfo" ) end -- Called when the addon is disabled. function EMA:OnDisable() end -- Settings received. function EMA:EMAOnSettingsReceived( characterName, settings ) if characterName ~= EMA.characterName then -- Update the settings. EMA.db.showItemUse = settings.showItemUse --EMA.db.showItemUseOnMasterOnly = settings.showItemUseOnMasterOnly --EMA.db.hideItemUseInCombat = settings.hideItemUseInCombat EMA.db.showItemCount = settings.showItemCount EMA.db.borderStyle = settings.borderStyle EMA.db.backgroundStyle = settings.backgroundStyle EMA.db.itemUseScale = settings.itemUseScale EMA.db.itemUseTitleHeight = settings.itemUseTitleHeight EMA.db.itemUseVerticalSpacing = settings.itemUseVerticalSpacing EMA.db.itemUseHorizontalSpacing = settings.itemUseHorizontalSpacing EMA.db.autoAddQuestItemsToBar = settings.autoAddQuestItemsToBar --EMA.db.autoAddArtifactItemsToBar = settings.autoAddArtifactItemsToBar --EMA.db.autoAddSatchelsItemsToBar = settings.autoAddSatchelsItemsToBar EMA.db.hideClearButton = settings.hideClearButton EMA.db.itemBarsSynchronized = settings.itemBarsSynchronized EMA.db.numberOfItems = settings.numberOfItems EMA.db.numberOfRows = settings.numberOfRows EMA.db.messageArea = settings.messageArea if EMA.db.itemBarsSynchronized == true then EMA.db.itemsAdvanced = EMAUtilities:CopyTable( settings.itemsAdvanced ) end EMA.db.frameAlpha = settings.frameAlpha EMA.db.framePoint = settings.framePoint EMA.db.frameRelativePoint = settings.frameRelativePoint EMA.db.frameXOffset = settings.frameXOffset EMA.db.frameYOffset = settings.frameYOffset EMA.db.frameBackgroundColourR = settings.frameBackgroundColourR EMA.db.frameBackgroundColourG = settings.frameBackgroundColourG EMA.db.frameBackgroundColourB = settings.frameBackgroundColourB EMA.db.frameBackgroundColourA = settings.frameBackgroundColourA EMA.db.frameBorderColourR = settings.frameBorderColourR EMA.db.frameBorderColourG = settings.frameBorderColourG EMA.db.frameBorderColourB = settings.frameBorderColourB EMA.db.frameBorderColourA = settings.frameBorderColourA -- Refresh the settings. EMA:SettingsRefresh() -- Tell the player. EMA:Print( L["SETTINGS_RECEIVED_FROM_A"]( characterName ) ) end end function EMA:PLAYER_REGEN_ENABLED() if EMA.db.hideItemUseInCombat == true then EMA:SetItemUseVisibility() end if EMA.refreshItemUseControlsPending == true then EMA:RefreshItemUseControls() EMA.refreshItemUseControlsPending = false end if EMA.refreshUpdateItemsInBarPending == true then EMA:UpdateItemsInBar() EMA.refreshUpdateItemsInBarPending = false end if EMA.refreshUpdateBindingsPending == true then EMA:UPDATE_BINDINGS() EMA.refreshUpdateBindingsPending = false end if EMA.updateSettingsAfterCombat == true then EMA:SettingsRefresh() EMA.updateSettingsAfterCombat = false end end function EMA:PLAYER_REGEN_DISABLED() if EMA.db.hideItemUseInCombat == true then EMAItemUseFrame:Hide() end end function EMA:BAG_UPDATE_DELAYED() if EMA.db.showItemUse == false and not InCombatLockdown() then return end if EMA.db.autoAddQuestItemsToBar == true then EMA:CheckForQuestItemAndAddToBar() end if EMA.db.showItemCount == true then EMA:GetEMAItemCount() end --[[ if EMA.db.autoAddSatchelsItemsToBar == true then EMA:CheckForSatchelsItemAndAddToBar() end ]] end function EMA:QUEST_UPDATE() if not InCombatLockdown() then EMA:UpdateQuestItemsInBar() end end -- More then Likey to be removed! using bag scan function EMA:ITEM_PUSH() if EMA.db.showItemUse == false then return end if EMA.db.autoAddQuestItemsToBar == true then EMA:ScheduleTimer( "CheckForQuestItemAndAddToBar", 1 ) end --[[ if EMA.db.autoAddArtifactItemsToBar == true then EMA:ScheduleTimer( "CheckForArtifactItemAndAddToBar", 1 ) end if EMA.db.autoAddSatchelsItemsToBar == true then EMA:ScheduleTimer( "CheckForSatchelsItemAndAddToBar", 1 ) end ]] end function EMA:PLAYER_ENTERING_WORLD( event, ... ) EMA:ScheduleTimer( "GetEMAItemCount", 0.5 ) end local function GetMaxItemCountFromItemID(itemID) if itemID == nil then return 0 end if EMA.sharedInvData == nil then return 0 end local count = 0 for itemName, data in pairs( EMA.sharedInvData ) do for id, itemData in pairs( data ) do if itemID == itemData.item then count = count + itemData.itemCount end end end return count end function EMA:AddTooltipInfo( toolTip, itemID ) if EMA.db.showItemUse == false or EMA.db.showItemCount == false then return end EMA:AddToTooltip( toolTip, itemID ) toolTip:Show() end function EMA:AddToTooltip(toolTip, itemID) local totalCount = 0 if itemID ~= nil then local count = GetMaxItemCountFromItemID(itemID) if count > 0 then toolTip:AddLine(" ") toolTip:AddDoubleLine(L["TEAM_BAGS"], L["BAG_BANK"], 1,0.82,0,1,0.82,0) for characterName, position in EMAApi.TeamList() do local count, bankCount = EMA:GetItemCountFromItemID( characterName, itemID ) if count ~= nil then toolTip:AddDoubleLine(Ambiguate(characterName, "none"), count..L[" "]..L["("]..bankCount..L[")"], 1,1,1,1,1,1) totalCount = totalCount + count end end end end if totalCount > 1 then toolTip:AddLine(" ") toolTip:AddDoubleLine(L["TOTAL"], totalCount, 1,0.82,0,1,1,1,1) end end function EMA:GetEMAItemCount() if EMA.db.showItemUse == false or EMA.db.showItemCount == false then return end local iteminfo = {} for iterateItems , itemInfo in pairs( EMA.db.itemsAdvanced ) do local itemID = itemInfo.action if itemID ~= nil then local itemName = GetItemInfo( itemID ) local countBags = GetItemCount( itemID ) local countTotal = GetItemCount( itemID , true) local countBank = ( countTotal - countBags ) if itemName ~= nil then iteminfo[itemName] = {} table.insert( iteminfo[itemName], { itemID = itemID, countBags = countBags, countBank = countBank } ) end end end EMA:EMASendCommandToTeam( EMA.COMMAND_ITEM_COUNT, iteminfo ) end function EMA:ReceiveItemCount( characterName, dataTable ) if InCombatLockdown() then return end --EMA:Print("ReceiveItemCount", characterName ) for itemName, info in pairs( dataTable ) do for i, data in pairs( info ) do if EMA.sharedInvData[characterName..itemName] == nil then EMA.sharedInvData[characterName..itemName] = {} else EMAUtilities:ClearTable( EMA.sharedInvData[characterName..itemName] ) end table.insert(EMA.sharedInvData[characterName..itemName], {name = characterName, item = data.itemID, itemCount = data.countBags, bankCount = data.countBank } ) end end LibActionButton:UpdateAllButtons() end function EMA:GetItemCountFromItemID( characterName, itemID ) if EMA.db.showItemUse == false or EMA.db.showItemCount == false then return end local count = nil local countBank = nil for itemName, data in pairs( EMA.sharedInvData ) do for id, itemData in pairs( data ) do --EMA:Print("testaaa", itemID, "vs", itemData.item) if itemID == itemData.item and characterName == itemData.name then --EMA:Print("Found", characterName, itemData.itemCount ) count = itemData.itemCount countBank = itemData.bankCount end end end return count, countBank end function EMA:UPDATE_BINDINGS() if InCombatLockdown() then EMA.refreshUpdateBindingsPending = true return end ClearOverrideBindings( EMA.keyBindingFrame ) for iterateItems = 1, EMA.maximumNumberOfItems, 1 do local containerButtonName = EMA.globalFramePrefix.."ContainerButton"..iterateItems local key1, key2 = GetBindingKey( "ITEMUSE"..iterateItems ) if key1 then SetOverrideBindingClick( EMA.keyBindingFrame, false, key1, containerButtonName ) end if key2 then SetOverrideBindingClick( EMA.keyBindingFrame, false, key2, containerButtonName ) end end end function EMA:LibSharedMedia_Registered() end function EMA:LibSharedMedia_SetGlobal() end -- A EMA command has been recieved. function EMA:EMAOnCommandReceived( characterName, commandName, ... ) if EMAApi.IsCharacterInTeam(characterName) == true then if commandName == EMA.COMMAND_ITEMBAR_BUTTON then EMA:ReceiveButtonData( characterName, ... ) end if commandName == EMA.COMMAND_ITEMUSE_SYNC then EMA:ReceiveSync( characterName, ... ) end if commandName == EMA.COMMAND_ITEM_COUNT then EMA:ReceiveItemCount( characterName, ... ) end end end --EMA QUEST API EMAApi.GetMaxItemCountFromItemID = GetMaxItemCountFromItemID --EMAApi.QuestTest = EMA.CheckForSatchelsItemAndAddToBar