vanilla-wow-addons – Rev 1

Subversion Repositories:
Rev:
--[[

        Enchantrix v3.6.1 (Platypus)
        $Id: Enchantrix.lua 859 2006-05-11 13:35:49Z aradan $

        By Norganna
        http://enchantrix.org/

        This is an addon for World of Warcraft that add a list of what an item
        disenchants into to the items that you mouse-over in the game.

        License:
                This program is free software; you can redistribute it and/or
                modify it under the terms of the GNU General Public License
                as published by the Free Software Foundation; either version 2
                of the License, or (at your option) any later version.

                This program is distributed in the hope that it will be useful,
                but WITHOUT ANY WARRANTY; without even the implied warranty of
                MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
                GNU General Public License for more details.

                You should have received a copy of the GNU General Public License
                along with this program(see GLP.txt); if not, write to the Free Software
                Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA.

]]

-- Local functions
local addonLoaded
local onLoad
local pickupInventoryItemHook
local pickupContainerItemHook
local onEvent

Enchantrix.Version = "3.6.1"
if (Enchantrix.Version == "<".."%version%>") then
        Enchantrix.Version = "3.5.DEV"
end

local DisenchantEvent = {}

-- This function differs from onLoad in that it is executed
-- after variables have been loaded.
function addonLoaded(hookArgs, event, addOnName)
        if (event ~= "ADDON_LOADED") or (string.lower(addOnName) ~= "enchantrix") then
                return
        end
        Stubby.UnregisterEventHook("ADDON_LOADED", "Enchantrix")

        -- Call AddonLoaded for other objects
        Enchantrix.Storage.AddonLoaded() -- Sets up saved variables so should be called first
        Enchantrix.Barker.AddonLoaded()
        Enchantrix.Command.AddonLoaded()
        Enchantrix.Config.AddonLoaded()
        Enchantrix.Locale.AddonLoaded()
        Enchantrix.Tooltip.AddonLoaded()

        Enchantrix.Revision = Enchantrix.Util.GetRevision("$Revision: 859 $")
        for name, obj in pairs(Enchantrix) do
                if type(obj) == "table" then
                        Enchantrix.Revision = math.max(Enchantrix.Revision, Enchantrix.Util.GetRevision(obj.Revision))
                end
        end

        Stubby.RegisterAddOnHook("Auctioneer", "Enchantrix", Enchantrix.Command.AuctioneerLoaded);

        -- Register disenchant detection hooks
        Stubby.RegisterFunctionHook("PickupContainerItem", 400, pickupContainerItemHook)
        Stubby.RegisterFunctionHook("PickupInventoryItem", 400, pickupInventoryItemHook)

        Stubby.RegisterEventHook("SPELLCAST_START", "Enchantrix", onEvent)
        Stubby.RegisterEventHook("SPELLCAST_STOP", "Enchantrix", onEvent)
        Stubby.RegisterEventHook("SPELLCAST_FAILED", "Enchantrix", onEvent)
        Stubby.RegisterEventHook("SPELLCAST_INTERRUPTED", "Enchantrix", onEvent)
        Stubby.RegisterEventHook("LOOT_OPENED", "Enchantrix", onEvent)

        local vstr = string.format("%s-%d", Enchantrix.Version, Enchantrix.Revision)
        Enchantrix.Util.ChatPrint(string.format(_ENCH('FrmtWelcome'), vstr), 0.8, 0.8, 0.2)
        Enchantrix.Util.ChatPrint(_ENCH('FrmtCredit'), 0.6, 0.6, 0.1)
end

