Custom Player Models

_images/icon4.webp

sp614x with 2 CPMs active

Custom Player Models (CPM; sometimes called Special Cosmetics) is a feature that can modify player models. They are loaded on join and can be associated with a specific player.

CPMs are loaded from an online OptiFine server, but may also be specified to work with local files.

_images/cape_change.webp

Available online CPMs can be chosen under the Cape Change menu.

CPMs cannot be bought and like Special capes, they are normally not available to normal donators.

Seasonal CPMs

Some CPMs are available to all donators during certain time periods.

_images/cape_change.webp

Available CPMs can be chosen under the Cape Change menu. Here, the Halloween hat is available and enabled.

Christmas

Uses Santa Hat.

Date applied

Date removed

2020/12/25

2021/01/01

2021/12/24

2022/01/01

2022/12/23

2023/01/01

2023/12/23

2024/01/01

2024/12/24

2025/01/01

Halloween

Uses Jingy Hat.

Date applied

Date removed

2021/10/30

2021/11/07

2022/10/26

2022/11/07

2023/10/30

2023/11/08

2024/10/29

2024/11/07

List of online models

This is a list of all CPMs available from the OptiFine server.

Santa Hat

A santa hat.

{
	"type" : "PlayerItem",
	"texture": "optifine:textures/features/hat_santa.png",
	"textureSize": [64, 32],
	"models": [
		{
			"part": "santa_hat",
			"id": "santa_hat",
			"type": "ModelBox",
			"attachTo": "head", 
			"invertAxis": "xy",
			"translate": [0, 0, 0],
			"rotate": [0, -90, 0],
			"submodels": [
				{
					"id": "sant_hat_top2",
					"invertAxis": "xy",
					"translate": [0.53024, 10.61642, 0],
					"rotate": [0, 0, -60],
					"boxes": [
						{"coordinates": [-0.5, 2, -1.5, 3, 3, 3], "textureOffset": [0, 0]}
					]
				},
				{
					"id": "sant_hat_top1",
					"invertAxis": "xy",
					"translate": [1.03024, 9.75039, 0],
					"rotate": [0, 0, -50],
					"boxes": [
						{"coordinates": [-3, -1, -3, 6, 4, 6], "textureOffset": [0, 0]}
					]
				},
				{
					"id": "santa_hat_top0",
					"invertAxis": "xy",
					"translate": [0.2892, 8.72718, 0],
					"rotate": [0, 0, -20],
					"boxes": [
						{"coordinates": [-4, -1, -4, 9, 3, 8], "textureOffset": [0, 0]}
					]
				},
				{
					"id": "sant_hat_top3",
					"invertAxis": "xy",
					"translate": [5.78024, 12.11642, 0],
					"rotate": [0, 0, 15],
					"boxes": [
						{"coordinates": [-0.90192, -1.83013, -2, 4, 4, 4], "textureOffset": [0, 16]}
					]
				},
				{
					"id": "santa_hat_base",
					"invertAxis": "xy",
					"translate": [0.2892, 8.72718, 0],
					"rotate": [0, 0, -15],
					"boxes": [
						{"coordinates": [-4.5, -3, -4.5, 10, 4, 9], "textureOffset": [0, 16], "sizeAdd": 0.1}
					]
				}
			]
		}
	]
}

MrCheeze

Rings at the top and bottom of the head. It resembles the rings at the top of Lego blocks; MrCheeze's cape is a reference to Legos, as well as his skin and profile. The ID is the username of an OptiFine Discord moderator.

{
	"type": "PlayerItem",
	"usePlayerTexture": true,
	"textureSize": [
		64,
		64
	],
	"models": [
		{
		"id": "tail",
		"type": "ModelBox",
		"attachTo": "body",
		"invertAxis": "z",
		"translate": [
			0,
			0,
			0
		],
		"submodels": [
			{
			"part": "tail",
			"id": "tail",
			"invertAxis": "z",
			"translate": [
				0,
				3.5,
				-7.2
			],
			"rotate": [
				-57,
				0,
				0
			],
			"boxes": [
				{
				"coordinates": [
					-0.5,
					-3,
					-7.2,
					1,
					7,
					1
				],
				"textureOffset": [
					60,
					20
				]
				}
			]
			},
			{
			"part": "tail2",
			"id": "tail2",
			"invertAxis": "z",
			"translate": [
				0,
				-8.8,
				-16.9
			],
			"rotate": [
				-102.5,
				0,
				0
			],
			"boxes": [
				{
				"coordinates": [
					-0.5,
					4.5,
					-22,
					1,
					6,
					1
				],
				"textureOffset": [
					60,
					20
				]
				}
			]
			}
		]
		}
	]
}

Jiingy Hat

A ushanka, a Russian hat. The ID is the username of an OptiFine Discord moderator.

{
	"type": "PlayerItem",
	"textureSize": [
		62,
		23
	],
	"models": [
		{
			"id": "Main",
			"type": "ModelBox",
			"attachTo": "head",
			"invertAxis": "xy",
			"translate": [
				0,
				0,
				0
			],
			"rotate": [
				5,
				0,
				0
			],
			"boxes": [
				{
					"coordinates": [
						-5,
						4.5,
						-6,
						10,
						5,
						5
					],
					"textureOffset": [
						0,
						0
					]
				},
				{
					"coordinates": [
						-4.5,
						3,
						-2.5,
						9,
						6,
						7
					],
					"textureOffset": [
						0,
						10
					],
					"sizeAdd": "0.1"
				},
				{
					"coordinates": [
						3.5,
						0,
						-1.5,
						1,
						3,
						4
					],
					"textureOffset": [
						30,
						1
					],
					"sizeAdd": "0.1"
				},
				{
					"coordinates": [
						-4.5,
						0,
						-1.5,
						1,
						3,
						4
					],
					"textureOffset": [
						30,
						1
					],
					"sizeAdd": "0.1"
				}
			]
		}
	]
}

