Making Resource Packs
Making Resource Packs
Selene supports client-side overrides through the global_client_bundles folder. Any bundle placed there is always loaded and can replace existing client assets or JSON definitions by using the same internal file path as the original.
You can override:
- Textures (
.png) - Sounds (
.ogg) - Visual definitions (
.json) - Animations and grid settings
This also makes larger visual conversions possible, such as different isometric perspectives or higher-resolution assets.
How overrides work
Client bundles typically contain files such as:
client/data/visuals.json
client/textures/...
For example, a visual definition may reference a texture like this:
{
"entries": {
"thirdparty:tile_cursor": {
"type": "simple",
"texture": "client/textures/thirdparty/ui/select_map.png",
"offsetX": 0,
"offsetY": -22,
"sortLayerOffset": 300
}
}
}
To override it, place a replacement file in your own bundle using the exact same relative path.
You can replace either:
- The texture file itself
- The JSON definition that references it
Folder structure
Place resource packs inside global_client_bundles:
global_client_bundles/
my-resource-pack/
bundle.json
client/
data/
textures/
These bundles are local and client-only, making them ideal for visual customization.
Minimal bundle
Create a folder such as global_client_bundles/my-resource-pack/ and add a bundle.json:
{
"name": "my-resource-pack",
"description": "Local visual overrides."
}
Replacing textures
If the original bundle contains:
client/textures/thirdparty/ui/gui_chat.png
then place your replacement texture at:
global_client_bundles/
my-resource-pack/
client/
textures/
thirdparty/
ui/
gui_chat.png
Because the path matches, Selene will load your version instead.
Replacing visual definitions
You can also override JSON definitions by mirroring their path:
global_client_bundles/
my-resource-pack/
client/
data/
thirdparty/
visuals/
example.json
Example override:
{
"entries": {
"thirdparty:tile_cursor": {
"type": "simple",
"texture": "client/textures/thirdparty/ui/my_select_map.png",
"offsetX": 0,
"offsetY": -22,
"sortLayerOffset": 300
}
}
}
This is useful when you need to change animations, offsets, or reference entirely new assets.
Example: cursor replacement
Suppose the original bundle contains:
client/data/visuals.json
client/textures/thirdparty/ui/select_map.png
Replace only the texture
Use the existing JSON and swap the image:
global_client_bundles/
my-resource-pack/
client/
textures/
thirdparty/
ui/
select_map.png
Replace the JSON definition
Override the visual definition and point it to a custom texture:
global_client_bundles/
my-resource-pack/
client/
data/
visuals.json
textures/
thirdparty/
ui/
my_select_map.png
Recommended workflow
- Find the original file inside an existing bundle.
- Recreate the same path inside your resource pack.
- Add your replacement file.
- Launch Selene and verify the changes in-game.
When troubleshooting, compare your bundle structure directly against the original.
Tips
- Keep resource packs client-only unless shared data is required.
- Override one file at a time while testing.
- Preserve folder structure and filenames exactly.
- Replacing only the texture is usually simpler than overriding JSON.
- You can reload all bundles by pressing
F5to see your changes instantly. - You can set
hotReload=trueinclient.propertiesto have bundle files automatically reload.