Compatibility
Minecraft: Java Edition
Platforms
Links
Tags
Creators
Details
PetCore
Cozy, persistent companion pets — the comfort feature your server has been missing, done cleanly and safely.
PetCore gives every player a companion animal that walks behind them, can be told to stay or to live in a little home they build, and grows a bond over time. There are no runtime dependencies at all: no database, no economy plugin, no WorldGuard, no Bedrock form toolkit. Everything is YAML you can read, and every word a player sees ships in English and Dutch.
🐾 Cozy, never combat. Pets are invulnerable, never deal or take damage, and never target players or mobs. No stat buffs, no combat perks — ever.
🐾 Adopt from a catalogue
A YAML catalogue of adoptable animals — cats, dogs, foxes, allays, sniffers and more — each with a display name, permission gate, locomotion profile, biome affinity and lore. Players hold several up to a permission-driven slot limit and switch between them. Optional per-pet cost runs a console command first, so adoption can charge coins through any economy plugin.
/pet adopt | switch | release | info.
🚶 Three cozy behaviours
- Follow — walks just behind the owner, using the real Paper pathfinder, and teleports to catch up past a distance.
- Stay — sits where it was left.
- Home — lives inside a region the owner outlines, gently wandering within it.
/pet behind | stay | cage | tphere | tpcage.
🏡 A pet home you build yourself
Two corners, /pet savecage, and a particle outline confirms it. Validated by
self-contained size rules (a hard 3×3×2 minimum and configurable max
width/length/height/chunks/area), an optional allowed-worlds list, and an optional
distance-from-owner limit — no land-claim or WorldGuard dependency.
💛 Bonding with tiers
Bond grows from cozy moments — being near you, resting by a campfire, travelling together, a first rename — each on its own cooldown so it can't be farmed. Crossing a tier unlocks titles, emotes and cosmetics, and can grant a one-time reward (items, XP, console commands, chat lines — never a direct economy call). A calm bond bar and action-bar notices keep it gentle.
🎀 Cozy cosmetics
Random personalities, unlockable titles and emotes, cosmetic home styles, seasonal particle cosmetics (that appear only in their months), a live mood, favourite-biome discovery, and keepsakes. All decorative, all in config.
🎁 Gifts
Send another player a cozy pet gift they redeem with a token — applying a small bond bonus and optionally a cosmetic, title or keepsake. An optional module that builds on pets through the service registry.
/petgift <player> <gift> [note] | list | claim <token>.
Entity hygiene is the headline
This plugin spawns and persists mobs, so it's built to be tidy:
- Every pet is tagged with its owner and id and spawned non-persistent, so the server never writes it to region files — a crash or restart leaves no loose pets.
- Orphan/duplicate sweeps run on enable, on chunk load, and on a timer;
/pet cleanupand/pet debugare there when you want them. - Pets despawn when their owner logs off and re-spawn on join; caged pets only materialise when a player is near.
- No plugin chunk tickets by default — pets never keep chunks loaded unless you opt in.
- Movement uses the public
Mob#getPathfinder()API and Bukkit teleport — no NMS, no reflection, nothing version-locked.
Modular & standalone
Every feature is a module you can switch on or off. pets is the foundation;
the optional gifts module depends on it and, if pets are off, logs one line and
stays off rather than half-starting. No database, no external plugin dependencies,
all data in plain YAML.
Built for Paper 26.2
Adventure components everywhere, registry-based type lookups, pre-spawn entity
configuration, the modern pathfinder API. Ships with JUnit tests for the parts that
matter: home-bounds containment and the size-validation matrix, PetMode /
PetSupportProfile parsing, bond cap-and-cooldown bookkeeping, permission-driven
slot resolution, pet-id normalisation, and cosmetic/season parsing.
Languages
English and Dutch out of the box. Every player-facing string is in a language file — add your own by copying one.