Jiingy Scarf

A blue and white scarf. The ID is the username of an OptiFine Discord moderator.

{
	"type": "PlayerItem",
	"textureSize": [
		62,
		23
	],
	"models": [
		{
			"id": "Main",
			"type": "ModelBox",
			"attachTo": "body",
			"invertAxis": "xy",
			"translate": [
				0,
				0,
				0
			],
			"rotate": [
				0,
				0,
				0
			],
			"boxes": [
				{
					"coordinates": [
						-5,
						0,
						-2.5,
						10,
						1,
						5
					],
					"textureOffset": [
						32,
						10
					]
				},
				{
					"coordinates": [
						-4,
						-1,
						-2.5,
						8,
						1,
						5
					],
					"textureOffset": [
						32,
						17
					]
				},
				{
					"coordinates": [
						1,
						-6,
						-2.5,
						2,
						5,
						1
					],
					"textureOffset": [
						41,
						2
					]
				},
				{
					"coordinates": [
						1,
						-7,
						-2.5,
						1,
						1,
						1
					],
					"textureOffset": [
						48,
						6
					]
				}
			]
		}
	]
}

Kai Ears

Cat ears. Likely for KaiAF, an OptiFine Discord moderator.

{
	"type": "PlayerItem",
	"usePlayerTexture": true,
	"textureSize": [
		64,
		64
	],
	"models": [
		{
			"id": "ears",
			"type": "ModelBox",
			"attachTo": "head",
			"invertAxis": "z",
			"translate": [
				0,
				0,
				0
			],
			"submodels": [
				{
					"part": "leftEar",
					"id": "leftEar",
					"invertAxis": "xy",
					"translate": [
						0,
						0,
						0
					],
					"rotate": [
						0,
						-180,
						0
					],
					"boxes": [
						{
							"coordinates": [
								2,
								7.7,
								-2,
								1,
								2,
								3
							],
							"textureOffset": [
								0,
								0
							]
						}
					]
				},
				{
					"part": "rightEar",
					"id": "rightEar",
					"invertAxis": "xy",
					"translate": [
						0,
						0,
						0
					],
					"rotate": [
						0,
						0,
						0
					],
					"boxes": [
						{
							"coordinates": [
								2,
								7.7,
								-1,
								1,
								2,
								3
							],
							"textureOffset": [
								0,
								0
							]
						}
					]
				}
			]
		}
	]
}

Kai Tail

A cat's tail. Likely for KaiAF, an OptiFine Discord moderator.

{
	"type": "PlayerItem",
	"usePlayerTexture": true,
	"textureSize": [
		64,
		64
	],
	"models": [
		{
			"id": "tail",
			"type": "ModelBox",
			"attachTo": "body",
			"invertAxis": "z",
			"translate": [
				0,
				0,
				0
			],
			"submodels": [
				{
					"part": "tail",
					"id": "tail",
					"invertAxis": "z",
					"translate": [
						0,
						3.5,
						-7.2
					],
					"rotate": [
						-57,
						0,
						0
					],
					"boxes": [
						{
							"coordinates": [
								-0.5,
								-3,
								-7.2,
								1,
								7,
								1
							],
							"textureOffset": [
								60,
								20
							]
						}
					]
				},
				{
					"part": "tail2",
					"id": "tail2",
					"invertAxis": "z",
					"translate": [
						0,
						-8.8,
						-16.9
					],
					"rotate": [
						-102.5,
						0,
						0
					],
					"boxes": [
						{
							"coordinates": [
								-0.5,
								4.5,
								-22,
								1,
								6,
								1
							],
							"textureOffset": [
								60,
								20
							]
						}
					]
				}
			]
		}
	]
}

Back Sword

An old Iron Sword at the player's back.

{
	"type": "PlayerItem",
	"textureSize": [
		16,
		16
	],
	"models": [
		{
			"id": "Level 1",
			"type": "ModelBox",
			"attachTo": "body",
			"invertAxis": "yz",
			"translate": [
				-7,
				2,
				-4
			],
			"rotate": [
				0,
				0,
				-90
			],
			"sprites": [
				{
					"comment": "Axe",
					"textureOffset": [
						0,
						0
					],
					"coordinates": [
						0,
						0,
						0,
						16,
						16,
						1
					]
				}
			]
		}
	]
}

Back Pickaxe

An old Iron Pickaxe at the player's back.

{
	"type": "PlayerItem",
	"textureSize": [
		16,
		16
	],
	"models": [
		{
			"id": "Level 1",
			"type": "ModelBox",
			"attachTo": "body",
			"invertAxis": "yz",
			"mirrorTexture": "u",
			"translate": [
				-7,
				-14,
				-4
			],
			"rotate": [
				0,
				0,
				0
			],
			"sprites": [
				{
					"comment": "Axe",
					"textureOffset": [
						0,
						0
					],
					"coordinates": [
						0,
						0,
						0,
						16,
						16,
						1
					]
				}
			]
		}
	]
}

Back Axe

An old Iron Axe at the player's back.

