vanilla-wow-addons – Rev 1

Subversion Repositories:
Rev:
--
-- MI2_ConvDropRate.lua
--
-- author: NakorNH
-- this converter was written and submitted by NakorNH
--
-- DropRate data converter for the MobInfo2 AddOn
-- This converter will convert all Mobs found in the DropRate database
-- and convert them into entries for the MobInfo2 database. Item data
-- can only be converted if the item can be found in either the
-- ItemSync or KC_Items or LootLink databases (thus either of these
-- AddOns must be installed as well).
--
-- Using LootLink is recommended for the conversion because AddOns sites
-- like "http://ui.worldofwar.net" host huge LootLink item databases
-- that ensure a high conversion success rate. After successful
-- conversion LootLink can be uninstalled.
--


local MI_CONVERTER = mifontLightBlue.."<MobInfo DR Convert>"..mifontWhite.." "
local MI_MOBSFOUND = " Mobs found in DropRate data,"
local MI_NEWMOBSFOUND = " new Mobs added to database,"
local MI_EXISTINGMOBS = " existing Mobs expanded,"
local MI_PARTIALMOBS = " Mobs partially converted,"
local MI_SKIPPEDITEMS = " unknown items skipped,"
local MI_ADDEDITEMS = " items added to database,"


-----------------------------------------------------------------------------
-- MI2_StartDropRateConversion()
--
-- Scans the DropRate database. Then converts the data and adds it to MobInfo2 database
-----------------------------------------------------------------------------
function MI2_StartDropRateConversion()
        local totalMobs = 0
        local newMobsFound = 0
        local mobsExtended = 0
        local partialMobs = 0
        local itemsSkipped = 0
        local itemsFound = 0

        chattext( MI_CONVERTER.."DropRate conversion started ..." )
        
        if not drdb then
                chattext( "DropRate database not found" )
                return
        end
        
        for mobName, value in drdb do
                local notCompleteMob = 0
                local newMobData = {}
                local drMobLevel
                for index , value2 in value do
                        if index == "level" then
                                drMobLevel = value2
                                totalMobs = totalMobs + 1
                        end
                end     
                
                if drMobLevel then
                        for index, value2 in value do
                                local drItemID = -1
                                if index == "level" then
                                        drMobLevel = value2
                                elseif index == "looted" then
                                        newMobData.loots = value2
                                        drdb[mobName][index] = nil
                                elseif index == "skinned" then
                                        newMobData.skinCount = value2
                                        notItem = 1
                                        drdb[mobName][index] = nil
                                elseif index == "money" then
                                        newMobData.copper = value2
                                        drdb[mobName][index] = nil
                                else
                                        drItemID = (MI2_drFindItemID(index) or 0)
                                end

                                -- process all item data antries where an item ID code could be found
                                if drItemID > 0 then
                                        -- process item quality for item quality overview
                                        local drQuality = dritems[index]
                                        if drQuality == 0 then
                                                newMobData.r1 = (newMobData.r1 or 0) + 1
                                        elseif drQuality == 1 then
                                                newMobData.r2 = (newMobData.r2 or 0) + 1
                                        elseif drQuality == 2 then
                                                newMobData.r3 = (newMobData.r3 or 0) + 1
                                        elseif drQuality == 3 then
                                                newMobData.r4 = (newMobData.r4 or 0) + 1
                                        elseif drQuality == 4 then
                                                newMobData.r5 = (newMobData.r5 or 0) + 1
                                        elseif drQuality == -1 then
                                                drQuality = 1
                                        end

                                        -- process item value
                                        local drItemValue = MI2_FindItemValue( index, drItemID )
                                        newMobData.itemValue = (newMobData.itemValue or 0) + drItemValue

                                        -- add item to MobInfo items table
                                        if MobInfoConfig.SaveItems == 1 and (drQuality + 1) >= MobInfoConfig.ItemsQuality then
                                                if not newMobData.itemList then newMobData.itemList = {} end
                                                newMobData.itemList[drItemID] = value2
                                                if not MI2_ItemNameTable[drItemID] then
                                                        MI2_ItemNameTable[drItemID] = index.."/"..(drQuality + 1)
                                                end
                                        end

                                        drdb[mobName][index] = nil
                                        itemsFound = itemsFound + 1

                                elseif drItemID == 0 then
                                        notCompleteMob = 1
                                        itemsSkipped = itemsSkipped + 1
                                end
                        end -- for

                        -- add converted DropRate Mob data to existing MobInfo data
                        -- (creates new MobInfo database entry if Mob does not exist)
                        local origMobData = MI2_GetMobData(mobName,drMobLevel)
                        if origMobData.loots then
                                mobsExtended = mobsExtended + 1
                        else
                                newMobsFound = newMobsFound + 1
                        end     
                        MI2_AddTwoMobs(newMobData, origMobData)
                        MI2x_StoreMobData( newMobData, mobName, drMobLevel, MI2_PlayerName )

                        -- check if entire DropRate Mob entry has been converted
                        local remainingEntries = 0
                        for index in drdb[mobName] do
                                if index ~= "level" then
                                        remainingEntries = remainingEntries + 1
                                end
                        end
                        if remainingEntries == 0 then
                                drdb[mobName] = nil
                        end
                end
                if notCompleteMob > 0 then
                        partialMobs = partialMobs + 1
                end
                
        end

        MI2_BuildXRefItemTable()

        chattext(MI_CONVERTER..totalMobs..MI_MOBSFOUND)
        chattext(MI_CONVERTER..mobsExtended..MI_EXISTINGMOBS)
        chattext(MI_CONVERTER..newMobsFound..MI_NEWMOBSFOUND)
        chattext(MI_CONVERTER..partialMobs..MI_PARTIALMOBS)
        chattext(MI_CONVERTER..itemsFound..MI_ADDEDITEMS)
        chattext(MI_CONVERTER..itemsSkipped..MI_SKIPPEDITEMS) 
end 

-----------------------------------------------------------------------------
-- MI2_StartDropRateConversion()
--
-- Find the itemID for each item in the database
-----------------------------------------------------------------------------
function MI2_drFindItemID(index)
        -- Find item code from ItemSync
        if ISyncDB_Names then
                for ISItemID, ISItemName in ISyncDB_Names do
                        if ISItemName == index then
                                return ISItemID
                        end
                end
        end

        -- Find item code from KC_Items (potentially dangerous : might cause disconnect
        -- when calling "GetItemInfo()" with item ID not known on server)
        if KC_ItemsDB then
                for itemCode, itemInfo in KC_ItemsDB do
                        local itemName, itemLink = GetItemInfo(itemCode)
                        if itemName then
                                if itemName == index then
                                        return itemCode, itemLink
                                end
                        end
                end
        end
        
        -- Find item code from LootLink
        if ItemLinks then
                if ItemLinks[index] then
                        local lootLinkData = ItemLinks[index].i
                        local a,b,itemCode,CDRenchantCode,CDRbonusCode,CDRmiscCode = string.find(lootLinkData, "(%d*):(%d*):(%d*):(%d*)")
                        return tonumber(itemCode)
                end
        end
        
        return nil
end -- of MI2_drFindItemID