vanilla-wow-addons – Rev 1
?pathlinks?
--
-- MI2_Slash.lua
--
-- Handle all slash commands and the actions performed by slash commands.
-- All option dialog settings use slash commands for performing their
-- actions.
--
miVersionNo = ' 2.97'
miVersion = mifontYellow..'MobInfo-2 Version '..miVersionNo..mifontGreen..' http://www.dizzarian.com/forums/viewforum.php?f=16'
miPatchNotes = mifontYellow..
'MobInfo-2 Version '..miVersionNo..'\n'..
' ver 2.97\n'..
' - updated to comply with newest WoW version 1.11\n'..
' - show items on search options page in correct item color\n'..
' - search options page again shows result list size\n'..
' - fixed bug in search for Mobs that drop a certain item\n\n'..
' ver 2.96\n'..
' - new feature: store health value obtained through Beast Lore in health database\n'..
' - new feature: added chinese translation submitted by Andyca Chiou\n'..
' - fixed nil error for items with legendary and artifact rarity\n\n'..
' ver 2.95\n'..
' - bugfix release : fixes wrong max health display\n\n'..
' ver 2.94\n'..
' - huge update of MobInfo vendor sell price table (over 1000 new prices)\n'..
' - DropRate conversion now supports LootLink databases\n'..
' - fixed: DropRate conversion nil bug "Mobinfo2.lua Line: 383"\n'..
' - fixed bug where health was displayed wrong after using "BeastLore" on Mob\n\n'..
' ver 2.93\n'..
' - new feature: implemented DropRate database converter from NakorNH\n'..
' - bugfix: correctly import locations for mobs in instances\n'..
' - added new items (loot from Silithus) to MobInfo item price table\n'..
' - several new skinning loot items added to skinning loot detection table\n\n'..
' ver 2.92\n'..
' - new feature: you can choose to import only unknown (ie. new) Mobs\n'..
' - improved item colors in Mob tooltip for better readability\n'..
' - fixed all health/mana updating issues for unit frame and tooltip\n'..
' - fixed max health not increasing correctly for group member targets\n\n'..
' ver 2.91\n'..
' - new feature: importing of externally supplied MobInfo databases\n'..
' - new feature: option to delete all Mobs shown in search result\n'..
' - added Turtle Scales to skinning loot detection table\n'..
' - show all "green hills of Strangle" pages on one tooltip line\n'..
' - item list on search page: show all items if item name field is empty\n'..
' - fixed: mob name search errors on special chars\n'..
' - fixed: correct independant show/hide of basic loot items\n\n'..
' ver 2.90\n'..
' - added separate tooltip option for cloth and skinning loot\n'..
' - show drop percentages for items in Mob tooltip\n'..
' - calculate skinning loot percantage based on skinned counter\n'..
' - rearranged tooltips options page\n'..
' - new skinning loot support for Shiny Fish Scales and Red Whelp Scales\n\n'..
' For all previous patch notes and to report bugs please visit http://www.dizzarian.com/forums/viewforum.php?f=16'
local MI2_DeleteMode = ""
-- Configs
function MI2_SlashAction_Default()
MobInfoConfig.ShowClass = 1
MobInfoConfig.ShowHealth = 1
MobInfoConfig.ShowMana = 0
MobInfoConfig.ShowDamage = 1
MobInfoConfig.ShowKills = 0
MobInfoConfig.ShowLoots = 1
MobInfoConfig.ShowEmpty = 0
MobInfoConfig.ShowXp = 1
MobInfoConfig.ShowNo2lev = 1
MobInfoConfig.ShowQuality = 1
MobInfoConfig.ShowCloth = 1
MobInfoConfig.ShowCoin = 0
MobInfoConfig.ShowIV = 0
MobInfoConfig.ShowTotal = 1
MobInfoConfig.ShowCombined = 0
MobInfoConfig.ShowItems = 1
MobInfoConfig.ShowLocation = 1
MobInfoConfig.ShowClothSkin = 1
end
function MI2_SlashAction_AllOn()
MobInfoConfig.ShowClass = 1
MobInfoConfig.ShowHealth = 1
MobInfoConfig.ShowMana = 1
MobInfoConfig.ShowKills = 1
MobInfoConfig.ShowDamage = 1
MobInfoConfig.ShowXp = 1
MobInfoConfig.ShowNo2lev = 1
MobInfoConfig.ShowLoots = 1
MobInfoConfig.ShowEmpty = 1
MobInfoConfig.ShowCoin = 1
MobInfoConfig.ShowIV = 1
MobInfoConfig.ShowTotal = 1
MobInfoConfig.ShowQuality = 1
MobInfoConfig.ShowCloth = 1
MobInfoConfig.ShowCombined = 1
MobInfoConfig.ShowItems = 1
MobInfoConfig.ShowLocation = 1
MobInfoConfig.ShowClothSkin = 1
end
function MI2_SlashAction_AllOff()
MobInfoConfig.ShowClass = 0
MobInfoConfig.ShowHealth = 0
MobInfoConfig.ShowMana = 0
MobInfoConfig.ShowKills = 0
MobInfoConfig.ShowDamage = 0
MobInfoConfig.ShowXp = 0
MobInfoConfig.ShowNo2lev = 0
MobInfoConfig.ShowLoots = 0
MobInfoConfig.ShowEmpty = 0
MobInfoConfig.ShowCoin = 0
MobInfoConfig.ShowIV = 0
MobInfoConfig.ShowTotal = 0
MobInfoConfig.ShowQuality = 0
MobInfoConfig.ShowCloth = 0
MobInfoConfig.ShowCombined = 0
MobInfoConfig.ShowItems = 0
MobInfoConfig.ShowLocation = 0
MobInfoConfig.ShowClothSkin = 0
end
function MI2_SlashAction_Minimal()
MobInfoConfig.ShowClass = 1
MobInfoConfig.ShowHealth = 1
MobInfoConfig.ShowMana = 0
MobInfoConfig.ShowKills = 0
MobInfoConfig.ShowDamage = 0
MobInfoConfig.ShowXp = 0
MobInfoConfig.ShowNo2lev = 1
MobInfoConfig.ShowLoots = 0
MobInfoConfig.ShowEmpty = 0
MobInfoConfig.ShowCoin = 0
MobInfoConfig.ShowIV = 0
MobInfoConfig.ShowTotal = 1
MobInfoConfig.ShowQuality = 0
MobInfoConfig.ShowCloth = 0
MobInfoConfig.ShowCombined = 0
MobInfoConfig.ShowItems = 0
MobInfoConfig.ShowLocation = 0
MobInfoConfig.ShowClothSkin = 0
end
-----------------------------------------------------------------------------
-- MI2_RegisterWithAddonManagers()
--
-- Register MobInfo with the KHAOS AddOn manager. This is a very simple
-- registration that merely creates a button to open the MobInfo options
-- dialog.
--
-- Register MobInfo with the myAddons manager.
--
-- Register with the EARTH AddOn manager.
-----------------------------------------------------------------------------
function MI2_RegisterWithAddonManagers()
-- register with myAddons manager
if ( myAddOnsFrame_Register ) then
local mobInfo2Details = {
name = "MobInfo2",
version = miVersionNo,
author = "Skeeve & Dizzarian",
website = "http://www.dizzarian.com/forums/viewforum.php?f=16",
category = MYADDONS_CATEGORY_OTHERS,
optionsframe = "frmMIConfig"
}
myAddOnsFrame_Register( mobInfo2Details )
end
-- register with EARTH manager (mainly for Cosmos support)
if EarthFeature_AddButton then
EarthFeature_AddButton(
{
id = "MobInfo2",
name = "MobInfo2",
subtext = "v"..miVersionNo,
tooltip = MI_DESCRIPTION,
icon = "Interface\\AddOns\\MobInfo2\\MobInfoIcon",
callback = function(state) MI2_SlashParse( "", false ) end,
test = nil
}
)
-- register with KHAOS (only if EARTH not found)
elseif Khaos then
Khaos.registerOptionSet(
"tooltip",
{
id = "MobInfo2OptionSet",
text = "MobInfo 2",
helptext = MI_DESCRIPTION,
difficulty = 1,
callback = function(state) end,
default = true,
options = {
{
id = "MobInfo2OptionsHeader",
type = K_HEADER,
difficulty = 1,
text = MI_TXT_WELCOME,
helptext = MI_DESCRIPTION
},
{
id = "MobInfo2OptionsButton",
type = K_BUTTON,
difficulty = 1,
text = MI_TXT_CONFIG_TITLE,
helptext = "",
callback = function(state) MI2_SlashParse( "", false ) end,
feedback = function(state) end,
setup = { buttonText = MI_TXT_OPEN }
}
}
}
)
end
end -- MI2_RegisterWithAddonManagers()
-----------------------------------------------------------------------------
-- MI2_SlashAction_ClearTarget()
--
-- Clear MobInfo and MobHealth data for current target.
-----------------------------------------------------------------------------
function MI2_SlashAction_ClearTarget()
local index = MI2_Target.mobIndex
if index then
MI2_MobHealth_ClearTargetData()
MI2_DeleteMobData( index )
MI2_DbOptionsFrameOnShow()
ClearTarget()
chattext( "data for "..mifontGreen..index..mifontWhite.." has been cleared" )
end
end -- MI2_SlashAction_ClearTarget()
-----------------------------------------------------------------------------
-- MI2_Slash_ClearAllConfirmed()
--
-- Clear-All-Confirmation-Handler : Clear entire contents of MobInfo and
-- MobHealth databases.
-----------------------------------------------------------------------------
function MI2_Slash_ClearAllConfirmed()
if MI2_DeleteMode == "MobDb" then
MobInfoDB = {}
MI2_ItemNameTable = {}
MobInfoDB["DatabaseVersion:0"] = { ver = MI2_DB_VERSION }
MI2_CharTable = {}
MI2_CharTable.charCount = 0
elseif MI2_DeleteMode == "HealthDb" then
MI2_MobHealth_Reset()
elseif MI2_DeleteMode == "PlayerDb" then
MobHealthPlayerDB = {}
end
chattext( "<MobInfo> database deleted" )
MI2_DbOptionsFrameOnShow()
end -- MI2_Slash_ClearAllConfirmed()
-----------------------------------------------------------------------------
-- MI2_SlashAction_ClearHealthDb()
--
-- Clear entire contents of MobInfo and MobHealth databases.
-- Ask for confirmation before performing the clear operation.
-----------------------------------------------------------------------------
function MI2_SlashAction_ClearHealthDb()
StaticPopupDialogs["MOBINFO_CONFIRMATION"].text = MI_TXT_CLR_ALL_CONFIRM.."'"..MI2_OPTIONS[this:GetName()].help.."' ?"
StaticPopupDialogs["MOBINFO_CONFIRMATION"].OnAccept = MI2_Slash_ClearAllConfirmed
MI2_DeleteMode = "HealthDb"
local dialog = StaticPopup_Show( "MOBINFO_CONFIRMATION", "")
end -- MI2_SlashAction_ClearHealthDb()
-----------------------------------------------------------------------------
-- MI2_SlashAction_ClearPlayerDb()
--
-- Clear entire contents of MobInfo and MobHealth databases.
-- Ask for confirmation before performing the clear operation.
-----------------------------------------------------------------------------
function MI2_SlashAction_ClearPlayerDb()
StaticPopupDialogs["MOBINFO_CONFIRMATION"].text = MI_TXT_CLR_ALL_CONFIRM.."'"..MI2_OPTIONS[this:GetName()].help.."' ?"
StaticPopupDialogs["MOBINFO_CONFIRMATION"].OnAccept = MI2_Slash_ClearAllConfirmed
MI2_DeleteMode = "PlayerDb"
local dialog = StaticPopup_Show( "MOBINFO_CONFIRMATION", "")
end -- MI2_SlashAction_ClearPlayerDb()
-----------------------------------------------------------------------------
-- MI2_SlashAction_ClearMobDb()
--
-- Clear entire contents of MobInfo and MobHealth databases.
-- Ask for confirmation before performing the clear operation.
-----------------------------------------------------------------------------
function MI2_SlashAction_ClearMobDb()
StaticPopupDialogs["MOBINFO_CONFIRMATION"].text = MI_TXT_CLR_ALL_CONFIRM.."'"..MI2_OPTIONS[this:GetName()].help.."' ?"
StaticPopupDialogs["MOBINFO_CONFIRMATION"].OnAccept = MI2_Slash_ClearAllConfirmed
MI2_DeleteMode = "MobDb"
local dialog = StaticPopup_Show( "MOBINFO_CONFIRMATION", "")
end -- MI2_SlashAction_ClearMobDb()
-----------------------------------------------------------------------------
-- MI2_Slash_TrimDownConfirmed()
--
-- Trim down the contents of the mob info database by removing all data
-- that is not set as being recorded. This function is called when the
-- user confirms the delete confirmation.
-----------------------------------------------------------------------------
function MI2_Slash_TrimDownConfirmed()
MobInfoDB["DatabaseVersion:0"] = nil
-- loop through database and check each record
-- remove all fields within the record where recording of the field is disabled
for idx, mobInfo in MobInfoDB do
if MobInfoConfig.SaveBasicInfo == 0 then
mobInfo.bi = nil
end
if MobInfoConfig.SaveQualityData == 0 then
mobInfo.qi = nil
end
if MobInfoConfig.SaveLocation == 0 then
mobInfo.ml = nil
end
if MobInfoConfig.SaveItems == 0 then
mobInfo.il = nil
end
if MobInfoConfig.SaveCharData == 0 then
MI2_RemoveCharData( mobInfo )
end
end
if MobInfoConfig.SaveItems == 0 then
MI2_ItemNameTable = {}
end
-- char table can be deleted when not saving char specific data
if MobInfoConfig.SaveCharData == 0 then
MI2_CharTable = { charCount = 0 }
end
-- force a cleanup after trimming down
MobInfoDB["DatabaseVersion:0"] = { ver = MI2_DB_VERSION - 1 }
MI2_CleanupDatabases()
MI2_DbOptionsFrameOnShow()
end -- MI2_Slash_TrimDownConfirmed()
-----------------------------------------------------------------------------
-- MI2_SlashAction_TrimDownMobData()
--
-- Trim down the contents of the mob info database by removing all data
-- that is not set as being recorded. Ask for a confirmation before
-- actually deleting anything.
-----------------------------------------------------------------------------
function MI2_SlashAction_TrimDownMobData()
StaticPopupDialogs["MOBINFO_CONFIRMATION"].text = MI_TXT_TRIM_DOWN_CONFIRM
StaticPopupDialogs["MOBINFO_CONFIRMATION"].OnAccept = MI2_Slash_TrimDownConfirmed
local dialog = StaticPopup_Show( "MOBINFO_CONFIRMATION", "")
end -- MI2_SlashAction_TrimDownMobData()
-----------------------------------------------------------------------------
-- MI2_UpdateMob()
--
-- Update a specific existing mob by adding to it the given new Mob data.
-----------------------------------------------------------------------------
local function MI2_UpdateMob( mobIndex, newMobInfo )
local existingMobInfo = MobInfoDB[mobIndex]
local existingMobData, newMobData = {}, {}
MI2_GetMobDataFromMobInfo( existingMobInfo, existingMobData )
MI2_GetMobDataFromMobInfo( newMobInfo, newMobData )
MI2_AddTwoMobs( existingMobData, newMobData )
MI2x_StoreMobData( existingMobData, nil, nil, MI2_PlayerName, mobIndex )
end -- MI2_UpdateMob()
-----------------------------------------------------------------------------
-- MI2_AdaptImportLocation()
--
-- Adapt the location info of an imported Mob. This is only necessary for
-- Mobs in instances, because instances are not available in the WoW
-- zone tables.
-----------------------------------------------------------------------------
local function MI2_AdaptImportLocation( mobInfo, importZoneTable )
-- decode mob location information: only adapt mobs from instances
local mobData = {}
MI2_DecodeMobLocation( mobInfo, mobData )
if not mobData.location or mobData.location.z < 100 then return end
-- instance mob found: find the name of the instance
local zoneId = mobData.location.z
local zoneName = importZoneTable[zoneId]
if not zoneName then
-- unknown import zone ID : search zone name and add it to the zone table
for name, id in importZoneTable do
if id == zoneId then
zoneName = name
importZoneTable[zoneId] = zoneName
end
end
end
-- find the corrected zone ID for the zone name
if zoneName then
if not MI2_ZoneTable[zoneName] then
MI2_ZoneTable.cnt = MI2_ZoneTable.cnt + 1
MI2_ZoneTable[zoneName] = 100 + MI2_ZoneTable.cnt
end
local correctedZoneId = MI2_ZoneTable[zoneName]
local loc = mobData.location
mobInfo.ml = (loc.x1 or "").."/"..(loc.y1 or "").."/"..(loc.x2 or "").."/"..(loc.y2 or "").."/0/"..correctedZoneId
else
mobInfo.ml = nil
end
end -- MI2_AdaptImportLocation()
-----------------------------------------------------------------------------
-- MI2_SlashAction_ImportMobData()
--
-- Import externally supplied MobInfo database into own database.
-----------------------------------------------------------------------------
function MI2_SlashAction_ImportMobData()
local newMobs, updatedMobs, newHealth, newItems = 0, 0, 0, 0
local chatPrefix = mifontLightBlue.."<MobInfo Import>"..mifontWhite
chattext( chatPrefix.." starting external database import ...." )
-- import loot items into main loot item database
for itemId, itemInfo in MI2_ItemNameTable_Import do
if not MI2_ItemNameTable[itemId] then
MI2_ItemNameTable[itemId] = itemInfo
newItems = newItems + 1
end
end
-- import health data into main Mob health database
for mobIndex, healthInfo in MobHealthDB_Import do
if not MobHealthDB[mobIndex] then
MobHealthDB[mobIndex] = healthInfo
newHealth = newHealth + 1
end
end
-- import Mobs into main Mob database
for mobIndex, mobInfo in MobInfoDB_Import do
MI2_RemoveCharData( mobInfo )
MI2_AdaptImportLocation( mobInfo, MI2_ZoneTable_Import )
if MobInfoDB[mobIndex] then
updatedMobs = updatedMobs + 1
if MobInfoConfig.ImportOnlyNew == 0 then
-- import Mob that already exists
MI2_UpdateMob( mobIndex, mobInfo )
end
else
-- import unknown Mob
MobInfoDB[mobIndex] = mobInfo
newMobs = newMobs + 1
end
end
-- update item cross reference table after import
if MobInfoConfig.ImportOnlyNew == 0 then
MI2_BuildXRefItemTable()
end
chattext( chatPrefix.." imported "..newMobs.." new Mobs" )
chattext( chatPrefix.." imported "..newHealth.." new health values" )
chattext( chatPrefix.." imported "..newItems.." new loot items" )
if MobInfoConfig.ImportOnlyNew == 0 then
chattext( chatPrefix.." updated data for "..updatedMobs.." existing Mobs" )
else
chattext( chatPrefix.." did NOT update data for "..updatedMobs.." existing Mobs" )
end
-- update database options frame
MobInfoConfig.ImportSignature = MI2_Import_Signature
MI2_DbOptionsFrameOnShow()
end -- MI2_SlashAction_ImportMobData()
-----------------------------------------------------------------------------
-- MI2_SlashAction_DeleteSearch()
--
-- Delete all Mobs in the search result list from the MobInfo database.
-- This function will ask for confirmation before deleting.
-----------------------------------------------------------------------------
function MI2_SlashAction_DeleteSearch()
local confirmationText = string.format( MI_TXT_DEL_SEARCH_CONFIRM, MI2_NumMobsFound )
StaticPopupDialogs["MOBINFO_CONFIRMATION"].text = confirmationText
StaticPopupDialogs["MOBINFO_CONFIRMATION"].OnAccept = MI2_DeleteSearchResultMobs
local dialog = StaticPopup_Show( "MOBINFO_CONFIRMATION", "")
end -- MI2_SlashAction_DeleteSearch()
-----------------------------------------------------------------------------
-- MI2_SlashInit()
--
-- Add all Slash Commands
-----------------------------------------------------------------------------
function MI2_SlashInit()
SlashCmdList["MOBINFO"] = MI2_SlashParse
SLASH_MOBINFO1 = "/mobinfo2"
SLASH_MOBINFO2 = "/mi2"
end -- MI2_SlashInit()
-----------------------------------------------------------------------------
-- MI2_SlashParse()
--
-- Parses the msg entered as a slash command. This function is also used
-- for the internal purpose of setting all options in the options dialog.
-- When used by the options dialog there is no need to actually update the
-- dialog, which is indicated by the "updateOptions" parameter.
-----------------------------------------------------------------------------
function MI2_SlashParse( msg, updateOptions )
-- extract option name and option argument from message string
local _, _, cmd, param = string.find( string.lower(msg), "([%w_]*)[ ]*([-%w]*)")
-- handle show/hide of options dialog first of all
-- handle all simple commands that dont require parsing right here
if not cmd or cmd == "" or cmd == "config" then
if frmMIConfig:IsVisible() then
frmMIConfig:Hide()
else
frmMIConfig:Show()
end
return
elseif cmd == 'version' then
chattext( miVersion )
return
elseif cmd == 'notes' then
chattext( miPatchNotes )
return
elseif cmd == 'convertdroprate' then
MI2_StartDropRateConversion()
return
elseif cmd == 'help' then
chattext( mifontYellow.. 'Usage /mobinfo2 <cmd> or /mi2 <cmd>' )
chattext( 'Where <cmd> is any of the following:' )
for idx, val in MI2_OPTIONS do
if val.help and val.help ~= "" then
local prefix = string.sub(idx, 1, 7)
local option = string.lower( string.sub(idx, 8) )
if prefix == "MI2_Opt" then
chattext( mifontGreen..option..' - '..mifontYellow..val.help )
end
end
end
return
end
-- search for the option data structure matching the command
local optionName, optionData
for idx, val in MI2_OPTIONS do
local lower_opt = string.lower( idx )
local optionCommand = string.sub(lower_opt, 8)
if cmd == lower_opt or cmd == optionCommand then
optionName = string.sub(idx, 8)
optionData = val
break
end
end
-- now call the option handler for the more complex commands
if optionData then
MI2_OptionParse( optionName, optionData, param, updateOptions )
end
end -- of MI2_SlashParse()
-----------------------------------------------------------------------------
-- MI2_OptionParse()
--
-- Parses the more complex option toggle/set commands. There are 4
-- categories of options:
-- * options that can toggle between an on and off state
-- * options that represent a numeric value
-- * options that represent a text
-- * options that activate a special functionality represented by a
-- handler function that must correspond to a specific naming convention
-----------------------------------------------------------------------------
function MI2_OptionParse( optionName, optionData, param, updateOptions )
-- handle the option according to its option type: its either a
-- switch being toggleg, a value being set, or a special action
if optionData.val then
-- it is a slider setting a value
-- get new option value from parameter and set it
local optValue = tonumber( param ) or 0
MobInfoConfig[optionName] = optValue
if updateOptions then
chattext( optionData.text.." : "..mifontGreen..optValue )
end
elseif optionData.txt then
-- it is a text based option
MobInfoConfig[optionName] = param
if updateOptions then
chattext( optionData.text.." : "..mifontGreen..param )
end
elseif MobInfoConfig[optionName] then
-- it is a switch toggle option:
-- get current option value and toggle it to the opposite state (On<->Off)
local valTxt = { val0 = "-OFF-", val1 = "-ON-" }
local optValue = MobInfoConfig[ optionName ]
optValue = 1 - optValue -- toggle option
MobInfoConfig[optionName] = optValue
chattext( optionData.text.." : "..mifontGreen..valTxt["val"..optValue] )
-- special case: disabling MobInfo requires extra processing
if optionName == "DisableMobInfo" then MI2_UpdateMobInfoState() end
else
-- special action commands have a corresponding handler function
local actionHandlerName = "MI2_SlashAction_"..optionName
local actionHandler = getglobal( actionHandlerName )
if actionHandler then
actionHandler()
updateOptions = true -- for AllOn, AllOff, etc.
end
end
-- update font and position of health / mana texts
MI2_MobHealth_SetPos()
-- update options dialog if shown and if requested
if frmMIConfig:IsVisible() and updateOptions then
MI2_UpdateOptions()
end
end -- MI2_OptionParse()