From d1c95742ddd83899bb35051de9d731d38aba80a4 Mon Sep 17 00:00:00 2001 From: E14 <1640391+E14@users.noreply.github.com> Date: Sun, 22 Sep 2019 22:57:54 +0200 Subject: Add ProtocolBlockTypePalette (#4391) --- Tools/BlockTypePaletteGenerator/Generator.lua | 91 +++++++++++++++++++++++++++ 1 file changed, 91 insertions(+) create mode 100644 Tools/BlockTypePaletteGenerator/Generator.lua (limited to 'Tools/BlockTypePaletteGenerator/Generator.lua') diff --git a/Tools/BlockTypePaletteGenerator/Generator.lua b/Tools/BlockTypePaletteGenerator/Generator.lua new file mode 100644 index 000000000..f33f2b789 --- /dev/null +++ b/Tools/BlockTypePaletteGenerator/Generator.lua @@ -0,0 +1,91 @@ +-- lib/lunajson/src/ is not in default Lua package paths +package.path = 'lib/lunajson/src/?.lua;' .. package.path; + + +--- Prints usage instructions to stdout. +-- If the optional `message` is passed, output is prepended by message _and_ +-- redirected to stderr. +function usage(message) + if message then + io.output(io.stderr); + io.write(message, "\n\n"); + end + io.write( + "Usage: lua Generator.lua INPUTFILE OUTPUTFILE\n".. + "Converts the Minecraft blocks.json report format to the cuberite ".. + "block type palette format.\n".. + "\n".. + "INPUTFILE and OUTPUTFILE must point to a valid path. INPUTFILE must ".. + "be readable and OUTPUTFILE must be writable. Either can be replaced ".. + "with `-` (dash character) to point to standard-input or -output.\n"); + os.exit(message and 1 or 0); +end + + +-- Test whether the script is run in a path where it can load it's libraries +if not pcall(function() require("lunajson.decoder") end) then + usage("Could not load required libraries, please run `Generator.lua` ".. + "within its directory and make sure to run `git submodule update`."); +end + + +-- Check/Prepare CLI arguments +local inpath, outpath = ...; +io.input(io.stdin); +io.output(io.stdout); + +if select("#", ...) ~= 2 then + usage("Incorrect number of arguments."); +end + +if inpath ~= "-" then + local handle, err = io.open(inpath, "r"); + io.input(handle or usage(err)); +end + +if outpath ~= "-" then + local handle, err = io.open(outpath, "w"); + io.output(handle or usage(err)); +end + + +-- Main program starts here +local decode = (require("lunajson.decoder"))(); +local encode = (require("lunajson.encoder"))(); + +local input = decode(io.input():read("*a")); +local registry = {}; +local max_id = -1; + + +for blockname, blockdata in pairs(input) do + for i = 1, #(blockdata.states or {}) do + local state = blockdata.states[i]; + assert(registry[state.id + 1] == nil, "Ensure no duplicate IDs"); + + -- needed in the end to verify we got no holes in the array: + max_id = math.max(max_id, state.id); + + registry[state.id + 1] = { + id = assert(state.id, "id is required."), + name = assert(blockname, "Block type name is required."), + -- default = state.default or nil, -- may need this later + props = state.properties, + }; + end +end + + +-- The following assertion is not necessary by the current spec, but is required +-- by how lunajson distinguishes objects from arrays. Also if this fails, it is +-- _very_ likely that the input file is faulty. +assert(#registry == max_id + 1, "Ensure that registry has contiguous keys"); + +local out = { + Metadata = { + ProtocolBlockTypePaletteVersion = 1 + }, + Palette = registry +}; + +io.write(encode(out), "\n"); -- cgit v1.2.3