-- Register our temporary command hook with stubby
function onLoad()
        Stubby.RegisterBootCode("Enchantrix", "CommandHandler", [[
                local function cmdHandler(msg)
                        local i,j, cmd, param = string.find(string.lower(msg), "^([^ ]+) (.+)$")
                        if (not cmd) then cmd = string.lower(msg) end
                        if (not cmd) then cmd = "" end
                        if (not param) then param = "" end
                        if (cmd == "load") then
                                if (param == "") then
                                        Stubby.Print("Manually loading Enchantrix...")
                                        LoadAddOn("Enchantrix")
                                elseif (param == "always") then
                                        Stubby.Print("Setting Enchantrix to always load for this character")
                                        Stubby.SetConfig("Enchantrix", "LoadType", param)
                                        LoadAddOn("Enchantrix")
                                elseif (param == "never") then
                                        Stubby.Print("Setting Enchantrix to never load automatically for this character (you may still load manually)")
                                        Stubby.SetConfig("Enchantrix", "LoadType", param)
                                else
                                        Stubby.Print("Your command was not understood")
                                end
                        else
                                Stubby.Print("Enchantrix is currently not loaded.")
                                Stubby.Print("  You may load it now by typing |cffffffff/enchantrix load|r")
                                Stubby.Print("  You may also set your loading preferences for this character by using the following commands:")
                                Stubby.Print("  |cffffffff/enchantrix load always|r - Enchantrix will always load for this character")
                                Stubby.Print("  |cffffffff/enchantrix load never|r - Enchantrix will never load automatically for this character (you may still load it manually)")
                        end
                end
                SLASH_ENCHANTRIX1 = "/enchantrix"
                SLASH_ENCHANTRIX2 = "/enchant"
                SLASH_ENCHANTRIX3 = "/enx"
                SlashCmdList["ENCHANTRIX"] = cmdHandler
        ]]);

        Stubby.RegisterBootCode("Enchantrix", "Triggers", [[
                if Stubby.GetConfig("Enchantrix", "LoadType") == "always" then
                        LoadAddOn("Enchantrix")
                else
                        Stubby.Print("]].._ENCH('MesgNotloaded')..[[")
                end
        ]]);

        SLASH_ENCHANTRIX1 = "/enchantrix";
        SLASH_ENCHANTRIX2 = "/enchant";
        SLASH_ENCHANTRIX3 = "/enx";
        SlashCmdList["ENCHANTRIX"] = function(msg) Enchantrix.Command.HandleCommand(msg) end

        Stubby.RegisterEventHook("ADDON_LOADED", "Enchantrix", addonLoaded)
end

function pickupInventoryItemHook(funcArgs, retVal, slot)
        -- Remember last activated item
        if slot then
                DisenchantEvent.spellTarget = GetInventoryItemLink("player", slot)
        end
end

function pickupContainerItemHook(funcArgs, retVal, bag, slot)
        -- Remember last activated item
        if bag and slot then
                DisenchantEvent.spellTarget = GetContainerItemLink(bag, slot)
        end
end

function onEvent(funcVars, event, spellName, spellDuration)
        if event == "SPELLCAST_START" then
                if spellName == _ENCH('ArgSpellname') then
                        DisenchantEvent.started = DisenchantEvent.spellTarget
                        DisenchantEvent.finished = nil
                        DisenchantEvent.startTime = GetTime()
                        DisenchantEvent.spellDuration = spellDuration / 1000  -- Convert ms to s
                else
                        DisenchantEvent.started = nil
                        DisenchantEvent.finished = nil
                end
                return
        end
        if (event == "SPELLCAST_FAILED") or (event == "SPELLCAST_INTERRUPTED") then
                DisenchantEvent.started = nil
                DisenchantEvent.finished = nil
                return
        end
        if event == "SPELLCAST_STOP" then
                DisenchantEvent.finished = DisenchantEvent.started
                DisenchantEvent.started = nil
                return
        end
        if event == "LOOT_OPENED" then
                if DisenchantEvent.finished then
                        -- Make sure loot windows opens within a few seconds from expected spell completion time
                        -- Normal range of lootLatency appears to be around -0.1 - 0.7s
                        local lootLatency = GetTime() - (DisenchantEvent.startTime + DisenchantEvent.spellDuration)
                        if (lootLatency > -1) and (lootLatency < 2) then
                                Enchantrix.Util.ChatPrint(string.format(_ENCH("FrmtFound"), DisenchantEvent.finished))
                                local sig = Enchantrix.Util.GetSigFromLink(DisenchantEvent.finished)
                                for i = 1, GetNumLootItems(), 1 do
                                        if LootSlotIsItem(i) then
                                                local icon, name, quantity, rarity = GetLootSlotInfo(i)
                                                local link = GetLootSlotLink(i)
                                                Enchantrix.Util.ChatPrint(string.format("  %s x%d", link, quantity))
                                                -- Save result
                                                local reagentID = Enchantrix.Util.GetItemIdFromLink(link)
                                                if reagentID then
                                                        Enchantrix.Storage.SaveDisenchant(sig, reagentID, quantity)
                                                end
                                        end
                                end
                        end
                end
                DisenchantEvent.started = nil
                DisenchantEvent.finished = nil
                return
        end
end

-- Execute on load
onLoad()