{
	"type": "PlayerItem",
	"textureSize": [
		16,
		16
	],
	"models": [
		{
			"id": "Level 1",
			"type": "ModelBox",
			"attachTo": "body",
			"invertAxis": "yz",
			"mirrorTexture": "uv",
			"translate": [
				-8,
				1,
				-4
			],
			"rotate": [
				0,
				0,
				-90
			],
			"sprites": [
				{
					"comment": "Axe",
					"textureOffset": [
						0,
						0
					],
					"coordinates": [
						0,
						0,
						0,
						16,
						16,
						1
					]
				}
			]
		}
	]
}

Back Quiver

A quiver at the player's back. Quivers are a remnant of Minecraft; the texture was removed in 1.9 snapshot 15w31a.

{
	"type": "PlayerItem",
	"textureSize": [
		16,
		16
	],
	"models": [
		{
			"id": "Level 1",
			"type": "ModelBox",
			"attachTo": "body",
			"invertAxis": "yz",
			"mirrorTexture": "u",
			"translate": [
				-8,
				-13,
				-4
			],
			"rotate": [
				0,
				0,
				0
			],
			"sprites": [
				{
					"comment": "Axe",
					"textureOffset": [
						0,
						0
					],
					"coordinates": [
						0,
						0,
						0,
						16,
						16,
						1
					]
				}
			]
		}
	]
}

Back Bow

This cosmetic has an old-textured Bow at the player's back.

{
	"type": "PlayerItem",
	"textureSize": [
		16,
		16
	],
	"models": [
		{
			"id": "Level 1",
			"type": "ModelBox",
			"attachTo": "body",
			"invertAxis": "yz",
			"mirrorTexture": "uv",
			"translate": [
				-8,
				2,
				-4
			],
			"rotate": [
				0,
				0,
				-90
			],
			"sprites": [
				{
					"comment": "Axe",
					"textureOffset": [
						0,
						0
					],
					"coordinates": [
						0,
						0,
						0,
						16,
						16,
						1
					]
				}
			]
		}
	]
}

Back Carrot on a Stick

An old Carrot on a Stick at the player's back.

{
	"type": "PlayerItem",
	"textureSize": [
		16,
		16
	],
	"models": [
		{
			"id": "Level 1",
			"type": "ModelBox",
			"attachTo": "body",
			"invertAxis": "yz",
			"mirrorTexture": "u",
			"translate": [
				-7,
				-14,
				-4
			],
			"rotate": [
				0,
				0,
				0
			],
			"sprites": [
				{
					"comment": "Axe",
					"textureOffset": [
						0,
						0
					],
					"coordinates": [
						0,
						0,
						0,
						16,
						16,
						1
					]
				}
			]
		}
	]
}

Back Fishing Rod

An old Fishing Rod at the player's back.

{
	"type": "PlayerItem",
	"textureSize": [
		16,
		16
	],
	"models": [
		{
			"id": "Level 1",
			"type": "ModelBox",
			"attachTo": "body",
			"invertAxis": "yz",
			"mirrorTexture": "u",
			"translate": [
				-7,
				-14,
				-4
			],
			"rotate": [
				0,
				0,
				0
			],
			"sprites": [
				{
					"comment": "Axe",
					"textureOffset": [
						0,
						0
					],
					"coordinates": [
						0,
						0,
						0,
						16,
						16,
						1
					]
				}
			]
		}
	]
}

Body Boobs

{
	"type": "PlayerItem",
	"usePlayerTexture": true,
	"textureSize": [
		64,
		32
	],
	"models": [
		{
			"id": "Level 1",
			"type": "ModelBox",
			"attachTo": "body",
			"invertAxis": "z",
			"translate": [
				-4,
				3,
				1.9
			],
			"rotate": [
				0,
				0,
				0
			],
			"sprites": [
				{
					"textureOffset": [
						20,
						23
					],
					"coordinates": [
						0,
						0,
						0,
						8,
						3,
						1
					]
				}
			]
		}
	]
}

Body Sword

An old Iron Sword at the player's front.

_images/body_sword_front.webp

Front

_images/body_sword_back.webp

Back

{
	"type": "PlayerItem",
	"textureSize": [
		16,
		16
	],
	"models": [
		{
			"id": "Level 1",
			"type": "ModelBox",
			"attachTo": "body",
			"invertAxis": "yz",
			"translate": [
				-1,
				-6,
				-14
			],
			"rotate": [
				90,
				-45,
				90
			],
			"sprites": [
				{
					"comment": "Axe",
					"textureOffset": [
						0,
						0
					],
					"coordinates": [
						0,
						0,
						0,
						16,
						16,
						1
					]
				}
			]
		}
	]
}

Body Hearth

A heart at the player's chest. Hearth is likely to be a typo, intended to be heart.

{
	"type": "PlayerItem",
	"textureSize": [
		16,
		16
	],
	"models": [
		{
			"id": "Main",
			"type": "ModelBox",
			"attachTo": "body",
			"invertAxis": "z",
			"translate": [
				-3,
				3,
				2.1
			],
			"rotate": [
				0,
				0,
				0
			],
			"sprites": [
				{
					"textureOffset": [
						0,
						0
					],
					"coordinates": [
						0,
						0,
						0,
						7,
						6,
						1
					]
				}
			]
		}
	]
}

Arrow Hat

An arrow through the player's head.

_images/hat_arrow1.webp

Initial

_images/hat_arrow_front.webp

Front

