HomeBedrockAddonsJeff the villager
Jeff the villager
AddonsBedrock

Jeff the villager

by commanderbly · on CurseForge

is it your friend?

⬇ Download on CurseForge

Jeff — Your Best Friend

A Minecraft Bedrock add-on. You summon a villager called Jeff. He is genuinely helpful for two days. He is paying attention the whole time.

Target version: Bedrock 1.21.x (@minecraft/server 2.0.0, @minecraft/server-ui 2.0.0)


Install

  1. Double-click Jeff.mcaddon — Minecraft imports both packs automatically.
  2. Create or edit a world → Behaviour Packs → activate Jeff — Your Best Friend. The resource pack activates with it. If it doesn't, activate it manually.
  3. In the world's Experiments section, turn on Beta APIs. The add-on is almost entirely script-driven and will do nothing without it.
  4. Cheats must be on if you want the /scriptevent console commands.

If the content log complains that @minecraft/server-ui version 2.0.0 is unavailable, open jeff_BP/manifest.json and change that one version string to 1.3.0. Everything else is unaffected.

He turns up on his own

The first time you enter a world with the pack on, Jeff arrives by himself. About four seconds after you spawn you'll hear a villager somewhere nearby and get "something is walking over" on the action bar; a few seconds later he walks up out of the trees roughly ten blocks away and introduces himself. You don't have to craft or summon anything.

He only does this once per world. Dying and respawning won't produce a second one, and if he's already been summoned nothing happens.

To turn that off — so he only appears when you deliberately make him:

 
/scriptevent jeff:auto off

Then use one of these instead:

The clock starts the moment he appears and is measured in in-game days. Sleeping through the night advances it.


The six days

Day What happens
0–1 Jeff follows you, fights hostile mobs for you, places torches when it gets dark, hands you food, and asks you for small favours. Feed him and he gives you things back. He talks constantly.
2–3 He goes quieter and starts standing closer. Items begin going missing from your inventory. Sounds in the treeline. Torches go out. Rarely: a burnt village, or a single 1×1 hole in the ground.
4–5 Openly wrong. Villages near you burn — with the villagers dead on the ground where they fell. Your base gets visited: lights out, blocks missing, a skull on a post by the door. The 1×1 holes become common.
6, daytime At whatever hour you reach day six, Jeff says goodbye, tells you exactly what he learned about you, and leaves. Nothing attacks. You get a whole day of knowing it's coming and not being able to find him — footsteps that keep pace, "he is waiting for the sun to go" on the action bar.
the sixth night Sundown. Lightning, and something three blocks tall walks out of the dark wearing his smock.

The hole

A 1×1 shaft, straight down, no other disturbance. Fifteen blocks down it opens into a bone-floored room ringed with skulls on fence posts, lit blue, with a sign reading YOUR MINE. There's a chest with one of your own stolen items in it. /scriptevent jeff:lair prints the coordinates if you lose it.

What he learns

The whole time he's running a profile on you — deaths, what you carry, how long you spend underground, whether you run from fights, what time you sleep, where you keep coming back to, and every word you say to him. On day six that resolves into one weakness and one strength, and the thing he becomes uses them:

Weakness What it does to you
dark Puts your lights out and blinds you
fire Sets fires around you
mobs Spawns hostiles on top of you
hunger Drains your food
greed Takes more of your things
loneliness Kills your pets and nearby villagers
drowning Nausea, disorientation

/scriptevent jeff:status shows the profile at any time — including before day six, if you want to see it building.

The thing that comes on the sixth night

It is still recognisably Jeff, which is the point — same green smock, now split open and rotted; same big nose and heavy brow, now on a face twice too long; same villager silhouette pulled to three blocks tall with arms that reach past its knees. You are supposed to know who it is.

