-- ************************************************************************** -- * TitanAmmo.lua -- * -- * By: Titan Panel Development Team -- ************************************************************************** -- 2019 Aug - reverted and updated for Classic -- -- This will track the number of ammo (bows and guns) or thrown (knives) the character -- has. -- Ammo is placed in the 'ammo' slot where Blizzard counts ALL of that *type of ammo* -- regardless of where it is in your bags. -- Thrown is placed in the actual weapon slot where Blizzard counts ALL of that *type of thrown* -- as being in that slot. -- The difference forces a different routine to be used. This causes the routine to always check -- which is being used. -- ******************************** Constants ******************************* local _G = getfenv(0); local TITAN_AMMO_ID = "Ammo"; local TITAN_AMMO_THRESHOLD_TABLE = { Values = { 150, 300, 500 }, Colors = { RED_FONT_COLOR, ORANGE_FONT_COLOR, NORMAL_FONT_COLOR, HIGHLIGHT_FONT_COLOR }, } -- ******************************** Variables ******************************* local class = select(2, UnitClass("player")) local ammoSlotID = GetInventorySlotInfo("AmmoSlot") local rangedSlotID = GetInventorySlotInfo("RangedSlot") local count = 0; local isThrown = nil; local isAmmo = nil; local currentlink = ""; local AmmoName = ""; local L = LibStub("AceLocale-3.0"):GetLocale("Titan", true) -- ******************************** Functions ******************************* -- ************************************************************************** -- NAME : TitanPanelAmmoButton_OnLoad() -- DESC : Registers the plugin upon it loading -- ************************************************************************** function TitanPanelAmmoButton_OnLoad(self) self.registry = { id = TITAN_AMMO_ID, --builtIn = 1, category = "Built-ins", version = TITAN_VERSION, menuText = L["TITAN_AMMO_MENU_TEXT"], buttonTextFunction = "TitanPanelAmmoButton_GetButtonText", tooltipTitle = L["TITAN_AMMO_TOOLTIP"], icon = "Interface\\AddOns\\TitanClassicAmmo\\TitanClassicThrown", iconWidth = 16, controlVariables = { ShowIcon = true, ShowLabelText = true, ShowRegularText = false, ShowColoredText = true, DisplayOnRightSide = false }, savedVariables = { ShowIcon = 1, ShowLabelText = 1, ShowColoredText = 1, ShowAmmoName = false, } }; self:SetScript("OnEvent", function(_, event, arg1, ...) if event == "PLAYER_LOGIN" then TitanPanelAmmoButton_PLAYER_LOGIN() elseif event == "UNIT_INVENTORY_CHANGED" then TitanPanelAmmoButton_UNIT_INVENTORY_CHANGED(arg1, ...) elseif event == "UPDATE_INVENTORY_DURABILITY" then TitanPanelAmmoButton_UPDATE_INVENTORY_DURABILITY() elseif event == "MERCHANT_CLOSED" or event == "PLAYER_ENTERING_WORLD" then TitanPanelAmmoButton_MERCHANT_CLOSED() elseif event == "ACTIONBAR_HIDEGRID" then TitanPanelAmmoButton_ACTIONBAR_HIDEGRID() end end) TitanPanelAmmoButton:RegisterEvent("PLAYER_LOGIN") end function TitanPanelAmmoButton_PLAYER_LOGIN() -- Class check if class ~= "ROGUE" and class ~= "WARRIOR" and class ~= "HUNTER" then TitanPanelAmmoButton_PLAYER_LOGIN = nil return end --TitanDebug("TitanPanelAmmoButton_PLAYER_LOGIN") local itemlink = GetInventoryItemLink("player", rangedSlotID) currentlink = itemlink; local loc = ""; if itemlink then loc = select(9, GetItemInfo(itemlink)) end if loc == "INVTYPE_THROWN" then TitanPanelAmmoButton:RegisterEvent("UPDATE_INVENTORY_DURABILITY") isThrown = true; isAmmo = nil; else TitanPanelAmmoButton:RegisterEvent("ACTIONBAR_HIDEGRID") isAmmo = true; isThrown = nil; end TitanPanelAmmoButton:RegisterEvent("UNIT_INVENTORY_CHANGED") TitanPanelAmmoButton:RegisterEvent("MERCHANT_CLOSED") TitanPanelAmmoButton:RegisterEvent("PLAYER_ENTERING_WORLD") TitanPanelAmmoButton_PLAYER_LOGIN = nil end function TitanPanelAmmoButton_UNIT_INVENTORY_CHANGED(arg1, ...) if arg1 == "player" then TitanPanelAmmoUpdateDisplay(); if isThrown then count = GetInventoryItemCount("player", rangedSlotID) or count elseif isAmmo then --and GetInventoryItemLink("player", ammoSlotID) count = GetInventoryItemCount("player", ammoSlotID) or count -- AmmoName = GetItemInfo(GetInventoryItemLink("player", ammoSlotID)) or _G["UNKNOWN"] else --isThrown = nil; count = 0; AmmoName = ""; end TitanPanelButton_UpdateButton(TITAN_AMMO_ID); end end function TitanPanelAmmoButton_UPDATE_INVENTORY_DURABILITY() count = GetInventoryItemCount("player", rangedSlotID) or count -- GetInventoryItemDurability(rangedSlotID) or count TitanPanelButton_UpdateButton(TITAN_AMMO_ID); end function TitanPanelAmmoButton_MERCHANT_CLOSED() if isThrown then count = GetInventoryItemCount("player", rangedSlotID) or count elseif isAmmo then --and GetInventoryItemLink("player", ammoSlotID) count = GetInventoryItemCount("player", ammoSlotID) or count -- AmmoName = GetItemInfo(GetInventoryItemLink("player", ammoSlotID)) or _G["UNKNOWN"] else count = 0; AmmoName = ""; end TitanPanelButton_UpdateButton(TITAN_AMMO_ID); end function TitanPanelAmmoButton_ACTIONBAR_HIDEGRID() local prev = 0 TitanPanelAmmoButton:SetScript("OnUpdate", function(_, e) prev = prev + e if prev > 2 then TitanPanelAmmoButton:SetScript("OnUpdate", nil) count = GetInventoryItemCount("player", ammoSlotID) or count TitanPanelButton_UpdateButton(TITAN_AMMO_ID); end end) end function TitanPanelAmmoUpdateDisplay() -- Manual Display update in case the rangedSlot it switched local itemlink = GetInventoryItemLink("player", rangedSlotID) local loc = ""; if itemlink == currentlink then return else currentlink = itemlink end if itemlink then loc = select(9, GetItemInfo(itemlink)) end if loc == "INVTYPE_THROWN" then if TitanPanelAmmoButton:IsEventRegistered("ACTIONBAR_HIDEGRID") then TitanPanelAmmoButton:UnregisterEvent("ACTIONBAR_HIDEGRID") TitanPanelAmmoButton:SetScript("OnUpdate", nil) end if not TitanPanelAmmoButton:IsEventRegistered("UPDATE_INVENTORY_DURABILITY") then TitanPanelAmmoButton:RegisterEvent("UPDATE_INVENTORY_DURABILITY") end isThrown = true; isAmmo = nil; count = GetInventoryItemCount("player", rangedSlotID) or count -- count = GetInventoryItemDurability(rangedSlotID); else if TitanPanelAmmoButton:IsEventRegistered("UPDATE_INVENTORY_DURABILITY") then TitanPanelAmmoButton:UnregisterEvent("UPDATE_INVENTORY_DURABILITY") end if not TitanPanelAmmoButton:IsEventRegistered("ACTIONBAR_HIDEGRID") then TitanPanelAmmoButton:RegisterEvent("ACTIONBAR_HIDEGRID") end isAmmo = true; isThrown = nil; count = GetInventoryItemCount("player", ammoSlotID) end TitanPanelButton_UpdateButton(TITAN_AMMO_ID); end -- ************************************************************************** -- NAME : TitanPanelAmmoButton_GetButtonText(id) -- DESC : Calculate ammo/thrown logic then display data on button -- VARS : id = button ID -- ************************************************************************** function TitanPanelAmmoButton_GetButtonText(id) local labelText, ammoText, ammoRichText, color; -- safeguard to prevent malformed labels if not count then count = 0 end if (isThrown) then labelText = L["TITAN_AMMO_BUTTON_LABEL_THROWN"]; ammoText = format(L["TITAN_AMMO_FORMAT"], count); elseif (isAmmo) then labelText = L["TITAN_AMMO_BUTTON_LABEL_AMMO"]; ammoText = format(L["TITAN_AMMO_FORMAT"], count); if TitanGetVar(TITAN_AMMO_ID, "ShowAmmoName") and AmmoName ~= "" then ammoText = ammoText.."|cffffff9a".." ("..AmmoName..")".."|r" end else count = 0; labelText = L["TITAN_AMMO_BUTTON_LABEL_AMMO_THROWN"]; ammoText = L["TITAN_AMMO_BUTTON_NOAMMO"]; end if (TitanGetVar(TITAN_AMMO_ID, "ShowColoredText")) then color = TitanUtils_GetThresholdColor(TITAN_AMMO_THRESHOLD_TABLE, count); ammoRichText = TitanUtils_GetColoredText(ammoText, color); else ammoRichText = TitanUtils_GetHighlightText(ammoText); end return labelText, ammoRichText; end -- ************************************************************************** -- NAME : TitanPanelRightClickMenu_PrepareAmmoMenu() -- DESC : Display rightclick menu options -- ************************************************************************** function TitanPanelRightClickMenu_PrepareAmmoMenu() local info = {}; TitanPanelRightClickMenu_AddTitle(TitanPlugins[TITAN_AMMO_ID].menuText); TitanPanelRightClickMenu_AddToggleIcon(TITAN_AMMO_ID); TitanPanelRightClickMenu_AddToggleLabelText(TITAN_AMMO_ID); TitanPanelRightClickMenu_AddToggleColoredText(TITAN_AMMO_ID); info.text = L["TITAN_AMMO_BULLET_NAME"]; info.func = function() TitanPanelRightClickMenu_ToggleVar({TITAN_AMMO_ID, "ShowAmmoName"}) TitanPanelButton_UpdateButton(TITAN_AMMO_ID); end info.checked = TitanUtils_Ternary(TitanGetVar(TITAN_AMMO_ID, "ShowAmmoName"), 1, nil); L_UIDropDownMenu_AddButton(info); TitanPanelRightClickMenu_AddSpacer(); TitanPanelRightClickMenu_AddCommand(L["TITAN_PANEL_MENU_HIDE"], TITAN_AMMO_ID, TITAN_PANEL_MENU_FUNC_HIDE); end