Quantcast
-- **************************************************************************
-- * TitanAmmo.lua
-- *
-- * By: TitanMod, Dark Imakuni, Adsertor and the Titan Development Team
-- *     (HonorGoG, jaketodd422, joejanko, Lothayer, Tristanian)
-- **************************************************************************

-- ******************************** 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\\TitanAmmo\\TitanThrown",
          iconWidth = 16,
		controlVariables = {
			ShowIcon = true,
			ShowLabelText = true,
			ShowRegularText = false,
			ShowColoredText = true,
			DisplayOnRightSide = false
		},
          savedVariables = {
               ShowIcon = 1,
               ShowLabelText = 1,
               ShowColoredText = 1,
               ShowAmmoName = false,
          }
     };
--TitanDebug("TitanPanelAmmoButton_OnLoad")

self:SetScript("OnEvent",  function(_, event, arg1, ...)

--TitanDebug("OnEvent")
		if event == "PLAYER_LOGIN" then
--TitanDebug("PLAYER_LOGIN")
			TitanPanelAmmoButton_PLAYER_LOGIN()
		elseif event == "UNIT_INVENTORY_CHANGED" then
--TitanDebug("UNIT_INVENTORY_CHANGED")
			TitanPanelAmmoButton_UNIT_INVENTORY_CHANGED(arg1, ...)
		elseif event == "UPDATE_INVENTORY_DURABILITY" then
--TitanDebug("UPDATE_INVENTORY_DURABILITY")
			TitanPanelAmmoButton_UPDATE_INVENTORY_DURABILITY()
		elseif event == "MERCHANT_CLOSED" or event == "PLAYER_ENTERING_WORLD" then
--TitanDebug("MERCHANT_CLOSED / PLAYER_ENTERING_WORLD")
			TitanPanelAmmoButton_MERCHANT_CLOSED()
		elseif event == "ACTIONBAR_HIDEGRID" then
			TitanPanelAmmoButton_ACTIONBAR_HIDEGRID()
		end

end)
	TitanPanelAmmoButton:RegisterEvent("PLAYER_LOGIN")
--[[
	TitanPanelAmmoButton:RegisterEvent("UNIT_INVENTORY_CHANGED")
	TitanPanelAmmoButton:RegisterEvent("UPDATE_INVENTORY_DURABILITY")
	TitanPanelAmmoButton:RegisterEvent("MERCHANT_CLOSED")
	TitanPanelAmmoButton:RegisterEvent("PLAYER_ENTERING_WORLD")
	TitanPanelAmmoButton:RegisterEvent("ACTIONBAR_HIDEGRID")
--]]
end
--[[
function TitanClassicAmmo_OnEvent(self, event, ...)
	if (event == "PLAYER_LOGIN") then
			TitanPanelAmmoButton_PLAYER_LOGIN()
		return;
	end
	if (event == "UNIT_INVENTORY_CHANGED") then
			TitanPanelAmmoButton_UNIT_INVENTORY_CHANGED()
		return;
	end
	if (event == "UPDATE_INVENTORY_DURABILITY") then
			TitanPanelAmmoButton_UPDATE_INVENTORY_DURABILITY()
		return;
	end
	if (event == "MERCHANT_CLOSED" or event == "PLAYER_ENTERING_WORLD") then
			TitanPanelAmmoButton_MERCHANT_CLOSED()
		return;
	end
	if (event == "ACTIONBAR_HIDEGRID") then
			TitanPanelAmmoButton_ACTIONBAR_HIDEGRID()
		return;
	end
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
--TitanDebug("TitanPanelAmmoButton_UNIT_INVENTORY_CHANGED")
 	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);
-- 	if isAmmo then
--	TitanDebug("ammoSlotID: " .. ammoSlotID);
--	TitanDebug("GetInventoryItemLink: " .. tostring(GetInventoryItemLink("player", ammoSlotID)));
--  		if GetInventoryItemLink("player", ammoSlotID) then
--				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
 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
-- 	count = GetInventoryItemDurability(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


function TitanPanelAmmoButton_ACTIONBAR_HIDEGRID()
	local prev = 0
	TitanPanelAmmoButton:SetScript("OnUpdate", function(_, e)
		prev = prev + e
		if prev > 2 then
			TitanPanelAmmoButton:SetScript("OnUpdate", nil)
--			if GetInventoryItemLink("player", ammoSlotID) then
				count = GetInventoryItemCount("player", ammoSlotID) or count
--			else
--				count = 0;
--			end
			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;
--			if GetInventoryItemLink("player", ammoSlotID) then
				count = GetInventoryItemCount("player", ammoSlotID)
--			else
--				count = 0;
--			end

		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