{
	"type": "PlayerItem",
	"textureSize": [
		16,
		16
	],
	"models": [
		{
			"id": "SideA",
			"type": "ModelBox",
			"attachTo": "head",
			"invertAxis": "yz",
			"translate": [
				0,
				5,
				0
			],
			"rotate": [
				-45,
				0,
				0
			],
			"scale": 0.75,
			"boxes": [
				{
					"comment": "Tail",
					"textureOffset": [
						0,
						5
					],
					"coordinates": [
						-13,
						-2.5,
						0,
						8,
						5,
						0
					]
				},
				{
					"comment": "Head",
					"textureOffset": [
						0,
						0
					],
					"coordinates": [
						5,
						-2.5,
						0,
						8,
						5,
						0
					]
				}
			]
		},
		{
			"id": "SideB",
			"baseId": "SideA",
			"rotate": [
				45,
				0,
				0
			]
		},
		{
			"id": "Back",
			"type": "ModelBox",
			"attachTo": "head",
			"invertAxis": "yz",
			"translate": [
				0,
				5,
				0
			],
			"rotate": [
				45,
				0,
				0
			],
			"scale": 0.75,
			"boxes": [
				{
					"comment": "Back (tex coord V is 5 instead of 10!)",
					"textureOffset": [
						0,
						5
					],
					"coordinates": [
						12,
						-2.5,
						-2.5,
						0,
						5,
						5
					]
				}
			]
		}
	]
}

Axe Hat

An axe through the player's head.

Error

Missing render

{
	"type": "PlayerItem",
	"textureSize": [
		16,
		16
	],
	"models": [
		{
			"id": "Level 1",
			"type": "ModelBox",
			"attachTo": "head",
			"invertAxis": "yz",
			"mirrorTexture": "",
			"translate": [
				-1,
				-1,
				-16
			],
			"rotate": [
				90,
				0,
				90
			],
			"sprites": [
				{
					"comment": "Axe",
					"textureOffset": [
						0,
						0
					],
					"coordinates": [
						0,
						0,
						0,
						16,
						16,
						1
					]
				}
			]
		}
	]
}

Bee Antenna

A bee antenna coming out of the east side of the player's head.

{
	"type": "PlayerItem",
	"texture": "optifine:textures/features/hat_bee.png",
	"textureSize": [
		16,
		16
	],
	"models": [
		{
			"id": "RightAntenna",
			"type": "ModelBox",
			"attachTo": "head",
			"invertAxis": "yz",
			"translate": [
				2,
				8,
				0
			],
			"rotate": [
				0,
				0,
				0
			],
			"boxes": [
				{
					"comment": "V",
					"textureOffset": [
						0,
						0
					],
					"coordinates": [
						-1,
						0,
						0,
						1,
						4,
						1
					]
				},
				{
					"comment": "H",
					"textureOffset": [
						0,
						5
					],
					"coordinates": [
						0,
						4,
						0,
						2,
						1,
						1
					]
				},
				{
					"comment": "Dot",
					"textureOffset": [
						4,
						0
					],
					"coordinates": [
						2,
						3,
						0,
						1,
						1,
						1
					]
				},
				{
					"textureOffset": [
						4,
						0
					],
					"coordinates": [
						3,
						4,
						0,
						1,
						1,
						1
					]
				},
				{
					"textureOffset": [
						4,
						0
					],
					"coordinates": [
						4,
						3,
						0,
						1,
						1,
						1
					]
				},
				{
					"textureOffset": [
						4,
						0
					],
					"coordinates": [
						3,
						2,
						0,
						1,
						1,
						1
					]
				},
				{
					"comment": "DotCenter",
					"textureOffset": [
						4,
						2
					],
					"coordinates": [
						3,
						3,
						0,
						1,
						1,
						1
					]
				}
			]
		},
		{
			"id": "LeftAntenna",
			"baseId": "RightAntenna",
			"invertAxis": "xyz",
			"mirrorTexture": "u"
		}
	]
}

Jingy Hat

A modified Witch Hat, used for Halloween.

The name Jingy is misspelled; it is supposed to be Jiingy. The ID is a reference to Jiingy, an OptiFine Discord admin.

{
	"type": "PlayerItem",
	"texture": "optifine:textures/features/hat_jingy.png",
	"textureSize": [
		96,
		26
	],
	"models": [
		{
			"part": "witch_hat",
			"type": "ModelBox",
			"attachTo": "head",
			"id": "witch_hat",
			"invertAxis": "xy",
			"translate": [
				-2.372,
				-23.5,
				-8.5
			],
			"rotate": [
				90,
				72.5,
				89.5
			],
			"submodels": [
				{
					"id": "Tip",
					"invertAxis": "xy",
					"translate": [
						-2.3828,
						40.3367,
						2.1
					],
					"rotate": [
						0,
						-90,
						50
					],
					"boxes": [
						{
							"coordinates": [
								-1,
								-1.5,
								-1,
								2,
								3,
								2
							],
							"textureOffset": [
								75,
								21
							]
						}
					]
				},
				{
					"id": "Top",
					"invertAxis": "xy",
					"translate": [
						-0.2993,
						37.9964,
						2.1
					],
					"rotate": [
						0,
						-90,
						37.5
					],
					"boxes": [
						{
							"coordinates": [
								-2,
								-2,
								-2,
								4,
								4,
								4
							],
							"textureOffset": [
								58,
								18
							]
						}
					]
				},
				{
					"id": "Middle",
					"invertAxis": "xy",
					"translate": [
						0.5898,
						35.475,
						2.1
					],
					"rotate": [
						0,
						-90,
						14.5
					],
					"boxes": [
						{
							"coordinates": [
								-2.8999,
								-2.3873,
								-3,
								6,
								4,
								6
							],
							"textureOffset": [
								33,
								16
							]
						}
					]
				},
				{
					"id": "Bottom2",
					"invertAxis": "xy",
					"translate": [
						0.9,
						33.05,
						2.1
					],
					"rotate": [
						0,
						-90,
						-3
					],
					"boxes": [
						{
							"coordinates": [
								-4,
								-1,
								-4,
								8,
								2,
								8
							],
							"textureOffset": [
								0,
								16
							],
							"sizeAdd": 0.1
						}
					]
				},
				{
					"id": "Bottom1",
					"invertAxis": "xy",
					"translate": [
						0.775,
						31.4594,
						2.1
					],
					"rotate": [
						0,
						-90,
						-7.5
					],
					"boxes": [
						{
							"coordinates": [
								-4.9348,
								-1,
								-5,
								10,
								2,
								10
							],
							"textureOffset": [
								56,
								3
							]
						}
					]
				},
				{
					"id": "Base",
					"invertAxis": "xy",
					"translate": [
						0.775,
						30.9636,
						2.1
					],
					"rotate": [
						0,
						0,
						-7.5
					],
					"boxes": [
						{
							"coordinates": [
								-7.00004,
								-0.5136,
								-7,
								14,
								0,
								14
							],
							"textureOffset": [
								0,
								0
							]
						}
					]
				}
			]
		}
	]
}

