# minosoft
# Copyright (C) 2020 Lukas Eisenhauer
#
# This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version.
#
# This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details.
#
# You should have received a copy of the GNU General Public License along with this program.If not, see .
#
# This software is not affiliated with Mojang AB, the original developer of Minecraft.
import io
import requests
import sys
import ujson
import zipfile
if len(sys.argv) != 3:
print("Usage: %s ".format(
sys.argv[
0]))
sys.exit()
blockStates = {}
blockModels = {}
modName = "minecraft"
print(
"Downloading minecraft jar...")
request = requests.get(sys.argv[2], allow_redirects=True)
print(
"Unpacking minecraft jar...")
zip = zipfile.ZipFile(
io.BytesIO(
request.content),
"r")
files = zip.namelist()
print(
"Loading blockstates...")
def readRotations(
apply,
current):
if "x" in current:
apply[
"x"] = \
current[
"x"]
if "y" in current:
apply[
"y"] = \
current[
"y"]
if "z" in current:
apply[
"z"] = \
current[
"z"]
def readPart(part):
properties = []
if "when" in part:
when = part["when"]
if "OR" in when:
for item in when["OR"]:
properties.append(item)
else:
properties.append(part["when"])
apply = {}
current = part["apply"]
if type(current) == type([]):
current = current[0]
if "/" in current["model"]:
apply["model"] = current["model"].split("/")[1]
else:
apply["model"] = current["model"]
readRotations(apply, current)
result = []
for item in properties:
state = {}
state["properties"] = item
for i in apply:
state[i] = apply[i]
result.append(state)
if len(result) == 0:
result.append(apply)
return result
for blockStateFile in [f for f in files if f.startswith('assets/minecraft/blockstates/')]:
with zip.open(blockStateFile) as file:
tempData = file.read().decode("utf-8")
if tempData.endswith("n"):
# why the hell are mojangs json files incorrect?
# in 19w02a (https://launcher.mojang.com/v1/objects/8664f5d1b428d5ba8a936ab9c097cc78821d06e6/client.jar) the json ends with a random "n"
tempData = tempData[:-1]
data = ujson.loads(tempData)
block = {}
if "variants" in data:
variants = data["variants"]
states = []
for variant in variants:
state = {}
properties = {}
if variant != "" and variant != "normal" and variant != "map" and variant != "all":
for part in variant.split(","):
properties[part.split("=")[0]] = part.split("=")[1]
state["properties"] = properties
current = variants[variant]
if type(current) == type([]):
current = current[0]
if "/" in current["model"]:
state["model"] = current["model"].split("/")[1]
else:
state["model"] = current["model"]
readRotations(state, current)
states.append(state)
block = {
"states": states
}
elif "multipart" in data:
parts = data["multipart"]
conditional = []
for part in parts:
conditional.extend(readPart(part))
block = {
"conditional": conditional
}
blockStates[blockStateFile.split(".")[0].split("/")[-1]] = block
print("Loading models...")
for blockModelFile in [f for f in files if f.startswith('assets/minecraft/models/block/')]:
with zip.open(blockModelFile) as file:
data = ujson.load(file)
blockModels[blockModelFile.split(".")[0].split("/")[-1]] = data
print("Combining files...")
finalJson = {
modName: {
"blockStates": blockStates,
"blockModels": blockModels
}
}
print("Saving...")
with open(sys.argv[1], "w+") as file:
finalJson = ujson.dumps(finalJson)
file.write(finalJson.replace("minecraft:", ""))
print(
"Finished successfully")