resourcepack.ai
DOCS

Building

GUIs

A GUI asset reskins one of Minecraft's screens: the chest window, the furnace, the anvil, the enchanting table. You draw a 256×256 sheet with the screen's window sitting in the middle of it, and that sheet draws over the screen when it opens.

A GUI is draw-only

A pack changes how a screen looks. It cannot move a slot, add one, resize the window or change what any of it does. That's server code, and no Resource Pack has ever been able to reach it. Design against the slot positions you're given, not the ones you'd like.

How it actually works#

This one is worth understanding, because most GUIs here are not a texture override and the difference shows up everywhere else. (The exception is the player's inventory, which is one — see below.)

The sheet ships as a font glyph, and a plugin opens the screen with a title made of two invisible characters: a negative-space character that walks the cursor back to the window's top-left, then the glyph itself. Minecraft draws the title, the title happens to be your entire image, and it lands exactly over the window.

Two consequences follow, and both are the point:

  • Vanilla screens stay vanilla. The files under textures/gui/ are never touched, so an ordinary chest a player opens looks like an ordinary chest. Only a screen a plugin opens with your title gets the custom look.
  • You can draw outside the window. The sheet is bigger than the window, and the margin renders too, so a banner, a border or a pair of hanging chains can overflow the frame. The dashed rectangle in the editor is where vanilla's window sits; everything outside it is yours.

Which screens#

The picker covers the screens whose title text actually renders, grouped by what they're for:

GroupScreens
StorageChest (1–6 rows), Shulker Box, Dispenser / Dropper, Hopper
Crafting & smeltingCrafting Table, Furnace, Blast Furnace, Smoker, Smithing Table, Stonecutter, Grindstone, Loom, Cartography Table
UtilityEnchanting Table, Anvil, Brewing Stand
PlayerPlayer Inventory
MenusEscape Menu

The beacon is missing on purpose: it draws no title, and with no title there's nowhere to put an overlay.

The player's inventory is the other kind#

The Player Inventory in that table works differently from everything above it, and the difference matters more than it sounds.

Nobody opens a player's own inventory for them. There is no plugin call, no title to set, and therefore no glyph trick to play — so that screen is reskinned the only other way a pack can reskin anything: by replacing the vanilla file, textures/gui/container/inventory.png. Pick it like any other screen — in the Draw door it starts from the real vanilla art in the pixel editor with the same slot guides, and under Generate it sits in the same Screen to reskin list, where choosing it swaps the layout builder for the two choices it does have (whether to draw the slot cells, and whether to colour them from your panel). There is nothing else to place: vanilla owns the layout.

What replacing costs you, all three worth knowing before you draw one:

  • It applies everywhere, always. Every inventory every player opens, on every server running the pack, whether or not a plugin asked for it. That is the opposite of the overlay's opt-in behaviour.
  • A pack holds one. Two assets replacing the same file would both export to the same path, so the second one is refused with a message saying which asset already has it.
  • There is no margin. The game draws the window from the file's top-left corner and ignores everything outside it, so unlike an overlay there is no overflow room — art past the window's 176×166 edge simply never appears. The editor's dashed rectangle sits at the sheet's corner rather than in the middle, which is how you can tell the two apart at a glance.

Everything else — the editor, the slot guides, export, moving it to another pack — is identical.

The Escape menu is a third kind again#

The Escape Menu in that table is not a window at all. There is no frame to draw, no slots, and no title we can set — the pause screen is the client drawing a handful of shared sprites, each its own small file: the button face, its hover and disabled states, and the tiled background behind the menu.

So it is generated rather than drawn. Describe the material once and every one of those files is cut from it, with your heading over the top. Three things are worth knowing before you make one:

  • It themes every menu, not just the pause screen. Vanilla draws that same button on the title screen, the options screens and the world list. There is no per-screen widget to override, so theming one themes all of them.
  • The words on the buttons are the client's. Minecraft draws "Back to Game" over your sprite in white with a shadow, at a position no pack controls — so a button face has to survive white text on top of it.
  • A pack holds one, like the player's inventory and for the same reason.

It also opens in the pixel editor rather than the GUI editor, as one packed sheet of all its sprites with a guide box around each — there is no slot grid to show, and a stroke a pixel outside a sprite's box reaches no file at all.

Making one#

GUIs are drawn rather than generated: you start from the real vanilla window art for the screen you picked, already centred in the sheet, and edit from there. There's no prompt box yet: the AI isn't capable of drawing a good screen, and we're working on it.

In the editor you get the vanilla backplate to draw over, the dashed window frame, and a guide box on every slot the screen has, so you can line a panel up with the grid instead of counting pixels. The player inventory and hotbar draw at a fixed offset below the window on most screens, and they're guided too.

Seeing it in game#

An overlay's page carries the exact command that opens it, plus an Open in-game button that runs it for you in game:

/gui @p chest_54 \ue000\ue001

Those last two characters are this GUI's own: the negative-space one, then the glyph. They're allocated per pack, so copy the command off the page rather than typing it.

That's our plugin's command, and it's runnable by any player rather than being op-only, so the person who just drew the sheet can look at it. The screen it opens is a real one, so you're judging the art against real slots and real item stacks.

A replaced screen has no such command and doesn't need one — Sync the pack and press E.

Exporting#

An overlay leaves as a PNG under assets/minecraft/textures/font/, plus an entry in the pack's font provider that binds it to its character. There's no gui/ file in the export, which is what keeps ordinary screens ordinary.

A replaced screen (the player's inventory) leaves as the vanilla file it replaces — assets/minecraft/textures/gui/container/inventory.png — and needs no font entry, no title and no plugin. It works the moment the pack is applied.

The half that isn't in the pack is the title. Your own plugin has to open the inventory with that exact string, in white, or the overlay never appears:

// The title is copied from the GUI's page in the Studio.
Inventory inv = Bukkit.createInventory(null, 54, Component.text("\ue000\ue001").color(NamedTextColor.WHITE));
player.openInventory(inv);

White matters, because the glyph is drawn in the title's colour and a coloured title tints your whole overlay.

Moving a GUI to another pack renumbers it

The characters are allocated per pack, so an overlay copied into a different pack gets new ones and its title string changes. Re-copy it from the GUI's page rather than reusing the old string. (A replaced screen has no characters to renumber — but it won't copy into a pack that already has one of its own.)

On Bedrock#

None of this crosses over. Bedrock's screens aren't drawn from a Java font provider, and there's no title trick to exploit, so a GUI is Java-only. The rest of your pack converts as normal.