Skip to content

Commit 6fa331e

Browse files
committed
Add support for dataPaths.json and partial protos
Up until now this code has been trying to optimistically load all data from a single folder, which is how Minecraft Data was setup long ago. Nowadays the data for a given version is split up to minimize data replication, and the latest versions don't have all the data available just yet. This update adds support for those things.
1 parent 6a22348 commit 6fa331e

2 files changed

Lines changed: 70 additions & 37 deletions

File tree

minecraft_data/__init__.py

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -7,9 +7,9 @@
77
class mod(sys.modules[__name__].__class__):
88
def __call__(self, version):
99
_dir = os.path.join(
10-
os.path.dirname(__file__), "data/data/pc/", version
10+
os.path.dirname(__file__), "data/data/"
1111
)
12-
return type(version, (object,), convert(_dir))
12+
return type(version, (object,), convert(_dir, version))
1313

1414

1515
sys.modules[__name__].__class__ = mod

minecraft_data/tools.py

Lines changed: 68 additions & 35 deletions
Original file line numberDiff line numberDiff line change
@@ -3,34 +3,69 @@
33
from glob import glob
44

55

6-
def convert(dir):
7-
data = _grabdata(dir)
8-
ret = {
9-
'blocks': _by_id(data['blocks']),
10-
'blocks_name': _by_name(data['blocks']),
11-
'blocks_list': data['blocks'],
12-
'items': _by_id(data['items']),
13-
'items_name': _by_name(data['items']),
14-
'items_list': data['items'],
15-
'biomes': _by_id(data['biomes']),
16-
'biomes_list': data['biomes'],
17-
'recipes': data['recipes'],
18-
'instruments': _by_id(data['instruments']),
19-
'instruments_list': data['instruments'],
20-
'materials': data['materials'],
21-
'mobs': _by_id(_filter('type', 'mob', data['entities'])),
22-
'objects': _by_id(_filter('type', 'object', data['entities'])),
23-
'entities_name': _by_name(data['entities']),
24-
'entities_list': data['entities'],
25-
'protocol': data['protocol'],
26-
'windows': _by_id(data['windows']),
27-
'windows_name': _by_name(data['windows']),
28-
'windows_list': data['windows'],
29-
'effects': _by_id(data['effects']),
30-
'effects_name': _by_name(data['effects']),
31-
'effects_list': data['effects'],
32-
'version': data['version']
33-
}
6+
def convert(_dir, version):
7+
fp = open(os.path.join(_dir, 'dataPaths.json'))
8+
datapaths = json.load(fp)
9+
fp.close()
10+
data = _grabdata(_dir, datapaths['pc'][version])
11+
ret = {}
12+
if 'blocks' in data:
13+
ret.update({
14+
'blocks': _by_id(data['blocks']),
15+
'blocks_name': _by_name(data['blocks']),
16+
'blocks_list': data['blocks'],
17+
})
18+
if 'items' in data:
19+
ret.update({
20+
'items': _by_id(data['items']),
21+
'items_name': _by_name(data['items']),
22+
'items_list': data['items'],
23+
})
24+
if 'biomes' in data:
25+
ret.update({
26+
'biomes': _by_id(data['biomes']),
27+
'biomes_list': data['biomes'],
28+
})
29+
if 'recipes' in data:
30+
ret.update({
31+
'recipes': data['recipes'],
32+
})
33+
if 'instruments' in data:
34+
ret.update({
35+
'instruments': _by_id(data['instruments']),
36+
'instruments_list': data['instruments'],
37+
})
38+
if 'materials' in data:
39+
ret.update({
40+
'materials': data['materials'],
41+
})
42+
if 'entities' in data:
43+
ret.update({
44+
'mobs': _by_id(_filter('type', 'mob', data['entities'])),
45+
'objects': _by_id(_filter('type', 'object', data['entities'])),
46+
'entities_name': _by_name(data['entities']),
47+
'entities_list': data['entities'],
48+
})
49+
if 'protocol' in data:
50+
ret.update({
51+
'protocol': data['protocol'],
52+
})
53+
if 'windows' in data:
54+
ret.update({
55+
'windows': _by_id(data['windows']),
56+
'windows_name': _by_name(data['windows']),
57+
'windows_list': data['windows'],
58+
})
59+
if 'effects' in data:
60+
ret.update({
61+
'effects': _by_id(data['effects']),
62+
'effects_name': _by_name(data['effects']),
63+
'effects_list': data['effects'],
64+
})
65+
if 'version' in data:
66+
ret.update({
67+
'version': data['version'],
68+
})
3469

3570
def find_item_or_block(find):
3671
if isinstance(find, int): # by id
@@ -43,13 +78,11 @@ def find_item_or_block(find):
4378
return ret
4479

4580

46-
def _grabdata(dir):
47-
data = dict()
48-
for filename in glob(os.path.join(dir, '*.json')):
49-
with open(filename) as fp:
50-
base = os.path.splitext(os.path.basename(filename))[0]
51-
doc = json.load(fp)
52-
data[base] = doc
81+
def _grabdata(_dir, datapaths):
82+
data = {}
83+
for category, folder in datapaths.items():
84+
with open(os.path.join(_dir, folder, f'{category}.json')) as fp:
85+
data[category] = json.load(fp)
5386
return data
5487

5588

0 commit comments

Comments
 (0)