A prototype of the Santa Hat.

{
	"type": "PlayerItem",
	"textureSize": [
		64,
		64
	],
	"models": [
		{
			"id": "Level1",
			"type": "ModelBox",
			"attachTo": "head",
			"invertAxis": "y",
			"translate": [
				-5,
				7,
				-5
			],
			"rotate": [
				0,
				0,
				0
			],
			"boxes": [
				{
					"textureOffset": [
						0,
						0
					],
					"coordinates": [
						0,
						0,
						0,
						10,
						3,
						10
					],
					"sizeAdd": 0.1
				}
			],
			"submodel": {
				"comment": "Level2",
				"invertAxis": "y",
				"translate": [
					1,
					3,
					1
				],
				"rotate": [
					-20,
					0,
					0
				],
				"boxes": [
					{
						"textureOffset": [
							0,
							13
						],
						"coordinates": [
							0,
							0,
							0,
							8,
							4,
							8
						]
					}
				],
				"submodel": {
					"comment": "Level3",
					"invertAxis": "y",
					"translate": [
						1,
						4,
						1
					],
					"rotate": [
						-25,
						0,
						0
					],
					"boxes": [
						{
							"textureOffset": [
								0,
								25
							],
							"coordinates": [
								0,
								0,
								0,
								6,
								4,
								6
							]
						}
					],
					"submodel": {
						"comment": "Level4",
						"invertAxis": "y",
						"translate": [
							0.5,
							4,
							0.5
						],
						"rotate": [
							-40,
							0,
							0
						],
						"boxes": [
							{
								"textureOffset": [
									0,
									35
								],
								"coordinates": [
									0,
									0,
									0,
									5,
									4,
									5
								]
							}
						],
						"submodel": {
							"comment": "Level5",
							"invertAxis": "y",
							"translate": [
								0.5,
								4,
								0.5
							],
							"rotate": [
								-40,
								0,
								0
							],
							"boxes": [
								{
									"textureOffset": [
										0,
										44
									],
									"coordinates": [
										0,
										0,
										0,
										4,
										4,
										4
									]
								}
							],
							"submodel": {
								"comment": "Level6",
								"invertAxis": "y",
								"translate": [
									0.5,
									4,
									0.5
								],
								"rotate": [
									-35,
									0,
									0
								],
								"boxes": [
									{
										"textureOffset": [
											0,
											52
										],
										"coordinates": [
											0,
											0,
											0,
											3,
											5,
											3
										]
									}
								],
								"submodel": {
									"comment": "Level7",
									"invertAxis": "y",
									"translate": [
										0.5,
										5,
										0.5
									],
									"rotate": [
										-15,
										0,
										0
									],
									"boxes": [
										{
											"textureOffset": [
												32,
												13
											],
											"coordinates": [
												0,
												0,
												0,
												2,
												5,
												2
											]
										}
									],
									"submodels": [
										{
											"comment": "Level8",
											"invertAxis": "y",
											"translate": [
												0.5,
												5,
												0.5
											],
											"rotate": [
												-3,
												0,
												0
											],
											"boxes": [
												{
													"textureOffset": [
														40,
														0
													],
													"coordinates": [
														0,
														0,
														0,
														1,
														4,
														1
													]
												}
											]
										}
									]
								}
							}
						}
					}
				}
			}
		}
	]
}

Pickaxe Hat

An old Iron Pickaxe through the player's head.

Error

Missing render

{
	"type": "PlayerItem",
	"textureSize": [
		16,
		16
	],
	"models": [
		{
			"id": "Level 1",
			"type": "ModelBox",
			"attachTo": "head",
			"invertAxis": "yz",
			"translate": [
				0,
				1,
				-14
			],
			"rotate": [
				0,
				-90,
				0
			],
			"sprites": [
				{
					"comment": "Axe",
					"textureOffset": [
						0,
						0
					],
					"coordinates": [
						0,
						0,
						0,
						16,
						16,
						1
					]
				}
			]
		}
	]
}

Reddit Hat

Similar to hat_bee, except that the antenna is more centered, and the yellow dot is white. It is intended to look like Snoo's (the alien-like mascot of Reddit) single antenna.

