-
Notifications
You must be signed in to change notification settings - Fork 24
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
Fix resourcepack format version 22 short_grass
and filtering out block models
#643
base: dev
Are you sure you want to change the base?
Changes from all commits
File filter
Filter by extension
Conversations
Jump to
Diff view
Diff view
There are no files selected for viewing
Original file line number | Diff line number | Diff line change |
---|---|---|
|
@@ -16,6 +16,7 @@ | |
# | ||
# ##### END GPL LICENSE BLOCK ##### | ||
|
||
import json | ||
import os | ||
from typing import Dict, Optional, List, Any, Tuple, Union, cast | ||
from pathlib import Path | ||
|
@@ -216,6 +217,39 @@ def find_from_texturepack(blockname: str, resource_folder: Optional[Path]=None) | |
return res | ||
|
||
|
||
def get_format_version_texturepack(resource_folder: Optional[Path]=None) -> Union[int, MCprepError]: | ||
""" Get texturepack format version | ||
|
||
See https://minecraft.wiki/w/Pack_format#List_of_resource_pack_formats""" | ||
if resource_folder is None: | ||
# default to internal pack | ||
resource_folder = Path(cast( | ||
str, | ||
bpy.path.abspath(bpy.context.scene.mcprep_texturepack_path) | ||
)) | ||
|
||
if not resource_folder.exists() or not resource_folder.is_dir(): | ||
env.log("Error, resource folder does not exist") | ||
line, file = env.current_line_and_file() | ||
return MCprepError(FileNotFoundError(), line, file, f"Resource pack folder at {resource_folder} does not exist!") | ||
|
||
# Resource folder is same level as assets folder | ||
meta_file = Path(resource_folder, "pack.mcmeta") | ||
if meta_file.exists() and meta_file.is_file(): | ||
with open(meta_file, 'r') as f: | ||
data = json.load(f) | ||
if data.get("pack"): | ||
r = data.get("pack").get("pack_format") | ||
if r: | ||
return r | ||
# Comment this out for now | ||
# Invalid pack.mcmeta file | ||
# line, file = env.current_line_and_file() | ||
# MCprepError(TypeError(), line, file, f"Resource pack metadata ({meta_file}) is invalid!") | ||
# return the unaffected change version, 22 | ||
return 21 | ||
Comment on lines
+249
to
+250
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. All I'd prefer an A check for the There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. I was thinking of the current default MCprep resourcepack doesn't have the meta file and if you make it return like that this whole check_dirs part is considered as unnecessary, throw away the legacy behavior, you can swap any sub folder like from the "textures" folder can also work. |
||
|
||
|
||
def detect_form(materials: List[Material]) -> Optional[Form]: | ||
"""Function which, given the input materials, guesses the exporter form. | ||
|
||
|
@@ -367,6 +401,15 @@ def set_texture_pack( | |
run the swap (and auto load e.g. normals and specs if avail.) | ||
""" | ||
mc_name, _ = get_mc_canonical_name(material.name) | ||
texture_pack_format = get_format_version_texturepack(folder) | ||
if isinstance(texture_pack_format, MCprepError): | ||
if texture_pack_format.msg: | ||
env.log(texture_pack_format.msg) | ||
return 0 | ||
# grass rename to short_grass in MC 1.20.3 with pack format version 22 | ||
if (material.name == "grass" and texture_pack_format > 21): | ||
mc_name = "short_grass" | ||
Comment on lines
+410
to
+411
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. Maybe we should extend this further to all changes, just to properly handle older resource packs, though I'll defer that decision to @TheDuckCow Also, I think we should make sure that the OBJ actually needs this particular change. OBJs from worlds predating this change won't need us to handle pack format 22 compatibility, though checking might be a bit of a pain (this is making me wish CommonMCOBJ V1 included the world's version in the header, probably will open a proposal for that for V2 in the next couple of days) |
||
|
||
image = find_from_texturepack(mc_name, folder) | ||
if isinstance(image, MCprepError): | ||
if image.msg: | ||
|
@@ -588,7 +631,7 @@ def get_textures(material: Material) -> Dict[str, Image]: | |
|
||
def find_additional_passes(image_file: Path) -> Dict[str, Image]: | ||
"""Find relevant passes like normal and spec in same folder as image.""" | ||
print("What is this?", image_file) | ||
# print("What is this?", image_file) # just gonna comment this out for now | ||
abs_img_file = bpy.path.abspath(str(image_file)) # needs to be blend file relative | ||
env.log(f"\tFind additional passes for: {image_file}", vv_only=True) | ||
if not os.path.isfile(abs_img_file): | ||
|
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Per callout above, we want to modify the source mappings, not this file itself - otherwise it'll get overwritten directly.