function ChatCast_Trade_OnLoad() this:RegisterEvent("TRADE_SHOW"); this:RegisterEvent("TRADE_REQUEST"); this:RegisterEvent("TRADE_UPDATE"); this:RegisterEvent("TRADE_ACCEPT_UPDATE") this:RegisterEvent("TRADE_CLOSED") this:RegisterEvent("TRADE_REQUEST_CANCELLED") this:RegisterEvent("SPELLCAST_START"); this:RegisterEvent("SPELLCAST_INTERRUPTED"); this:RegisterEvent("SPELLCAST_STOP"); this:RegisterEvent("SPELLCAST_FAILED"); end function ChatCast_Trade_OnEvent() if (event == "TRADE_SHOW" or event == "TRADE_REQUEST") then ChatCast_DoTrade(); elseif (event == "TRADE_UPDATE" or event == "TRADE_ACCEPT_UPDATE") then ChatCast_FinishTrade(); elseif (event == "TRADE_CLOSED" or event == "TRADE_REQUEST_CANCELLED") then ChatCast.Trading = nil; elseif (event == "SPELLCAST_STOP") then if (ChatCast.Trading) then if (ChatCast.Trading.creating == 1) then ChatCast.Trading.creating = 3.5 end end elseif (event == "SPELLCAST_FAILED" or event == "SPELLCAST_INTERRUPT") then if (ChatCast.Trading) then ChatCast.Trading = nil if (ChatCast.Feedback) then DEFAULT_CHAT_FRAME:AddMessage(CCLocale.UI.text.fb_createfail .. " " .. arg1 .. ".") end end elseif (event == "UI_ERROR_MESSAGE") then if (ChatCast.Feedback) then if arg1 == "Interrupted" then DEFAULT_CHAT_FRAME:AddMessage(CCLocale.UI.text.fb_createfail .. " " .. arg1 .. ".") elseif arg1 == "Trade target is too far away." then DEFAULT_CHAT_FRAME:AddMessage(string.format(CCLocale.UI.text.fb_tradefail,ChatCast.Trading.name) .. " " .. arg1) end end if (ChatCast.Trading) then ChatCast.Trading = nil end end end -- Trade functions function ChatCast_FindItem(item,quantity) for container=0,NUM_CONTAINER_FRAMES do for slot=1,GetContainerNumSlots(container) do local _, count, _, _ = GetContainerItemInfo(container, slot) if (count and count >= quantity) then GameTooltip:SetBagItem(container,slot) if item == getglobal("GameTooltipTextLeft1"):GetText() then return container, slot; end end end end return nil,nil end; function ChatCast_LookupItem(info, item) local target_rank, spellName, spellRank, iclass, inumber, target_rankt local j = 0 if item == "_Healthstone" then iclass, inumber, target_rankt = "WARLOCK", 4, 10 elseif item == "_Soulstone" then iclass, inumber, target_rankt = "WARLOCK", 5, 60 elseif item == "_Water" then iclass, inumber, target_rankt = "MAGE", 6, 5 elseif item == "_Food" then iclass, inumber, target_rankt = "MAGE", 7, 7 end DEFAULT_CHAT_FRAME:AddMessage(item) if ChatCast_SpellLibrary[iclass][inumber] then for i=1, table.getn(ChatCast_SpellLibrary[iclass][inumber].rank), 1 do if UnitLevel("player") >= ChatCast_SpellLibrary[iclass][inumber].rank[i] and UnitLevel("target") >= ChatCast_SpellLibrary[iclass][inumber].rank[i] - target_rankt then target_rank = i end end if info == "item" then return ChatCast_SpellLibrary[iclass][inumber].rankitem[target_rank] elseif info == "spell" then if target_rank then if item == "_Water" or item == "_Food" then return ChatCast_SpellLibrary[iclass][inumber].spellname .. string.format(CCLocale.UI.rank, target_rank) end local i = 1 while true do spellName, spellRank = GetSpellName(i, 1) if not spellName then break elseif spellName == ChatCast_SpellLibrary[iclass][inumber].spellname[target_rank] then return i end i = i + 1 end end end end return nil end function ChatCast_CreateItem(item) if item == "_Healthstone" or item == "_Soulstone" or item == "_Water" or item == "_Food" then local spellid = ChatCast_LookupItem("spell", item) if spellid then if ChatCast.Trading then ChatCast.Trading.creating = 1 end if (ChatCast.Feedback) then DEFAULT_CHAT_FRAME:AddMessage(string.format(CCLocale.UI.text.fb_creating, (ChatCast.Trading and ChatCast.Trading.itemname or item))) end if item == "_Healthstone" or item == "_Soulstone" then CastSpell(spellid,BOOKTYPE_SPELL) elseif item == "_Water" or item == "_Food" then CastSpellByName(spellid) end end end end function ChatCast_Soulstone(name) if not name then return end local itemname = ChatCast_LookupItem("item", "_Soulstone") local container, slot = ChatCast_FindItem(itemname, 1) if container and slot then local oldtarget if UnitName("target") then oldtarget = UnitName("target") end if ChatCast_Target(name) then UseContainerItem(container, slot) end else ChatCast_CreateItem("_Soulstone") end end function ChatCast_InitiateTrade(name, item, quantity) if not name or not item or not quantity then return nil end local oldtarget, itemname = nil,nil if UnitName("target") then oldtarget = UnitName("target") end if ChatCast_Target(name) then if item == "_Healthstone" or item == "_Water" or item == "_Food" then itemname = ChatCast_LookupItem("item", item) else itemname = item end local cca, ccb = ChatCast_FindItem(itemname, quantity) ChatCast.Trading = { name = name, itemname = itemname, time = 4, quantity = quantity, creating = nil } ChatCastFrame:Show() if cca and ccb then InitiateTrade("target") -- if ChatCast.Feedback then DEFAULT_CHAT_FRAME:AddMessage(string.format(CCLocale.UI.text.fb_trading, name)) end else ChatCast_CreateItem(item) end else if ChatCast.Feedback then DEFAULT_CHAT_FRAME:AddMessage(string.format(CCLocale.UI.text.fb_targetfail, name)) end ChatCast.Trading = nil end if oldtarget then ChatCast_Target(oldtarget) else ClearTarget() end end function ChatCast_DoTrade() if ChatCast.Trading then if ChatCast.Trading.time > 0.1 then if not ChatCast.Trading.container or not ChatCast.Trading.slot then ChatCast.Trading.container, ChatCast.Trading.slot = ChatCast_FindItem(ChatCast.Trading.itemname, ChatCast.Trading.quantity) end if ChatCast.Trading.container and ChatCast.Trading.slot then PickupContainerItem(ChatCast.Trading.container, ChatCast.Trading.slot) ClickTradeButton(1) ChatCast.Trading.ready = 1.5 if CursorHasItem() then PickupContainerItem(ChatCast.Trading.container, ChatCast.Trading.slot); return; end end end end end function ChatCast_FinishTrade() if ChatCast.Trading then AcceptTrade() ChatCast.Trading = nil end end function ChatCast_Trade_OnUpdate() if CC_AttackTimer and CC_AttackTimer > 0 then CC_AttackTimer = CC_AttackTimer - arg1 if CC_AttackTimer < 0 then AttackTarget() ChatCastFrame:Hide() end elseif ChatCast.Trading then if not ChatCast.Trading.creating then if TradeFrame:IsShown() and ChatCast.Trading.ready then if ChatCast.Trading.ready < 0.1 then ChatCast_FinishTrade() else ChatCast.Trading.ready = ChatCast.Trading.ready - arg1 end elseif ChatCast.Trading.time < 0.1 then if ChatCast.Feedback then DEFAULT_CHAT_FRAME:AddMessage(string.format(CCLocale.UI.text.fb_tradefail, ChatCast.Trading.name)) end ChatCast.Trading = nil else ChatCast.Trading.time = ChatCast.Trading.time - arg1 end elseif ChatCast.Trading.creating > 2 then ChatCast.Trading.creating = ChatCast.Trading.creating - arg1 if ChatCast.Trading.creating <= 2 then ChatCast_InitiateTrade(ChatCast.Trading.name, ChatCast.Trading.itemname, ChatCast.Trading.quantity) end end else ChatCastFrame:Hide() end end