{
	"type": "PlayerItem",
	"texture": "optifine:textures/features/hat_reddit.png",
	"textureSize": [
		16,
		16
	],
	"models": [
		{
			"id": "Level 1",
			"type": "ModelBox",
			"attachTo": "head",
			"invertAxis": "yz",
			"translate": [
				0,
				8,
				0
			],
			"rotate": [
				0,
				0,
				0
			],
			"boxes": [
				{
					"comment": "V",
					"textureOffset": [
						0,
						0
					],
					"coordinates": [
						-1,
						0,
						0,
						1,
						4,
						1
					]
				},
				{
					"comment": "H",
					"textureOffset": [
						0,
						5
					],
					"coordinates": [
						0,
						4,
						0,
						2,
						1,
						1
					]
				},
				{
					"comment": "Dot",
					"textureOffset": [
						4,
						0
					],
					"coordinates": [
						2,
						3,
						0,
						1,
						1,
						1
					]
				},
				{
					"textureOffset": [
						4,
						0
					],
					"coordinates": [
						3,
						4,
						0,
						1,
						1,
						1
					]
				},
				{
					"textureOffset": [
						4,
						0
					],
					"coordinates": [
						4,
						3,
						0,
						1,
						1,
						1
					]
				},
				{
					"textureOffset": [
						4,
						0
					],
					"coordinates": [
						3,
						2,
						0,
						1,
						1,
						1
					]
				},
				{
					"comment": "DotCenter",
					"textureOffset": [
						4,
						2
					],
					"coordinates": [
						3,
						3,
						0,
						1,
						1,
						1
					]
				}
			]
		}
	]
}

Reindeer Antlers

Two reindeer antlers from the top of the player's head.

Error

Missing render

{
	"type": "PlayerItem",
	"textureSize": [
		16,
		16
	],
	"models": [
		{
			"id": "Level 1",
			"type": "ModelBox",
			"attachTo": "head",
			"invertAxis": "yz",
			"translate": [
				-8,
				6,
				0
			],
			"rotate": [
				0,
				0,
				0
			],
			"sprites": [
				{
					"textureOffset": [
						0,
						0
					],
					"coordinates": [
						0,
						0,
						0,
						16,
						6,
						1
					]
				}
			]
		}
	]
}

Shovel Hat

An old Iron Shovel in the player's head.

Error

Missing render

{
	"type": "PlayerItem",
	"textureSize": [
		16,
		16
	],
	"models": [
		{
			"id": "Level 1",
			"type": "ModelBox",
			"attachTo": "head",
			"invertAxis": "yz",
			"mirrorTexture": "",
			"translate": [
				-1,
				-3,
				-15
			],
			"rotate": [
				90,
				0,
				90
			],
			"sprites": [
				{
					"comment": "Axe",
					"textureOffset": [
						0,
						0
					],
					"coordinates": [
						0,
						0,
						0,
						16,
						16,
						1
					]
				}
			]
		}
	]
}

Witch Hat

This cosmetic looks like the Vanilla Witch's hat. It is not the same as hat_jingy.

{
	"type": "PlayerItem",
	"texture": "optifine:textures/features/hat_witch.png",
	"textureSize": [
		64,
		64
	],
	"models": [
		{
			"id": "Level1",
			"type": "ModelBox",
			"attachTo": "head",
			"invertAxis": "yz",
			"translate": [
				0,
				7,
				0
			],
			"rotate": [
				0,
				0,
				0
			],
			"boxes": [
				{
					"textureOffset": [
						0,
						0
					],
					"coordinates": [
						-5,
						0,
						-5,
						10,
						2,
						10
					],
					"sizeAdd": 0.1
				}
			]
		},
		{
			"id": "Level2",
			"type": "ModelBox",
			"attachTo": "head",
			"invertAxis": "yz",
			"translate": [
				0,
				8.75,
				0
			],
			"rotate": [
				-3,
				0,
				-1.5
			],
			"boxes": [
				{
					"textureOffset": [
						0,
						12
					],
					"coordinates": [
						-3.5,
						0,
						-3.5,
						7,
						4,
						7
					]
				}
			]
		},
		{
			"id": "Level3",
			"type": "ModelBox",
			"attachTo": "head",
			"invertAxis": "yz",
			"translate": [
				0,
				12.5,
				0
			],
			"rotate": [
				-9,
				0,
				-4.5
			],
			"boxes": [
				{
					"textureOffset": [
						0,
						23
					],
					"coordinates": [
						-2,
						0,
						-2,
						4,
						4,
						4
					]
				}
			]
		},
		{
			"id": "Level4",
			"type": "ModelBox",
			"attachTo": "head",
			"invertAxis": "yz",
			"translate": [
				0,
				16.25,
				0
			],
			"rotate": [
				-21,
				0,
				-10.5
			],
			"boxes": [
				{
					"textureOffset": [
						0,
						31
					],
					"coordinates": [
						-0.25,
						0,
						-1,
						1,
						2,
						1
					],
					"sizeAdd": 0.25
				}
			]
		}
	]
}

Nose Up

A nose, raised up.

{
	"type": "PlayerItem",
	"usePlayerTexture": true,
	"textureSize": [
		64,
		32
	],
	"models": [
		{
			"id": "Level 1",
			"type": "ModelBox",
			"attachTo": "head",
			"invertAxis": "yz",
			"translate": [
				-1,
				3,
				4
			],
			"rotate": [
				0,
				0,
				0
			],
			"sprites": [
				{
					"textureOffset": [
						11,
						13
					],
					"coordinates": [
						0,
						0,
						0,
						2,
						1,
						1
					]
				}
			]
		}
	]
}

Nose Down

A nose, lowered down.

