summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--Tools/BlockTypePaletteGenerator/UpgradePaletteCheck.lua140
1 files changed, 140 insertions, 0 deletions
diff --git a/Tools/BlockTypePaletteGenerator/UpgradePaletteCheck.lua b/Tools/BlockTypePaletteGenerator/UpgradePaletteCheck.lua
new file mode 100644
index 000000000..4ed6efc3a
--- /dev/null
+++ b/Tools/BlockTypePaletteGenerator/UpgradePaletteCheck.lua
@@ -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()