diff --git a/Consumables.lua b/Consumables.lua index d961ea7..9c2751d 100644 --- a/Consumables.lua +++ b/Consumables.lua @@ -1,159 +1,82 @@ --- consumables.lua consumablesCategories = { ["Elixirs"] = { - { id = 13452, name = "Elixir of the Mongoose" }, - { id = 9187, name = "Elixir of Greater Agility" }, - { id = 13453, name = "Elixir of Brute Force" }, - { id = 13447, name = "Elixir of the Sages" }, - { id = 3825, name = "Elixir of Fortitude" }, - { id = 9179, name = "Elixir of Greater Intellect" }, - { id = 13454, name = "Greater Arcane Elixir" }, - { id = 17708, name = "Elixir of Frost Power" }, - { id = 9264, name = "Elixir of Shadow Power" }, - { id = 6373, name = "Elixir of Firepower" }, - { id = 21546, name = "Elixir of Greater Firepower" }, - { id = 18294, name = "Elixir of Greater Water Breathing" }, - { id = 9088, name = "Gift of Arthas" }, - { id = 9155, name = "Arcane Elixir" }, + { id = 13452, name = "Elixir of the Mongoose", texture = "Interface\\Icons\\INV_Potion_32", description = "Increases Agility by 25 and critical strike chance by 2% for 1 hour." }, + { id = 9187, name = "Elixir of Greater Agility", texture = "Interface\\Icons\\INV_Potion_94", description = "Increases Agility by 15 for 1 hour." }, + { id = 13453, name = "Elixir of Brute Force", texture = "Interface\\Icons\\INV_Potion_80", description = "Increases Strength and Stamina by 18 for 1 hour." }, + { id = 13447, name = "Elixir of the Sages", texture = "Interface\\Icons\\INV_Potion_29", description = "Increases Intellect and Spirit by 18 for 1 hour." }, + { id = 13454, name = "Greater Arcane Elixir", texture = "Interface\\Icons\\INV_Potion_22", description = "Increases spell damage by up to 35 for 1 hour." }, + { id = 11348, name = "Elixir of Superior Defense", texture = "Interface\\Icons\\INV_Potion_52", description = "Increases armor by 450 for 1 hour." }, + { id = 17708, name = "Elixir of Frost Power", texture = "Interface\\Icons\\INV_Potion_20", description = "Increases Frost spell damage by up to 15 for 1 hour." }, + { id = 3456, name = "Lucidity Potion", texture = "Interface\\Icons\\INV_Potion_17", description = "Restores a significant amount of mana over 10 seconds." }, + { id = 36003, name = "Elixir of Nimble Mind", texture = "Interface\\Icons\\INV_Potion_34", description = "Increases haste by 5% for 1 hour." }, }, ["Protection Potions"] = { - { id = 13457, name = "Greater Fire Protection Potion" }, - { id = 13456, name = "Greater Frost Protection Potion" }, - { id = 13458, name = "Greater Nature Protection Potion" }, - { id = 13459, name = "Greater Shadow Protection Potion" }, - { id = 13461, name = "Greater Arcane Protection Potion" }, - { id = 9036, name = "Magic Resistance Potion" }, + { id = 13457, name = "Greater Fire Protection Potion", texture = "Interface\\Icons\\INV_Potion_24", description = "Absorbs 1950 to 3250 Fire damage for 1 hour." }, + { id = 13456, name = "Greater Frost Protection Potion", texture = "Interface\\Icons\\INV_Potion_20", description = "Absorbs 1950 to 3250 Frost damage for 1 hour." }, + { id = 13458, name = "Greater Nature Protection Potion", texture = "Interface\\Icons\\INV_Potion_22", description = "Absorbs 1950 to 3250 Nature damage for 1 hour." }, + { id = 13459, name = "Greater Shadow Protection Potion", texture = "Interface\\Icons\\INV_Potion_23", description = "Absorbs 1950 to 3250 Shadow damage for 1 hour." }, + { id = 13461, name = "Greater Arcane Protection Potion", texture = "Interface\\Icons\\INV_Potion_25", description = "Absorbs 1950 to 3250 Arcane damage for 1 hour." }, + { id = 36002, name = "Greater Physical Protection Potion", texture = "Interface\\Icons\\INV_Potion_93", description = "Reduces physical damage taken by 10% for 1 hour." }, }, - ["Utility Potions"] = { - { id = 20008, name = "Living Action Potion" }, - { id = 5634, name = "Free Action Potion" }, - { id = 3387, name = "Limited Invulnerability Potion" }, - { id = 9030, name = "Restorative Potion" }, - { id = 13462, name = "Purification Potion" }, - { id = 9172, name = "Invisibility Potion" }, - { id = 2459, name = "Swiftness Potion" }, + ["Weapon Enhancements"] = { + { id = 12404, name = "Dense Sharpening Stone", texture = "Interface\\Icons\\INV_Stone_SharpeningStone_02", description = "Increases weapon damage by 8 for 30 minutes." }, + { id = 12645, name = "Thorium Shield Spike", texture = "Interface\\Icons\\INV_Shield_13", description = "Attaches a Thorium Spike to a shield, causing 20-30 damage when blocking." }, + { id = 20749, name = "Brilliant Mana Oil", texture = "Interface\\Icons\\INV_Potion_100", description = "Increases mana regeneration by 12 and spell damage by up to 25 for 30 minutes." }, + { id = 20750, name = "Brilliant Wizard Oil", texture = "Interface\\Icons\\INV_Potion_105", description = "Increases spell damage by up to 36 for 30 minutes." }, + { id = 3829, name = "Frost Oil", texture = "Interface\\Icons\\INV_Potion_20", description = "Adds a chance to inflict Frost damage on hit. Lasts 30 minutes." }, + { id = 23122, name = "Consecrated Sharpening Stone", texture = "Interface\\Icons\\INV_Stone_02", description = "Increases melee attack power by 100 against undead for 30 minutes." }, + { id = 18262, name = "Elemental Sharpening Stone", texture = "Interface\\Icons\\INV_Stone_WeightStone_01", description = "Increases critical strike chance by 2% for 30 minutes." }, }, ["Combat Potions"] = { - { id = 13455, name = "Greater Stoneshield Potion" }, - { id = 13442, name = "Mighty Rage Potion" }, - { id = 5631, name = "Rage Potion" }, + { id = 13455, name = "Greater Stoneshield Potion", texture = "Interface\\Icons\\INV_Potion_67", description = "Increases armor by 2000 for 2 minutes." }, + { id = 13442, name = "Mighty Rage Potion", texture = "Interface\\Icons\\INV_Potion_41", description = "Restores 45 to 75 rage and increases Strength by 60 for 20 seconds." }, + { id = 20007, name = "Mageblood Potion", texture = "Interface\\Icons\\INV_Potion_45", description = "Regenerates 12 mana every 5 seconds for 1 hour." }, + { id = 36004, name = "Potion of Brutal Force", texture = "Interface\\Icons\\INV_Potion_26", description = "Increases Strength by 50 for 1 hour." }, }, - ["Mana & Health Potions"] = { - { id = 13444, name = "Major Mana Potion" }, - { id = 13446, name = "Major Healing Potion" }, - { id = 12190, name = "Dreamless Sleep Potion" }, - { id = 2456, name = "Rejuvenation Potion" }, - }, - ["Juju & Other Buffs"] = { - { id = 12460, name = "Juju Power" }, - { id = 12451, name = "Juju Might" }, - { id = 12457, name = "Juju Chill" }, - { id = 12455, name = "Juju Ember" }, - { id = 12450, name = "Juju Flurry" }, - { id = 8412, name = "Ground Scorpok Assay" }, - { id = 8410, name = "R.O.I.D.S." }, - { id = 8411, name = "Lung Juice Cocktail" }, - { id = 18284, name = "Kreeg's Stout Beatdown" }, - { id = 21151, name = "Rumsey Rum Black Label" }, - { id = 12820, name = "Winterfall Firewater" }, + ["Utility Items"] = { + { id = 20008, name = "Living Action Potion", texture = "Interface\\Icons\\INV_Potion_16", description = "Removes movement impairing effects and grants immunity to them for 5 seconds." }, + { id = 3387, name = "Limited Invulnerability Potion", texture = "Interface\\Icons\\INV_Potion_62", description = "Makes you immune to physical attacks for 6 seconds." }, + { id = 5634, name = "Free Action Potion", texture = "Interface\\Icons\\INV_Potion_04", description = "Grants immunity to stun and movement impairing effects for 30 seconds." }, + { id = 9030, name = "Restorative Potion", texture = "Interface\\Icons\\INV_Potion_68", description = "Removes a magic, curse, poison, or disease effect every 5 seconds for 30 seconds." }, + { id = 4390, name = "Iron Grenade", texture = "Interface\\Icons\\INV_Misc_Bomb_08", description = "Stuns enemies in a 3-yard radius for 3 seconds." }, + { id = 15993, name = "Thorium Grenade", texture = "Interface\\Icons\\INV_Misc_Bomb_09", description = "Stuns enemies in a 3-yard radius for 3 seconds." }, + { id = 10577, name = "Goblin Sapper Charge", texture = "Interface\\Icons\\INV_Misc_Bomb_07", description = "Deals 450-750 Fire damage to enemies within 10 yards, also damages you." }, }, ["Food Buffs"] = { - { id = 51711, name = "Sweet Mountain Berry (Agility)" }, - { id = 51714, name = "Sweet Mountain Berry (Stamina)" }, - { id = 12662, name = "Blasted Boar Lung" }, - { id = 21023, name = "Dirge's Kickin' Chimaerok Chops" }, - { id = 12210, name = "Tender Wolf Steak" }, - { id = 12217, name = "Dragonbreath Chili" }, - { id = 18254, name = "Runn Tum Tuber Surprise" }, - { id = 13931, name = "Nightfin Soup" }, - { id = 21217, name = "Sagefish Delight" }, - { id = 13928, name = "Grilled Squid" }, - { id = 20452, name = "Smoked Desert Dumplings" }, - { id = 12202, name = "Roast Raptor" }, - } + { id = 21023, name = "Dirge's Kickin' Chimaerok Chops", texture = "Interface\\Icons\\INV_Misc_Food_65", description = "Increases Strength by 25 for 1 hour." }, + { id = 18254, name = "Runn Tum Tuber Surprise", texture = "Interface\\Icons\\INV_Misc_Food_63", description = "Increases Intellect by 10 for 1 hour." }, + { id = 13931, name = "Nightfin Soup", texture = "Interface\\Icons\\INV_Drink_17", description = "Restores 8 mana every 5 seconds for 1 hour." }, + { id = 20452, name = "Smoked Desert Dumplings", texture = "Interface\\Icons\\INV_Misc_Food_64", description = "Increases Strength by 20 for 1 hour." }, + { id = 51711, name = "Sweet Mountain Berry (Agility)", texture = "Interface\\Icons\\INV_Misc_Food_40", description = "Increases Agility by 10 for 1 hour." }, + { id = 51714, name = "Sweet Mountain Berry (Stamina)", texture = "Interface\\Icons\\INV_Misc_Food_40", description = "Increases Stamina by 10 for 1 hour." }, + }, + ["Special Buffs"] = { + { id = 18269, name = "Hardened Mushrooms", texture = "Interface\\Icons\\INV_Mushroom_08", description = "Increases Stamina by 25 for 1 hour." }, + { id = 18270, name = "Power Mushrooms", texture = "Interface\\Icons\\INV_Mushroom_11", description = "Increases Strength by 20 for 1 hour." }, + { id = 21151, name = "Rumsey Rum Black Label", texture = "Interface\\Icons\\INV_Drink_04", description = "Increases Stamina by 15 for 15 minutes." }, + { id = 12460, name = "Juju Power", texture = "Interface\\Icons\\INV_Misc_MonsterScales_07", description = "Increases Strength by 30 for 30 minutes." }, + { id = 12451, name = "Juju Might", texture = "Interface\\Icons\\INV_Misc_MonsterScales_11", description = "Increases Attack Power by 40 for 30 minutes." }, + { id = 12455, name = "Juju Ember", texture = "Interface\\Icons\\INV_Misc_MonsterScales_15", description = "Increases Fire Resistance by 15 for 30 minutes." }, + { id = 12820, name = "Winterfall Firewater", texture = "Interface\\Icons\\INV_Misc_Powder_Mana", description = "Increases Attack Power by 35 for 20 minutes." }, + { id = 36001, name = "Nordanaar Herbal Tea", texture = "Interface\\Icons\\INV_Drink_Milk_05", description = "Restores 525 to 875 health and 810 to 1350 mana." }, + }, } + + consumablesList = {} consumablesNameToID = {} +consumablesTexture = {} +consumablesDescription = {} + for categoryName, consumables in pairs(consumablesCategories) do for _, consumable in ipairs(consumables) do consumablesList[consumable.id] = consumable.name consumablesNameToID[consumable.name] = consumable.id + consumablesTexture[consumable.id] = consumable.texture + consumablesDescription[consumable.id] = consumable.description end end - -consumablesTextures = { - -- Elixirs - [13452] = "Interface\\Icons\\INV_Potion_32", -- Elixir of the Mongoose - [9187] = "Interface\\Icons\\INV_Potion_94", -- Elixir of Greater Agility - [13453] = "Interface\\Icons\\INV_Potion_80", -- Elixir of Brute Force - [13447] = "Interface\\Icons\\INV_Potion_29", -- Elixir of the Sages - [3825] = "Interface\\Icons\\INV_Potion_43", -- Elixir of Fortitude - [9179] = "Interface\\Icons\\INV_Potion_10", -- Elixir of Greater Intellect - [13454] = "Interface\\Icons\\INV_Potion_22", -- Greater Arcane Elixir - [17708] = "Interface\\Icons\\INV_Potion_20", -- Elixir of Frost Power - [9264] = "Interface\\Icons\\INV_Potion_48", -- Elixir of Shadow Power - [6373] = "Interface\\Icons\\INV_Potion_38", -- Elixir of Firepower - [21546] = "Interface\\Icons\\INV_Potion_24", -- Elixir of Greater Firepower - [18294] = "Interface\\Icons\\INV_Potion_13", -- Elixir of Greater Water Breathing - [9088] = "Interface\\Icons\\INV_Potion_16", -- Gift of Arthas - [9155] = "Interface\\Icons\\INV_Potion_83", -- Arcane Elixir - - -- Protection Potions - [13457] = "Interface\\Icons\\INV_Potion_24", -- Greater Fire Protection Potion - [13456] = "Interface\\Icons\\INV_Potion_20", -- Greater Frost Protection Potion - [13458] = "Interface\\Icons\\INV_Potion_22", -- Greater Nature Protection Potion - [13459] = "Interface\\Icons\\INV_Potion_23", -- Greater Shadow Protection Potion - [13461] = "Interface\\Icons\\INV_Potion_25", -- Greater Arcane Protection Potion - [9036] = "Interface\\Icons\\INV_Potion_81", -- Magic Resistance Potion - - -- Utility Potions - [20008] = "Interface\\Icons\\INV_Potion_16", -- Living Action Potion - [5634] = "Interface\\Icons\\INV_Potion_04", -- Free Action Potion - [3387] = "Interface\\Icons\\INV_Potion_62", -- Limited Invulnerability Potion - [9030] = "Interface\\Icons\\INV_Potion_68", -- Restorative Potion - [13462] = "Interface\\Icons\\INV_Potion_27", -- Purification Potion - [9172] = "Interface\\Icons\\INV_Potion_31", -- Invisibility Potion - [2459] = "Interface\\Icons\\INV_Potion_95", -- Swiftness Potion - - -- Combat Potions - [13455] = "Interface\\Icons\\INV_Potion_67", -- Greater Stoneshield Potion - [13442] = "Interface\\Icons\\INV_Potion_41", -- Mighty Rage Potion - [5631] = "Interface\\Icons\\INV_Potion_24", -- Rage Potion - - -- Mana & Health Potions - [13444] = "Interface\\Icons\\INV_Potion_76", -- Major Mana Potion - [13446] = "Interface\\Icons\\INV_Potion_54", -- Major Healing Potion - [12190] = "Interface\\Icons\\INV_Potion_83", -- Dreamless Sleep Potion - [2456] = "Interface\\Icons\\INV_Potion_01", -- Minor Rejuvenation Potion - - -- Juju & Other Buffs - [12460] = "Interface\\Icons\\INV_Misc_MonsterScales_07", -- Juju Power - [12451] = "Interface\\Icons\\INV_Misc_MonsterScales_11", -- Juju Might - [12457] = "Interface\\Icons\\INV_Misc_MonsterScales_09", -- Juju Chill - [12455] = "Interface\\Icons\\INV_Misc_MonsterScales_15", -- Juju Ember - [12450] = "Interface\\Icons\\INV_Misc_MonsterScales_17", -- Juju Flurry - [8412] = "Interface\\Icons\\INV_Misc_Food_54", -- Ground Scorpok Assay - [8410] = "Interface\\Icons\\INV_Misc_Food_54", -- R.O.I.D.S. - [8411] = "Interface\\Icons\\INV_Drink_17", -- Lung Juice Cocktail - [18284] = "Interface\\Icons\\INV_Drink_05", -- Kreeg's Stout Beatdown - [21151] = "Interface\\Icons\\INV_Drink_04", -- Rumsey Rum Black Label - [12820] = "Interface\\Icons\\INV_Misc_Powder_Mana", -- Winterfall Firewater - - -- Food Buffs - [12662] = "Interface\\Icons\\INV_Misc_Organ_03", -- Demonic Rune (Assuming for Blasted Boar Lung) - [21023] = "Interface\\Icons\\INV_Misc_Food_47", -- Dirge's Kickin' Chimaerok Chops - [12210] = "Interface\\Icons\\INV_Misc_Food_47", -- Roast Raptor - [12217] = "Interface\\Icons\\INV_Misc_Food_41", -- Dragonbreath Chili - [18254] = "Interface\\Icons\\INV_Misc_Food_64", -- Runn Tum Tuber Surprise - [13931] = "Interface\\Icons\\INV_Misc_Food_47", -- Nightfin Soup - [21217] = "Interface\\Icons\\INV_Misc_Food_64", -- Sagefish Delight - [13928] = "Interface\\Icons\\INV_Misc_Food_51", -- Grilled Squid - [20452] = "Interface\\Icons\\INV_Misc_Food_62", -- Smoked Desert Dumplings - [12202] = "Interface\\Icons\\INV_Misc_Food_14", -- Tiger Meat (Assuming for Roast Raptor) -} - - diff --git a/ConsumesTracker.lua b/ConsumesTracker.lua index 98d561f..fe6dd9b 100644 --- a/ConsumesTracker.lua +++ b/ConsumesTracker.lua @@ -2,7 +2,7 @@ -- Metadata ------------------------------------------------------------------------------------------- AddonName = "Consumes Tracker" -Version = "1.2" +Version = "1.3" VState = "multi character (beta)" WindowWidth = 310 @@ -222,17 +222,23 @@ function ConsumeTracker_CreateMainWindow() end -- Tracker Tab - local tab1 = CreateTab("ConsumeTracker_MainFrameTab1", "Interface\\ICONS\\INV_Potion_93", 30, "Consumables Tracker", 1) + local tab1 = CreateTab("ConsumeTracker_MainFrameTab1", "Interface\\Icons\\INV_Potion_93", 30, "Consumables Tracker", 1) tab1:SetScript("OnClick", function() ConsumeTracker_ShowTab(1) end) -- Options Tab - local tab2 = CreateTab("ConsumeTracker_MainFrameTab2", "Interface\\ICONS\\INV_Misc_Gear_01", 80, "Options", 2) + local tab2 = CreateTab("ConsumeTracker_MainFrameTab2", "Interface\\Icons\\INV_Misc_Gear_01", 80, "Options", 2) tab2:SetScript("OnClick", function() ConsumeTracker_ShowTab(2) end) + -- Characters Tab + local tab3 = CreateTab("ConsumeTracker_MainFrameTab3", "Interface\\Icons\\Ability_Rogue_Disguise", 130, "Characters", 3) + tab3:SetScript("OnClick", function() + ConsumeTracker_ShowTab(3) + end) + -- Add Grey Line Under Tabs local tabsLine = ConsumeTracker_MainFrame:CreateTexture(nil, "ARTWORK") tabsLine:SetHeight(1) @@ -255,6 +261,12 @@ function ConsumeTracker_CreateMainWindow() tab2Content:SetPoint("TOPLEFT", ConsumeTracker_MainFrame, "TOPLEFT", 30, -80) ConsumeTracker_MainFrame.tabs[2] = tab2Content + local tab3Content = CreateFrame("Frame", nil, ConsumeTracker_MainFrame) + tab3Content:SetWidth(WindowWidth - 50) + tab3Content:SetHeight(380) + tab3Content:SetPoint("TOPLEFT", ConsumeTracker_MainFrame, "TOPLEFT", 30, -80) + ConsumeTracker_MainFrame.tabs[3] = tab3Content + -- Footer Text local footerText = ConsumeTracker_MainFrame:CreateFontString(nil, "OVERLAY", "GameFontNormalSmall") footerText:SetText("Made by Horyoshi (v" .. Version .. "-" .. VState .. ")") @@ -288,6 +300,7 @@ function ConsumeTracker_CreateMainWindow() -- Add Custom Content for Tabs ConsumeTracker_CreateTrackerContent(tab1Content) ConsumeTracker_CreateOptionsContent(tab2Content) + ConsumeTracker_CreateCharactersContent(tab3Content) end @@ -469,7 +482,6 @@ function ConsumeTracker_CreateTrackerContent(parentFrame) ConsumeTracker_UpdateTrackerScrollBar() end - -- Function to create the content of the Options tab function ConsumeTracker_CreateOptionsContent(parentFrame) -- Scroll Frame @@ -563,6 +575,16 @@ function ConsumeTracker_CreateOptionsContent(parentFrame) optionFrame:SetScript("OnMouseDown", function() checkbox:Click() end) + + -- Mouseover Tooltip + optionFrame:SetScript("OnEnter", function() + ConsumeTracker_ShowOptionsTooltip(currentItemID) + end) + optionFrame:SetScript("OnLeave", function() + if ConsumeTracker_OptionsTooltip then + ConsumeTracker_OptionsTooltip:Hide() + end + end) end -- Add some spacing after each category @@ -598,6 +620,160 @@ function ConsumeTracker_CreateOptionsContent(parentFrame) ConsumeTracker_UpdateOptionsScrollBar() end +function ConsumeTracker_CreateCharactersContent(parentFrame) + -- Scroll Frame + local scrollFrame = CreateFrame("ScrollFrame", "ConsumeTracker_CharactersScrollFrame", parentFrame) + scrollFrame:SetPoint("TOPLEFT", parentFrame, "TOPLEFT", 0, 0) + scrollFrame:SetPoint("BOTTOMRIGHT", parentFrame, "BOTTOMRIGHT", -20, 0) + scrollFrame:EnableMouseWheel(true) + scrollFrame:SetScript("OnMouseWheel", function() + local delta = arg1 + local current = scrollFrame:GetVerticalScroll() + local maxScroll = scrollFrame.maxScroll or 0 + local newScroll = math.max(0, math.min(current - (delta * 20), maxScroll)) + scrollFrame:SetVerticalScroll(newScroll) + if parentFrame.scrollBar then + parentFrame.scrollBar:SetValue(newScroll) + end + end) + + -- Scroll Child Frame + local scrollChild = CreateFrame("Frame", nil, scrollFrame) + scrollChild:SetWidth(WindowWidth - 10) + scrollChild:SetHeight(1) + scrollFrame:SetScrollChild(scrollChild) + + -- Initialize variables + parentFrame.checkboxes = {} + local index = 0 -- Position index + + -- Ensure settings table for characters exists + ConsumeTracker_Settings["Characters"] = ConsumeTracker_Settings["Characters"] or {} + + -- Get list of characters + local realmName = GetRealmName() + local faction = UnitFactionGroup("player") + local playerName = UnitName("player") + + local characterList = {} + + -- Ensure data structure exists + if ConsumeTracker_Data[realmName] and ConsumeTracker_Data[realmName][faction] then + for characterName, _ in pairs(ConsumeTracker_Data[realmName][faction]) do + table.insert(characterList, characterName) + end + end + + -- Ensure current character is included + local playerInList = false + for _, name in ipairs(characterList) do + if name == playerName then + playerInList = true + break + end + end + if not playerInList then + table.insert(characterList, playerName) + end + + -- Sort the character list + table.sort(characterList) + + -- Create FontString for title + local title = scrollChild:CreateFontString(nil, "OVERLAY", "GameFontNormal") + title:SetPoint("TOPLEFT", scrollChild, "TOPLEFT", 0, 0) -- Offset from the top + title:SetText("Select Characters to Track") + title:SetTextColor(1, 1, 1) + + -- Offset index to start below the title + local startYOffset = 20 + + -- For each character + for _, characterName in ipairs(characterList) do + index = index + 1 + + -- Create a local copy of characterName for the closure + local currentCharacterName = characterName + + -- Create a frame that encompasses the checkbox and label + local optionFrame = CreateFrame("Frame", "ConsumeTracker_CharacterFrame" .. index, scrollChild) + optionFrame:SetWidth(WindowWidth - 10) + optionFrame:SetHeight(18) + optionFrame:SetPoint("TOPLEFT", scrollChild, "TOPLEFT", 0, -(startYOffset + (index - 1) * 20)) + + -- Create the checkbox inside the optionFrame + local checkbox = CreateFrame("CheckButton", "ConsumeTracker_CharacterCheckbox" .. index, optionFrame) + checkbox:SetWidth(16) + checkbox:SetHeight(16) + checkbox:SetPoint("LEFT", optionFrame, "LEFT", 0, 0) + + -- Create Textures for the checkbox + checkbox:SetNormalTexture("Interface\\Buttons\\UI-CheckBox-Up") + checkbox:SetPushedTexture("Interface\\Buttons\\UI-CheckBox-Down") + checkbox:SetHighlightTexture("Interface\\Buttons\\UI-CheckBox-Highlight") + checkbox:SetCheckedTexture("Interface\\Buttons\\UI-CheckBox-Check") + + -- Create FontString for label + local label = optionFrame:CreateFontString(nil, "OVERLAY", "GameFontNormal") + label:SetPoint("LEFT", checkbox, "RIGHT", 4, 0) + label:SetText(currentCharacterName) + + -- Set up the checkbox OnClick handler + checkbox:SetScript("OnClick", function() + if checkbox:GetChecked() then + ConsumeTracker_Settings["Characters"][currentCharacterName] = true + else + ConsumeTracker_Settings["Characters"][currentCharacterName] = false + end + ConsumeTracker_UpdateTrackerContent() + end) + -- Load saved setting + if ConsumeTracker_Settings["Characters"][currentCharacterName] == nil then + -- Default to checked + checkbox:SetChecked(true) + ConsumeTracker_Settings["Characters"][currentCharacterName] = true + else + checkbox:SetChecked(ConsumeTracker_Settings["Characters"][currentCharacterName]) + end + parentFrame.checkboxes[currentCharacterName] = checkbox + + -- Make the optionFrame clickable (so clicking on the label checks/unchecks the box) + optionFrame:EnableMouse(true) + optionFrame:SetScript("OnMouseDown", function() + checkbox:Click() + end) + end + + -- Adjust the scroll child height + scrollChild.contentHeight = startYOffset + index * 20 + scrollChild:SetHeight(scrollChild.contentHeight) + + -- Scroll Bar + local scrollBar = CreateFrame("Slider", "ConsumeTracker_CharactersScrollBar", parentFrame) + scrollBar:SetPoint("TOPRIGHT", parentFrame, "TOPRIGHT", -2, -16) + scrollBar:SetPoint("BOTTOMRIGHT", parentFrame, "BOTTOMRIGHT", -2, 16) + scrollBar:SetWidth(16) + scrollBar:SetOrientation('VERTICAL') + scrollBar:SetThumbTexture("Interface\\Buttons\\UI-ScrollBar-Knob") + scrollBar:SetBackdrop({ + bgFile = "Interface\\Buttons\\UI-SliderBar-Background", + edgeFile = "Interface\\Buttons\\UI-SliderBar-Border", + tile = true, tileSize = 8, edgeSize = 8, + insets = { left = 3, right = 3, top = 3, bottom = 3 } + }) + scrollBar:SetScript("OnValueChanged", function() + local value = scrollBar:GetValue() + scrollFrame:SetVerticalScroll(value) + end) + parentFrame.scrollBar = scrollBar + parentFrame.scrollFrame = scrollFrame + parentFrame.scrollChild = scrollChild + + -- Update the scrollbar + ConsumeTracker_UpdateCharactersScrollBar() +end + + function ConsumeTracker_UpdateTrackerContent() if not ConsumeTracker_MainFrame or not ConsumeTracker_MainFrame.tabs or not ConsumeTracker_MainFrame.tabs[1] then return @@ -671,6 +847,9 @@ function ConsumeTracker_UpdateTrackerContent() categoryLabel:Hide() end + -- Ensure character settings exist + ConsumeTracker_Settings["Characters"] = ConsumeTracker_Settings["Characters"] or {} + -- Iterate over categories for _, categoryName in ipairs(sortedCategories) do local consumables = consumablesCategories[categoryName] @@ -700,13 +879,15 @@ function ConsumeTracker_UpdateTrackerContent() hasAnyVisibleItems = true -- Set to true when an item is displayed totalCounts[itemID] = 0 -- Initialize count - -- Sum counts across all characters + -- Sum counts across all selected characters for character, charData in pairs(data) do - -- Ensure charData["inventory"], ["bank"], ["mail"] are initialized - local inventory = charData["inventory"] and charData["inventory"][itemID] or 0 - local bank = charData["bank"] and charData["bank"][itemID] or 0 - local mail = charData["mail"] and charData["mail"][itemID] or 0 - totalCounts[itemID] = totalCounts[itemID] + inventory + bank + mail + if ConsumeTracker_Settings["Characters"][character] == true then + -- Proceed with counting + local inventory = charData["inventory"] and charData["inventory"][itemID] or 0 + local bank = charData["bank"] and charData["bank"][itemID] or 0 + local mail = charData["mail"] and charData["mail"][itemID] or 0 + totalCounts[itemID] = totalCounts[itemID] + inventory + bank + mail + end end -- Show and position item label @@ -787,7 +968,6 @@ end - function ConsumeTracker_UpdateTrackerScrollBar() local trackerFrame = ConsumeTracker_MainFrame.tabs[1] local scrollBar = trackerFrame.scrollBar @@ -813,7 +993,6 @@ end --- Function to update the options scrollbar function ConsumeTracker_UpdateOptionsScrollBar() local optionsFrame = ConsumeTracker_MainFrame.tabs[2] local scrollBar = optionsFrame.scrollBar @@ -837,6 +1016,31 @@ function ConsumeTracker_UpdateOptionsScrollBar() end end + +function ConsumeTracker_UpdateCharactersScrollBar() + local charactersFrame = ConsumeTracker_MainFrame.tabs[3] + local scrollBar = charactersFrame.scrollBar + local scrollFrame = charactersFrame.scrollFrame + local scrollChild = charactersFrame.scrollChild + + local totalHeight = scrollChild.contentHeight + local shownHeight = 320 -- Adjust based on your UI + + local maxScroll = math.max(0, totalHeight - shownHeight) + scrollFrame.maxScroll = maxScroll + + if totalHeight > shownHeight then + scrollBar:SetMinMaxValues(0, maxScroll) + scrollBar:SetValue(math.min(scrollBar:GetValue(), maxScroll)) + scrollBar:Show() + else + scrollBar:SetMinMaxValues(0, 0) + scrollBar:SetValue(0) + scrollBar:Hide() + end +end + + function ConsumeTracker_ShowConsumableTooltip(itemID) -- Ensure item is enabled in settings if not ConsumeTracker_Settings[itemID] then @@ -869,8 +1073,16 @@ function ConsumeTracker_ShowConsumableTooltip(itemID) title:SetPoint("TOPLEFT", icon, "TOPRIGHT", 10, -2) title:SetPoint("RIGHT", tooltipFrame, "RIGHT", -10, 0) title:SetJustifyH("LEFT") + title:SetTextColor(1,1,1) tooltipFrame.title = title + -- Item Total + local total = tooltipFrame:CreateFontString(nil, "OVERLAY", "GameFontNormalLarge") + total:SetPoint("TOPLEFT", icon, "TOPRIGHT", 10, -20) + total:SetPoint("RIGHT", tooltipFrame, "RIGHT", -10, 0) + total:SetJustifyH("LEFT") + tooltipFrame.total = total + -- Content text local content = tooltipFrame:CreateFontString(nil, "OVERLAY", "GameFontNormalSmall") content:SetPoint("TOPLEFT", icon, "BOTTOMLEFT", 0, -10) @@ -885,8 +1097,8 @@ function ConsumeTracker_ShowConsumableTooltip(itemID) -- Get item info local itemName = consumablesList[itemID] or "Unknown Item" - local itemTexture = consumablesTextures[itemID] or "Interface\\Icons\\INV_Misc_QuestionMark" - + local itemTexture = consumablesTexture[itemID] or "Interface\\Icons\\INV_Misc_QuestionMark" + -- Set icon and title tooltipFrame.icon:SetTexture(itemTexture) tooltipFrame.title:SetText(itemName) @@ -909,45 +1121,61 @@ function ConsumeTracker_ShowConsumableTooltip(itemID) local hasItems = false local characterList = {} + -- Ensure character settings exist + ConsumeTracker_Settings["Characters"] = ConsumeTracker_Settings["Characters"] or {} + -- Collect data for each character for character, charData in pairs(data) do - local inventory = charData["inventory"] and charData["inventory"][itemID] or 0 - local bank = charData["bank"] and charData["bank"][itemID] or 0 - local mail = charData["mail"] and charData["mail"][itemID] or 0 - local total = inventory + bank + mail + if ConsumeTracker_Settings["Characters"][character] == true then + local inventory = charData["inventory"] and charData["inventory"][itemID] or 0 + local bank = charData["bank"] and charData["bank"][itemID] or 0 + local mail = charData["mail"] and charData["mail"][itemID] or 0 + local total = inventory + bank + mail - if total > 0 then - hasItems = true - totalInventory = totalInventory + inventory - totalBank = totalBank + bank - totalMail = totalMail + mail + if total > 0 then + hasItems = true + totalInventory = totalInventory + inventory + totalBank = totalBank + bank + totalMail = totalMail + mail - table.insert(characterList, { - name = character, - inventory = inventory, - bank = bank, - mail = mail, - total = total, - isPlayer = (character == playerName) - }) + table.insert(characterList, { + name = character, + inventory = inventory, + bank = bank, + mail = mail, + total = total, + isPlayer = (character == playerName) + }) + end end end local totalItems = totalInventory + totalBank + totalMail + -- Adjust label color based on count + if totalItems == 0 then + tooltipFrame.total:SetTextColor(1, 0, 0) -- Red + elseif totalItems < 10 then + tooltipFrame.total:SetTextColor(1, 0.4, 0) -- Orange + elseif totalItems <= 20 then + tooltipFrame.total:SetTextColor(1, 0.85, 0) -- Yellow + else + tooltipFrame.total:SetTextColor(0, 1, 0) -- Green + end + + tooltipFrame.total:SetText("Total: " .. totalItems) if not hasItems then contentText = contentText .. "|cffff0000No items found for this consumable.|r" else - -- Display total counts at the top - contentText = contentText .. "|cffffff00Total:|r " .. totalItems .. "\n\n" -- Sort characters alphabetically (optional) table.sort(characterList, function(a, b) return a.name < b.name end) -- Display data for each character for _, charInfo in ipairs(characterList) do - local nameColor = charInfo.isPlayer and "|cff00ff00" or "|cffcccccc" -- Green for player, grey for others - contentText = contentText .. nameColor .. charInfo.name .. ": " .. charInfo.total .. "|r\n" + + local nameColor = charInfo.isPlayer and "|cff00ff00" or "|cffffffff" -- Green for player, grey for others + contentText = contentText .. nameColor .. charInfo.name .. " (" .. charInfo.total .. ")|r\n" local detailText = "" if charInfo.inventory > 0 then @@ -959,6 +1187,7 @@ function ConsumeTracker_ShowConsumableTooltip(itemID) if charInfo.mail > 0 then detailText = detailText .. "|cffffffffMail:|r " .. charInfo.mail .. " " end + contentText = contentText .. " " .. detailText .. "\n\n" end end @@ -987,7 +1216,112 @@ function ConsumeTracker_ShowConsumableTooltip(itemID) end +function ConsumeTracker_ShowOptionsTooltip(itemID) + -- Set the maximum width for the description text + local maxDescriptionWidth = 160 + -- Create or reuse the tooltip frame + if not ConsumeTracker_OptionsTooltip then + -- Create the frame + local tooltipFrame = CreateFrame("Frame", "ConsumeTracker_OptionsTooltip", UIParent) + tooltipFrame:SetFrameStrata("TOOLTIP") + tooltipFrame:SetBackdrop({ + bgFile = "Interface\\Tooltips\\UI-Tooltip-Background", + edgeFile = "Interface\\Tooltips\\UI-Tooltip-Border", + tile = true, tileSize = 16, edgeSize = 16, + insets = { left = 4, right = 4, top = 4, bottom = 4 } + }) + tooltipFrame:SetBackdropColor(0, 0, 0, 1) + + -- Item icon + local icon = tooltipFrame:CreateTexture(nil, "ARTWORK") + icon:SetWidth(32) + icon:SetHeight(32) + icon:SetPoint("TOPLEFT", tooltipFrame, "TOPLEFT", 10, -10) + tooltipFrame.icon = icon + + -- Item name + local title = tooltipFrame:CreateFontString(nil, "OVERLAY", "GameFontNormal") + title:SetPoint("TOPLEFT", icon, "TOPRIGHT", 10, -2) + title:SetJustifyH("LEFT") + tooltipFrame.title = title + + -- Item description + local description = tooltipFrame:CreateFontString(nil, "OVERLAY", "GameFontNormalSmall") + description:SetPoint("TOPLEFT", icon, "TOPRIGHT", 10, -16) + description:SetWidth(maxDescriptionWidth) + description:SetJustifyH("LEFT") + description:SetTextColor(1, 1, 1) + tooltipFrame.description = description + + ConsumeTracker_OptionsTooltip = tooltipFrame + end + + local tooltipFrame = ConsumeTracker_OptionsTooltip + + -- Get item info + local itemName = consumablesList[itemID] or "Unknown Item" + local itemTexture = consumablesTexture[itemID] or "Interface\\Icons\\INV_Misc_QuestionMark" + local itemDescription = consumablesDescription[itemID] or "" + + -- Function to add line breaks manually + local function WrapText(text, maxWidth, fontObject) + local wrappedText = "" + local currentLine = "" + local space = " " + local testString = tooltipFrame:CreateFontString(nil, "OVERLAY", fontObject) + testString:SetWidth(0) + testString:SetHeight(0) + testString:Hide() -- We don't need to display this + + -- Replace \n with spaces to avoid unintended line breaks + text = string.gsub(text, "\n", " ") + + -- Split the text into words + for word in string.gfind(text, "%S+") do + local testLine = currentLine == "" and word or (currentLine .. space .. word) + testString:SetText(testLine) + if testString:GetStringWidth() > maxWidth then + wrappedText = wrappedText == "" and currentLine or (wrappedText .. "\n" .. currentLine) + currentLine = word + else + currentLine = testLine + end + end + wrappedText = wrappedText == "" and currentLine or (wrappedText .. "\n" .. currentLine) + return wrappedText + end + + -- Wrap the description text + local wrappedDescription = WrapText(itemDescription, maxDescriptionWidth, "GameFontNormalSmall") + + -- Set icon, title, and description + tooltipFrame.icon:SetTexture(itemTexture) + tooltipFrame.title:SetText(itemName) + tooltipFrame.description:SetText(wrappedDescription) + + -- Calculate the number of lines in the wrapped description + local _, lineCount = string.gsub(wrappedDescription, "\n", "") + lineCount = lineCount + 1 -- Add 1 for the last line + + -- Set the heights for the description and the tooltip frame + local lineHeight = 12 + tooltipFrame.description:SetHeight(lineCount * lineHeight) + + local totalHeight = 50 + (lineCount * lineHeight) + tooltipFrame:SetHeight(totalHeight) + + -- Set the width of the tooltip + local maxWidth = math.max(tooltipFrame.title:GetStringWidth() + 70, tooltipFrame.description:GetStringWidth() + 70) + tooltipFrame:SetWidth(maxWidth) + + -- Position the tooltip near the cursor + local x, y = GetCursorPosition() + local scale = UIParent:GetEffectiveScale() + tooltipFrame:SetPoint("BOTTOMLEFT", UIParent, "BOTTOMLEFT", x / scale + 10, y / scale - 10) + + tooltipFrame:Show() +end diff --git a/ConsumesTracker.toc b/ConsumesTracker.toc index 5ceac82..7b5adfd 100644 --- a/ConsumesTracker.toc +++ b/ConsumesTracker.toc @@ -2,7 +2,7 @@ ## Title: |cff00ff00Consumes Tracker|r |cff808080[Horyoshi]|r ## Notes: Tracks your inventory, bank and mail for consumables. Works through multiple characters on the same account. ## Author: Horyoshi -## Version: 1.2 +## Version: 1.3 ## SavedVariables: ConsumeTracker_Settings, ConsumeTracker_Data ConsumesTracker.lua diff --git a/images/minimap_icon.tga b/images/minimap_icon.tga index ddb8094..6045b23 100644 Binary files a/images/minimap_icon.tga and b/images/minimap_icon.tga differ