minecraft-resource-pack
Create and edit Minecraft resource packs for 1.21.x including custom block models, item models, blockstate definitions, textures (PNG format requirements), sounds.json, custom fonts, MCMETA animation files, OptiFine CIT (Custom Item Textures), and pack.mcmeta format. Covers the full block/item model JSON schema (parent, textures, elements, display, overrides), multi-layer items, GUI textures, GUI sprites, language files, shader integration (core shaders, Iris), and the pack format numbers for each 1.21.x version. Use to customize how Minecraft looks and sounds without mods.
Best use case
minecraft-resource-pack is best used when you need a repeatable AI agent workflow instead of a one-off prompt.
Create and edit Minecraft resource packs for 1.21.x including custom block models, item models, blockstate definitions, textures (PNG format requirements), sounds.json, custom fonts, MCMETA animation files, OptiFine CIT (Custom Item Textures), and pack.mcmeta format. Covers the full block/item model JSON schema (parent, textures, elements, display, overrides), multi-layer items, GUI textures, GUI sprites, language files, shader integration (core shaders, Iris), and the pack format numbers for each 1.21.x version. Use to customize how Minecraft looks and sounds without mods.
Teams using minecraft-resource-pack should expect a more consistent output, faster repeated execution, less prompt rewriting.
When to use this skill
- You want a reusable workflow that can be run more than once with consistent structure.
When not to use this skill
- You only need a quick one-off answer and do not need a reusable workflow.
- You cannot install or maintain the underlying files, dependencies, or repository context.
Installation
Claude Code / Cursor / Codex
Manual Installation
- Download SKILL.md from GitHub
- Place it in
.claude/skills/minecraft-resource-pack/SKILL.mdinside your project - Restart your AI agent — it will auto-discover the skill
How minecraft-resource-pack Compares
| Feature / Agent | minecraft-resource-pack | Standard Approach |
|---|---|---|
| Platform Support | Not specified | Limited / Varies |
| Context Awareness | High | Baseline |
| Installation Complexity | Unknown | N/A |
Frequently Asked Questions
What does this skill do?
Create and edit Minecraft resource packs for 1.21.x including custom block models, item models, blockstate definitions, textures (PNG format requirements), sounds.json, custom fonts, MCMETA animation files, OptiFine CIT (Custom Item Textures), and pack.mcmeta format. Covers the full block/item model JSON schema (parent, textures, elements, display, overrides), multi-layer items, GUI textures, GUI sprites, language files, shader integration (core shaders, Iris), and the pack format numbers for each 1.21.x version. Use to customize how Minecraft looks and sounds without mods.
Where can I find the source code?
You can find the source code on GitHub using the link provided at the top of the page.
SKILL.md Source
# Minecraft Resource Pack Skill
## What Is a Resource Pack?
A resource pack is a folder (or `.zip`) that overrides or adds Minecraft's visual and
audio assets: textures, models, sounds, language files, fonts, and shaders. No Java
or mod loader required. Works on vanilla clients and servers.
### Routing Boundaries
- `Use when`: the deliverable is visual/audio assets (textures, models, sounds, fonts, shaders) in resource-pack format.
- `Do not use when`: the task requires gameplay logic or runtime behavior changes (use `minecraft-datapack`, `minecraft-plugin-dev`, or `minecraft-modding`).
- `Do not use when`: the task is server infrastructure/runtime administration (`minecraft-server-admin`).
---
## Pack Format Numbers (1.21.x)
| Minecraft Version | `pack_format` |
|-------------------|--------------|
| 1.21 / 1.21.1 | 34 |
| 1.21.2 / 1.21.3 | 42 |
| 1.21.4 | 46 |
| 1.21.5 | 55 |
Use `supported_formats` for broad compatibility:
```json
"supported_formats": { "min_inclusive": 34, "max_inclusive": 55 }
```
---
## Directory Layout
```
my-pack/
├── pack.mcmeta
├── pack.png ← 64×64 icon (optional)
└── assets/
└── minecraft/ ← override vanilla (or <namespace>/ for new packs)
├── models/
│ ├── block/
│ │ └── stone.json
│ └── item/
│ └── diamond_sword.json
├── blockstates/
│ └── stone.json
├── textures/
│ ├── block/
│ │ └── stone.png
│ ├── item/
│ │ └── diamond_sword.png
│ ├── gui/
│ │ └── sprites/
│ │ └── my_sprite.png
│ └── entity/
│ └── zombie/
│ └── zombie.png
├── sounds/
│ └── custom/
│ └── my_sound.ogg
├── sounds.json
├── font/
│ └── default.json
├── lang/
│ └── en_us.json
├── shaders/ ← core shader overrides (advanced)
└── optifine/ ← OptiFine CIT / CTM (OptiFine only)
└── cit/
└── my_item.properties
```
---
## `pack.mcmeta`
```json
{
"pack": {
"pack_format": 55,
"supported_formats": { "min_inclusive": 34, "max_inclusive": 55 },
"description": "My Custom Resource Pack v1.0"
}
}
```
---
## Block Models
### `assets/minecraft/models/block/my_cube.json`
Full cube — all six faces use the same texture:
```json
{
"parent": "minecraft:block/cube_all",
"textures": {
"all": "minecraft:block/stone"
}
}
```
Column block (like logs):
```json
{
"parent": "minecraft:block/cube_column",
"textures": {
"end": "mypack:block/my_pillar_top",
"side": "mypack:block/my_pillar_side"
}
}
```
Different sides:
```json
{
"parent": "minecraft:block/cube",
"textures": {
"up": "mypack:block/my_block_top",
"down": "mypack:block/my_block_bottom",
"north": "mypack:block/my_block_side",
"south": "mypack:block/my_block_side",
"east": "mypack:block/my_block_side",
"west": "mypack:block/my_block_side",
"particle": "mypack:block/my_block_side"
}
}
```
Cross model (flowers, plants):
```json
{
"parent": "minecraft:block/cross",
"textures": {
"cross": "mypack:block/my_flower"
}
}
```
### Custom geometry (elements)
```json
{
"credit": "Custom model",
"ambientocclusion": true,
"textures": {
"0": "mypack:block/panel",
"particle": "mypack:block/panel"
},
"elements": [
{
"from": [0, 0, 7],
"to": [16, 16, 9],
"faces": {
"north": { "texture": "#0", "uv": [0, 0, 16, 16] },
"south": { "texture": "#0", "uv": [0, 0, 16, 16] }
}
}
],
"display": {
"thirdperson_righthand": {
"rotation": [75, 45, 0],
"translation": [0, 2.5, 0],
"scale": [0.375, 0.375, 0.375]
}
}
}
```
> `from` and `to` are in 1/16th block units (0–16). `uv` is `[x1, y1, x2, y2]` in 0–16 units.
---
## Item Models
### Simple flat item
```json
{
"parent": "minecraft:item/generated",
"textures": {
"layer0": "mypack:item/my_item"
}
}
```
### Held item (in-hand model)
```json
{
"parent": "minecraft:item/handheld",
"textures": {
"layer0": "mypack:item/my_sword"
}
}
```
### Two-layer item (colored like leather armor)
```json
{
"parent": "minecraft:item/generated",
"textures": {
"layer0": "minecraft:item/leather_helmet",
"layer1": "minecraft:item/leather_helmet_overlay"
}
}
```
### Custom model data overrides (1.21.4 and prior)
Each `predicate` entry routes to a different model based on `custom_model_data`:
```json
{
"parent": "minecraft:item/handheld",
"textures": {
"layer0": "minecraft:item/stick"
},
"overrides": [
{ "predicate": { "custom_model_data": 1001 }, "model": "mypack:item/magic_wand" },
{ "predicate": { "custom_model_data": 1002 }, "model": "mypack:item/fire_staff" }
]
}
```
### 1.21.4+ Item Model (new format)
In 1.21.4, Mojang introduced a new item model system. Place model definitions at
`assets/<namespace>/items/<item_name>.json`:
```json
{
"model": {
"type": "minecraft:select",
"property": "minecraft:custom_model_data",
"fallback": {
"type": "minecraft:model",
"model": "minecraft:item/stick"
},
"cases": [
{
"when": 1001,
"model": { "type": "minecraft:model", "model": "mypack:item/magic_wand" }
}
]
}
}
```
---
## Blockstate Definitions
### Simple block (no variants)
```json
{
"variants": {
"": { "model": "mypack:block/my_block" }
}
}
```
### Facing block (4 rotations)
```json
{
"variants": {
"facing=north": { "model": "mypack:block/my_block" },
"facing=south": { "model": "mypack:block/my_block", "y": 180 },
"facing=east": { "model": "mypack:block/my_block", "y": 90 },
"facing=west": { "model": "mypack:block/my_block", "y": 270 }
}
}
```
### Random texture (multipart)
```json
{
"variants": {
"": [
{ "model": "minecraft:block/grass_block", "weight": 3 },
{ "model": "minecraft:block/grass_block_2" }
]
}
}
```
### Multipart (slabs, fences, walls)
```json
{
"multipart": [
{ "apply": { "model": "mypack:block/my_slab_bottom" }, "when": { "type": "bottom" } },
{ "apply": { "model": "mypack:block/my_slab_top" }, "when": { "type": "top" } },
{ "apply": { "model": "mypack:block/my_block" }, "when": { "type": "double" } }
]
}
```
---
## Textures
- Format: **PNG**, RGBA (32-bit)
- Standard block/item size: **16×16 px**
- Textures can be larger (32×32, 64×64) — Minecraft scales them, but stick to powers of 2
- Animation requires height = N × width (e.g., 16×64 for 4 frames)
- Place block textures in `assets/<namespace>/textures/block/`
- Place item textures in `assets/<namespace>/textures/item/`
- All textures are referenced without the `.png` extension in JSON
### Animated texture MCMETA
`assets/minecraft/textures/block/fire_0.png.mcmeta`:
```json
{
"animation": {
"frametime": 2,
"frames": [0, 1, 2, 3, 4, 5, 6, 7]
}
}
```
If `frames` is omitted, all frames play sequentially. `frametime` is in game ticks (default 1).
### GUI sprites (1.20.2+)
Place sprites at `assets/minecraft/textures/gui/sprites/<category>/<name>.png`.
Reference them with `<category>/<name>` in code/JSON.
---
## Sounds
### `assets/minecraft/sounds.json`
```json
{
"my_sound.play": {
"sounds": [
{ "name": "mypack:custom/my_sound", "volume": 1.0, "pitch": 1.0, "weight": 1 },
{ "name": "mypack:custom/my_sound_alt", "weight": 2 }
],
"category": "players"
},
"entity.player.levelup": {
"replace": true,
"sounds": [
{ "name": "mypack:custom/levelup_replaced", "volume": 0.75, "pitch": 1.0 }
]
}
}
```
- Sound files go in `assets/<namespace>/sounds/` as `.ogg` files (Vorbis encoded)
- Use `"replace": true` to replace vanilla sounds instead of adding to them
- Categories: `master`, `music`, `record`, `weather`, `block`, `hostile`, `neutral`, `player`, `ambient`, `voice`
---
## Language Files
`assets/minecraft/lang/en_us.json`:
```json
{
"block.mypack.my_block": "My Custom Block",
"item.mypack.my_item": "Magic Wand",
"entity.mypack.my_mob": "Forest Guardian",
"death.attack.mypack.laser": "%1$s was zapped by %2$s"
}
```
- Use the exact translation key format for your mod/datapack namespace
- File name is the locale code (e.g., `fr_fr.json`, `de_de.json`)
- Always provide `en_us.json` as the primary fallback
---
## Fonts
### `assets/minecraft/font/default.json` — add glyph
```json
{
"providers": [
{
"type": "bitmap",
"file": "mypack:font/icons.png",
"ascent": 8,
"height": 9,
"chars": ["\uE000", "\uE001", "\uE002"]
}
]
}
```
Custom icons via private use area (U+E000–U+F8FF). Reference in text with `\uE000`.
The `icons.png` must have each character cell `height` pixels tall.
---
## OptiFine CIT (Custom Item Textures)
> OptiFine-only feature. Does not work in vanilla or Iris.
### `assets/minecraft/optifine/cit/my_sword.properties`
```properties
type=item
items=minecraft:diamond_sword
texture=my_sword_texture.png
model=my_sword_model
nbt.display.Name=ipattern:*Excalibur*
```
Common CIT properties:
- `type=item` — item texture override
- `type=enchantment` — custom enchantment glint
- `type=armor` — armor overlay
- `items=` — comma-separated item IDs
- `damage=` — damage range (e.g., `0-50%`)
- `nbt.display.Name=ipattern:*text*` — NBT name filter
- `texture=` — PNG file (relative to `.properties` file)
- `model=` — JSON model file (relative)
---
## Iris Shaders (Resource Pack Method)
Iris shaders live inside a resource pack at:
```
assets/iris/
shaders/
core/
rendertype_terrain.vsh ← vertex shader override
rendertype_terrain.fsh ← fragment shader override
```
Full shader pack distribution uses the `.zip` format with a `shaders/` root folder
(not inside `assets/`). Resource pack shader overrides target specific render types.
---
## Installation
```bash
# Singleplayer: place in
~/.minecraft/resourcepacks/my-pack/
# or
~/.minecraft/resourcepacks/my-pack.zip
# Server-side (forces on clients):
# Set in server.properties:
resource-pack=https://example.com/my-pack.zip
resource-pack-sha1=<sha1 hash>
resource-pack-prompt={"text":"Required pack","color":"gold"}
```
---
## Common Issues
| Problem | Cause | Fix |
|---------|-------|-----|
| Model not showing | Wrong JSON path or syntax error | Check `assets/<namespace>/models/` path; validate JSON |
| Black/pink checkerboard | Texture path wrong or missing | Check `textures/` path, file extension not in JSON |
| Blockstate not applying | Wrong state property name | Match exact property names from `/blockdata` |
| Animation not working | Wrong MCMETA location | Must be same folder as texture, named `texture.png.mcmeta` |
| Custom sound not playing | Not in `sounds.json` | Register sound event in `sounds.json`, match namespace |
| Pack not loading | Wrong `pack_format` | Update `pack.mcmeta` for current MC version |
## Validator Script
Use the bundled validator script before shipping a resource-pack update:
```bash
# Run from the installed skill directory (for example `.claude/skills/minecraft-resource-pack`):
./scripts/validate-resource-pack.sh --root /path/to/resource-pack
# Strict mode treats warnings as failures:
./scripts/validate-resource-pack.sh --root /path/to/resource-pack --strict
```
What it checks:
- JSON validity for `pack.mcmeta` and `assets/**/*.json`
- Model/blockstate/font/sounds references resolve to real files
- Every `*.png.mcmeta` has a matching `*.png`
---
## References
- Minecraft Wiki — Resource pack: https://minecraft.wiki/w/Resource_pack
- Minecraft Wiki — Model: https://minecraft.wiki/w/Tutorials/Models
- Minecraft Wiki — Blockstates: https://minecraft.wiki/w/Blockstate_(Java_Edition)
- Pack format history: https://minecraft.wiki/w/Pack_format
- Misode's model viewer: https://misode.github.io/
- OptiFine CIT guide: https://optifine.readthedocs.io/cit.htmlRelated Skills
yt-packaging
Create optimized YouTube titles and thumbnail concepts for maximum CTR. Use this skill whenever the user says "title ideas", "thumbnail concepts", "package this video", "CTR optimization", "title options", "packaging", or has an approved brief and needs to finalize the title and thumbnail direction before outlining. Packaging determines whether viewers click. Use when working with yt packaging. Trigger with 'yt', 'packaging'.
tracking-resource-usage
Track and optimize resource usage across application stack including CPU, memory, disk, and network I/O. Use when identifying bottlenecks or optimizing costs. Trigger with phrases like "track resource usage", "monitor CPU and memory", or "optimize resource allocation".
package-json-manager
Package Json Manager - Auto-activating skill for DevOps Basics. Triggers on: package json manager, package json manager Part of the DevOps Basics skill category.
gpu-resource-optimizer
Gpu Resource Optimizer - Auto-activating skill for ML Deployment. Triggers on: gpu resource optimizer, gpu resource optimizer Part of the ML Deployment skill category.
provider-resources
Implement Terraform Provider resources and data sources using the Plugin Framework. Use when developing CRUD operations, schema design, state management, and acceptance testing for provider resources.
azure-resource-health-diagnose
Analyze Azure resource health, diagnose issues from logs and telemetry, and create a remediation plan for identified problems.
Expo UI Jetpack Compose
`@expo/ui/jetpack-compose` package lets you use Jetpack Compose Views and modifiers in your app.
go-packages
Use when creating Go packages, organizing imports, managing dependencies, or deciding how to structure Go code into packages. Also use when starting a new Go project or splitting a growing codebase into packages, even if the user doesn't explicitly ask about package organization. Does not cover naming individual identifiers (see go-naming).
minecraft-bukkit-pro
Master Minecraft server plugin development with Bukkit, Spigot, and Paper APIs. Specializes in event-driven architecture, command systems, world manipulation, player management, and performance optimization. Use PROACTIVELY for plugin architecture, gameplay mechanics, server-side features, or cross-version compatibility.
azure-resource-manager-sql-dotnet
Azure Resource Manager SDK for Azure SQL in .NET. Use for MANAGEMENT PLANE operations: creating/managing SQL servers, databases, elastic pools, firewall rules, and failover groups via Azure Resource Manager. NOT for data plane operations (executing queries) - use Microsoft.Data.SqlClient for that. Triggers: "SQL server", "create SQL database", "manage SQL resources", "ARM SQL", "SqlServerResource", "provision Azure SQL", "elastic pool", "firewall rule".
azure-resource-manager-redis-dotnet
Azure Resource Manager SDK for Redis in .NET. Use for MANAGEMENT PLANE operations: creating/managing Azure Cache for Redis instances, firewall rules, access keys, patch schedules, linked servers (geo-replication), and private endpoints via Azure Resource Manager. NOT for data plane operations (get/set keys, pub/sub) - use StackExchange.Redis for that. Triggers: "Redis cache", "create Redis", "manage Redis", "ARM Redis", "RedisResource", "provision Redis", "Azure Cache for Redis".
azure-resource-manager-postgresql-dotnet
Azure PostgreSQL Flexible Server SDK for .NET. Database management for PostgreSQL Flexible Server deployments. Use for creating servers, databases, firewall rules, configurations, backups, and high availability. Triggers: "PostgreSQL", "PostgreSqlFlexibleServer", "PostgreSQL Flexible Server", "Azure Database for PostgreSQL", "PostgreSQL database management", "PostgreSQL firewall", "PostgreSQL backup", "Postgres".