Making Resource Packs

Learn how to create client-side resource packs by overriding assets and visual definitions through bundles.

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
  1. Find the original file inside an existing bundle.
  2. Recreate the same path inside your resource pack.
  3. Add your replacement file.
  4. 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 F5 to see your changes instantly.
  • You can set hotReload=true in client.properties to have bundle files automatically reload.