Files
TurtleMail/Postal.lua
T
2016-02-21 19:23:12 +01:00

1046 lines
31 KiB
Lua

Postal = AceLibrary("AceAddon-2.0"):new("AceEvent-2.0", "AceHook-2.0")
function Postal:OnInitialize()
-- Allows the mail frame to be pushed
if UIPanelWindows["MailFrame"] then
UIPanelWindows["MailFrame"].pushable = 1
else
UIPanelWindows["MailFrame"] = { area = "left", pushable = 1 }
end
-- Close FriendsFrame will close if you try to open a mail with mailframe+friendsframe open
if UIPanelWindows["FriendsFrame"] then
UIPanelWindows["FriendsFrame"].pushable = 2
else
UIPanelWindows["FriendsFrame"] = { area = "left", pushable = 2 }
end
MailItem1:SetPoint("TOPLEFT", "InboxFrame", "TOPLEFT", 48, -80)
for i = 1, 7 do
getglobal("MailItem" .. i .. "ExpireTime"):SetPoint("TOPRIGHT", "MailItem" .. i, "TOPRIGHT", 10, -4)
getglobal("MailItem" .. i):SetWidth(280)
end
POSTAL_NUMITEMBUTTONS = 21
Postal_BagLinks = {}
Postal_ScheduledStack = {}
Postal_SelectedItems = {}
Postal_DELETEDELAY = 1
PostalForwardFrame.pickItem = {}
PostalForwardFrame.process = 0
PostalGlobalFrame.queue = {}
PostalGlobalFrame.total = 0
PostalGlobalFrame.sendmail = 0
PostalTooltip:SetOwner(WorldFrame, "ANCHOR_NONE")
PostalInboxFrame.eventFunc = {}
end
function Postal:SendMailFrame_Update()
MoneyFrame_Update("SendMailCostMoneyFrame", GetSendMailPrice() * max(1, self:GetNumMails()))
ATTACHMENTS_PER_ROW_SEND = 7
ATTACHMENTS_MAX_SEND = 21
ATTACHMENTS_MAX = 21
ATTACHMENTS_MAX_ROWS_SEND = 3
local itemCount = 0
local itemTitle
local gap
-- local last = 0
local last = self:GetNumMails()
for i=1, ATTACHMENTS_MAX_SEND do
-- -- get info about the attachment
-- local itemName, itemTexture, stackCount, quality = GetSendMailItem(i)
-- -- set attachment texture info
-- _G["PostalAttachment"..i]:SetNormalTexture(itemTexture)
-- -- set the stack count
-- if ( stackCount <= 1 ) then
-- _G["PostalAttachment"..i.."Count"]:SetText("")
-- else
-- _G["PostalAttachment"..i.."Count"]:SetText(stackCount)
-- end
-- local attachmentButton = _G["PostalAttachment"..i]
-- SetItemButtonQuality(attachmentButton, quality, GetSendMailItemLink(i))
-- -- determine what a name for the message in case it doesn't already have one
-- if ( itemName ) then
-- itemCount = itemCount + 1
-- if ( not itemTitle ) then
-- if ( stackCount <= 1 ) then
-- itemTitle = itemName
-- else
-- itemTitle = itemName.." ("..stackCount..")"
-- end
-- end
-- if ((last + 1) ~= i) then
-- gap = 1
-- end
-- last = i
-- end
end
-- Determine how many rows of attachments to show
local itemRowCount = 1
local temp = last
while temp > ATTACHMENTS_PER_ROW_SEND and itemRowCount < ATTACHMENTS_MAX_ROWS_SEND do
itemRowCount = itemRowCount + 1;
temp = temp - ATTACHMENTS_PER_ROW_SEND
end
if not gap and temp == ATTACHMENTS_PER_ROW_SEND and itemRowCount < ATTACHMENTS_MAX_ROWS_SEND then
itemRowCount = itemRowCount + 1;
end
if SendMailFrame.maxRowsShown and last > 0 and itemRowCount < SendMailFrame.maxRowsShown then
itemRowCount = SendMailFrame.maxRowsShown
else
SendMailFrame.maxRowsShown = itemRowCount
end
-- Compute sizes
local cursorx = 0
local cursory = itemRowCount - 1
local marginxl = 8 + 6
local marginxr = 40 + 6
local areax = SendMailFrame:GetWidth() - marginxl - marginxr
local iconx = PostalAttachment1:GetWidth() + 2
local icony = PostalAttachment1:GetHeight() + 2
local gapx1 = floor((areax - (iconx * ATTACHMENTS_PER_ROW_SEND)) / (ATTACHMENTS_PER_ROW_SEND - 1))
local gapx2 = floor((areax - (iconx * ATTACHMENTS_PER_ROW_SEND) - (gapx1 * (ATTACHMENTS_PER_ROW_SEND - 1))) / 2)
local gapy1 = 5
local gapy2 = 6
local areay = (gapy2 * 2) + (gapy1 * (itemRowCount - 1)) + (icony * itemRowCount)
local indentx = marginxl + gapx2 + 17
local indenty = 170 + gapy2 + icony - 13
local tabx = (iconx + gapx1) - 3 --this magic number changes the attachment spacing
local taby = (icony + gapy1)
local scrollHeight = 249 - areay
PostalHorizontalBarLeft:SetPoint('TOPLEFT', SendMailFrame, 'BOTTOMLEFT', 2 + 15, 184 + areay - 14)
SendMailScrollFrame:SetHeight(scrollHeight)
SendMailScrollChildFrame:SetHeight(scrollHeight)
local SendMailScrollFrameTop = ({SendMailScrollFrame:GetRegions()})[3]
SendMailScrollFrameTop:SetHeight(scrollHeight)
SendMailScrollFrameTop:SetTexCoord(0, 0.484375, 0, scrollHeight / 256)
StationeryBackgroundLeft:SetHeight(scrollHeight)
StationeryBackgroundLeft:SetTexCoord(0, 1.0, 0, scrollHeight / 256)
StationeryBackgroundRight:SetHeight(scrollHeight)
StationeryBackgroundRight:SetTexCoord(0, 1.0, 0, scrollHeight / 256)
-- Set Items
for i=1, ATTACHMENTS_MAX_SEND do
if cursory >= 0 then
getglobal("PostalAttachment"..i):Enable()
getglobal("PostalAttachment"..i):Show()
getglobal("PostalAttachment"..i):SetPoint("TOPLEFT", "SendMailFrame", "BOTTOMLEFT", indentx + (tabx * cursorx), indenty + (taby * cursory));
cursorx = cursorx + 1
if cursorx >= ATTACHMENTS_PER_ROW_SEND then
cursory = cursory - 1
cursorx = 0
end
else
getglobal("PostalAttachment"..i):Hide()
end
end
for i=ATTACHMENTS_MAX_SEND+1, ATTACHMENTS_MAX do
getglobal("PostalAttachment"..i):Hide()
end
if self:GetNumMails() > 0 then
SendMailCODButton:Enable();
SendMailCODButtonText:SetTextColor(NORMAL_FONT_COLOR.r, NORMAL_FONT_COLOR.g, NORMAL_FONT_COLOR.b);
else
SendMailRadioButton_OnClick(1);
SendMailCODButton:Disable();
SendMailCODButtonText:SetTextColor(GRAY_FONT_COLOR.r, GRAY_FONT_COLOR.g, GRAY_FONT_COLOR.b);
end
Postal:SendMailFrame_CanSend()
end
function Postal:OnEnable()
self:RegisterEvent("UI_ERROR_MESSAGE")
self:RegisterEvent("MAIL_SEND_SUCCESS")
self:RegisterEvent("MAIL_CLOSED")
self:RegisterEvent("BAG_UPDATE")
self:Hook("ContainerFrameItemButton_OnClick")
self:Hook("PickupContainerItem")
self:Hook("UseContainerItem")
self:Hook("SendMailFrame_Update")
self:Hook('SendMailFrame_CanSend')
self:Hook("ContainerFrame_Update")
self:Hook("ClickSendMailItemButton")
self:HookScript(TradeFrame, "OnShow", "TF_Show")
self:Hook("InboxFrameItem_OnEnter")
self:Hook("InboxFrame_OnClick")
self:Hook("InboxFrame_Update")
self:Hook("CloseMail")
self:Hook("OpenMail_Reply")
oldTakeInboxMoney = OpenMailMoneyButton:GetScript("OnClick")
-- NEW
SendMailFrame:CreateTexture('PostalHorizontalBarLeft', 'BACKGROUND')
PostalHorizontalBarLeft:SetTexture([[Interface\ClassTrainerFrame\UI-ClassTrainer-HorizontalBar]])
PostalHorizontalBarLeft:SetWidth(256)
PostalHorizontalBarLeft:SetHeight(16)
PostalHorizontalBarLeft:SetTexCoord(0, 1, 0, 0.25)
SendMailFrame:CreateTexture('PostalHorizontalBarRight', 'BACKGROUND')
PostalHorizontalBarRight:SetTexture([[Interface\ClassTrainerFrame\UI-ClassTrainer-HorizontalBar]])
PostalHorizontalBarRight:SetWidth(75)
PostalHorizontalBarRight:SetHeight(16)
PostalHorizontalBarRight:SetTexCoord(0, 0.29296875, 0.25, 0.5)
PostalHorizontalBarRight:SetPoint('LEFT', PostalHorizontalBarLeft, 'RIGHT')
do
local background = ({SendMailPackageButton:GetRegions()})[1]
background:Hide()
local count = ({SendMailPackageButton:GetRegions()})[3]
count:Hide()
SendMailPackageButton:Disable()
SendMailPackageButton:SetScript('OnReceiveDrag', nil)
SendMailPackageButton:SetScript('OnDragStart', nil)
end
do
SendMailMoneyText:SetPoint('TOPLEFT', 0, -2)
SendMailMoney:ClearAllPoints()
SendMailMoney:SetPoint('TOPLEFT', SendMailMoneyText, 'BOTTOMLEFT', 5, -3)
SendMailSendMoneyButton:SetPoint('TOPLEFT', SendMailMoney, 'TOPRIGHT', 0, 12)
end
PostalMailButton:SetScript('OnClick', function()
PostalGlobalFrame.first = true
PostalGlobalFrame.to = SendMailNameEditBox:GetText()
PostalGlobalFrame.subject = PostalSubjectEditBox:GetText() ~= '' and PostalSubjectEditBox:GetText()
PostalGlobalFrame.body = SendMailBodyEditBox:GetText()
PostalGlobalFrame.money = MoneyInputFrame_GetCopper(SendMailMoney)
PostalGlobalFrame.cod = SendMailCODButton:GetChecked()
PostalGlobalFrame.queue = Postal:FillItemTable()
PostalGlobalFrame.total = getn(PostalGlobalFrame.queue)
PostalGlobalFrame:Show()
POSTAL_CANSENDNEXT = 1
Postal:ClearItems()
Postal:SendMailFrame_Update()
end)
-- hack to avoid automatic subject setting/button enabling
SendMailMailButton:Hide()
SendMailSubjectEditBox:Hide()
SendMailNameEditBox:SetScript('OnTabPressed', function()
PostalSubjectEditBox:SetFocus()
end)
SendMailNameEditBox:SetScript('OnEnterPressed', function()
PostalSubjectEditBox:SetFocus()
end)
SendMailBodyEditBox:SetScript('OnTabPressed', function()
if IsShiftKeyDown() then
PostalSubjectEditBox:SetFocus()
else
SendMailMoneyGold:SetFocus()
end
end)
Postal:SendMailFrame_Update()
end
function Postal:MAIL_CLOSED()
Postal:ClearItems()
PostalGlobalFrame.total = 0
PostalGlobalFrame.queue = {}
-- Hides the minimap unread mail button if there are no unread mail on closing the mailbox.
-- Does not scan past the first 50 items since only the first 50 are viewable.
for i = 1, GetInboxNumItems() do
_, _, _, _, _, _, _, _, wasRead = GetInboxHeaderInfo(i)
if not wasRead then
return
end
end
MiniMapMailFrame:Hide()
-- There may be an UPDATE PENDING MAIL event after closing which would make the frame reappear, the following prevents that
local t = GetTime()
MiniMapMailFrame.Show = function()
if GetTime() - t > 2 then
MiniMapMailFrame.Show = Postal_MiniMapMailFrame_Show_Orig
MiniMapMailFrame:Show()
end
end
end
function Postal:MAIL_SEND_SUCCESS()
POSTAL_CANSENDNEXT = 1
end
function Postal:ContainerFrameItemButton_OnClick(btn, ignore)
if self:GetItemFrame(this:GetParent():GetID(), this:GetID()) then
return
end
self.hooks["ContainerFrameItemButton_OnClick"].orig(btn, ignore)
self:UpdateItemButtons()
end
function Postal:PickupContainerItem(bag, slot, special)
if (self:GetItemFrame(bag, slot) or (Postal_addItem and Postal_addItem[1] == bag and Postal_addItem[2] == slot)) and not special then
return
end
if not CursorHasItem() then
PostalFrame.bag = bag
PostalFrame.slot = slot
end
self.hooks["PickupContainerItem"].orig(bag, slot)
self:UpdateItemButtons()
end
function Postal:UseContainerItem(bag, slot)
if IsShiftKeyDown() or IsControlKeyDown() or IsAltKeyDown() then
return self.hooks["UseContainerItem"].orig(bag, slot)
end
if self:GetItemFrame(bag, slot) or (Postal_addItem and Postal_addItem[1] == bag and Postal_addItem[2] == slot) then
return
end
if not CursorHasItem() then
PostalFrame.bag = bag
PostalFrame.slot = slot
end
if SendMailFrame:IsVisible() and not CursorHasItem() then
local i
for i = 1, POSTAL_NUMITEMBUTTONS do
if not getglobal("PostalAttachment" .. i).slot then
if self:ItemIsMailable(bag, slot) then
Postal:Print("Postal: Cannot attach item.", 1, 0.5, 0)
return
end
self.hooks["PickupContainerItem"].orig(bag, slot)
self:MailButton_OnClick(getglobal("PostalAttachment" .. i))
self:UpdateItemButtons()
return
end
end
elseif TradeFrame:IsVisible() and not CursorHasItem() then
for i = 1, 6 do
if not GetTradePlayerItemLink(i) then
self.hooks["PickupContainerItem"].orig(bag, slot)
ClickTradeButton(i)
return
end
end
elseif not CursorHasItem() and (not TradeFrame or not TradeFrame:IsVisible()) and (not AuctionFrame or not AuctionFrame:IsVisible()) and UnitExists("target") and CheckInteractDistance("target", 2) and UnitIsFriend("player", "target") and UnitIsPlayer("target") then
InitiateTrade("target")
Postal_addItem = { bag, slot, UnitName("target"), 2 }
for i = 1, NUM_CONTAINER_FRAMES do
if getglobal("ContainerFrame" .. i):IsVisible() then
ContainerFrame_Update(getglobal("ContainerFrame" .. i))
end
end
return
end
self.hooks["UseContainerItem"].orig(bag, slot)
end
function Postal:ClickSendMailItemButton()
if not GetSendMailItem() then
PostalFrame.mailbag = PostalFrame.bag
PostalFrame.mailitem = PostalFrame.slot
end
self.hooks["ClickSendMailItemButton"].orig()
end
-- Handle the dragging of items
function Postal:MailButton_OnClick(button)
if not button then button = this end
if CursorHasItem() then
local bag = PostalFrame.bag
local slot = PostalFrame.slot
if not bag or not slot then return end
if self:ItemIsMailable(bag, slot) then
Postal:Print("Postal: Cannot attach item.", 1, 0.5, 0)
self.hooks["PickupContainerItem"].orig(bag, slot)
return
end
self.hooks["PickupContainerItem"].orig(bag, slot)
if this.bag and this.slot then
-- There's already an item there
-- Pickup that item to replicate Send Mail's behaviour
self.hooks["PickupContainerItem"].orig(button.bag, button.slot)
PostalFrame.bag = button.bag
PostalFrame.slot = button.slot
else
PostalFrame.bag = nil
PostalFrame.slot = nil
end
local texture, count = GetContainerItemInfo(bag, slot)
-- getglobal(button:GetName() .. "IconTexture"):Show()
button:SetNormalTexture(texture)
if count > 1 then
getglobal(button:GetName() .. "Count"):SetText(count)
getglobal(button:GetName() .. "Count"):Show()
else
getglobal(button:GetName() .. "Count"):Hide()
end
button.bag = bag
button.slot = slot
button.texture = texture
button.count = count
elseif button.slot and button.bag then
self.hooks["PickupContainerItem"].orig(button.bag, button.slot)
-- getglobal(button:GetName() .. "IconTexture"):Hide()
button:SetNormalTexture(nil)
getglobal(button:GetName() .. "Count"):Hide()
PostalFrame.bag = button.bag
PostalFrame.slot = button.slot
button.slot = nil
button.bag = nil
button.count = nil
button.texture = nil
end
for i = 1, NUM_CONTAINER_FRAMES do
if getglobal("ContainerFrame" .. i):IsVisible() then
ContainerFrame_Update(getglobal("ContainerFrame" .. i))
end
end
-- NEW
Postal:SendMailFrame_Update()
end
function Postal:ItemIsMailable(bag, slot)
-- Make sure tooltip is cleared
for i = 1, 29 do
getglobal("PostalTooltipTextLeft" .. i):SetText("")
end
PostalTooltip:SetBagItem(bag, slot)
for i = 1, PostalTooltip:NumLines() do
local text = getglobal("PostalTooltipTextLeft" .. i):GetText()
if text == ITEM_SOULBOUND or text == ITEM_BIND_QUEST or text == ITEM_CONJURED or text == ITEM_BIND_ON_PICKUP then
return 1
end
end
return nil
end
function Postal:UpdateItemButtons(frame)
local i
for i = 1, POSTAL_NUMITEMBUTTONS do
local btn = getglobal("PostalAttachment" .. i)
if not frame or btn ~= frame then
local texture, count
if btn.slot and btn.bag then
texture, count = GetContainerItemInfo(btn.bag, btn.slot)
end
if not texture then
btn:SetNormalTexture(nil)
getglobal(btn:GetName().."Count"):Hide()
btn.slot = nil
btn.bag = nil
btn.count = nil
btn.texture = nil
else
btn.count = count
btn.texture = texture
btn:SetNormalTexture(texture)
if count > 1 then
getglobal(btn:GetName().."Count"):Show()
getglobal(btn:GetName().."Count"):SetText(count)
else
getglobal(btn:GetName().."Count"):Hide()
end
end
end
end
end
function Postal:GetItemFrame(bag, slot)
local i
for i = 1, POSTAL_NUMITEMBUTTONS do
local btn = getglobal("PostalAttachment" .. i)
if btn.slot == slot and btn.bag == bag then
return btn
end
end
return nil
end
function Postal:GetNumMails()
local i
local num = 0
for i = 1, POSTAL_NUMITEMBUTTONS do
local btn = getglobal("PostalAttachment" .. i)
if btn.slot and btn.bag then
num = num + 1
end
end
return num
end
function Postal:ClearItems()
local i
local num = 0
for i = 1, POSTAL_NUMITEMBUTTONS do
local btn = getglobal("PostalAttachment" .. i)
btn.slot = nil
btn.count = nil
btn.bag = nil
btn.texture = nil
end
self:UpdateItemButtons()
PostalMailButton:Disable()
SendMailNameEditBox:SetText('')
SendMailNameEditBox:SetFocus()
PostalSubjectEditBox:SetText('')
SendMailBodyEditBox:SetText('')
MoneyInputFrame_ResetMoney(SendMailMoney)
SendMailRadioButton_OnClick(1)
end
function Postal:SendMailFrame_CanSend()
if strlen(SendMailNameEditBox:GetText()) > 0 and (SendMailSendMoneyButton:GetChecked() and MoneyInputFrame_GetCopper(SendMailMoney) or 0) + GetSendMailPrice() * self:GetNumMails() <= GetMoney() then
PostalMailButton:Enable()
else
PostalMailButton:Disable()
end
end
function Postal:SendMail()
local item = tremove(this.queue, 1)
if item or this.first then
local subject = this.subject or '[No Subject]'
if this.total > 1 then
subject = subject..format(' (Part %d of %d)', this.total - getn(this.queue), this.total)
end
if this.first then
this.first = false
if this.money then
if this.cod then
SetSendMailCOD(this.money)
else
SetSendMailMoney(this.money)
end
end
end
if item then
if GetSendMailItem() and PostalFrame.mailbag and PostalFrame.mailitem then
-- There's already an item in the slot
ClickSendMailItemButton()
self.hooks["PickupContainerItem"].orig(PostalFrame.mailbag, PostalFrame.mailitem)
PostalFrame.mailbag = nil
PostalFrame.mailitem = nil
elseif CursorHasItem() and PostalFrame.bag and PostalFrame.slot then
ClearCursor()
PostalFrame.bag = nil
PostalFrame.slot = nil
end
self.hooks["PickupContainerItem"].orig(item.bag, item.slot)
ClickSendMailItemButton()
local name, _, count = GetSendMailItem()
if not name then
Postal:Print("Postal: " .. POSTAL_ERROR, 1, 0, 0)
return
end
end
SendMail(this.to, subject, this.body)
return
end
PostalGlobalFrame:Hide()
end
function Postal:FillItemTable()
local arr = {}
for i = 1, POSTAL_NUMITEMBUTTONS do
local btn = getglobal("PostalAttachment" .. i)
if btn.slot and btn.bag then
tinsert(arr, { slot = btn.slot, bag = btn.bag })
end
end
return arr
end
function Postal:ProcessQueue(elapsed)
if not POSTAL_CANSENDNEXT then
return
end
this.sendmail = this.sendmail + elapsed
if this.sendmail > 0.5 then
this.sendmail = 0
self:SendMail()
POSTAL_CANSENDNEXT = nil
end
end
function Postal:ContainerFrame_Update(frame)
self.hooks["ContainerFrame_Update"].orig(frame)
Postal.control.on_next_update(function()
local name = frame:GetName()
for j=1, frame.size, 1 do
local itemButton = getglobal(name.."Item"..j)
local locked = self:GetItemFrame(itemButton:GetParent():GetID(), itemButton:GetID()) or (Postal_addItem and Postal_addItem[1] == itemButton:GetParent():GetID() and Postal_addItem[2] == itemButton:GetID())
if locked then
SetItemButtonDesaturated(itemButton, true, 0.5, 0.5, 0.5)
end
end
end)
end
function Postal:InboxFrameItem_OnEnter()
local didSetTooltip
if this.index then
if GetInboxItem(this.index) then
GameTooltip:SetOwner(this, "ANCHOR_RIGHT")
GameTooltip:SetInboxItem(this.index)
didSetTooltip = 1
end
end
if not didSetTooltip then
GameTooltip:SetOwner(this, "ANCHOR_RIGHT")
end
if this.money then
GameTooltip:AddLine(ENCLOSED_MONEY, "", 1, 1, 1)
SetTooltipMoney(GameTooltip, this.money)
SetMoneyFrameColor("GameTooltipMoneyFrame", HIGHLIGHT_FONT_COLOR.r, HIGHLIGHT_FONT_COLOR.g, HIGHLIGHT_FONT_COLOR.b)
elseif this.cod then
GameTooltip:AddLine(COD_AMOUNT, "", 1, 1, 1)
SetTooltipMoney(GameTooltip, this.cod)
if this.cod > GetMoney() then
SetMoneyFrameColor("GameTooltipMoneyFrame", RED_FONT_COLOR.r, RED_FONT_COLOR.g, RED_FONT_COLOR.b)
else
SetMoneyFrameColor("GameTooltipMoneyFrame", HIGHLIGHT_FONT_COLOR.r, HIGHLIGHT_FONT_COLOR.g, HIGHLIGHT_FONT_COLOR.b)
end
end
if didSetTooltip and (this.money or this.cod) then
GameTooltip:SetHeight(GameTooltip:GetHeight()+getglobal("GameTooltipTextLeft" .. GameTooltip:NumLines()):GetHeight())
if GameTooltipMoneyFrame:IsVisible() then
GameTooltip:SetHeight(GameTooltip:GetHeight()+GameTooltipMoneyFrame:GetHeight())
end
end
GameTooltip:Show()
end
function Postal:TF_Show()
self.hooks[TradeFrame].OnShow.orig()
if Postal_addItem and not CursorHasItem() and UnitName("NPC") == Postal_addItem[3] then
self.hooks["PickupContainerItem"].orig(Postal_addItem[1], Postal_addItem[2])
ClickTradeButton(1)
end
Postal_addItem = nil
end
function Postal:Inbox_OnUpdate(elapsed)
if Postal_addItem then
Postal_addItem[4] = Postal_addItem[4] - elapsed
if Postal_addItem[4] <= 0 then
Postal_addItem = nil
for i = 1, NUM_CONTAINER_FRAMES do
if getglobal("ContainerFrame" .. i):IsVisible() then
ContainerFrame_Update(getglobal("ContainerFrame" .. i))
end
end
end
end
end
function Postal:UI_ERROR_MESSAGE()
if event == "UI_ERROR_MESSAGE" and (arg1 == ERR_INV_FULL or arg1 == ERR_ITEM_MAX_COUNT) then
if this.num then
if arg1 == ERR_INV_FULL then
Postal:Inbox_Abort()
Postal:Print("Postal: Inventory full. Aborting.", 1, 0, 0)
elseif arg1 == ERR_ITEM_MAX_COUNT then
Postal:Print("Postal: You already have the maximum amount of that item. Skipping.", 1, 0, 0)
this.timeout = Postal_DELETEDELAY
if this.lastVal then
for key, va in this.id do
if va >= this.lastVal then
this.id[key] = va + 1
end
end
end
end
end
end
end
function Postal:Print(msg, r, g, b)
DEFAULT_CHAT_FRAME:AddMessage(msg, r, g, b)
end
function Postal_Inbox_SetSelected()
local id = this:GetID() + (InboxFrame.pageNum - 1) * 7
if not this:GetChecked() then
for k, v in Postal_SelectedItems do
if v == id then
tremove(Postal_SelectedItems, k)
break
end
end
else
tinsert(Postal_SelectedItems, id)
end
end
function Postal_Inbox_OpenSelected(open_all)
local selected = {}
if open_all then
for i = 1, GetInboxNumItems() do
tinsert(selected, i)
end
else
for _, i in Postal_SelectedItems do
tinsert(selected, i)
end
end
-- Postal:Inbox_DisableClicks(true)
-- PostalInboxFrame.num = true -- TODO remove
Postal.open.start(selected, function()
Postal:Inbox_DisableClicks(false)
PostalInboxFrame.num = false
end)
Postal_SelectedItems = {}
end
function Postal:InboxFrame_Update()
self.hooks["InboxFrame_Update"].orig()
for i = 1, 7 do
local index = (i + (InboxFrame.pageNum - 1) * 7)
if index > GetInboxNumItems() then
getglobal("PostalBoxItem" .. i .. "CB"):Hide()
else
getglobal("PostalBoxItem" .. i .. "CB"):Show()
getglobal("PostalBoxItem" .. i .. "CB"):SetChecked(nil)
for k, v in Postal_SelectedItems do
if v == index then
getglobal("PostalBoxItem" .. i .. "CB"):SetChecked(1)
break
end
end
end
end
if PostalInboxFrame.num then
Postal:Inbox_DisableClicks(1, 1)
end
end
function Postal:Inbox_DisableClicks(disable, loopPrevention)
if disable then
for i = 1, 7 do
getglobal("MailItem" .. i .. "ButtonIcon"):SetDesaturated(1)
end
if not self:IsHooked("InboxFrame_OnClick") then self:Hook("InboxFrame_OnClick", "DummyFunction") end
else
for i = 1, 7 do
getglobal("MailItem" .. i .. "ButtonIcon"):SetDesaturated(nil)
end
if not loopPrevention then
InboxFrame_Update()
end
if self:IsHooked("InboxFrame_OnClick") then self:Unhook("InboxFrame_OnClick") end
end
end
function Postal:InboxFrame_OnClick()
this:SetChecked(nil)
end
function Postal:Inbox_Abort()
Postal.open.stop()
PostalInboxFrame.num = nil
PostalInboxFrame.timeout = nil
PostalInboxFrame.id = {}
Postal_SelectedItems = {}
Postal:Inbox_DisableClicks()
end
function Postal:CloseMail()
self.hooks["CloseMail"].orig()
Postal:Inbox_Abort()
end
-- function Postal:TakeInboxItem(id)
-- TakeInboxItem(id)
-- local name = GetInboxItem(id)
-- tinsert(PostalForwardFrame.pickItem, name)
-- end
-- Mail Forwarding
function Postal:DisableAttachments(disable)
if disable then
OpenMailMoneyButtonIconTexture:SetDesaturated(1)
OpenMailPackageButtonIconTexture:SetDesaturated(1)
if not self:IsHooked(OpenMailMoneyButton, "OnClick") then self:HookScript(OpenMailMoneyButton, "OnClick", "DummyFunction") end
if not self:IsHooked(OpenMailPackageButton, "OnClick") then self:HookScript(OpenMailPackageButton, "OnClick", "DummyFunction") end
else
OpenMailMoneyButtonIconTexture:SetDesaturated(nil)
OpenMailPackageButtonIconTexture:SetDesaturated(nil)
if self:IsHooked(OpenMailMoneyButton, "OnClick") then self:Unhook(OpenMailMoneyButton, "OnClick") end
if self:IsHooked(OpenMailPackageButton, "OnClick") then self:Unhook(OpenMailPackageButton, "OnClick") end
end
end
function Postal:DummyFunction()
end
function Postal:OpenMail_Reply()
self.hooks["OpenMail_Reply"].orig()
SendMailMoneyCopper:SetText("")
SendMailMoneySilver:SetText("")
SendMailMoneyGold:SetText("")
end
function Postal:OpenReply()
OpenMail_Reply()
local _, _, _, subject, money = GetInboxHeaderInfo(InboxFrame.openMailID)
-- Money
local gold, silver, copper = "", "", ""
if money and money > 0 then
gold = floor(money / (COPPER_PER_SILVER * SILVER_PER_GOLD))
silver = floor((money - (gold * COPPER_PER_SILVER * SILVER_PER_GOLD)) / COPPER_PER_SILVER)
copper = mod(money, COPPER_PER_SILVER)
end
SendMailMoneyCopper:SetText(copper)
SendMailMoneySilver:SetText(silver)
SendMailMoneyGold:SetText(gold)
-- Items
local _, itemTexture, count = GetInboxItem(InboxFrame.openMailID)
SendMailPackageButton:SetNormalTexture(itemTexture)
if count > 1 then
SendMailPackageButtonCount:SetText(count)
else
SendMailPackageButtonCount:SetText("")
end
-- Text fields
SendMailNameEditBox:SetText("")
local subject = OpenMailSubject:GetText()
local prefix = "FW:".." "
if strsub(subject, 1, strlen(prefix)) ~= prefix then
subject = prefix..subject
end
PostalSubjectEditBox:SetText(subject or "")
SendMailBodyEditBox:SetText(string.gsub(OpenMailBodyText:GetText() or "", "\n", "\n>"))
SendMailNameEditBox:SetFocus()
-- self:Forward_EnableForward(1)
end
function Postal:PostalMailButton_OnClick()
local name = GetInboxItem(InboxFrame.openMailID)
local _, _, _, _, money = GetInboxHeaderInfo(InboxFrame.openMailID)
if name then
PostalForwardFrame.searchItem = name
PostalForwardFrame.forwardStep = 1
TakeInboxItem(InboxFrame.openMailID)
else
PostalForwardFrame.forwardStep = 2
if money and money > 0 then
SetSendMailMoney(money)
PostalForwardFrame.countDown = 2
oldTakeInboxMoney(InboxFrame.openMailID)
else
PostalForwardFrame.countDown = 0.5
end
end
PostalMailButton:Disable()
end
function Postal:Forward_OnUpdate(elapsed)
if this.forwardStep and this.forwardStep > 1 then
if this.countDown then
this.countDown = this.countDown - elapsed
if this.countDown <= 0 then
if this.forwardStep == 2 then
this.countDown = 0.5
this.forwardStep = 3
-- Send the mail
SendMail(SendMailNameEditBox:GetText(), PostalSubjectEditBox:GetText(), SendMailBodyEditBox:GetText())
PostalMailButton:Disable()
elseif this.forwardStep == 3 then
-- Delete the old one
local _, _, _, _, money, _, _, itemID = GetInboxHeaderInfo(InboxFrame.openMailID)
if money == 0 and not itemID then
DeleteInboxItem(InboxFrame.openMailID)
end
MailFrameTab_OnClick(1)
HideUIPanel(OpenMailFrame)
this.countDown = nil
this.forwardStep = nil
end
end
end
end
this.process = this.process - elapsed
if this.process <= 0 then
this.process = 3
if getn(Postal_ScheduledStack) > 0 then
self:ProcessStack()
end
end
end
function Postal:InboxFrame_OnClick(id)
self.hooks["InboxFrame_OnClick"].orig(id)
local _, _, _, _, _, CODAmount = GetInboxHeaderInfo(id)
if CODAmount and CODAmount > 0 then
OpenMailForwardButton:Disable()
else
OpenMailForwardButton:Enable()
end
end
function Postal:Forward_EnableForward(enable)
if enable then
OpenMailForwardButton:Disable()
if not self:IsHooked(SendMailPackageButton, "OnEnter") then self:HookScript(SendMailPackageButton, "OnEnter", "SMPBOE") end
SendMailCODButton:Disable()
self:DisableAttachments(1)
if not self:IsHooked("SendMailMailButton_OnClick") then self:Hook("SendMailMailButton_OnClick") end
if not self:IsHooked("SendMailPackageButton_OnClick") then self:Hook("SendMailPackageButton_OnClick") end
else
OpenMailForwardButton:Enable()
if self:IsHooked(SendMailPackageButton, "OnEnter") then self:Unhook(SendMailPackageButton, "OnEnter") end
SendMailCODButton:Enable()
self:DisableAttachments(nil)
if self:IsHooked("SendMailMailButton_OnClick") then self:Unhook("SendMailMailButton_OnClick") end
if self:IsHooked("SendMailPackageButton_OnClick") then self:Unhook("SendMailPackageButton_OnClick") end
end
end
function Postal:SMPBOE()
GameTooltip:SetOwner(SendMailPackageButton, "ANCHOR_RIGHT")
GameTooltip:SetInboxItem(InboxFrame.openMailID)
end
function Postal:SendMailPackageButton_OnClick()
end
function Postal:Forward_AttachSlot(container, slot)
PickupContainerItem(container, slot)
ClickSendMailItemButton()
PostalForwardFrame.searchItem = nil
PostalForwardFrame.forwardStep = 2
PostalForwardFrame.countDown = 1.5
end
function Postal:BAG_UPDATE()
local old = {}
for k, v in Postal_BagLinks do
if type(v) == "table" then
old[k] = { }
for key, val in v do
old[k][key] = val
end
end
end
Postal_BagLinks = {}
for i = 0, 4 do
Postal_BagLinks[i] = {}
for y = 1, GetContainerNumSlots(i) do
local curr = GetContainerItemLink(i, y)
local _, _, name = string.find(( curr or "" ), "%[(.+)%]")
if name then
if PostalForwardFrame.searchItem then
if name and name == PostalForwardFrame.searchItem and not old[i][y] then
self:Forward_AttachSlot(i, y)
end
else
local _, _, name = string.find(( curr or "" ), "%[(.+)%]")
if name and name == PostalForwardFrame.pickItem[1] and not old[i][y] then
tremove(PostalForwardFrame.pickItem, 1)
for k, v in old do
local hasFound
for key, val in v do
if val == name and ( k ~= i or key ~= y ) then
local _,_, link = string.find((GetContainerItemLink(k, key) or ""), "(item:[%d:]+)")
if link then
local texture, itemCount = GetContainerItemInfo(k,key)
local tex, iC = GetContainerItemInfo(i, y)
local sName, sLink, iQuality, iLevel, sType, sSubType, iCount = GetItemInfo(link)
if sName and itemCount and iCount and iC then
if iCount >= (itemCount+iC) then
if getn(Postal_ScheduledStack) == 0 then
PostalForwardFrame.process = 2
end
tinsert(Postal_ScheduledStack, { i, y, k, key })
hasFound = 1
break
end
end
end
end
end
if hasFound then
break
end
end
end
end
Postal_BagLinks[i][y] = name
end
end
end
end
function Postal:ProcessStack()
local val = tremove(Postal_ScheduledStack, 1)
PickupContainerItem(val[1], val[2])
PickupContainerItem(val[3], val[4])
end
local oldSMMFfunc = SendMailMoneyFrame.onvalueChangedFunc
SendMailMoneyFrame.onvalueChangedFunc = function()
if oldSMMFfunc then
oldSMMFfunc()
end
local subject = PostalSubjectEditBox:GetText()
if subject == "" or string.find(subject, "%[%d+G, %d+S, %d+C%]") then
local copper, silver, gold = SendMailMoneyFrameCopper:GetText(), SendMailMoneyFrameSilver:GetText(), SendMailMoneyFrameGold:GetText()
if not tonumber(copper) then
copper = 0
end
if not tonumber(silver) then
silver = 0
end
if not tonumber(gold) then
gold = 0
end
PostalSubjectEditBox:SetText(format("[%sG, %sS, %sC]", gold, silver, copper))
end
end