Badges update automatically and link to the mod page on MineUniverse.
Author one JSON file per PMMO skill in data/<your_pack>/pmmo_pufferfish_compat/skill_map/:
{
"pmmo_skill": "mining",
"awards": [
{
"skill_category": "your_pack:mining_tree",
"skill_points": 1,
"every_x_pmmo_levels": 1,
"starting_pmmo_level": 1,
"max_skill_points": 50,
"reconcile": "additive"
}
]
}
Each award targets one Pufferfish category. A single PMMO skill can feed many categories — point the awards array at as many trees as you want, each with its own rate, threshold, and cap. Multiple files for the same PMMO skill merge cleanly.
| Field | Default | Meaning |
|---|---|---|
skill_points |
1 | Points awarded per milestone |
every_x_pmmo_levels |
1 | PMMO levels between milestones |
starting_pmmo_level |
1 | Don't grant anything below this level |
max_skill_points |
unbounded | Stop awarding after this total |
reconcile |
additive | What to do when expected and granted drift |
Worked example: every_x_pmmo_levels: 3, starting_pmmo_level: 5, skill_points: 2 means "starting at PMMO level 5, grant 2 points; another 2 at level 8, 11, 14, and so on."
The genuinely interesting design choice. Configs drift over time — you tweak a rate, a player's points have been spent, PMMO loses levels on death. Each award picks how the bridge handles it:
additive (default) — top up missing points, never claw back. Safest. Players keep what they have when you lower a rate.trim_unspent — top up, and claw back unspent points if the new expected is lower. Won't refund nodes already bought.strict — enforce exact alignment. If expected drops below granted, the player gets a clean respec: every node in that category refunds, and the total drops to the new expected.none — only react to live level-ups, never audit. Useful when other sources feed the same category and you want this bridge to stay out of the way.The bridge applies the formula at three well-defined moments — never as a constant background process:
/reload — every online player is re-audited. Edit a mapping, /reload, the change applies to everyone instantly.For when those aren't enough, /pmmopufferfish resync is the admin escape hatch.
Pufferfish tracks point grants per source. This bridge uses stable per-skill source IDs (pmmo_pufferfish_compat:pmmo/<skill>), which means:
/puffish_skills command, and a future skill_tree-style content pack can all feed the same category without stepping on each other.The XpEvent listener is the hot path on any active server. It's been built around that:
Stream chains, no lambda allocation, no boxing on the event path./reload) do that work.You need two pieces in your datapack:
data/<pack>/puffish_skills/config.json # lists category names
data/<pack>/puffish_skills/categories/<name>/ # category.json, skills.json, etc.
data/<pack>/pmmo_pufferfish_compat/skill_map/<file>.json
Drop a /reload and you're live.
/pmmopufferfish resync — resync the executing player (op-only)
/pmmopufferfish resync <player> — resync one player
/pmmopufferfish resync @a — resync everyone online
All variants require permission level 2 (op / cheats enabled).
PMMO already has a polished skill-up loop — break blocks, kill mobs, brew potions, all of it. Pufferfish Skills already has a polished tree UI with rewards, prerequisites, and per-category point pools. Both are mature mods that hit their slot well.
What was missing was the cable between them. An opinion-free, performance-aware, datapack-configurable cable that lets a modpack author say "1 point in Mining for every level in PMMO Mining, capped at 50, additive reconcile" in one JSON file and have it work — including drift correction, multi-source coexistence, and live config edits.
This mod is that cable.
It was inspired by daedalus_dev's skill_tree, which uses Pufferfish Skills the same way but with its own custom progression system. PMMO can fit that slot just as well with a small adapter, and I wanted that adapter.
0.17.3+ (required)2.7.35+ (required)skill_tree, FTB Quests, admin point grants, and any other source feeding the same Pufferfish categories.