Added an UpgradeBlockTypePalette check script.
This commit is contained in:
parent
859f8d2849
commit
3f78ea7745
140
Tools/BlockTypePaletteGenerator/UpgradePaletteCheck.lua
Normal file
140
Tools/BlockTypePaletteGenerator/UpgradePaletteCheck.lua
Normal file
@ -0,0 +1,140 @@
|
||||
-- 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()
|
Loading…
Reference in New Issue
Block a user