{
	"type": "PlayerItem",
	"usePlayerTexture": true,
	"textureSize": [
		64,
		32
	],
	"models": [
		{
			"id": "Level 1",
			"type": "ModelBox",
			"attachTo": "head",
			"invertAxis": "yz",
			"translate": [
				-1,
				2,
				4
			],
			"rotate": [
				0,
				0,
				0
			],
			"sprites": [
				{
					"textureOffset": [
						11,
						13
					],
					"coordinates": [
						0,
						0,
						0,
						2,
						1,
						1
					]
				}
			]
		}
	]
}

Villager Nose

A Villager's nose.

{
	"type": "PlayerItem",
	"textureSize": [
		16,
		16
	],
	"models": [
		{
			"id": "Level 1",
			"type": "ModelBox",
			"attachTo": "head",
			"invertAxis": "yz",
			"translate": [
				-1,
				-1,
				4
			],
			"rotate": [
				0,
				0,
				0
			],
			"boxes": [
				{
					"textureOffset": [
						0,
						0
					],
					"coordinates": [
						0,
						0,
						0,
						2,
						4,
						2
					]
				}
			]
		}
	]
}

Mouse Ears

An mouse's ears in the player's head.

{
	"type": "PlayerItem",
	"textureSize": [
		32,
		32
	],
	"models": [
		{
			"id": "Main",
			"type": "ModelBox",
			"attachTo": "head",
			"invertAxis": "yz",
			"mirrorTexture": "",
			"translate": [
				0,
				0,
				0
			],
			"rotate": [
				0,
				0,
				0
			],
			"boxes": [
				{
					"textureOffset": [
						0,
						0
					],
					"coordinates": [
						2,
						6,
						0,
						4,
						4,
						1
					]
				}
			]
		},
		{
			"id": "Second",
			"type": "ModelBox",
			"baseId": "Main",
			"invertAxis": "xyz",
			"mirrorTexture": "u"
		}
	]
}

Angel Wings

An angel's wings.

{
	"type": "PlayerItem",
	"textureSize": [
		16,
		16
	],
	"models": [
		{
			"id": "Main",
			"type": "ModelBox",
			"attachTo": "body",
			"invertAxis": "",
			"translate": [
				1,
				0,
				3
			],
			"rotate": [
				0,
				0,
				0
			],
			"sprites": [
				{
					"textureOffset": [
						0,
						0
					],
					"coordinates": [
						0,
						0,
						0,
						16,
						16,
						1
					]
				}
			]
		},
		{
			"id": "Other",
			"baseId": "Main",
			"attachTo": "body",
			"invertAxis": "x",
			"mirrorTexture": "u"
		}
	]
}

Wolverine Hand

Long "claws" coming out of the player's hand.

Error

Missing render

{
	"type": "PlayerItem",
	"textureSize": [
		16,
		16
	],
	"models": [
		{
			"id": "LeftHand",
			"type": "ModelBox",
			"attachTo": "leftArm",
			"translate": [
				0,
				6.5,
				0
			],
			"rotate": [
				0,
				0,
				0
			],
			"boxes": [
				{
					"comment": "1",
					"textureOffset": [
						0,
						0
					],
					"coordinates": [
						2.4,
						0,
						-2,
						1,
						9,
						1
					],
					"sizeAdd": -0.3
				},
				{
					"comment": "2",
					"textureOffset": [
						0,
						0
					],
					"coordinates": [
						2.4,
						0,
						-0.5,
						1,
						9,
						1
					],
					"sizeAdd": -0.3
				},
				{
					"comment": "3",
					"textureOffset": [
						0,
						0
					],
					"coordinates": [
						2.4,
						0,
						1,
						1,
						9,
						1
					],
					"sizeAdd": -0.3
				}
			]
		},
		{
			"id": "RightHand",
			"baseId": "LeftHand",
			"attachTo": "rightArm",
			"invertAxis": "x"
		}
	]
}

Technical details

After trying to load a player's cape, OptiFine will also check base + /users/USERNAME.cfg, where USERNAME is the player's case-corrected username.

The term "base" refers to how OptiFine is loading the CPM, and thus where it's looking. CPMs may be loaded from 2 places:

  • Online

    Important

    Here, base is the URL http://s.optifine.net

    By default, OptiFine will load CPMs through the OptiFine website if local CPMs are not enabled. OptiFine will use the URL http://s.optifine.net as the 'base' for file locations and model references.

  • Locally

    Important

    Here, base is the file path .minecraft/playermodels

    If enabled, OptiFine will load CPMs through files locally stored on your computer. Instead of querying a website, it will use your filesystem as the 'base' for file locations and model references.

    Local CPMs are not enabled by default. To enable local CPMs:

    1. Set -Dplayer.models.local=true in JVM Arguments.

    2. Create a playermodels/ folder in your .minecraft folder. Or, if you are using MultiMC, your instance's folder.

    Warning

    When local CPMs are enabled, online CPMs will not load.

If the path is to a valid JSON file, OptiFine will process it.

For each object in the root "items" array, OptiFine will load the model referenced in "type". Models are obtained from base + /items/TYPE/model.cfg, where TYPE is the value of key "type".

Next, if the model does not use the player's skin and does not specify a texture, OptiFine will load that texture from base + items/TYPE/users/USERNAME.png.

If a texture cannot be loaded, red wool replaces it.

Warning

Models with "usePlayerTexture": true and "textureSize": [64, 32] will not load correctly, as they depend on old 64 x 32 player skin sizes.

In summary, this structure is:

