Overview
Paint living entities with shared, team-restricted and local layers, with a mod API for brushes, layer access rules and server-side painting.
Features
- Operator commands (
/entitypaint) to inspect, clear, fill and copy paint and to manage layers without a paint tool. - Paint lands on the exact texel under the crosshair, captured from the model as it is actually drawn, and each limb holds its own paint.
- Mobs from other mods paint out of the box, including ones animated with GeckoLib. A mod or datapack can opt mobs out with the
ffentitypainting:unpaintabletag. - Layers with blend modes, visibility and opacity, synchronized between players. Rename, reorder and delete them right in the layer manager. Layers other mods lock (like dirt) stay put above your own.
- Local layers only you can see, and team layers: servers, datapacks and mods can choose who sees each shared layer and who may paint it.
- Brush opacity for see-through strokes that mix with paint already on the layer.
- A modding API for custom brushes, server-side painting, locked layers, layer access rules, local layers, events, snapshots, custom models and mob body shapes.
- Measures nearby mobs' shapes for the server when another mod (like FFEntityDirt) asks, with client settings for range and rate.
Getting started
- Find the six paint tools, the eraser and the Mob AI Wand in the Entity Paint Tools creative tab. The wand toggles a mob's AI off and on with a right-click, so a mob stands still while you paint it; it is saved with the mob like the vanilla
NoAItag. - Use first-person view and right-click a living entity that isn't wearing armor, a saddle or a llama carpet. Parts that stick out past the mob, like a wolf's tail, are fair game too. The click waits up to one second for a fresh model draw. A miss or unsupported surface changes nothing.
- Paint once to set up that entity's texture resolution, then sneak and right-click to open the layer manager.
- Add layers, pick the one you paint on, and rename, reorder, hide, fade, blend, clear or delete them. Erasing removes paint from the selected layer and reveals the layers underneath.
This version captures paint placement from the actual vanilla model draw. Painting a sheep has been checked in game on every supported Minecraft version and loader, but multiplayer, villagers and players on the newer targets still need more testing.
Managing layers
The layer manager lists layers top first, the same order they stack on the mob. Click a layer to paint on it (it gets a > marker). Each row has ^ and v to move the layer, and x to delete it. The button turns into ? so a stray click can't wipe your work; click again to confirm.
Below the list, type a new name and press Rename (or Enter). Blend cycles normal, multiply, additive, screen, overlay, darken, lighten, color dodge, color burn, linear burn, hard light, soft light, difference, exclusion, subtract, divide, hue, saturation, color, luminosity, erase and mask (hold Shift to go backwards); the API guide says what each one does; Show / Hide, Clear Layer and Opacity round things out. The list has page buttons when a mob has more layers than fit.
Opacity
Brush Opacity cycles 100%, 75%, 50%, 25% and 10%. See-through strokes mix with paint already on that layer, so dabbing again builds the color up, and translucent blue over red gives purple. The eraser follows the same setting. Layer Opacity (100%, 75%, 50%, 25%) fades a whole layer without touching its pixels. Brush opacity is your own setting; layer opacity is shared with everyone.
Locked layers
Layers marked [locked] belong to another mod (team colors, markings, dirt and the like). You can see them, but you can't select, paint, clear, move or change them, and your own layers can't hop over them. New layers slide in just under any locked layers on top. If every layer on a mob is locked, your first stroke makes a fresh layer of your own.
Local layers
Add Local makes a layer that lives only in your game. Nobody else sees it and the server never hears about it. Local layers sit on top of everyone's paint, are marked [local], and work like any other layer. They are saved on your computer, filed under the world or server world you painted them in, so they survive server address changes. A mob's local layers go away when it dies, and ones you haven't seen for a while are tidied up (see localLayers below).
Team layers
A server, a datapack or another mod can decide who sees each shared layer and who can paint it. For example: everyone paints an "ALL" layer but only the red team can paint "Red"; only the red team can even see "Red"; or a secret mark only the player wearing it can see. Layers you can see but can't paint show [view only]. Layers you can't see simply aren't there for you. When your team or tags change, what you see catches up within about a second.
The server confirms changes. If another editor changes the same entity first, your stale edit is rejected and the latest state is sent back. Brushes use texture pixels, not a fixed world-space size.
Supported scope and limitations
- First-person painting only. Armor, wool, held items, equipment layers, emissive passes, invisible entities and custom rendering engines need separate adapters. Mobs wearing armor (an elytra counts), wolf or horse armor, llama carpets or a saddle can't be painted until it's removed. Shear sheep before painting their body.
- Paint stays put when a mob changes looks with its mood (tamed or angry wolves, sleeping foxes, angry bees, cold striders). Dyed wool, collars and fish patterns show paint in its real color. Paint shows in the inventory preview and on a horse in its inventory screen.
- Sodium works the same as without it. ETF texture variants are followed. EMF custom models paint on Minecraft 1.21.1, including extra pieces a resource pack adds; paint made on a pack's model stays with that model, so players without the pack won't see it. Big packs like Fresh Animations haven't been tried. On 1.21.11, EMF custom models can't be painted yet.
- Iris shader packs work (tried on Fabric for 1.21.1 and 1.21.11). Painted mobs lose PBR normal and specular maps while shaders are on.
- GeckoLib mobs paint bone by bone (GeckoLib 4.9 on 1.21.1, 5.4 on 1.21.11). A GeckoLib render layer that redraws the mob with another texture becomes its own paintable surface when it uses a vanilla entity render type; glowing layers and other special render types are drawn as they are and can't be painted. Paint under such a layer is hidden by it.
- 3D Skin Layers (0.9.2): the 3D hat, jacket, sleeves and pants of a player's skin take paint. Paint sits on the same skin pixels whether a player sees those layers in 3D or flat (without the mod, or past its detail distance), and works in both of its render modes (its compatibility mode, the default, and on 1.21.1 its render-layer mode). Clicks pass through gaps between the 3D pixels to the skin underneath.
- Mobs from other mods paint like vanilla ones when their models are built from vanilla model parts. A model the painter can't follow refuses the click instead of painting the wrong spot. Faces whose texture mapping runs off the edge of the texture are skipped. Mods and datapacks can opt mobs out with the
ffentitypainting:unpaintableentity tag; clicking one says "This mob can't be painted." - Each limb and model piece holds its own paint, even when pieces share texture space. Very small pieces may have no paint texel at a reduced resolution.
- Unreadable textures and unrecognized rendering passes are left unchanged. Models with a different texture layout don't inherit paint.
- Old paint from before the capture rework is kept as a read-only legacy surface and isn't displayed until a migration exists.
- No color picker, undo/redo, continuous strokes, eyedropper or fill yet.
- Paint is stored per loader: NeoForge and Fabric name model pieces differently, so paint from a NeoForge world won't line up when opened with Fabric.
- Server and clients must all use 0.9.0 or newer (0.9.0 to 0.9.3 play together, and 0.9.4 needs 0.9.4 on both sides); it doesn't connect with 0.8.x. Opening a 0.9.0 world in an older version shows team layers to everyone.
Mob shapes for other mods
Some mods, like FFEntityDirt, need to know where each paintable spot sits on a mob's body. Only your game knows what a model looks like, so on those servers FFEntityPainting quietly measures nearby standing mobs now and then (a couple per tick, each again every 30 seconds or so) and tells the server. Your own player is measured too, even in first person. On a server where no mod asks for shapes, nothing is measured. You can turn measuring off in the client settings.
Paint is saved on ordinary entities. Player paint persists across reconnects and dimension changes, and resets when a player dies unless the server turns on keepPlayerPaintOnDeath.
Configuration and commands
Painting rules are server settings and the brush and display options are client settings. Every option with its default, and the operator /entitypaint commands, are on the Configuration page.
Datapacks and functions
Datapacks can keep any mob from being painted with the ffentitypainting:unpaintable entity tag, and functions can use the /entitypaint commands above, team layers included. See the Datapacks page for the tag and examples.
Requirements and source version
| Minecraft | 1.21.1 and 1.21.11 |
|---|---|
| NeoForge | 21.1.211 or newer (1.21.1), 21.11.45 or newer (1.21.11) |
| Fabric | Fabric Loader 0.16.1 or newer (1.21.1) or 0.18.0 or newer (1.21.11), plus Fabric API |
| Included | FFUtilities is bundled in the download |
| Source version | 0.9.4 |
A Modrinth link appears only when a project link is configured. The source version above may be newer than the latest published file.