Kill it and it drops Jeff's Heart. Keep the heart in your inventory and he comes back the next day. Destroy it — lava, fire, a cactus — and it's over. (The heart is a totem of undying, so if you're holding it when he hits you, it pops and you live. Once.)


Talking to him

The reliable way, on every platform: press use on Jeff with an empty hand. A talk screen opens with six phase-appropriate things to say and a Type something... box for anything else. Craft the Friendship Bread and you can open the same screen from anywhere, at any range — including after he's gone, which is the only way to talk to what replaces him.

Chat also works where chat interception is available. Anything containing "jeff" gets a reply; if he's within ~20 blocks he'll sometimes butt into whatever else you're saying. On some Windows 10/11 builds and on Realms the script is never handed chat messages at all — that's a platform limitation, not a bug in the pack, and it's why the talk screen exists. The pack tries both chat event shapes at startup and falls back silently.

/scriptevent jeff:talk opens the screen too, and /scriptevent jeff:say <text> still works as a last resort.

This is not an AI — it runs entirely offline inside the game — but he does answer real questions with real answers, read off the live world:

Ask him He tells you
how many hearts do i have your actual health, and whether he's worried about it
what time is it time of day, and how many minutes of light are left
where am i / where do i live your coordinates, and your base once he's worked out where that is
what am i holding the exact stack in your hand
how many days have we known each other days since he arrived
how many times have i died your death count. He has been counting since day zero
am i safe how many hostiles are actually within 24 blocks
what should i do advice from your health, the time, your depth and what's nearby
what did you take the things he's stolen, by name — denied before day 4, admitted after
where is the hole the coordinates, once he's willing to say
whats my weakness deflection, until day six
what is 17 + 25 42. He is good at counting. He does a lot of counting

Underneath that he scores about two dozen intents by how much of your sentence they explain, answers yes/no questions as yes or no, and treats a bare "why?" as "expand on what you just said". He still misheard you occasionally, repeats himself, and typos — but only on statements, never when you've actually asked him something. He's meant to feel like something small that pays far too much attention, not something clever pretending to be small.

He records all of it. Every word feeds the profile.

Console commands

Command Effect
/scriptevent jeff:status Day, phase, trust, and the full profile he's built on you
/scriptevent jeff:summon Spawn Jeff
/scriptevent jeff:auto off Stop him arriving by himself in a new world (on to re-enable)
/scriptevent jeff:say <text> Talk to him if chat interception isn't working
/scriptevent jeff:lair Coordinates of the hole
/scriptevent jeff:phase <0-4> Jump the timeline (0 friendly → 4 monster)
/scriptevent jeff:talk Open the talk screen
/scriptevent jeff:vanish Make him leave now (dawn of day six)
/scriptevent jeff:night Skip straight to the sixth night — the attack
/scriptevent jeff:transform Both of the above, back to back
/scriptevent jeff:peace Mercy mode — no base sabotage, no village burning
/scriptevent jeff:brutal Back to default: he can burn real villages and break your base
/scriptevent jeff:reset Wipe his memory and start over

This is set to full gremlin by default. Stolen items are gone permanently, real villages next to you get burnt and their villagers killed, blocks near where you live can be removed, the monster tears through walls, and it kills you in one hit. Use it on a world you don't mind losing, or run /scriptevent jeff:peace first — that stops the village burning, the base sabotage and the block breaking, though he still hits like a truck.


Notes on the art

Jeff, the monster and the corpses are now custom models with custom textures — nothing depends on a vanilla asset path resolving any more, so there's no invisible-mob failure mode.

Jeff is his own villager: a head a pixel wider than his shoulders, heavy brow, big nose, green smock over a brown skirt, and arms hanging at his sides rather than the vanilla crossed block. The monster is the same villager pulled out of shape — same smock, split and rotted; the nose grown far too big; a face twice too long with the eyes sunk into black sockets. The corpses are Jeff's own model face down, on a drained and blood-flecked version of his texture.

All three geometries and all three textures are generated by tools/gen_models.py from one description, so the UV rectangles in the .geo.json and the painted regions in the .png cannot drift apart. It refuses to generate if any two cubes would overlap on the sheet. Edit the palette or the cube list at the top and re-run:

 
python3 tools/gen_models.py

The Friendship Bread ships a hand-drawn 16×16 icon and is flagged glint, so it shimmers like an enchanted item. Jeff is the stock villager model and skin; the monster and the corpses are custom geometry (a 3-block-tall figure with a head on backwards and arms to its shins, and a face-down body) mapped onto the vanilla zombie texture, which is why they look wrong in a way that reads as deliberate.

If Jeff renders invisible or as a purple-and-black cube, your version keeps the villager texture somewhere else. Open jeff_RP/entity/jeff.entity.json and change:

 
json
"textures": { "default": "textures/entity/villager2/villager" }

to "textures/entity/villager2/professions/farmer" or "textures/entity/villager/villager". Same file, "geometry" can be "geometry.villager_v2" or "geometry.villager".

Layout

 
jeff_BP/
  entities/        jeff, jeff_monster, corpse
  items/           friendship_bread
  recipes/
  scripts/
    main.js        wiring, tick loop, phases, console commands
    state.js       persistence, day timeline, weakness derivation
    chat.js        the keyword/mood engine and every line he says
    events.js      theft, lights, staring, sabotage, transformation
    build.js       the hole, the ruined village, corpses
    util.js        helpers + the block-placement drip queue
jeff_RP/
  entity/          client entities
  models/entity/   monster + corpse geometry
  animations/      walk / look / the monster's idle twitch
  render_controllers/

World edits go through a queue that places ~120 blocks per tick, so building a burnt village doesn't freeze the game.

Verified by MCModsHub

These come from our own check of the pack file, not from the source page.

Explore more