You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
251 lines
6.9 KiB
251 lines
6.9 KiB
|
4 years ago
|
-- ----------------------------------------------------------------------------
|
||
|
|
-- Localized Lua globals.
|
||
|
|
-- ----------------------------------------------------------------------------
|
||
|
|
-- Functions
|
||
|
|
local pairs = _G.pairs
|
||
|
|
local tonumber = _G.tonumber
|
||
|
|
local tostring = _G.tostring
|
||
|
|
local type = _G.type
|
||
|
|
|
||
|
|
-- Libraries
|
||
|
|
local table = _G.table
|
||
|
|
|
||
|
|
-----------------------------------------------------------------------
|
||
|
|
-- AddOn namespace.
|
||
|
|
-----------------------------------------------------------------------
|
||
|
|
local AddOnFolderName, private = ...
|
||
|
|
local Data = private.Data
|
||
|
|
local Enum = private.Enum
|
||
|
|
|
||
|
|
-----------------------------------------------------------------------
|
||
|
|
-- Helpers
|
||
|
|
-----------------------------------------------------------------------
|
||
|
|
local function CreateAlphaAnimation(animationGroup, fromAlpha, toAlpha, duration, startDelay, order)
|
||
|
|
local animation = animationGroup:CreateAnimation("Alpha")
|
||
|
|
animation:SetFromAlpha(fromAlpha)
|
||
|
|
animation:SetToAlpha(toAlpha)
|
||
|
|
animation:SetDuration(duration)
|
||
|
|
|
||
|
|
if startDelay then
|
||
|
|
animation:SetStartDelay(startDelay)
|
||
|
|
end
|
||
|
|
|
||
|
|
if order then
|
||
|
|
animation:SetOrder(order)
|
||
|
|
end
|
||
|
|
|
||
|
|
return animation
|
||
|
|
end
|
||
|
|
|
||
|
|
private.CreateAlphaAnimation = CreateAlphaAnimation
|
||
|
|
|
||
|
|
local function CreateScaleAnimation(animationGroup, fromScaleX, fromScaleY, toScaleX, toScaleY, duration, startDelay, order)
|
||
|
|
local animation = animationGroup:CreateAnimation("Scale")
|
||
|
|
animation:SetFromScale(fromScaleX, fromScaleY)
|
||
|
|
animation:SetToScale(toScaleX, toScaleY)
|
||
|
|
animation:SetDuration(duration)
|
||
|
|
|
||
|
|
if startDelay then
|
||
|
|
animation:SetStartDelay(startDelay)
|
||
|
|
end
|
||
|
|
|
||
|
|
if order then
|
||
|
|
animation:SetOrder(order)
|
||
|
|
end
|
||
|
|
|
||
|
|
return animation
|
||
|
|
end
|
||
|
|
|
||
|
|
private.CreateScaleAnimation = CreateScaleAnimation
|
||
|
|
|
||
|
|
local function FormatAtlasTexture(atlasName)
|
||
|
|
local atlasInfo = _G.C_Texture.GetAtlasInfo(atlasName)
|
||
|
|
|
||
|
|
if not atlasInfo.file then
|
||
|
|
return
|
||
|
|
end
|
||
|
|
|
||
|
|
local bottomTexCoord = atlasInfo.bottomTexCoord
|
||
|
|
local leftTexCoord = atlasInfo.leftTexCoord
|
||
|
|
local rightTexCoord = atlasInfo.rightTexCoord
|
||
|
|
local topTexCoord = atlasInfo.topTexCoord
|
||
|
|
|
||
|
|
local atlasWidth = atlasInfo.width / (rightTexCoord - leftTexCoord)
|
||
|
|
local atlasHeight = atlasInfo.height / (bottomTexCoord - topTexCoord)
|
||
|
|
local pxLeft = atlasWidth * leftTexCoord
|
||
|
|
local pxRight = atlasWidth * rightTexCoord
|
||
|
|
local pxTop = atlasHeight * topTexCoord
|
||
|
|
local pxBottom = atlasHeight * bottomTexCoord
|
||
|
|
|
||
|
|
return ("|T%s:%d:%d:0:0:%d:%d:%d:%d:%d:%d|t"):format(atlasInfo.file, 0, 0, atlasWidth, atlasHeight, pxLeft, pxRight, pxTop, pxBottom)
|
||
|
|
end
|
||
|
|
|
||
|
|
private.FormatAtlasTexture = FormatAtlasTexture
|
||
|
|
|
||
|
|
local function GetMapOptionDescription(mapID)
|
||
|
|
local continentID = Data.Maps[mapID].continentID
|
||
|
|
|
||
|
|
if continentID then
|
||
|
|
local continentName = Data.Continents[continentID].name
|
||
|
|
|
||
|
|
if continentName then
|
||
|
|
return ("%s %s %s"):format(_G.ID, mapID, _G.PARENS_TEMPLATE:format(continentName))
|
||
|
|
end
|
||
|
|
|
||
|
|
private.Debug("GetMapOptionDescription: No continentName for mapID %d", mapID)
|
||
|
|
end
|
||
|
|
|
||
|
|
return ("%s %s"):format(_G.ID, mapID)
|
||
|
|
end
|
||
|
|
|
||
|
|
private.GetMapOptionDescription = GetMapOptionDescription
|
||
|
|
|
||
|
|
local function GetMapOptionName(mapID)
|
||
|
|
local continentID = Data.Maps[mapID].continentID
|
||
|
|
local profile = private.db.profile
|
||
|
|
local isBlacklisted = profile.blacklist.mapIDs[mapID] or profile.detection.continentIDs[continentID] == Enum.DetectionGroupStatus.Disabled
|
||
|
|
local colorCode = isBlacklisted and _G.RED_FONT_COLOR_CODE or _G.GREEN_FONT_COLOR_CODE
|
||
|
|
return ("%s%s|r"):format(colorCode, Data.Maps[mapID].name)
|
||
|
|
end
|
||
|
|
|
||
|
|
private.GetMapOptionName = GetMapOptionName
|
||
|
|
|
||
|
|
do
|
||
|
|
local ValidUnitTypeNames = {
|
||
|
|
Creature = true,
|
||
|
|
Vehicle = true,
|
||
|
|
}
|
||
|
|
|
||
|
|
local function GUIDToCreatureID(GUID)
|
||
|
|
local unitTypeName, _, _, _, _, unitID = ("-"):split(GUID)
|
||
|
|
if ValidUnitTypeNames[unitTypeName] then
|
||
|
|
return tonumber(unitID)
|
||
|
|
end
|
||
|
|
end
|
||
|
|
|
||
|
|
private.GUIDToCreatureID = GUIDToCreatureID
|
||
|
|
|
||
|
|
local function UnitTokenToCreatureID(unitToken)
|
||
|
|
if unitToken then
|
||
|
|
local GUID = _G.UnitGUID(unitToken)
|
||
|
|
if not GUID then
|
||
|
|
return
|
||
|
|
end
|
||
|
|
|
||
|
|
return GUIDToCreatureID(GUID)
|
||
|
|
end
|
||
|
|
end
|
||
|
|
|
||
|
|
private.UnitTokenToCreatureID = UnitTokenToCreatureID
|
||
|
|
end -- do-block
|
||
|
|
|
||
|
|
local function NumericSortString(a, b)
|
||
|
|
local x, y = tonumber(a), tonumber(b)
|
||
|
|
|
||
|
|
if x and y then
|
||
|
|
return x < y
|
||
|
|
end
|
||
|
|
|
||
|
|
return a < b
|
||
|
|
end
|
||
|
|
|
||
|
|
local function TableKeyFormat(input)
|
||
|
|
return input and input:upper():gsub(" ", "_"):gsub("'", ""):gsub(":", ""):gsub("-", "_"):gsub("%(", ""):gsub("%)", "") or ""
|
||
|
|
end
|
||
|
|
|
||
|
|
do
|
||
|
|
local OrderedDataFields = {
|
||
|
|
"factionGroup",
|
||
|
|
"isTameable",
|
||
|
|
"questID",
|
||
|
|
"vignetteName",
|
||
|
|
}
|
||
|
|
|
||
|
|
local sectionDelimiter = "-- ----------------------------------------------------------------------------"
|
||
|
|
|
||
|
|
function private.DumpNPCData(continentID)
|
||
|
|
local NPCScan = _G.LibStub("AceAddon-3.0"):GetAddon(AddOnFolderName)
|
||
|
|
local continent = Data.Continents[continentID]
|
||
|
|
|
||
|
|
local sortedMapIDs = {}
|
||
|
|
local sortedNPCIDs = {}
|
||
|
|
|
||
|
|
for mapID, map in pairs(continent.Maps) do
|
||
|
|
local npcIDs = {}
|
||
|
|
sortedNPCIDs[mapID] = npcIDs
|
||
|
|
sortedMapIDs[#sortedMapIDs + 1] = mapID
|
||
|
|
|
||
|
|
for npcID in pairs(map.NPCs) do
|
||
|
|
npcIDs[#npcIDs + 1] = npcID
|
||
|
|
end
|
||
|
|
|
||
|
|
table.sort(sortedNPCIDs[mapID])
|
||
|
|
end
|
||
|
|
|
||
|
|
table.sort(sortedMapIDs)
|
||
|
|
|
||
|
|
local output = private.TextDump
|
||
|
|
output:Clear()
|
||
|
|
|
||
|
|
output:AddLine(sectionDelimiter)
|
||
|
|
output:AddLine("-- AddOn namespace")
|
||
|
|
output:AddLine(sectionDelimiter)
|
||
|
|
output:AddLine("local AddOnFolderName, private = ...")
|
||
|
|
output:AddLine("local NPCs = private.Data.NPCs\n")
|
||
|
|
|
||
|
|
for mapIndex = 1, #sortedMapIDs do
|
||
|
|
local map = Data.Maps[sortedMapIDs[mapIndex]]
|
||
|
|
local addedZoneHeader = false
|
||
|
|
|
||
|
|
for npcIndex = 1, #sortedNPCIDs[map.ID] do
|
||
|
|
local npcID = sortedNPCIDs[map.ID][npcIndex]
|
||
|
|
local npc = Data.NPCs[npcID]
|
||
|
|
|
||
|
|
local startedEntry = false
|
||
|
|
|
||
|
|
for index = 1, #OrderedDataFields do
|
||
|
|
local field = OrderedDataFields[index]
|
||
|
|
local fieldInfo = npc[field]
|
||
|
|
|
||
|
|
if fieldInfo then
|
||
|
|
if not addedZoneHeader then
|
||
|
|
addedZoneHeader = true
|
||
|
|
|
||
|
|
output:AddLine(sectionDelimiter)
|
||
|
|
output:AddLine(("-- %s (%d)"):format(map.name, map.ID))
|
||
|
|
output:AddLine(sectionDelimiter)
|
||
|
|
end
|
||
|
|
|
||
|
|
if not startedEntry then
|
||
|
|
startedEntry = true
|
||
|
|
output:AddLine(("NPCs[%d] = { -- %s"):format(npcID, NPCScan:GetNPCNameFromID(npcID)))
|
||
|
|
end
|
||
|
|
|
||
|
|
local fieldInfoOutput
|
||
|
|
if type(fieldInfo) == "string" then
|
||
|
|
fieldInfoOutput = ("\"%s\""):format(fieldInfo:gsub("\"", "\\\""))
|
||
|
|
else
|
||
|
|
fieldInfoOutput = tostring(fieldInfo)
|
||
|
|
end
|
||
|
|
|
||
|
|
local fieldInfoComment = field == "questID" and (" -- %s"):format(NPCScan:GetQuestNameFromID(fieldInfo)) or ""
|
||
|
|
output:AddLine((" %s = %s,%s"):format(field, fieldInfoOutput, fieldInfoComment))
|
||
|
|
end
|
||
|
|
end
|
||
|
|
|
||
|
|
if startedEntry then
|
||
|
|
output:AddLine("}\n")
|
||
|
|
end
|
||
|
|
end
|
||
|
|
end
|
||
|
|
|
||
|
|
output:Display()
|
||
|
|
end
|
||
|
|
|
||
|
|
private.DUMP_COMMANDS = {
|
||
|
|
npcdata = function(parameters)
|
||
|
|
private.DumpNPCData(tonumber(parameters))
|
||
|
|
end
|
||
|
|
}
|
||
|
|
end -- do-block
|