v5.0.0#

✨ Added#

GUI#

  • Graphical interface: implemented with PySide6 and launched when no arguments are provided.

  • ConverterTab: drag & drop, file type filters, output structure options.

  • MapCacheTab: .mdat to .mca conversion with threading.

  • VersionWidget: update check popup with GitHub release lookup.

CLI#

  • Command structure: scfile convert and scfile mapcache.

  • scfile.__main__: automatically runs convert when a file or directory is given as first argument.

  • --updates: update check option.

  • --on-conflict: output conflict option (overwrite, rename, skip).

  • params: Click types Files, Output, MapCacheDir, Formats and OnConflict.

Formats#

  • EfkmodelDecoder: new source format .efkmodel (geometry only).

  • McalDecoder: new source format .mcal (animation library, no export).

  • MdatDecoder: new source format .mdat (region cache).

  • McaEncoder: new output format .mca (Anvil regions).

  • FbxEncoder: new output format .fbx (geometry only).

  • nbt.nbt: NBT encoding functions (encode(), compound(), list(), etc.).

  • mca.mapping: block ID mapping table for the Anvil format.

Core#

  • StructIO: unified stream class replacing StructBytesIO and StructFileIO.

  • BaseFile: unified binary stream adapter for file paths, bytes and IO streams.

  • FileDecoder.convert_to(): output parameter (IOStream).

  • FileEncoder.transform() hook and transforms pipeline.

  • RegionContent: world chunk container.

  • RegionChunk, ChunkHeader: world chunk structures.

  • ModelContent: uv2, tangents and colors fields.

  • FileEncoder, FileDecoder: prelude() hooks.

Models#

  • transforms: scene transformation functions.

  • ModelMesh fields: uv2, tangents, colors, link_space, uv_origin, uv_sign, max_influences.

  • ModelSkeleton fields: space, hierarchy.

  • AnimationClip: replaced transforms with rotations and translations.

  • SkeletonBone: slug property.

  • Enums: UVOrigin, UVSign, LinkSpace, SkeletonSpace, SkeletonHierarchy, AnimationTranslation and AnimationRotation.

  • Type aliases: EulerAngles, TransformMatrix, BindPose, etc.

Convert#

  • Converter registry: converters() and registry() functions with the @converter decorator for format pairs.

Utils#

  • scfile.utils: new package.

  • files: resource(), resolve(), walk(), destination().

  • versions: Version dataclass with parsing and comparison.

  • updates: update checking against GitHub API.

  • regions: region merging from scattered map cache files.

  • cli: callbacks version_callback, updates_callback.

📝 Changed#

Core#

  • UserOptions: renamed to Options.

  • UserOptions.parse_skeleton: renamed to Options.skeleton.

  • UserOptions.parse_animation: renamed to Options.animation.

  • UserOptions.overwrite: replaced by Options.on_conflict.

  • FileEncoder.save_as(), FileEncoder.export_as(): now return Self.

Formats#

  • Model decoders: to_XXX() methods replaced by as_XXX(). They return an empty encoder; encode() must be called explicitly.

  • Model decoders: prepare() replaced by a transforms list.

  • GlbEncoder._add_meshes(): writes uv2 and tangents when present.

  • DaeEncoder._add_controller_sources(): checks max_influences > 0.

  • McsaFileIO._links(): normalizes bone weights.

Constants#

  • NBT_FILENAMES: renamed to SUPPORTED_NBT.

Tests#

  • Coverage: 100% excluding scfile.gui.

🐛 Fixed#

  • McsaDecoder: UV2 and tangent parsing (exported only to .glb).

  • GlbEncoder: binary data for meshes without skinning links when a skeleton is present.

🗑️ Removed#

  • CLI: --unique option (replaced by --on-conflict rename).

  • FileFormat.ITEMNAMES (replaced by FileFormat.NBT).

  • McsaBoneLinksError (replaced by a silent fallback).

  • scfile.cli.commands.py, scfile.cli.types.py, scfile.cli.utils.py.

  • SceneCounts, MeshCounts.

  • structures.types.

  • enums.FileMode.

♻️ Refactored#

Structure#

  • core.io: moved to core.structio.

  • core.context: split into core.content and core.options.

  • structures.models: now contains animation, mesh, skeleton, scene, flags and vectors.

  • consts.McsaUnits: moved to formats.mcsa.consts.

  • consts.OlString: moved to formats.ol.io.

  • StructBytesIO, StructFileIO: merged into StructIO.

  • AnimationClip.transforms: split into rotations and translations.

  • convert.legacy: merged back into convert.formats.

Renamed#

  • ModelMesh.positions: renamed to ModelMesh.vertices.

  • ModelMesh.textures: renamed to ModelMesh.uv1.

  • TextureArrayContent: renamed to TexarrContent.

  • TextureArrayDecoder: renamed to TexarrDecoder.

  • TextureArrayEncoder: renamed to TexarrEncoder.

  • NbtBytesIO: renamed to NbtBufferIO.

  • McsaModel: renamed to ModelDefaults.

  • MeshOrigin: renamed to MeshBounds.