--[[ Jamba Advanced Loot ******************* Author: Max Schilling Create Date: 10/16/2012 Version: 5.1.1 Description: Jamba extension that allows choosing which group member is able to loot a certain item. Specifically intended for Motes of Harmony. Credits: Built on top of the awesome JAMBA addon, most code is copied nearly directly from various Jamba addons. Only the logic for looting is original. ]]-- -- Create the addon using AceAddon-3.0 and embed some libraries. local AJM = LibStub( "AceAddon-3.0" ):NewAddon( "JambaAdvancedLoot", "JambaModule-1.0", "AceConsole-3.0", "AceEvent-3.0" ) AJM.simpleTeamList = {} -- Load libraries. local JambaUtilities = LibStub:GetLibrary( "JambaUtilities-1.0" ) local JambaHelperSettings = LibStub:GetLibrary( "JambaHelperSettings-1.0" ) local AceGUI = LibStub:GetLibrary( "AceGUI-3.0" ) -- Constants and Locale for this module. AJM.moduleName = "Jamba-AdvancedLoot" AJM.settingsDatabaseName = "JambaAdvancedLootProfileDB" AJM.chatCommand = "jamba-advancedloot" local L = LibStub( "AceLocale-3.0" ):GetLocale( AJM.moduleName ) AJM.parentDisplayName = L["Team"] AJM.moduleDisplayName = L["Advanced Loot"] -- Settings - the values to store and their defaults for the settings database. AJM.settings = { profile = { advancedLoot = false, manageAutoLoot = false, autoCloseLootWindowOnSlaves = false, messageArea = JambaApi.DefaultWarningArea(), lootBindPickupEpic = "", lootBindEquipEpic = "", lootBindPickupRare = "", lootBindEquipRare = "", lootBindPickupUncommon = "", lootBindEquipUncommon = "", lootCloth = "", advancedLootItems = {} }, } -- Configuration. function AJM:GetConfiguration() local configuration = { name = AJM.moduleDisplayName, handler = AJM, type = 'group', childGroups = "tab", get = "JambaConfigurationGetSetting", set = "JambaConfigurationSetSetting", args = { --[[ popout = { type = "input", name = L["PopOut"], desc = L["Show the advancedloot settings in their own window."], usage = "/jamba-advancedloot popout", get = false, set = "ShowPopOutWindow", }, ]]-- push = { type = "input", name = L["Push Settings"], desc = L["Push the advanced loot settings to all characters in the team."], usage = "/jamba-advancedloot push", get = false, set = "JambaSendSettings", }, }, } return configuration end ------------------------------------------------------------------------------------------------------------- -- Command this module sends. ------------------------------------------------------------------------------------------------------------- ------------------------------------------------------------------------------------------------------------- -- Messages module sends. ------------------------------------------------------------------------------------------------------------- ------------------------------------------------------------------------------------------------------------- -- Advanced Loot Management. ------------------------------------------------------------------------------------------------------------- function AJM:BeforeJambaProfileChanged() end function AJM:OnJambaProfileChanged() AJM:SettingsRefresh() end function AJM:SettingsRefresh() if AJM.advancedLootItemCharacterName == nil then AJM.advancedLootItemCharacterName = AJM.characterName end AJM.settingsControl.checkBoxAdvancedLoot:SetValue( AJM.db.advancedLoot ) AJM.settingsControl.checkBoxManageAutoLoot:SetValue( AJM.db.manageAutoLoot ) AJM.settingsControl.checkBoxAutoCloseLootWindowOnSlaves:SetValue( AJM.db.autoCloseLootWindowOnSlaves ) AJM.settingsControl.dropdownCharacterName:SetValue( AJM.advancedLootItemCharacterName ) AJM.settingsControl.dropdownMessageArea:SetValue( AJM.db.messageArea ) AJM.settingsControl.lootBindPickupEpic:SetValue( AJM.db.lootBindPickupEpic ) AJM.settingsControl.lootBindEquipEpic:SetValue( AJM.db.lootBindEquipEpic ) AJM.settingsControl.lootBindPickupRare:SetValue( AJM.db.lootBindPickupRare ) AJM.settingsControl.lootBindPickupRare:SetValue( AJM.db.lootBindPickupRare ) AJM.settingsControl.lootBindPickupUncommon:SetValue( AJM.db.lootBindPickupUncommon ) AJM.settingsControl.lootBindEquipUncommon:SetValue( AJM.db.lootBindEquipUncommon ) AJM.settingsControl.lootCloth:SetValue( AJM.db.lootCloth ) AJM.settingsControl.checkBoxManageAutoLoot:SetDisabled( not AJM.db.advancedLoot ) AJM.settingsControl.editBoxItem:SetDisabled( not AJM.db.advancedLoot ) AJM.settingsControl.dropdownCharacterName:SetDisabled( not AJM.db.advancedLoot ) AJM.settingsControl.buttonRemove:SetDisabled( not AJM.db.advancedLoot ) AJM.settingsControl.buttonAdd:SetDisabled( not AJM.db.advancedLoot ) AJM.settingsControl.lootBindPickupEpic:SetDisabled( not AJM.db.advancedLoot ) AJM.settingsControl.lootBindEquipEpic:SetDisabled( not AJM.db.advancedLoot ) AJM.settingsControl.lootBindPickupRare:SetDisabled( not AJM.db.advancedLoot ) AJM.settingsControl.lootBindPickupRare:SetDisabled( not AJM.db.advancedLoot ) AJM.settingsControl.lootBindPickupUncommon:SetDisabled( not AJM.db.advancedLoot ) AJM.settingsControl.lootBindEquipUncommon:SetDisabled( not AJM.db.advancedLoot ) AJM.settingsControl.lootCloth:SetDisabled( not AJM.db.advancedLoot ) AJM:SettingsScrollRefresh() end -- Settings received. function AJM:JambaOnSettingsReceived( characterName, settings ) if characterName ~= AJM.characterName then -- Update the settings. AJM.db.advancedLoot = settings.advancedLoot AJM.db.manageAutoLoot = settings.manageAutoLoot AJM.db.messageArea = settings.messageArea AJM.db.autoCloseLootWindowOnSlaves = settings.autoCloseLootWindowOnSlaves AJM.db.advancedLootItems = JambaUtilities:CopyTable( settings.advancedLootItems ) AJM.db.lootBindPickupEpic = settings.lootBindPickupEpic AJM.db.lootBindEquipEpic = settings.lootBindEquipEpic AJM.db.lootBindPickupRare = settings.lootBindPickupRare AJM.db.lootBindPickupRare = settings.lootBindPickupRare AJM.db.lootBindPickupUncommon = settings.lootBindPickupUncommon AJM.db.lootBindEquipUncommon = settings.lootBindEquipUncommon AJM.db.lootCloth = settings.lootCloth AJM:SetAutoLoot() -- Refresh the settings. AJM:SettingsRefresh() -- Tell the player. AJM:Print( L["Settings received from A."]( characterName ) ) -- Tell the team? --AJM:JambaSendMessageToTeam( AJM.db.messageArea, L["Settings received from A."]( characterName ), false ) end end ------------------------------------------------------------------------------------------------------------- -- Settings Dialogs. ------------------------------------------------------------------------------------------------------------- local function SettingsCreateOptions( top ) -- Position and size constants. local buttonControlWidth = 105 local checkBoxHeight = JambaHelperSettings:GetCheckBoxHeight() local buttonHeight = JambaHelperSettings:GetButtonHeight() local editBoxHeight = JambaHelperSettings:GetEditBoxHeight() local dropdownHeight = JambaHelperSettings:GetDropdownHeight() local left = JambaHelperSettings:LeftOfSettings() local headingHeight = JambaHelperSettings:HeadingHeight() local headingWidth = JambaHelperSettings:HeadingWidth( true ) local horizontalSpacing = JambaHelperSettings:GetHorizontalSpacing() local verticalSpacing = JambaHelperSettings:GetVerticalSpacing() local halfWidth = (headingWidth - horizontalSpacing) / 2 local left2 = left + halfWidth + horizontalSpacing local movingTop = top JambaHelperSettings:CreateHeading( AJM.settingsControl, L["Advanced Loot Items"], movingTop, true ) movingTop = movingTop - headingHeight AJM.settingsControl.checkBoxAdvancedLoot = JambaHelperSettings:CreateCheckBox( AJM.settingsControl, halfWidth, left, movingTop, L["Enable Advanced Loot"], AJM.SettingsToggleAdvancedLootItems ) AJM.settingsControl.checkBoxManageAutoLoot = JambaHelperSettings:CreateCheckBox( AJM.settingsControl, halfWidth, left2, movingTop, L["Manage Auto Loot"], AJM.SettingsToggleAdvancedLootManageAutoLoot ) movingTop = movingTop - checkBoxHeight AJM.settingsControl.checkBoxAutoCloseLootWindowOnSlaves = JambaHelperSettings:CreateCheckBox( AJM.settingsControl, halfWidth, left, movingTop, L["Auto Close Loot Window On Minions"], AJM.SettingsToggleAutoCloseLootWindowOnMinions ) movingTop = movingTop - checkBoxHeight AJM.settingsControl.advancedLootHighlightRow = 1 AJM.settingsControl.advancedLootOffset = 1 local list = {} list.listFrameName = "JambaAdvancedLootSettingsFrame" list.parentFrame = AJM.settingsControl.widgetSettings.content list.listTop = movingTop list.listLeft = left list.listWidth = headingWidth list.rowHeight = 20 list.rowsToDisplay = 8 list.columnsToDisplay = 2 list.columnInformation = {} list.columnInformation[1] = {} list.columnInformation[1].width = 60 list.columnInformation[1].alignment = "LEFT" list.columnInformation[2] = {} list.columnInformation[2].width = 30 list.columnInformation[2].alignment = "LEFT" list.scrollRefreshCallback = AJM.SettingsScrollRefresh list.rowClickCallback = AJM.SettingsRowClick AJM.settingsControl.list = list JambaHelperSettings:CreateScrollList( AJM.settingsControl.list ) movingTop = movingTop - list.listHeight - verticalSpacing AJM.settingsControl.buttonRemove = JambaHelperSettings:CreateButton( AJM.settingsControl, buttonControlWidth, left, movingTop, L["Remove"], AJM.SettingsRemoveClick ) movingTop = movingTop - buttonHeight - verticalSpacing JambaHelperSettings:CreateHeading( AJM.settingsControl, L["Add Item"], movingTop, true ) movingTop = movingTop - headingHeight AJM.settingsControl.editBoxItem = JambaHelperSettings:CreateEditBox( AJM.settingsControl, headingWidth, left, movingTop, L["Item (drag item to box from your bags)"] ) AJM.settingsControl.editBoxItem:SetCallback( "OnEnterPressed", AJM.SettingsEditBoxChangedItem ) movingTop = movingTop - editBoxHeight AJM.settingsControl.dropdownCharacterName = JambaHelperSettings:CreateDropdown( AJM.settingsControl, halfWidth, left, movingTop, L["Character Name"] ) AJM.settingsControl.dropdownCharacterName:SetList( AJM:GetTeamList() ) AJM.settingsControl.dropdownCharacterName:SetCallback( "OnValueChanged", AJM.SettingsSetCharacterName ) movingTop = movingTop - dropdownHeight - verticalSpacing AJM.settingsControl.buttonAdd = JambaHelperSettings:CreateButton( AJM.settingsControl, buttonControlWidth, left, movingTop, L["Add"], AJM.SettingsAddClick ) movingTop = movingTop - buttonHeight JambaHelperSettings:CreateHeading( AJM.settingsControl, L["Epic Quality Target"], movingTop, true ) movingTop = movingTop - headingHeight AJM.settingsControl.lootBindPickupEpic = JambaHelperSettings:CreateDropdown( AJM.settingsControl, halfWidth, left, movingTop, L["Bind on Pickup"] ) AJM.settingsControl.lootBindPickupEpic:SetList( AJM:GetTeamList() ) AJM.settingsControl.lootBindPickupEpic:SetCallback( "OnValueChanged", AJM.SettingslootBindPickupEpic ) AJM.settingsControl.lootBindEquipEpic = JambaHelperSettings:CreateDropdown( AJM.settingsControl, halfWidth, left2, movingTop, L["Bind on Equip"] ) AJM.settingsControl.lootBindEquipEpic:SetList( AJM:GetTeamList() ) AJM.settingsControl.lootBindEquipEpic:SetCallback( "OnValueChanged", AJM.SettingslootBindEquipEpic ) movingTop = movingTop - dropdownHeight - verticalSpacing JambaHelperSettings:CreateHeading( AJM.settingsControl, L["Rare Quality Target"], movingTop, true ) movingTop = movingTop - headingHeight AJM.settingsControl.lootBindPickupRare = JambaHelperSettings:CreateDropdown( AJM.settingsControl, halfWidth, left, movingTop, L["Bind on Pickup"] ) AJM.settingsControl.lootBindPickupRare:SetList( AJM:GetTeamList() ) AJM.settingsControl.lootBindPickupRare:SetCallback( "OnValueChanged", AJM.SettingslootBindPickupRare ) AJM.settingsControl.lootBindPickupRare = JambaHelperSettings:CreateDropdown( AJM.settingsControl, halfWidth, left2, movingTop, L["Bind on Equip"] ) AJM.settingsControl.lootBindPickupRare:SetList( AJM:GetTeamList() ) AJM.settingsControl.lootBindPickupRare:SetCallback( "OnValueChanged", AJM.SettingslootBindPickupRare ) movingTop = movingTop - dropdownHeight - verticalSpacing JambaHelperSettings:CreateHeading( AJM.settingsControl, L["Uncommon Quality Target"], movingTop, true ) movingTop = movingTop - headingHeight AJM.settingsControl.lootBindPickupUncommon = JambaHelperSettings:CreateDropdown( AJM.settingsControl, halfWidth, left, movingTop, L["Bind on Pickup"] ) AJM.settingsControl.lootBindPickupUncommon:SetList( AJM:GetTeamList() ) AJM.settingsControl.lootBindPickupUncommon:SetCallback( "OnValueChanged", AJM.SettingslootBindPickupUncommon ) AJM.settingsControl.lootBindEquipUncommon = JambaHelperSettings:CreateDropdown( AJM.settingsControl, halfWidth, left2, movingTop, L["Bind on Equip"] ) AJM.settingsControl.lootBindEquipUncommon:SetList( AJM:GetTeamList() ) AJM.settingsControl.lootBindEquipUncommon:SetCallback( "OnValueChanged", AJM.SettingslootBindEquipUncommon ) movingTop = movingTop - dropdownHeight - verticalSpacing JambaHelperSettings:CreateHeading( AJM.settingsControl, L["Cloth Target"], movingTop, true ) movingTop = movingTop - headingHeight AJM.settingsControl.lootCloth = JambaHelperSettings:CreateDropdown( AJM.settingsControl, halfWidth, left, movingTop, L["Loot all cloth with"] ) AJM.settingsControl.lootCloth:SetList( AJM:GetTeamList() ) AJM.settingsControl.lootCloth:SetCallback( "OnValueChanged", AJM.SettingsCloth ) movingTop = movingTop - dropdownHeight - verticalSpacing JambaHelperSettings:CreateHeading( AJM.settingsControl, L["Advanced Loot Messages"], movingTop, true ) movingTop = movingTop - headingHeight AJM.settingsControl.dropdownMessageArea = JambaHelperSettings:CreateDropdown( AJM.settingsControl, headingWidth, left, movingTop, L["Message Area"] ) AJM.settingsControl.dropdownMessageArea:SetList( JambaApi.MessageAreaList() ) AJM.settingsControl.dropdownMessageArea:SetCallback( "OnValueChanged", AJM.SettingsSetMessageArea ) movingTop = movingTop - dropdownHeight - verticalSpacing return movingTop end local function SettingsCreate() AJM.settingsControl = {} JambaHelperSettings:CreateSettings( AJM.settingsControl, AJM.moduleDisplayName, AJM.parentDisplayName, AJM.SettingsPushSettingsClick ) local bottomOfSettings = SettingsCreateOptions( JambaHelperSettings:TopOfSettings() ) AJM.settingsControl.widgetSettings.content:SetHeight( -bottomOfSettings ) -- Help local helpTable = {} JambaHelperSettings:CreateHelp( AJM.settingsControl, helpTable, AJM:GetConfiguration() ) end ------------------------------------------------------------------------------------------------------------- -- Settings Callbacks. ------------------------------------------------------------------------------------------------------------- function AJM:SettingsScrollRefresh() FauxScrollFrame_Update( AJM.settingsControl.list.listScrollFrame, AJM:GetItemsMaxPosition(), AJM.settingsControl.list.rowsToDisplay, AJM.settingsControl.list.rowHeight ) AJM.settingsControl.advancedLootOffset = FauxScrollFrame_GetOffset( AJM.settingsControl.list.listScrollFrame ) for iterateDisplayRows = 1, AJM.settingsControl.list.rowsToDisplay do -- Reset. AJM.settingsControl.list.rows[iterateDisplayRows].columns[1].textString:SetText( "" ) AJM.settingsControl.list.rows[iterateDisplayRows].columns[1].textString:SetTextColor( 1.0, 1.0, 1.0, 1.0 ) AJM.settingsControl.list.rows[iterateDisplayRows].columns[2].textString:SetText( "" ) AJM.settingsControl.list.rows[iterateDisplayRows].columns[2].textString:SetTextColor( 1.0, 1.0, 1.0, 1.0 ) AJM.settingsControl.list.rows[iterateDisplayRows].highlight:SetColorTexture( 0.0, 0.0, 0.0, 0.0 ) -- Get data. local dataRowNumber = iterateDisplayRows + AJM.settingsControl.advancedLootOffset if dataRowNumber <= AJM:GetItemsMaxPosition() then -- Put data information into columns. local itemInformation = AJM:GetItemAtPosition( dataRowNumber ) AJM.settingsControl.list.rows[iterateDisplayRows].columns[1].textString:SetText( itemInformation.name ) AJM.settingsControl.list.rows[iterateDisplayRows].columns[2].textString:SetText( itemInformation.characterName ) -- Highlight the selected row. if dataRowNumber == AJM.settingsControl.advancedLootHighlightRow then AJM.settingsControl.list.rows[iterateDisplayRows].highlight:SetColorTexture( 1.0, 1.0, 0.0, 0.5 ) end end end end function AJM:SettingsRowClick( rowNumber, columnNumber ) if AJM.settingsControl.advancedLootOffset + rowNumber <= AJM:GetItemsMaxPosition() then AJM.settingsControl.advancedLootHighlightRow = AJM.settingsControl.advancedLootOffset + rowNumber AJM:SettingsScrollRefresh() end end function AJM:SettingsPushSettingsClick( event ) AJM:JambaSendSettings() end function AJM:SettingsSetMessageArea( event, value ) AJM.db.messageArea = value AJM:SettingsRefresh() end function AJM:SettingsSetCharacterName( event, value ) AJM.advancedLootItemCharacterName = value AJM:SettingsRefresh() end function AJM:SettingslootBindPickupEpic( event, value ) AJM.db.lootBindPickupEpic = value AJM:SettingsRefresh() end function AJM:SettingslootBindEquipEpic( event, value ) AJM.db.lootBindEquipEpic = value AJM:SettingsRefresh() end function AJM:SettingslootBindPickupRare( event, value ) AJM.db.lootBindPickupRare = value AJM:SettingsRefresh() end function AJM:SettingslootBindPickupRare( event, value ) AJM.db.lootBindPickupRare = value AJM:SettingsRefresh() end function AJM:SettingslootBindPickupUncommon( event, value ) AJM.db.lootBindPickupUncommon = value AJM:SettingsRefresh() end function AJM:SettingslootBindEquipUncommon( event, value ) AJM.db.lootBindEquipUncommon = value AJM:SettingsRefresh() end function AJM:SettingsCloth( event, value ) AJM.db.lootCloth = value AJM:SettingsRefresh() end function AJM:SettingsToggleAdvancedLootItems( event, checked ) AJM.db.advancedLoot = checked AJM:SetAutoLoot() AJM:SettingsRefresh() end function AJM:SettingsToggleAdvancedLootManageAutoLoot( event, checked ) AJM.db.manageAutoLoot = checked AJM:SetAutoLoot() AJM:SettingsRefresh() end function AJM:SettingsToggleAutoCloseLootWindowOnMinions( event, checked ) AJM.db.autoCloseLootWindowOnSlaves = checked AJM:SettingsRefresh() end function AJM:SettingsRemoveClick( event ) StaticPopup_Show( "JAMBAADVANCEDLOOT_CONFIRM_REMOVE_ADVANCEDLOOT_ITEM" ) end function AJM:SettingsEditBoxChangedItem( event, text ) AJM.advancedLootItemLink = text AJM:SettingsRefresh() end function AJM:SettingsAddClick( event ) if AJM.advancedLootItemLink ~= nil and AJM.advancedLootItemCharacterName ~= nil then if AJM:GetAdvancedLootCharacterName( AJM.advancedLootItemLink ) == nil then AJM:AddItem( AJM.advancedLootItemLink, AJM.advancedLootItemCharacterName ) AJM.advancedLootItemLink = nil AJM.settingsControl.editBoxItem:SetText( "" ) AJM:SettingsRefresh() end end end ------------------------------------------------------------------------------------------------------------- -- Popup Dialogs. ------------------------------------------------------------------------------------------------------------- -- Initialize Popup Dialogs. local function InitializePopupDialogs() StaticPopupDialogs["JAMBAADVANCEDLOOT_CONFIRM_REMOVE_ADVANCEDLOOT_ITEM"] = { text = L["Are you sure you wish to remove the selected item from the advanced loot items list?"], button1 = YES, button2 = NO, timeout = 0, whileDead = 1, hideOnEscape = 1, OnAccept = function() AJM:RemoveItem() end, } end ------------------------------------------------------------------------------------------------------------- -- Addon initialization, enabling and disabling. ------------------------------------------------------------------------------------------------------------- -- Initialise the module. function AJM:OnInitialize() AJM.itemsAlertedCount = 1 AJM.itemsAlerted = {} AJM.advancedLootItemLink = nil -- Create the settings control. SettingsCreate() -- Initialise the JambaModule part of this module. AJM:JambaModuleInitialize( AJM.settingsControl.widgetSettings.frame ) -- Initialise the popup dialogs. InitializePopupDialogs() -- Populate the settings. AJM:SettingsRefresh() -- Loot scanning tooltip. CreateFrame( "GameTooltip", "JambaAdvancedLootScanningTooltip" ) JambaAdvancedLootScanningTooltip:SetOwner( WorldFrame, "ANCHOR_NONE" ) -- Allow tooltip SetX() methods to dynamically add new lines based on these JambaAdvancedLootScanningTooltip:AddFontStrings( JambaAdvancedLootScanningTooltip:CreateFontString( "$parentTextLeft1", nil, "GameTooltipText" ), JambaAdvancedLootScanningTooltip:CreateFontString( "$parentTextRight1", nil, "GameTooltipText" ) ) -- Upgrade character names if necessary. local realmName = GetRealmName() for position, itemInfoTable in pairs( AJM.db.advancedLootItems ) do local characterName = itemInfoTable.characterName local updateMatchStart = characterName:find( "-" ) if not updateMatchStart then itemInfoTable.characterName = characterName.."-"..realmName end end end -- Called when the addon is enabled. function AJM:OnEnable() AJM:SetAutoLoot() --AJM:RegisterEvent( "LOOT_OPENED" ) AJM:RegisterEvent( "GROUP_ROSTER_UPDATE" ) AJM:RegisterEvent( "LOOT_READY" ) AJM:RegisterMessage( JambaApi.MESSAGE_MESSAGE_AREAS_CHANGED, "OnMessageAreasChanged" ) end -- Called when the addon is disabled. function AJM:OnDisable() AJM:DisableAutoLoot() end ------------------------------------------------------------------------------------------------------------- -- JambaAdvancedLoot functionality. ------------------------------------------------------------------------------------------------------------- function AJM:OnMessageAreasChanged( message ) AJM.settingsControl.dropdownMessageArea:SetList( JambaApi.MessageAreaList() ) end function AJM:GetTeamList() JambaUtilities:ClearTable( AJM.simpleTeamList ) for characterName, characterPosition in JambaApi.TeamList() do AJM.simpleTeamList[characterName] = characterName end AJM.simpleTeamList[""] = "" table.sort( AJM.simpleTeamList ) return AJM.simpleTeamList end function AJM:ShowPopOutWindow() --AJM.standaloneWindow:Show() end function AJM:GetItemsMaxPosition() return #AJM.db.advancedLootItems end function AJM:GetItemAtPosition( position ) return AJM.db.advancedLootItems[position] end function AJM:AddItem( itemLink, characterName ) -- Get some more information about the item. local name, link, quality, iLevel, reqLevel, class, subclass, maxStack, equipSlot, texture, vendorPrice = GetItemInfo( itemLink ) -- If the item could be found. if name ~= nil then local itemInformation = {} itemInformation.link = itemLink itemInformation.name = name itemInformation.characterName = characterName table.insert( AJM.db.advancedLootItems, itemInformation ) AJM:SettingsRefresh() AJM:SettingsRowClick( 1, 1 ) end end function AJM:RemoveItem() table.remove( AJM.db.advancedLootItems, AJM.settingsControl.advancedLootHighlightRow ) AJM:SettingsRefresh() AJM:SettingsRowClick( 1, 1 ) end function AJM:SetAutoLoot() if (AJM.db.advancedLoot) then if GetNumGroupMembers() == 0 then AJM:EnableAutoLoot() else AJM:DisableAutoLoot() end else AJM:EnableAutoLoot() end end function AJM:EnableAutoLoot() if (AJM.db.manageAutoLoot) then SetCVar( "autoLootDefault", 1 ); end end function AJM:DisableAutoLoot() if (AJM.db.manageAutoLoot) then SetCVar( "autoLootDefault", 0 ); end end function AJM:GROUP_ROSTER_UPDATE( event, ... ) AJM:SetAutoLoot() end function AJM:LOOT_READY() if AJM.db.advancedLoot == true then if IsInGroup() then AJM:DoAdvancedLoot() end end end function AJM:LOOT_OPENED() if AJM.db.advancedLoot == true then if IsInGroup() then AJM:DoAdvancedLoot() end end end -- A Jamba command has been recieved. function AJM:JambaOnCommandReceived( characterName, commandName, ... ) end function AJM:GetAdvancedLootCharacterName(iteminfo) local returnCharacterName = nil local itemNameToFind = GetItemInfo( iteminfo ) for position, itemInfoTable in pairs( AJM.db.advancedLootItems ) do local characterName = itemInfoTable.characterName local advancedLootItemLink = itemInfoTable.link local itemNameAdvancedLoot = GetItemInfo( advancedLootItemLink ) if itemNameAdvancedLoot == itemNameToFind then returnCharacterName = characterName; break end end return returnCharacterName; end function AJM:IsBOP(slot) JambaAdvancedLootScanningTooltip:ClearLines() JambaAdvancedLootScanningTooltip:SetLootItem(slot) for _, region in ipairs({JambaAdvancedLootScanningTooltip:GetRegions()}) do if region and region:GetObjectType() == "FontString" then local text = region:GetText() if text ~= nil and text ~= "" and strfind(text, ITEM_BIND_ON_PICKUP) then return true end end end return false end function AJM:IsBOE(slot) JambaAdvancedLootScanningTooltip:ClearLines() JambaAdvancedLootScanningTooltip:SetLootItem(slot) for _, region in ipairs({JambaAdvancedLootScanningTooltip:GetRegions()}) do if region and region:GetObjectType() == "FontString" then local text = region:GetText() if text ~= nil and text ~= "" and strfind(text, ITEM_BIND_ON_EQUIP) then return true end end end return false end function AJM:AlertAboutLoot(itemName, advancedLootCharacterName) local alreadyAlerted = false for i = 1, AJM.itemsAlertedCount do if AJM.itemsAlerted[i] == itemName then alreadyAlerted = true end end if alreadyAlerted == false then AJM:JambaSendMessageToTeam( AJM.db.messageArea, L["GOTTA LOOT A FROM B."]( itemName, advancedLootCharacterName ), false ) AJM.itemsAlerted[AJM.itemsAlertedCount] = itemName AJM.itemsAlertedCount = AJM.itemsAlertedCount + 1 end end function AJM:DoAdvancedLoot() local numloot = GetNumLootItems() if numloot == 0 then pcall(CloseLoot) return nil end AJM.itemsAlerted = {} AJM.itemsAlertedCount = 1 local safeToLoot = true local lootThisSlot = false local tries = 0 -- seems to get itself stuck when it only runs once... this is intended to allow a few times -- through while the others are looting just in case. while tries < 20 and numloot > 0 do safeToLoot = true -- Pass one: Find out if there are any items with advanced loot targets for slot = 1, numloot do lootThisSlot = false -- Ebony's Change for personal Loot as players can always loot always Loot Items and other characters can not loot the item so AVD Loot is kinda pointless. -- personal Loot is always on in the outside world from legion so always loot items. local isInstance, instanceType = IsInInstance() --local method = GetLootMethod() if isInstance == true then lootThisSlot = false --safeToLoot = true else lootThisSlot = true safeToLoot = true end local _, icon, name, quantity, quality, locked, isQuestItem, questId, isActive = pcall(GetLootSlotInfo, slot) if icon and lootThisSlot == false then local is_item = (GetLootSlotType(slot) == LOOT_SLOT_ITEM) if is_item then local link = GetLootSlotLink(slot) local itemName, sLink, iRarity, iLevel, iMinLevel, sType, sSubType, iStackCount = GetItemInfo(link); -- Check for items specified in config local advancedLootCharacterName = AJM:GetAdvancedLootCharacterName(link); if advancedLootCharacterName ~= nil then if advancedLootCharacterName == AJM.characterName then lootThisSlot = true else AJM:AlertAboutLoot(itemName, advancedLootCharacterName) safeToLoot = false end end -- Check for BOP matches if AJM:IsBOP(slot) then if iRarity == 4 and AJM.db.lootBindPickupEpic ~= nil and AJM.db.lootBindPickupEpic ~= "" then if AJM.db.lootBindPickupEpic == AJM.characterName then lootThisSlot = true else AJM:AlertAboutLoot(itemName, AJM.db.lootBindPickupEpic) safeToLoot = false end end if iRarity == 3 and AJM.db.lootBindPickupRare ~= nil and AJM.db.lootBindPickupRare ~= "" then if AJM.db.lootBindPickupRare == AJM.characterName then lootThisSlot = true else AJM:AlertAboutLoot(itemName, AJM.db.lootBindPickupRare) safeToLoot = false end end if iRarity == 2 and AJM.db.lootBindPickupUncommon ~= nil and AJM.db.lootBindPickupUncommon ~= "" then if AJM.db.lootBindPickupUncommon == AJM.characterName then lootThisSlot = true else AJM:AlertAboutLoot(itemName, AJM.db.lootBindPickupUncommon) safeToLoot = false end end end -- Check for BOE Matches if AJM:IsBOE(slot) then if iRarity == 4 and AJM.db.lootBindEquipEpic ~= nil and AJM.db.lootBindEquipEpic ~= "" then if AJM.db.lootBindEquipEpic == AJM.characterName then lootThisSlot = true else AJM:AlertAboutLoot(itemName, AJM.db.lootBindEquipEpic) safeToLoot = false end end if iRarity == 3 and AJM.db.lootBindPickupRare ~= nil and AJM.db.lootBindPickupRare ~= "" then if AJM.db.lootBindPickupRare == AJM.characterName then lootThisSlot = true else AJM:AlertAboutLoot(itemName, AJM.db.lootBindPickupRare) safeToLoot = false end end if iRarity == 2 and AJM.db.lootBindEquipUncommon ~= nil and AJM.db.lootBindEquipUncommon ~= "" then if AJM.db.lootBindEquipUncommon == AJM.characterName then lootThisSlot = true else AJM:AlertAboutLoot(itemName, AJM.db.lootBindEquipUncommon) safeToLoot = false end end end -- Check for Cloth Matches -- if sType == L["Trade Goods"] and sSubType == L["Cloth"] and AJM.db.lootCloth ~= nil and AJM.db.lootCloth ~= "" then if sType == L["Tradeskill"] and sSubType == L["Cloth"] and AJM.db.lootCloth ~= nil and AJM.db.lootCloth ~= "" then if AJM.db.lootCloth == AJM.characterName then lootThisSlot = true else AJM:AlertAboutLoot(itemName, AJM.db.lootCloth) safeToLoot = false end end end -- If this character is set to loot the item in this slot, then loot the slot. if lootThisSlot == true then LootSlot(slot) end end end -- Pass two: Pick up everything else numloot = GetNumLootItems() if safeToLoot then for slot = 1, numloot do --AJM:Print("testloot1241", numloot) LootSlot(slot) end end numloot = GetNumLootItems() tries = tries + 1 end if AJM.db.autoCloseLootWindowOnSlaves == true then if JambaApi.IsCharacterTheMaster( AJM.characterName ) ~= true then pcall(CloseLoot) end end end