BASE/ (URL or local folder)
        users/
                USERNAME.cfg (what models a player has)
        items/
                MODEL/
                        model.cfg (the model)
                        users/
                                USERNAME.cfg (the model's texture for this player)

Limitations

CPMs have some limitations that may make them unsuitable for certain needs:

  • (local only) They cannot be in resource packs.

  • (local only) You can only target specific players by username.

  • They require OptiFine, and (local only) specific JVM arguments.

  • They are client-side, and (local only) other players will not see your own CPMs.

  • They do not support animations, as in Animation.

Warning

These resources are not related to OptiDocs, but may provide some help.

JSON schema

Player CFG file
{
	"$schema": "http://json-schema.org/draft/2020-12/schema",
	"$id": "https://gitlab.com/whoatemybutter/optifinedocs/-/blob/master/schemas/cpm_player.schema.json",
	"title": "CPM Player CFG",
	"type": "object",
	"properties": {
		"items": {
			"type": "array",
			"description": "The models available to this player.",
			"items": {
				"type": "object",
				"properties": {
					"type": {
						"type": "string"
					},
					"active": {
						"type": "string",
						"pattern": "^(true|false)$"
					},
					"model": {
						"$ref": "common.schema.json#/$defs/resource"
					},
					"texture": {
						"$ref": "common.schema.json#/$defs/resource"
					}
				},
				"required": ["type", "active"]
			}
		}
	},
	"required": ["items"],
	"additionalProperties": false
}
Model file
{
	"$schema": "http://json-schema.org/draft/2020-12/schema",
	"$id": "https://gitlab.com/whoatemybutter/optifinedocs/-/blob/master/schemas/cpm_model.schema.json",
	"title": "CPM model",
	"type": "object",
	"properties": {
		"type": {
			"const": "PlayerItem"
		},
		"usePlayerTexture": {
			"type": "boolean"
		},
		"texture": {
			"type": "string"
		},
		"textureSize": {
			"type": "array",
			"items": {
				"type": "integer"
			},
			"minItems": 2,
			"maxItems": 2,
			"description": "Texture size (width, height) in pixels."
		},
		"model": {
			"$ref": "#/$defs/model"
		},
		"models": {
			"type": "array",
			"items": {
				"$ref": "#/$defs/model"
			}
		}
	},
	"required": [
		"type",
		"textureSize"
	],
	"allOf": [
		{
			"oneOf": [
				{
					"required": [
						"model"
					]
				},
				{
					"required": [
						"models"
					]
				}
			]
		},
		{
			"if": {
				"properties": {
					"usePlayerTextures": {
						"const": true
					}
				},
				"required": [
					"usePlayerTextures"
				]
			},
			"then": {
				"not": {
					"required": [
						"texture"
					]
				}
			}
		}
	],
	"$defs": {
		"model": {
			"type": "object",
			"properties": {
				"id": {
					"type": "string"
				},
				"type": {
					"const": "ModelBox"
				},
				"attachTo": {
					"type": "string"
				},
				"baseId": {
					"type": "string",
					"minLength": 1
				},
				"invertAxis": {
					"type": "string",
					"maxLength": 3,
					"pattern": "^([xyz])?((?!\\1)[xyz])?((?!\\1)(?!\\2)[xyz])?((?!\\1)(?!\\2)(?!\\3))?$",
					"description": "Axes to invert; \"xyz\" inverts the X, Y, and Z axes, \"\" inverts none of them."
				},
				"translate": {
					"type": "array",
					"minItems": 3,
					"maxItems": 3,
					"items": {
						"type": "number"
					},
					"description": "Translate texture by [0], [1], [2]."
				},
				"rotate": {
					"type": "array",
					"minItems": 3,
					"maxItems": 3,
					"items": {
						"type": "number"
					},
					"description": "Rotate texture by [0], [1], [2]."
				},
				"sprites": {
					"type": "array",
					"items": {
						"$ref": "#/$defs/uvBox"
					}
				},
				"boxes": {
					"type": "array",
					"items": {
						"$ref": "#/$defs/uvBox"
					},
					"description": "List of part model boxes."
				},
				"mirrorTexture": {
					"type": "string",
					"minLength": 1,
					"maxLength": 2,
					"pattern": "^([uv])?((?!\\1)[uv])?((?!\\1)(?!\\2)[uv])?$"
				},
				"submodel": {
					"$ref": "#/$defs/model",
					"description": "Submodel; attached to the parent, moving and rotating with it."
				},
				"submodels": {
					"type": "array",
					"description": "List of submodels; attached to the parent, moving and rotating with it.",
					"items": {
						"$ref": "#/$defs/model"
					}
				}
			}
		},
		"uvBox": {
			"type": "object",
			"properties": {
				"textureOffset": {
					"type": "array",
					"items": {
						"type": "number"
					},
					"minItems": 2,
					"maxItems": 2,
					"description": "Texture offset for the box format."
				},
				"coordinates": {
					"type": "array",
					"minItems": 6,
					"maxItems": 6,
					"items": {
						"type": "number"
					},
					"description": "Box position and dimensions. x, y, z, width, height, depth."
				},
				"sizeAdd": {
					"type": "number",
					"minimum": 0,
					"maximum": 65535,
					"description": "Size increment added to all dimensions; can be used for asymmetric scaling."
				},
				"sizesAdd": {
					"type": "array",
					"minItems": 3,
					"maxItems": 3,
					"items": {
						"type": "number",
						"minimum": 0,
						"maximum": 65535
					},
					"description": "Separate size increments can be used for asymmetric scaling."
				}
			}
		}
	}
}

Assumes the latest OptiFine & Minecraft versions.
Updated to commit 967a9fdb.

Last update: 2025 February 23