134 lines
4.6 KiB
Lua
134 lines
4.6 KiB
Lua
-- ------------------------------------------------------------------------------ --
|
|
-- TradeSkillMaster --
|
|
-- https://tradeskillmaster.com --
|
|
-- All Rights Reserved - Detailed license information included with addon. --
|
|
-- ------------------------------------------------------------------------------ --
|
|
|
|
local _, TSM = ...
|
|
local Merchant = TSM.Accounting:NewPackage("Merchant")
|
|
local Event = TSM.Include("Util.Event")
|
|
local Math = TSM.Include("Util.Math")
|
|
local ItemString = TSM.Include("Util.ItemString")
|
|
local ItemInfo = TSM.Include("Service.ItemInfo")
|
|
local private = {
|
|
repairMoney = 0,
|
|
couldRepair = nil,
|
|
repairCost = 0,
|
|
pendingSales = {
|
|
itemString = {},
|
|
quantity = {},
|
|
copper = {},
|
|
insertTime = {},
|
|
},
|
|
}
|
|
|
|
|
|
|
|
-- ============================================================================
|
|
-- Module Functions
|
|
-- ============================================================================
|
|
|
|
function Merchant.OnInitialize()
|
|
Event.Register("MERCHANT_SHOW", private.SetupRepairCost)
|
|
Event.Register("BAG_UPDATE_DELAYED", private.OnMerchantUpdate)
|
|
Event.Register("UPDATE_INVENTORY_DURABILITY", private.AddRepairCosts)
|
|
Event.Register("MERCHANT_CLOSED", private.OnMerchantClosed)
|
|
hooksecurefunc("UseContainerItem", private.CheckMerchantSale)
|
|
hooksecurefunc("BuyMerchantItem", private.OnMerchantBuy)
|
|
hooksecurefunc("BuybackItem", private.OnMerchantBuyback)
|
|
end
|
|
|
|
|
|
|
|
-- ============================================================================
|
|
-- Repair Cost Tracking
|
|
-- ============================================================================
|
|
|
|
function private.SetupRepairCost()
|
|
private.repairMoney = GetMoney()
|
|
private.couldRepair = CanMerchantRepair()
|
|
-- if merchant can repair set up variables so we can track repairs
|
|
if private.couldRepair then
|
|
private.repairCost = GetRepairAllCost()
|
|
end
|
|
end
|
|
|
|
function private.OnMerchantUpdate()
|
|
-- Could have bought something before or after repair
|
|
private.repairMoney = GetMoney()
|
|
-- log any pending sales
|
|
for i, insertTime in ipairs(private.pendingSales.insertTime) do
|
|
if GetTime() - insertTime < 5 then
|
|
TSM.Accounting.Transactions.InsertVendorSale(private.pendingSales.itemString[i], private.pendingSales.quantity[i], private.pendingSales.copper[i])
|
|
end
|
|
end
|
|
wipe(private.pendingSales.itemString)
|
|
wipe(private.pendingSales.quantity)
|
|
wipe(private.pendingSales.copper)
|
|
wipe(private.pendingSales.insertTime)
|
|
end
|
|
|
|
function private.AddRepairCosts()
|
|
if private.couldRepair and private.repairCost > 0 then
|
|
local cash = GetMoney()
|
|
if private.repairMoney > cash then
|
|
-- this is probably a repair bill
|
|
local cost = private.repairMoney - cash
|
|
TSM.Accounting.Money.InsertRepairBillExpense(cost)
|
|
-- reset money as this might have been a single item repair
|
|
private.repairMoney = cash
|
|
-- reset the repair cost for the next repair
|
|
private.repairCost = GetRepairAllCost()
|
|
end
|
|
end
|
|
end
|
|
|
|
function private.OnMerchantClosed()
|
|
private.couldRepair = nil
|
|
private.repairCost = 0
|
|
end
|
|
|
|
|
|
-- ============================================================================
|
|
-- Merchant Purchases / Sales Tracking
|
|
-- ============================================================================
|
|
|
|
function private.CheckMerchantSale(bag, slot, onSelf)
|
|
-- check if we are trying to sell something to a vendor
|
|
if (not MerchantFrame:IsShown() and not TSM.UI.VendoringUI.IsVisible()) or onSelf then
|
|
return
|
|
end
|
|
|
|
local itemString = ItemString.Get(GetContainerItemLink(bag, slot))
|
|
local _, quantity = GetContainerItemInfo(bag, slot)
|
|
local copper = ItemInfo.GetVendorSell(itemString)
|
|
if not itemString or not quantity or not copper then
|
|
return
|
|
end
|
|
tinsert(private.pendingSales.itemString, itemString)
|
|
tinsert(private.pendingSales.quantity, quantity)
|
|
tinsert(private.pendingSales.copper, copper)
|
|
tinsert(private.pendingSales.insertTime, GetTime())
|
|
end
|
|
|
|
function private.OnMerchantBuy(index, quantity)
|
|
local _, _, price, batchQuantity = GetMerchantItemInfo(index)
|
|
local itemString = ItemString.Get(GetMerchantItemLink(index))
|
|
if not itemString or not price or price <= 0 then
|
|
return
|
|
end
|
|
quantity = quantity or batchQuantity
|
|
local copper = Math.Round(price / batchQuantity)
|
|
TSM.Accounting.Transactions.InsertVendorBuy(itemString, quantity, copper)
|
|
end
|
|
|
|
function private.OnMerchantBuyback(index)
|
|
local _, _, price, quantity = GetBuybackItemInfo(index)
|
|
local itemString = ItemString.Get(GetBuybackItemLink(index))
|
|
if not itemString or not price or price <= 0 then
|
|
return
|
|
end
|
|
local copper = Math.Round(price / quantity)
|
|
TSM.Accounting.Transactions.InsertVendorBuy(itemString, quantity, copper)
|
|
end
|