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

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