view Modules/Events.lua @ 4:c940b527ccab

Fixed Milling. Disenchating will probably have to be fixed the same way
author Asa Ayers <Asa.Ayers@Gmail.com>
date Sat, 22 May 2010 15:23:11 -0700
parents bbcf81868171
children 7d0f4ebedf8c
line wrap: on
line source
local addonName, addonTable = ...; 
local addon = _G[addonName]

local utils = addonTable.utils

function addon:PLAYER_ENTERING_WORLD()
	self:RegisterEvent("MAIL_SHOW")
	self:RegisterEvent("UNIT_SPELLCAST_START")
	self:WatchBags()
end
 
 function addon:MAIL_SHOW()
	self:Debug("MAIL_SHOW")
	self.lastMailScan = self:ScanMail()
	self:UnregisterEvent("MAIL_SHOW")
	self:RegisterEvent("MAIL_CLOSED")
	self:RegisterEvent("MAIL_INBOX_UPDATE")
	self:Debug("MAIL_SHOW complete")
end

function addon:MAIL_CLOSED()
	addon:UnregisterEvent("MAIL_CLOSED")
	self:UnregisterEvent("MAIL_INBOX_UPDATE")
	self:RegisterEvent("MAIL_SHOW")
end

function addon:MAIL_INBOX_UPDATE()
	local newScan = addon:ScanMail()
	local diff
	for item, total in pairs(self.lastMailScan) do

		if newScan[item] == nil then
			newScan[item] = 0
		end
		diff = total - newScan[item]
		if diff ~= 0 then
			self:SaveValue(item, diff)
		end

	end

	self.lastMailScan = newScan
end

function addon:UNIT_SPELLCAST_START(event, target, spell)
	if target == "player" and spell == "Milling" then
		self:UnwatchBags()
		self:UpdateCurrentInventory()
		self:RegisterEvent("UNIT_SPELLCAST_INTERRUPTED")
		self:RegisterEvent("LOOT_CLOSED")
	end
end

--[[ 
	The item should be destroyed before this point, so the last inventory check
	needs to be kept so it can be combined with the up coming loot.
 ]]
function addon:LOOT_CLOSED()
	self:UnregisterEvent("LOOT_CLOSED")
	self:UnregisterEvent("UNIT_SPELLCAST_INTERRUPTED")
	local inventory = self.lastInventory
	self:WatchBags()
	self.lastInventory = inventory 
end

function addon:UNIT_SPELLCAST_INTERRUPTED(event, target, spell)
	if target == "player" and spell == "Milling" then
		self:UnregisterEvent("UNIT_SPELLCAST_INTERRUPTED")
		self:UnregisterEvent("LOOT_CLOSED")
		self:WatchBags()
	end
end

function addon:UpdateCurrentInventory()
	self.lastInventory = self:GetCurrentInventory()
end

function addon:UpdateAudit()
	self:Debug("UpdateAudit")
	local currentInventory = self:GetCurrentInventory()
	local diff =  addon:GetInventoryDiff(self.lastInventory, currentInventory)
	-- this is only here for debugging
	self.lastdiff = diff
	
	if abs(diff.money) > 0 and utils:tcount(diff.items) == 1 then
		self:Debug("purchase or sale")
		
		for itemName, count in pairs(diff.items) do
			self:SaveValue(itemName, diff.money)
		end
	elseif utils:tcount(diff.items) > 1 then
		local positive, negative = {}, {}
		local positiveCount, negativeCount = 0, 0
		for item, count in pairs(diff.items) do
			if count > 0 then
				positive[item] = count
				positiveCount = positiveCount + count
			elseif count < 0 then
				negative[item] = count
				negativeCount = negativeCount + abs(count)
			end
		end
		
		if utils:tcount(positive) > 0 and utils:tcount(negative) > 0 then
			-- we must have created/converted something
			self:Debug("conversion")
			local totalChange = 0
			for itemName, change in pairs(negative) do
				local _, itemCost, count = self:GetItemCost(itemName, change)
				self:SaveValue(itemName, abs(itemCost * change))
				
				totalChange = totalChange + abs(itemCost * change)
			end
			
			self:Debug("totalChange")
			self:Debug(totalChange)
			
			local valuePerItem = totalChange / positiveCount
			self:Debug(valuePerItem )
			for itemName, change in pairs(positive) do
				self:Debug(itemName)
				self:Debug(0-abs(valuePerItem * change))
				self:SaveValue(itemName, 0-abs(valuePerItem * change))
			end
		end
	end
	
	self.lastInventory = currentInventory
	addon:WatchBags()
end