I’ve undertaken the (didn’t realize what I was in for!) task of making the Amulet Minecraft Map Editor into the Amulet Flatpak Edition, and for the most part, it runs.
However, there’s an error with some of the textures not loading, and I don’t understand why because I can create a VENV and Amulet runs fine.
I understand that there are certain directories that are expressly forbidden to Flatpak apps, but as far as I can tell, Amulet isn’t trying to use any of them and all files and directories used are relative to Amulet’s install location.
To provide some background, Minecraft’s official resource packs don’t contain certain key textures, so Amulet bundles them with itself, getting installed with alongside it, and downloads the rest from the web, the same way the official Minecraft launcher does.
Because the Flatpak sandbox runs the FreeDesktop.org
implementation of Python 3.12.6, I also used 3.12.6 for my VENV.
When I run Amulet in the VENV, it works fine. When I run the Flatpak version, I get this error:
texture_relative_path = #rail
texture_path = /home/evilsupahfly/.var/app/io.github.evilsupahfly.amulet_flatpak/cache/AmuletMapEditor/resource_packs/java/vanilla/assets/minecraft/textures/block/rail_corner.png
texture_relative_path = #rail
texture_path = /home/evilsupahfly/.var/app/io.github.evilsupahfly.amulet_flatpak/cache/AmuletMapEditor/resource_packs/java/vanilla/assets/minecraft/textures/block/rail_corner.png
<minecraft_model_reader.api.mesh.block.block_mesh.BlockMesh object at 0xe7adc73bfb0> = copy.deepcopy(self._load_block_model(minecraft:block/rail_corner))
model_path_list = ['minecraft', 'block/water']
model_path_list = ['block/cube_all']
model_path_list = ['block/cube']
model_path_list = ['block/block']
texture_relative_path = #down
texture_path = /app/lib/python3.12/site-packages/minecraft_model_reader/api/resource_pack/java/java_vanilla_fix/assets/minecraft/textures/block/water.png
ERROR - Failed to load block model {'model': 'minecraft:block/water'}
'/app/lib/python3.12/site-packages/minecraft_model_reader/api/resource_pack/java/java_vanilla_fix/assets/minecraft/textures/block/water.png'
Traceback (most recent call last):
File "/app/lib/python3.12/site-packages/minecraft_model_reader/api/resource_pack/java/resource_pack_manager.py", line 246, in _get_model
return self._load_blockstate_model(
^^^^^^^^^^^^^^^^^^^^^^^^^^^^
File "/app/lib/python3.12/site-packages/minecraft_model_reader/api/resource_pack/java/resource_pack_manager.py", line 337, in _load_blockstate_model
model = copy.deepcopy(self._load_block_model(model_path))
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
File "/app/lib/python3.12/site-packages/minecraft_model_reader/api/resource_pack/java/resource_pack_manager.py", line 437, in _load_block_model
if self._texture_is_transparent[texture_path][1]:
~~~~~~~~~~~~~~~~~~~~~~~~~~~~^^^^^^^^^^^^^^
KeyError: '/app/lib/python3.12/site-packages/minecraft_model_reader/api/resource_pack/java/java_vanilla_fix/assets/minecraft/textures/block/water.png'
ERROR - Failed to load block model {'model': 'minecraft:block/water'}
'/app/lib/python3.12/site-packages/minecraft_model_reader/api/resource_pack/java/java_vanilla_fix/assets/minecraft/textures/block/water.png'
Traceback (most recent call last):
File "/app/lib/python3.12/site-packages/minecraft_model_reader/api/resource_pack/java/resource_pack_manager.py", line 246, in _get_model
return self._load_blockstate_model(
^^^^^^^^^^^^^^^^^^^^^^^^^^^^
File "/app/lib/python3.12/site-packages/minecraft_model_reader/api/resource_pack/java/resource_pack_manager.py", line 337, in _load_blockstate_model
model = copy.deepcopy(self._load_block_model(model_path))
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
File "/app/lib/python3.12/site-packages/minecraft_model_reader/api/resource_pack/java/resource_pack_manager.py", line 437, in _load_block_model
if self._texture_is_transparent[texture_path][1]:
~~~~~~~~~~~~~~~~~~~~~~~~~~~~^^^^^^^^^^^^^^
KeyError: '/app/lib/python3.12/site-packages/minecraft_model_reader/api/resource_pack/java/java_vanilla_fix/assets/minecraft/textures/block/water.png'
Texture path retrieved: /app/lib/python3.12/site-packages/minecraft_model_reader/api/image/missing_no.png
BlockMesh created with texture path: /app/lib/python3.12/site-packages/minecraft_model_reader/api/image/missing_no.png
model_path_list = ['minecraft', 'block/iron_door_bottom_right']
model_path_list = ['minecraft', 'block/door_bottom_right']
texture_relative_path = #bottom
texture_path = /home/evilsupahfly/.var/app/io.github.evilsupahfly.amulet_flatpak/cache/AmuletMapEditor/resource_packs/java/vanilla/assets/minecraft/textures/block/iron_door_bottom.png
texture_relative_path = #bottom
texture_path = /home/evilsupahfly/.var/app/io.github.evilsupahfly.amulet_flatpak/cache/AmuletMapEditor/resource_packs/java/vanilla/assets/minecraft/textures/block/iron_door_bottom.png
texture_relative_path = #bottom
texture_path = /home/evilsupahfly/.var/app/io.github.evilsupahfly.amulet_flatpak/cache/AmuletMapEditor/resource_packs/java/vanilla/assets/minecraft/textures/block/iron_door_bottom.png
texture_relative_path = #bottom
texture_path = /home/evilsupahfly/.var/app/io.github.evilsupahfly.amulet_flatpak/cache/AmuletMapEditor/resource_packs/java/vanilla/assets/minecraft/textures/block/iron_door_bottom.png
texture_relative_path = #bottom
texture_path = /home/evilsupahfly/.var/app/io.github.evilsupahfly.amulet_flatpak/cache/AmuletMapEditor/resource_packs/java/vanilla/assets/minecraft/textures/block/iron_door_bottom.png
<minecraft_model_reader.api.mesh.block.block_mesh.BlockMesh object at 0xe7adc1e1e50> = copy.deepcopy(self._load_block_model(minecraft:block/iron_door_bottom_right))
Initially I thought the textures weren’t accessible, but after checking the directory structure inside the Flatpak, I can see that it’s fine. The .JSON files and the .PNG files are all present where they’re supposed to be (as you can see from the fact that iron_door
and rail
were loaded without issue), but water
and lava
consistently fail:
[~/Downloads/flatpak-stuff/Amulet-Flatpak] flatpak-builder --run amulet-flatpak_build_dir io.github.evilsupahfly.amulet_flatpak.yaml sh
sh-5.2$ python --version
Python 3.12.6
sh-5.2$ cd /app/lib/python3.12/site-packages/minecraft_model_reader/api/resource_pack/java/java_vanilla_fix/assets/minecraft/textures/block
sh-5.2$ ls -Fla
total 24
drwxr-xr-x+ 1 evilsupahfly evilsupahfly 150 Dec 31 1969 ./
drwxr-xr-x+ 1 evilsupahfly evilsupahfly 10 Dec 31 1969 ../
drwxr-xr-x+ 1 evilsupahfly evilsupahfly 528 Dec 31 1969 banner/
-rw-r--r--+ 1 evilsupahfly evilsupahfly 651 Dec 31 1969 barrier.png
-rw-r--r--+ 1 evilsupahfly evilsupahfly 1265 Dec 31 1969 end_portal.png
-rw-r--r--+ 1 evilsupahfly evilsupahfly 213 Dec 31 1969 grass.png
-rw-r--r--+ 1 evilsupahfly evilsupahfly 1286 Dec 31 1969 lava.png
-rw-r--r--+ 1 evilsupahfly evilsupahfly 1405 Dec 31 1969 structure_void.png
-rw-r--r--+ 1 evilsupahfly evilsupahfly 927 Dec 31 1969 water.png
sh-5.2$ echo $PWD
/app/lib/python3.12/site-packages/minecraft_model_reader/api/resource_pack/java/java_vanilla_fix/assets/minecraft/textures/block
sh-5.2$ cd ..
sh-5.2$ echo $PWD
/app/lib/python3.12/site-packages/minecraft_model_reader/api/resource_pack/java/java_vanilla_fix/assets/minecraft/textures
sh-5.2$ ls -Fla
total 0
drwxr-xr-x+ 1 evilsupahfly evilsupahfly 10 Dec 31 1969 ./
drwxr-xr-x+ 1 evilsupahfly evilsupahfly 50 Dec 31 1969 ../
drwxr-xr-x+ 1 evilsupahfly evilsupahfly 150 Dec 31 1969 block/
sh-5.2$ cd ..
sh-5.2$ echo $PWD
/app/lib/python3.12/site-packages/minecraft_model_reader/api/resource_pack/java/java_vanilla_fix/assets/minecraft
sh-5.2$ ls -Fla
total 0
drwxr-xr-x+ 1 evilsupahfly evilsupahfly 50 Dec 31 1969 ./
drwxr-xr-x+ 1 evilsupahfly evilsupahfly 18 Dec 31 1969 ../
drwxr-xr-x+ 1 evilsupahfly evilsupahfly 3080 Dec 31 1969 blockstates/
drwxr-xr-x+ 1 evilsupahfly evilsupahfly 10 Dec 31 1969 models/
drwxr-xr-x+ 1 evilsupahfly evilsupahfly 10 Dec 31 1969 textures/
sh-5.2$ cd models
sh-5.2$ echo $PWD
/app/lib/python3.12/site-packages/minecraft_model_reader/api/resource_pack/java/java_vanilla_fix/assets/minecraft/models
sh-5.2$ ls -Fla
total 0
drwxr-xr-x+ 1 evilsupahfly evilsupahfly 10 Dec 31 1969 ./
drwxr-xr-x+ 1 evilsupahfly evilsupahfly 50 Dec 31 1969 ../
drwxr-xr-x+ 1 evilsupahfly evilsupahfly 1624 Dec 31 1969 block/
sh-5.2$ cd block
sh-5.2$ echo $PWD
/app/lib/python3.12/site-packages/minecraft_model_reader/api/resource_pack/java/java_vanilla_fix/assets/minecraft/models/block
sh-5.2$ ls -Fla
total 168
drwxr-xr-x+ 1 evilsupahfly evilsupahfly 1624 Dec 31 1969 ./
drwxr-xr-x+ 1 evilsupahfly evilsupahfly 10 Dec 31 1969 ../
drwxr-xr-x+ 1 evilsupahfly evilsupahfly 1704 Dec 31 1969 banner/
-rw-r--r--+ 1 evilsupahfly evilsupahfly 133 Dec 31 1969 barrier.json
drwxr-xr-x+ 1 evilsupahfly evilsupahfly 992 Dec 31 1969 bed/
-rw-r--r--+ 1 evilsupahfly evilsupahfly 1525 Dec 31 1969 bed_foot.json
-rw-r--r--+ 1 evilsupahfly evilsupahfly 1535 Dec 31 1969 bed_head.json
-rw-r--r--+ 1 evilsupahfly evilsupahfly 1610 Dec 31 1969 bell_between_walls.json
-rw-r--r--+ 1 evilsupahfly evilsupahfly 1507 Dec 31 1969 bell_ceiling.json
-rw-r--r--+ 1 evilsupahfly evilsupahfly 2669 Dec 31 1969 bell_floor.json
-rw-r--r--+ 1 evilsupahfly evilsupahfly 1592 Dec 31 1969 bell_wall.json
-rw-r--r--+ 1 evilsupahfly evilsupahfly 153 Dec 31 1969 black_shulker_box.json
-rw-r--r--+ 1 evilsupahfly evilsupahfly 151 Dec 31 1969 blue_shulker_box.json
-rw-r--r--+ 1 evilsupahfly evilsupahfly 153 Dec 31 1969 brown_shulker_box.json
-rw-r--r--+ 1 evilsupahfly evilsupahfly 1855 Dec 31 1969 chest_base.json
-rw-r--r--+ 1 evilsupahfly evilsupahfly 105 Dec 31 1969 chest.json
-rw-r--r--+ 1 evilsupahfly evilsupahfly 1537 Dec 31 1969 chest_left_base.json
-rw-r--r--+ 1 evilsupahfly evilsupahfly 115 Dec 31 1969 chest_left.json
-rw-r--r--+ 1 evilsupahfly evilsupahfly 1527 Dec 31 1969 chest_right_base.json
-rw-r--r--+ 1 evilsupahfly evilsupahfly 117 Dec 31 1969 chest_right.json
-rw-r--r--+ 1 evilsupahfly evilsupahfly 579 Dec 31 1969 conduit.json
-rw-r--r--+ 1 evilsupahfly evilsupahfly 151 Dec 31 1969 cyan_shulker_box.json
-rw-r--r--+ 1 evilsupahfly evilsupahfly 104 Dec 31 1969 ender_chest.json
-rw-r--r--+ 1 evilsupahfly evilsupahfly 139 Dec 31 1969 end_portal.json
-rw-r--r--+ 1 evilsupahfly evilsupahfly 109 Dec 31 1969 grass.json
-rw-r--r--+ 1 evilsupahfly evilsupahfly 151 Dec 31 1969 gray_shulker_box.json
-rw-r--r--+ 1 evilsupahfly evilsupahfly 153 Dec 31 1969 green_shulker_box.json
drwxr-xr-x+ 1 evilsupahfly evilsupahfly 18 Dec 31 1969 head/
-rw-r--r--+ 1 evilsupahfly evilsupahfly 134 Dec 31 1969 lava.json
drwxr-xr-x+ 1 evilsupahfly evilsupahfly 396 Dec 31 1969 light/
-rw-r--r--+ 1 evilsupahfly evilsupahfly 163 Dec 31 1969 light_blue_shulker_box.json
-rw-r--r--+ 1 evilsupahfly evilsupahfly 163 Dec 31 1969 light_gray_shulker_box.json
-rw-r--r--+ 1 evilsupahfly evilsupahfly 151 Dec 31 1969 lime_shulker_box.json
-rw-r--r--+ 1 evilsupahfly evilsupahfly 157 Dec 31 1969 magenta_shulker_box.json
-rw-r--r--+ 1 evilsupahfly evilsupahfly 151 Dec 31 1969 moving_piston.json
-rw-r--r--+ 1 evilsupahfly evilsupahfly 155 Dec 31 1969 orange_shulker_box.json
-rw-r--r--+ 1 evilsupahfly evilsupahfly 151 Dec 31 1969 pink_shulker_box.json
-rw-r--r--+ 1 evilsupahfly evilsupahfly 155 Dec 31 1969 purple_shulker_box.json
-rw-r--r--+ 1 evilsupahfly evilsupahfly 149 Dec 31 1969 red_shulker_box.json
-rw-r--r--+ 1 evilsupahfly evilsupahfly 141 Dec 31 1969 shulker_box.json
drwxr-xr-x+ 1 evilsupahfly evilsupahfly 1032 Dec 31 1969 sign/
-rw-r--r--+ 1 evilsupahfly evilsupahfly 147 Dec 31 1969 structure_void.json
-rw-r--r--+ 1 evilsupahfly evilsupahfly 106 Dec 31 1969 trapped_chest.json
-rw-r--r--+ 1 evilsupahfly evilsupahfly 116 Dec 31 1969 trapped_chest_left.json
-rw-r--r--+ 1 evilsupahfly evilsupahfly 118 Dec 31 1969 trapped_chest_right.json
drwxr-xr-x+ 1 evilsupahfly evilsupahfly 336 Dec 31 1969 wall_banner/
-rw-r--r--+ 1 evilsupahfly evilsupahfly 1208 Dec 31 1969 wall_banner.json
drwxr-xr-x+ 1 evilsupahfly evilsupahfly 228 Dec 31 1969 wall_sign/
-rw-r--r--+ 1 evilsupahfly evilsupahfly 135 Dec 31 1969 water.json
-rw-r--r--+ 1 evilsupahfly evilsupahfly 153 Dec 31 1969 white_shulker_box.json
-rw-r--r--+ 1 evilsupahfly evilsupahfly 155 Dec 31 1969 yellow_shulker_box.json
sh-5.2$
So, can somebody who is good with both Python and Flatpaks explain to me what’s going on? What differences exist between “Flatpak Python 3.12.6” and “Normal Python 3.12.6” that could be causing my problem, and how do I resolve it?