VoxeLibre/tools/libtextureconverter/utils.py

182 lines
6.0 KiB
Python

import shutil
import csv
import os
import tempfile
import sys
import argparse
import glob
import re
import zipfile
from .config import SUPPORTED_MINECRAFT_VERSION, home
from PIL import Image
from collections import Counter
import platform
def detect_pixel_size(directory):
sizes = []
for filename in glob.glob(directory + '/**/*.png', recursive=True):
with Image.open(filename) as img:
sizes.append(img.size)
if not sizes:
return 16 # Default to 16x16 if no PNG files are found
most_common_size = Counter(sizes).most_common(1)[0][0]
print(
f"Autodetected pixel size: {most_common_size[0]}x{most_common_size[1]}")
return most_common_size[0]
def target_dir(
directory,
make_texture_pack,
output_dir,
output_dir_name,
mineclone2_path):
if make_texture_pack:
return output_dir + "/" + output_dir_name
else:
return mineclone2_path + directory
def colorize(
colormap,
source,
colormap_pixel,
texture_size,
destination,
tempfile1_name):
os.system(
"convert " +
colormap +
" -crop 1x1+" +
colormap_pixel +
" -depth 8 -resize " +
texture_size +
"x" +
texture_size +
" " +
tempfile1_name)
os.system("composite -compose Multiply " +
tempfile1_name + " " + source + " " + destination)
def colorize_alpha(
colormap,
source,
colormap_pixel,
texture_size,
destination,
tempfile2_name):
colorize(colormap, source, colormap_pixel,
texture_size, destination, tempfile2_name)
os.system("composite -compose Dst_In " + source + " " +
tempfile2_name + " -alpha Set " + destination)
def find_highest_minecraft_version(home, supported_version):
version_pattern = re.compile(re.escape(supported_version) + r"\.\d+")
versions_dir = os.path.join(home, ".minecraft", "versions")
highest_version = None
if os.path.isdir(versions_dir):
for folder in os.listdir(versions_dir):
if version_pattern.match(folder):
if not highest_version or folder > highest_version:
highest_version = folder
return highest_version
def find_all_minecraft_resourcepacks():
resourcepacks_dir = os.path.join(home, '.minecraft', 'resourcepacks')
if not os.path.isdir(resourcepacks_dir):
print(f"Resource packs directory not found: {resourcepacks_dir}")
return
resourcepacks = []
for folder in os.listdir(resourcepacks_dir):
folder_path = os.path.join(resourcepacks_dir, folder)
if os.path.isdir(folder_path):
pack_png_path = os.path.join(folder_path, 'pack.png')
if os.path.isfile(pack_png_path):
print(f"Adding resourcepack '{folder}'")
resourcepacks.append(folder_path)
else:
print(
f"pack.png not found in resourcepack '{folder}', not converting")
return resourcepacks
def handle_default_minecraft_texture(home, output_dir):
version = find_highest_minecraft_version(home, SUPPORTED_MINECRAFT_VERSION)
if not version:
print("No suitable Minecraft version found.")
sys.exit(1)
jar_file = os.path.join(
home, ".minecraft", "versions", version, f"{version}.jar")
if not os.path.isfile(jar_file):
print("Minecraft JAR file not found.")
sys.exit(1)
temp_zip = f"/tmp/mc-default-{version.replace('.', '')}.zip"
shutil.copy2(jar_file, temp_zip)
extract_folder = temp_zip.replace(".zip", "")
with zipfile.ZipFile(temp_zip, 'r') as zip_ref:
zip_ref.extractall(extract_folder)
if not os.path.exists(extract_folder):
print(f"Extraction failed, folder not found: {extract_folder}")
sys.exit(1)
# Normalize the extract folder path
extract_folder = os.path.normpath(extract_folder)
# Define the textures directory and normalize it
textures_directory = os.path.normpath(
f"{extract_folder}/assets/minecraft/textures")
# Using glob to find all files
all_files = glob.glob(f"{extract_folder}/**/*.*", recursive=True)
# Remove all non-png files except pack.mcmeta and pack.png in the root
for file_path in all_files:
if not file_path.endswith('.png') and not file_path.endswith(
'pack.mcmeta') and not file_path.endswith('pack.png'):
# print(f"Removing file: {file_path}")
os.remove(file_path)
# Remove all directories in the root except 'assets'
for item in os.listdir(extract_folder):
item_path = os.path.join(extract_folder, item)
if os.path.isdir(item_path) and item != "assets":
# print(f"Removing directory: {item_path}")
shutil.rmtree(item_path, ignore_errors=True)
# Remove directories in 'minecraft' except for 'textures'
minecraft_directory = os.path.normpath(
f"{extract_folder}/assets/minecraft")
for item in os.listdir(minecraft_directory):
item_path = os.path.join(minecraft_directory, item)
if os.path.isdir(item_path) and item != "textures":
print(f"Removing directory: {item_path}")
shutil.rmtree(item_path, ignore_errors=True)
# Copy the textures directory to the output directory
output_textures_directory = os.path.join(
output_dir, 'assets/minecraft/textures')
if os.path.exists(textures_directory) and not os.path.exists(
output_textures_directory):
os.makedirs(os.path.dirname(output_textures_directory), exist_ok=True)
shutil.copytree(textures_directory,
output_textures_directory, dirs_exist_ok=True)
# Copy pack.mcmeta and pack.png file if exists
for file_name in ['pack.mcmeta', 'pack.png']:
file_path = os.path.join(extract_folder, file_name)
if os.path.exists(file_path):
shutil.copy(file_path, output_dir)
print(f"Filtered and extracted to: {extract_folder}")
return extract_folder