From 5c55ce81407c381f9de2ff14d682aec481fa2b8d Mon Sep 17 00:00:00 2001 From: Matthias Schiffer Date: Tue, 22 Jun 2021 23:18:43 +0200 Subject: [PATCH] resource: add blocklist tool to list and diff the supported block IDs of a Minecraft version --- resource/blocklist.py | 69 +++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 69 insertions(+) create mode 100755 resource/blocklist.py diff --git a/resource/blocklist.py b/resource/blocklist.py new file mode 100755 index 0000000..d3de297 --- /dev/null +++ b/resource/blocklist.py @@ -0,0 +1,69 @@ +#!/usr/bin/env python3 + +import argparse +import os +import sys + +def blocklist(path): + blockpath = os.path.join(path, 'assets', 'minecraft', 'blockstates') + try: + return map( + lambda filename: filename[:-5], + filter( + lambda filename: filename.endswith('.json'), + os.listdir(blockpath), + ), + ) + except FileNotFoundError: + sys.exit(''' +Path '{}' not found. +Please pass a directory containing the unpacked contents of a JAR of a recent Minecraft version. + '''.strip().format(blockpath)) + +def print_blocklist(path): + for block in sorted(blocklist(path)): + print(block) + +def diff_blocklist(old, new, cmd): + blocks_old = set(blocklist(old)) + blocks_new = set(blocklist(new)) + diff = sorted(blocks_old.symmetric_difference(blocks_new)) + + for block in diff: + if block in blocks_old: + if cmd == 'removed': + print(block) + elif cmd == 'diff': + print('-', block) + else: + if cmd == 'added': + print(block) + elif cmd == 'diff': + print('+', block) + + +parser = argparse.ArgumentParser(description='List block IDs of an unpacked Minecraft JAR, or diff two versions') + +subparsers = parser.add_subparsers(dest='cmd', metavar='COMMAND', required=True) + +parse_list = subparsers.add_parser('list', help='list supported blocks') +parse_list.add_argument('DIR') + +parse_added = subparsers.add_parser('added', help='list added blocks') +parse_added.add_argument('OLD') +parse_added.add_argument('NEW') + +parse_removed = subparsers.add_parser('removed', help='list removed blocks') +parse_removed.add_argument('OLD') +parse_removed.add_argument('NEW') + +parse_removed = subparsers.add_parser('diff', help='diff lists of supported blocks') +parse_removed.add_argument('OLD') +parse_removed.add_argument('NEW') + +args = parser.parse_args() + +if args.cmd == 'list': + print_blocklist(args.DIR) +else: + diff_blocklist(args.OLD, args.NEW, args.cmd)