Author SHA1 Message Date
Eclipse cd743a8e76 Address reviews 2026-08-04 13:17:51 +00:00
Eclipse cd4b48ee45 Some more updates 2026-08-04 11:06:17 +00:00
Eclipse 247718bb74 Update custom-skulls page for JSON mappings 2026-08-04 10:46:49 +00:00
7 changed files with 142 additions and 146 deletions

No files matched your search

+3 -3
View File
@@ -1,9 +1,9 @@
{
"bedrock": {
"supported": "26.0-26.33",
"supported": "26.0-26.40",
"latest": {
"id": 1001,
"name": "26.33"
"id": 2168,
"name": "26.40"
}
},
"java": {
+18
View File
@@ -15,3 +15,21 @@ Geyser supports mapping various custom additions to the game via resource packs
Geyser does not convert resource packs from Java Edition automatically.
However, you can use automatic tools such as [Rainbow](/wiki/other/rainbow/) or [Thunder](/wiki/other/thunder) to make converting custom content simpler.
:::
## JSON mappings {#json-mappings}
Various custom additions to the game will require writing custom JSON mappings for Geyser. These mappings are placed
within the `custom_mappings` folder in Geyser's config directory. To enable the usage of custom JSON mappings, ensure
that `gameplay.enable-custom-content` is set to `true` in your `config.yml` file:
```yaml
# Whether to add any items and blocks which normally does not exist in Bedrock Edition.
# This should only need to be disabled if using a proxy that does not use the "transfer packet" style of server switching.
# If this is disabled, furnace minecart items will be mapped to hopper minecart items.
# Geyser's block, item, and skull mappings systems will also be disabled.
# This option requires a restart of Geyser in order to change its setting.
enable-custom-content: true
```
JSON mappings will always have a `format_version` key defined at the root object. Refer to the documentation of the
content you're mapping (items, blocks, etc.) to see what the current `format_version` is.
+2
View File
@@ -18,6 +18,8 @@ would normally require mods to be installed on the Java client.
To set up custom items in Geyser, you have to choose how you are going to register your items. The easiest is using a json mapping file,
but you can also use a Geyser extension which uses the [Geyser API](/wiki/geyser/api/). Further, a Bedrock edition resource pack must also be supplied to ensure Bedrock players can see custom items.
For setting up JSON mappings, please see the instructions [here](/wiki/geyser/custom-content#json-mappings).
:::warning
Geyser does not convert resource packs from Java Edition, and also does not generate custom item mappings automatically.
However, you can use automatic tools such as [Rainbow](/wiki/other/rainbow/) to make converting content simpler.
-139
View File
@@ -1,139 +0,0 @@
---
title: Custom Skulls
description: Geyser allows mapping of custom skulls to custom blocks for use in inventories and on entities.
---
Unlike Java Edition, Bedrock does not have native support for custom skull items. As a result, any method to display custom skulls with Geyser is, to some extent, a workaround. Geyser has long supported in-world custom skulls via the spawning of player entities. This, however, does not allow for the use of custom skulls in inventories, nor does it allow them to be worn by entities. To resolve this, Geyser now allows for the pre-registration of custom skulls via a config file. Geyser will then use this config file to generate a custom resource pack on start that contains the geometry and textures for the pre-registered custom skulls. To the client, these skulls are blocks. Therefore, they can be held in player inventories. In additional, attachables are defined for each skull block so that it is displayed correctly when worn and held by entities.
To setup custom skulls in geyser, you have to choose how you are going to register your blocks. The easiest is [using custom-skulls.yml](#custom-skullsyml), but you can also [use a Geyser extension](#geyser-extensions).
## Enabling custom skulls {#enabling-custom-skulls}
To enable custom skulls, you must set `gameplay.enable-custom-content` to `true` in the `config.yml` file. This will enable the generation of the custom resource pack and the translation of custom skulls to custom blocks. You can then add custom skulls to the `custom-skulls.yml` file.
```yaml
# Whether to add any items and blocks which normally does not exist in Bedrock Edition.
# This should only need to be disabled if using a proxy that does not use the "transfer packet" style of server switching.
# If this is disabled, furnace minecart items will be mapped to hopper minecart items.
# Geyser's block, item, and skull mappings systems will also be disabled.
# This option requires a restart of Geyser in order to change its setting.
enable-custom-content: true
```
## custom-skulls.yml {#custom-skullsyml}
The configuration file `custom-skulls.yml` is present in Geyser's configuration folder and is laid out as follows:
```yml
# --------------------------------
# Geyser Custom Skull Configuration Files
#
# This file is ignored with `add-custom-skull-blocks` disabled.
# See `config.yml` for the main set of configuration values
#
# Custom skulls with the player username, UUID, or texture specified in this file
# will be translated as custom blocks and be displayed in the inventory and on entities.
# --------------------------------
# Java player usernames
# Skins will be updated when Geyser starts and players will have to re-download
# the resource pack if any players had changed their skin.
player-usernames:
- GeyserMC
# Java player UUIDs
# Skins will be updated when Geyser starts and players will have to re-download
# the resource pack if any players had changed their skin.
player-uuids:
- 8b8d8e8f-2759-47c6-acb5-5827de8a72b8
# The long string of characters found in the NBT of custom player heads
player-profiles:
- ewogICJ0aW1lc3RhbXAiIDogMTY1NzMyMjIzOTgzMywKICAicHJvZmlsZUlkIiA6ICJjZGRiZTUyMGQwNDM0YThiYTFjYzlmYzkyZmRlMmJjZiIsCiAgInByb2ZpbGVOYW1lIiA6ICJBbWJlcmljaHUiLAogICJ0ZXh0dXJlcyIgOiB7CiAgICAiU0tJTiIgOiB7CiAgICAgICJ1cmwiIDogImh0dHA6Ly90ZXh0dXJlcy5taW5lY3JhZnQubmV0L3RleHR1cmUvYTkwNzkwYzU3ZTE4MWVkMTNhZGVkMTRjNDdlZTJmN2M4ZGUzNTMzZTAxN2JhOTU3YWY3YmRmOWRmMWJkZTk0ZiIsCiAgICAgICJtZXRhZGF0YSIgOiB7CiAgICAgICAgIm1vZGVsIiA6ICJzbGltIgogICAgICB9CiAgICB9CiAgfQp9
# The hash of the skin on Minecraft's skin server
skin-hashes:
- a90790c57e181ed13aded14c47ee2f7c8de3533e017ba957af7bdf9df1bde94f
```
To add a skull, you need to choose any of the four methods, and add a new entry. The following sections will explain each method:
### Player usernames {#player-usernames}
Skulls can be registered in this section via player usernames. These will be updated when Geyser starts. As a result, they may change if the player's username or skin changes.
### Player UUIDs {#player-uuids}
Skulls can be registered in this section via player UUIDs. These will be updated when Geyser starts. As a result, they may change if skin changes.
### Player profiles {#player-profiles}
Skulls can be registered in this section via the texture string found in the NBT of custom player heads. Unless the value is changed manually, these will not be updated when Geyser starts. As a result, they will not change if the player's username or skin changes. The data is simply base64 encoded JSON. For instance, the example given in the config decodes as follows:
```json
{
"timestamp" : 1657322239833,
"profileId" : "cddbe520d0434a8ba1cc9fc92fde2bcf",
"profileName" : "Amberichu",
"textures" : {
"SKIN" : {
"url" : "http://textures.minecraft.net/texture/a90790c57e181ed13aded14c47ee2f7c8de3533e017ba957af7bdf9df1bde94f",
"metadata" : {
"model" : "slim"
}
}
}
}
```
If on a paper server, this data can be obtained for a skull by holding the item in hand, and running the command `/paper dumpitem`. This will output the NBT data of the item to chat and console. The texture string is found in the `SkullOwner` tag, under the `Properties` tag, under the `textures` tag, under the `Value` tag. For example:
```log
[05:58:07 INFO]: .KastleFirefox issued server command: /paper dumpitem
[05:58:07 INFO]: minecraft:player_head{display: {Name: '{"text":"Test"}'}, SkullOwner: {Properties: {textures: [{Value: "ewogICJ0aW1lc3RhbXAiIDogMTY1NzMyMjIzOTgzMywKICAicHJvZmlsZUlkIiA6ICJjZGRiZTUyMGQwNDM0YThiYTFjYzlmYzkyZmRlMmJjZiIsCiAgInByb2ZpbGVOYW1lIiA6ICJkYXZjaG9vIiwKICAidGV4dHVyZXMiIDogewogICAgIlNLSU4iIDogewogICAgICAidXJsIiA6ICJodHRwOi8vdGV4dHVyZXMubWluZWNyYWZ0Lm5ldC90ZXh0dXJlL2E5MDc5MGM1N2UxODFlZDEzYWRlZDE0YzQ3ZWUyZjdjOGRlMzUzM2UwMTdiYTk1N2FmN2JkZjlkZjFiZGU5NGYiLAogICAgICAibWV0YWRhdGEiIDogewogICAgICAgICJtb2RlbCIgOiAic2xpbSIKICAgICAgfQogICAgfQogIH0KfQ"}]}, Id: [I; -229048314, -553040501, -1407961158, 465313087]}}
```
### Skin Hashes {#skin-hashes}
Skulls can be registered in this section via the hash of the skin on Minecraft's skin server. This is found at the end of the URL. For example, in the URL `http://textures.minecraft.net/texture/a90790c57e181ed13aded14c47ee2f7c8de3533e017ba957af7bdf9df1bde94f` the hash is `a90790c57e181ed13aded14c47ee2f7c8de3533e017ba957af7bdf9df1bde94f`.Unless the value is changed manually, these will not be updated when Geyser starts. As a result, they will not change if the player's username or skin changes.
This can be obtained by decoding the base64 data obtained from a player profile.
## Geyser extensions {#geyser-extensions}
In this example, we will register a custom skull from a player profile. We will use the player profile from the example above.
First, create a class that implements Geyser's Extension class:
```java
public class RegisterCustomSkull implements Extension {
//...
}
```
Next, create a method to register your blocks in the `GeyserDefineCustomSkullsEvent`:
```java
public class RegisterCustomSkull implements Extension {
@Subscribe
public void onDefineCustomSkulls(GeyserDefineCustomSkullsEvent event) {
//...
}
}
```
Finally, register your skull in the event. Use the enum SkullTextureType to specify that the value being passed is a player profile:
```java
public class RegisterCustomSkull implements Extension {
@Subscribe
public void onDefineCustomSkulls(GeyserDefineCustomSkullsEvent event) {
String profile = "ewogICJ0aW1lc3RhbXAiIDogMTY1NzMyMjIzOTgzMywKICAicHJvZmlsZUlkIiA6ICJjZGRiZTUyMGQwNDM0YThiYTFjYzlmYzkyZmRlMmJjZiIsCiAgInByb2ZpbGVOYW1lIiA6ICJkYXZjaG9vIiwKICAidGV4dHVyZXMiIDogewogICAgIlNLSU4iIDogewogICAgICAidXJsIiA6ICJodHRwOi8vdGV4dHVyZXMubWluZWNyYWZ0Lm5ldC90ZXh0dXJlL2E5MDc5MGM1N2UxODFlZDEzYWRlZDE0YzQ3ZWUyZjdjOGRlMzUzM2UwMTdiYTk1N2FmN2JkZjlkZjFiZGU5NGYiLAogICAgICAibWV0YWRhdGEiIDogewogICAgICAgICJtb2RlbCIgOiAic2xpbSIKICAgICAgfQogICAgfQogIH0KfQ"
event.register(profile, SkullTextureType.PROFILE);
}
}
```
## Scraping custom skulls from a world {#scraping-custom-skulls-from-a-world}
Custom skulls can be extracted from an existing world for easy implementation via mappings or API using the tool [HeadExtractor](https://github.com/davchoo/HeadExtractor) made by Amberichu. See the linked repository for usage instructions.
+106
View File
@@ -0,0 +1,106 @@
---
title: Custom Skulls
description: Geyser allows mapping of custom skulls to custom blocks for use in inventories and on entities.
---
import Tabs from "@theme/Tabs";
import TabItem from "@theme/TabItem";
Unlike Minecraft: Java Edition, Bedrock Edition does not have native support for custom skull items.
As a result, any method to display custom skulls with Geyser is, to some extent, a workaround.
Geyser has long supported in-world custom skulls via the spawning of player entities.
This, however, does not allow for the use of custom skulls in inventories, nor does it allow them to be worn by entities.
To resolve this, Geyser allows for the pre-registration of custom skulls via custom JSON mappings
or the Geyser API. Geyser will then generate a custom resource pack on start that contains the geometry and textures
for the pre-registered custom skulls.
To the client, these skulls are blocks. Therefore, they can be held in player inventories.
In addition, attachables are defined for each skull block, so that it is displayed correctly when worn and held by entities.
To set up custom skulls in Geyser, you have to choose how you are going to register them.
The easiest is using custom mappings via JSON files. Alternatively, you can also use the Geyser API, for example using a Geyser extension or a plugin.
:::info
You can use tools such as [Rainbow](/wiki/other/rainbow/) to automatically generate custom JSON mappings for skulls.
:::
:::info
Custom skulls used to be registered using a YAML file in Geyser's config directory, `custom-skulls.yml`. This file
is legacy and its contents will automatically be migrated to custom JSON mappings when Geyser starts.
:::
## Registering custom skulls
Custom skulls can be registered through 4 methods:
- By player username. These will be updated when Geyser starts. As a result, they may change if the player's username or skin changes.
- Use this option for skulls marked `Dynamic` on Java Edition.
- By player UUID. These will also be updated when Geyser starts. As a result, they may change if skin changes.
- Use this option for skulls marked `Dynamic` on Java Edition.
- By the base-64 encoded `textures` property of game profiles. These will only ever change when the registered value itself changes, as they hold a static reference to a skin.
- You can get these values from a custom skull in your hand using the following command in Minecraft: Java Edition: `/data get entity @s SelectedItem.components."minecraft:profile".properties[{name:"textures"}].value`.
- Please note that this command has only been tested on Java Edition 26.2. If the command fails, that could mean your custom skull is a dynamic one, and you should register a UUID or username instead.
- By skin texture hash. These will also only ever change when the value itself changes. They are a static reference to a skin texture over at `https://textures.minecraft.net/texture/`.
- You generally don't need to use this option, as it is often easier to just use the base-64 profile found in a skull.
- If you want to publish an extension or custom skull mappings however, this option can be useful to hide player names/UUIDs, if you wish to do so.
<Tabs groupId="custom-skull-implementation">
<TabItem value="json" label="JSON mappings">
For setting up JSON mappings, please see the instructions [here](/wiki/geyser/custom-content#json-mappings).
JSON mappings have to specify the `format_version` set to `1`, and list all custom skulls under the
`skulls` key. This key holds an object in which Java Edition usernames, user UUIDs, profile hashes or skin texture
hashes can be specified.
For example, take the following `custom_skulls.json` file:
```json
{
"format_version": 1,
"skulls": {
"username": [
"GeyserMC"
],
"uuid": [
"8b8d8e8f-2759-47c6-acb5-5827de8a72b8"
],
"profile": [
"ewogICJ0aW1lc3RhbXAiIDogMTY1NzMyMjIzOTgzMywKICAicHJvZmlsZUlkIiA6ICJjZGRiZTUyMGQwNDM0YThiYTFjYzlmYzkyZmRlMmJjZiIsCiAgInByb2ZpbGVOYW1lIiA6ICJBbWJlcmljaHUiLAogICJ0ZXh0dXJlcyIgOiB7CiAgICAiU0tJTiIgOiB7CiAgICAgICJ1cmwiIDogImh0dHA6Ly90ZXh0dXJlcy5taW5lY3JhZnQubmV0L3RleHR1cmUvYTkwNzkwYzU3ZTE4MWVkMTNhZGVkMTRjNDdlZTJmN2M4ZGUzNTMzZTAxN2JhOTU3YWY3YmRmOWRmMWJkZTk0ZiIsCiAgICAgICJtZXRhZGF0YSIgOiB7CiAgICAgICAgIm1vZGVsIiA6ICJzbGltIgogICAgICB9CiAgICB9CiAgfQp9"
],
"skin_hash": [
"a90790c57e181ed13aded14c47ee2f7c8de3533e017ba957af7bdf9df1bde94f"
]
}
}
```
These mappings specify skulls for the `GeyserMC` user, the `Camotoy` user (using UUID `8b8d8e8f-2759-47c6-acb5-5827de8a72b8`),
and [this](http://textures.minecraft.net/texture/a90790c57e181ed13aded14c47ee2f7c8de3533e017ba957af7bdf9df1bde94f) skin (through the base-64 `profile` entry and the `skin_hash` entry).
</TabItem>
<TabItem value="api" label="Geyser API">
Custom skulls are registered at startup through the `GeyserDefineCustomSkullsEvent`. All skulls are registered
through the `register(String texture, SkullTextureType type)` method, in which the `type` parameter defines the
type of the string registered, which is one of:
- `SkullTextureType.USERNAME` for usernames.
- `SkullTextureType.UUID` for UUIDs.
- `SkullTextureType.PROFILE` for base-64 encoded `textures` properties of game profiles.
- `SkullTextureType.SKIN_HASH` for skin texture hashes.
As an example:
```java
@Subscribe
public void onDefineCustomSkulls(GeyserDefineCustomSkullsEvent event) {
event.register("GeyserMC", SkullTextureType.USERNAME);
event.register("8b8d8e8f-2759-47c6-acb5-5827de8a72b8", SkullTextureType.UUID);
event.register("ewogICJ0aW1lc3RhbXAiIDogMTY1NzMyMjIzOTgzMywKICAicHJvZmlsZUlkIiA6ICJjZGRiZTUyMGQwNDM0YThiYTFjYzlmYzkyZmRlMmJjZiIsCiAgInByb2ZpbGVOYW1lIiA6ICJBbWJlcmljaHUiLAogICJ0ZXh0dXJlcyIgOiB7CiAgICAiU0tJTiIgOiB7CiAgICAgICJ1cmwiIDogImh0dHA6Ly90ZXh0dXJlcy5taW5lY3JhZnQubmV0L3RleHR1cmUvYTkwNzkwYzU3ZTE4MWVkMTNhZGVkMTRjNDdlZTJmN2M4ZGUzNTMzZTAxN2JhOTU3YWY3YmRmOWRmMWJkZTk0ZiIsCiAgICAgICJtZXRhZGF0YSIgOiB7CiAgICAgICAgIm1vZGVsIiA6ICJzbGltIgogICAgICB9CiAgICB9CiAgfQp9", SkullTextureType.PROFILE);
event.register("a90790c57e181ed13aded14c47ee2f7c8de3533e017ba957af7bdf9df1bde94f", SkullTextureType.SKIN_HASH);
}
```
This example specifies skulls for the `GeyserMC` user, the `Camotoy` user (using UUID `8b8d8e8f-2759-47c6-acb5-5827de8a72b8`),
and [this](http://textures.minecraft.net/texture/a90790c57e181ed13aded14c47ee2f7c8de3533e017ba957af7bdf9df1bde94f) skin (through the base-64 `PROFILE` entry and the `SKIN_HASH` entry).
</TabItem>
</Tabs>
+3 -1
View File
@@ -26,7 +26,7 @@ Java Edition resource packs.
:::warning
As with custom blocks and items, Geyser does not convert resource packs from Java Edition, and also does not generate
custom waypoint mappings automatically. However, [Rainbow](/wiki/other/rainbow/) is planning
custom waypoint mappings automatically. However, [Rainbow](/wiki/other/rainbow/) has
support for these conversions.
:::
@@ -38,6 +38,8 @@ the same format as Java's custom waypoint styles and should feel very familiar.
<Tabs groupId="custom-waypoint-implementation">
<TabItem value="json" label="JSON-mappings">
For setting up JSON mappings, please see the instructions [here](/wiki/geyser/custom-content#json-mappings).
JSON mappings have to specify the `format_version` set to `1`, and list all custom waypoint styles under the
`waypoint_styles` key. This key holds an object in which keys are identifiers of waypoint styles, and each
value is the definition of that waypoint style.
+10 -3
View File
@@ -42,12 +42,11 @@ appears correctly on your Java client, then Rainbow is able to analyse it.
Generally, you use Rainbow as follows:
1. Set up a Java Edition 26.1 client, with Fabric installed, and ensure that Rainbow is present on your client.
1. Set up a Java Edition 26.2 client, with Fabric installed, and ensure that Rainbow is present on your client.
2. Join a world or server of choice and make sure all the necessary resource packs are loaded. Then, run `/rainbow create <pack name>`, with `<pack name>` replaced with the name of your resource pack on Bedrock Edition.
3. You can then start converting (or "mapping") custom content to be exported in your Bedrock resource pack. You can find a full list of ways to map custom content below.
4. Run `/rainbow finish` to finish your conversion. Rainbow will then output the generated resource pack and additional files to `.minecraft/rainbow/<pack name>`. You can click the `Wrote pack to disk` message in chat to open that folder.
5. In this folder, you'll find 5 important files/folders:
- `custom-skulls.yml`: put this in Geyser's config folder. These are the exported player skulls. The file may already exist in Geyser's config folder, be careful with overwriting it!
5. In this folder, you'll find 4 important files/folders:
- `custom_mappings`: you need to put the files in here in the `custom_mappings` folder in Geyser's config folder. These are the generated Geyser mappings.
- `pack.zip`: this is the generated resource pack for Bedrock Edition. You need to put this file in the `packs` folder in Geyser's config folder.
- `lang`: you need to put all files in this folder in the `locales/overrides` folder in Geyser's config folder.
@@ -122,6 +121,12 @@ Custom sounds may be mapped by using `/rainbow auto sounds`, which scans through
and maps all that are found. You may also use `/rainbow map sound <namespace>`, which maps all the custom sounds
of the given namespace. This can be useful when you only want to export custom sounds of a single resource pack.
### Mapping custom waypoint styles
Custom waypoint styles, also known as locator bar icons, may be mapped by using `/rainbow auto waypoints`, which scans
through all loaded resource packs for custom styles, and maps all that are found. You may also use
`/rainbow map waypoint <waypoint style>`, which maps a single waypoint style.
## Capabilities and limitations
Rainbow is currently capable of the following:
@@ -149,6 +154,8 @@ Rainbow is currently capable of the following:
- For the `display_context` property, the `gui` case is mapped, if present.
- Also includes detecting if an item should be displayed handheld by looking at the item's model.
- Also is able to detect and map items using the "legacy" `custom_model_data` range-dispatch style, and map them to Geyser's `legacy` item mappings.
- Generating Geyser skull mappings.
- Generating Geyser waypoint style mappings for custom waypoint styles (locator bar icons).
- Generating a simple Bedrock resource pack for blocks and simple 2D items, as well as:
- Simple custom armour items, by analysing an item's `minecraft:equippable` component and loaded equipment assets.
- Custom elytra items also work, but only visually, due to bedrock limitations.