1
0
Fork 0
cuberite-2a/Tools/BlockTypePaletteGenerator/UpgradePaletteCheck.lua

141 lines
3.7 KiB
Lua

-- UpgradePaletteCheck.lua
--[[ Implements a check that lists all entries in the UpgradeBlockTypePalette
that are not present in the 1.13 protocol palette.
The palette files are expected to be in folders relative to this script like
they are in the git repo:
../../Server/Protocol/UpgradeBlockTypePalette.txt
../../Server/Protocol/1.13/base.btp.txt
--]]
--- Partially loads a BlockTypePalette file
-- Parses the specified file into headers (returned as a key-value table) and data (returned as array of strings)
-- Returns a table, {headers = {}, data = {}}
local function loadPalSplitHeader(aFileName)
local f = assert(io.open(aFileName, "r"))
local isFileIdentLine = true
local isInHeaders = false
local headers = {}
local data = {}
local idx = 1
for ln in f:lines() do
if (isFileIdentLine) then
assert(not(isInHeaders))
assert((ln == "BlockTypePalette") or (ln == "UpgradeBlockTypePalette"))
isFileIdentLine = false
isInHeaders = true
elseif (ln == "") then
assert(not(isFileIdentLine))
assert(isInHeaders) -- data must not contain an empty line
isInHeaders = false
elseif (isInHeaders) then
assert(not(isFileIdentLine))
local key, val = ln:match("(.-)\t(.*)")
assert(key)
assert(val)
headers[key] = val
else
data[idx] = ln
idx = idx + 1
end
end
return { headers = headers, data = data}
end
--- Normalizes the block description
-- aRawDesc is the description read from the palette file, "grass_block\tsnowy\tfalse"
-- Returns the normalized description "grass_block:snowy:false", where the block state keys are alpha-sorted
local function normalizeDesc(aRawDesc)
local blockTypeName, blockStates = aRawDesc:match("(.-)\t(.*)")
if not(blockTypeName) then
-- There's no TABs in the raw desc, only simple block
return aRawDesc
end
local blockStatesTab = {}
local idx = 1
blockStates = blockStates .. "\t"
for k, v in blockStates:gmatch("(.-)\t(.-)\t") do
blockStatesTab[idx] = k .. ":" .. v
idx = idx + 1
end
table.sort(blockStatesTab)
return blockTypeName .. ":" .. table.concat(blockStatesTab, ":")
end
--- Loads the 1.13 palette
--[[
Returns the palette loaded as a table:
{
numberToDesc = {[1] = "minecraft:stone", [8] = "minecraft:grass_block:snowy:false", ...},
descToNumber = {["minecraft:stone"] = 1, ...}
}
--]]
local function loadPalette()
local pal = loadPalSplitHeader("../../Server/Protocol/1.13/base.btp.txt")
local numberToDesc = {}
local descToNumber = {}
local prefix = pal.headers["CommonPrefix"] or ""
for _, ln in ipairs(pal.data) do
local number, desc = ln:match("(.-)\t(.*)")
desc = normalizeDesc(desc)
desc = prefix .. desc
number = tonumber(number) or error("Index is not a number: " .. ln)
numberToDesc[number] = desc
descToNumber[desc] = number
end
return { numberToDesc = numberToDesc, descToNumber = descToNumber}
end
local function runCheck()
-- Load the palettes:
local pal = loadPalette()
local upg = loadPalSplitHeader("../../Server/Protocol/UpgradeBlockTypePalette.txt")
-- Check the UpgradePalette's BlockDescs against the 1.13 palette:
local prefix = upg.headers["CommonPrefix"] or ""
local notFound = {}
local idx = 1
local totalCnt = 0
for _, ln in ipairs(upg.data) do
local blockType, blockMeta, desc = ln:match("(.-)\t(.-)\t(.*)")
local normDesc = normalizeDesc(prefix .. desc)
if not(pal.descToNumber[normDesc]) then
notFound[idx] = {blockType = blockType, blockMeta = blockMeta, desc = desc}
idx = idx + 1
end
totalCnt = totalCnt + 1
end
idx = idx - 1
-- Print the findings:
print("Blocks not found: " .. idx .. " out of " .. totalCnt)
for _, nf in ipairs(notFound) do
print(nf.blockType .. "\t" .. nf.blockMeta .. "\t" .. nf.desc)
end
print("Blocks not found: " .. idx .. " out of " .. totalCnt)
end
-- MAIN:
runCheck()