Project MMO: Pufferfish Skills Compat

Adds a customizable compatibility bridge between Project MMO and Pufferfish Skills. Gaining levels in different Project MMO skills will give you Pufferfish skill points to any configured skill trees.

PMMO Pufferfish Compat turns Project MMO skill levels into spendable points in Pufferfish Skills trees. Mine some stone → level up Mining in PMMO → unlock nodes in whatever Mining tree your modpack ships. It's the cable between PMMO's progression loop and Pufferfish's skill-tree UI — a pure bridge, configured entirely through datapack JSON.

Features

Datapack-configurable skill mapping

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.

Tunable progression per award

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."

Four reconcile modes

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.

Sync at the right moments

The bridge applies the formula at three well-defined moments — never as a constant background process:

  • On level change — when a player's PMMO skill levels up (or down), the delta is granted live. Hot path: zero Pufferfish reads, just a write.
  • On player join — one tick after login, every mapping is audited against the player's current PMMO levels. Catches drift from new mappings added while they were offline.
  • On /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.

Per-source attribution

Pufferfish tracks point grants per source. This bridge uses stable per-skill source IDs (pmmo_pufferfish_compat:pmmo/<skill>), which means:

  • This mod, FTB Quests, an admin's /puffish_skills command, and a future skill_tree-style content pack can all feed the same category without stepping on each other.
  • Changing a mapping's rate doesn't orphan old grants — the source ID is stable, only the expected total moves.
  • Strict-mode respec refunds the nodes the player chose, not their entire point balance.

Performance-aware

The XpEvent listener is the hot path on any active server. It's been built around that:

  • Source-id strings interned at config load, never rebuilt per event.
  • No Stream chains, no lambda allocation, no boxing on the event path.
  • No Pufferfish read-back for live grants — only the audit moments (login / /reload) do that work.
  • Mappings indexed in primitive-style arrays keyed by PMMO skill name.

Setup

You need two pieces in your datapack:

  1. A Pufferfish category (either authored yourself or shipped by another mod):
    data/<pack>/puffish_skills/config.json          # lists category names
    data/<pack>/puffish_skills/categories/<name>/   # category.json, skills.json, etc.
    
  2. A bridge mapping per PMMO skill you want to wire:
    data/<pack>/pmmo_pufferfish_compat/skill_map/<file>.json
    

Drop a /reload and you're live.

Commands

/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).


Why this mod?

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.

Compatibility

  • Pufferfish Skills 0.17.3+ (required)
  • Project MMO 2.7.35+ (required)
  • Coexists with skill_tree, FTB Quests, admin point grants, and any other source feeding the same Pufferfish categories.
  • NeoForge 1.21.1.

The Project MMO: Pufferfish Skills Compat Team

profile avatar
  • 9
    Followers
  • 19
    Projects
  • 360.7K
    Downloads

More from SilvertideView all

  • Pufferfish's Skills: Iron's Spellbooks Compat project image

    Pufferfish's Skills: Iron's Spellbooks Compat

    • 204
    • Mods

    Adds compatability between Iron's Spells and Spellbooks and Pufferfish's Skills. Restrict casting spells behind having a skill, or allow players to cast skills without a skill book (innately) by gaining a skill.

    • 204
    • June 1, 2026
    • Mods
  • Nerfed Bone Meal project image

    Nerfed Bone Meal

    • 1.0K
    • Mods

    Disables Bone Meal's ability to grow crops and trees and, well, everything. It didn't just get nerfed, it got gutted.

    • 1.0K
    • May 27, 2026
    • Mods
  • Realms of Reverie project image

    Realms of Reverie

    • 531
    • Mods

    Realms of Reverie Modpack Mod

    • 531
    • May 24, 2026
    • Mods
    • +1
  • Realms Of Reverie project image

    Realms Of Reverie

    • 532
    • Modpacks

    A highly integrated RPG pack designed discovery, exploration, advancement, and long term community play.

    • 532
    • May 22, 2026
    • Modpacks
    • +4
  • Pufferfish's Skills: Iron's Spellbooks Compat project image

    Pufferfish's Skills: Iron's Spellbooks Compat

    • 204
    • Mods

    Adds compatability between Iron's Spells and Spellbooks and Pufferfish's Skills. Restrict casting spells behind having a skill, or allow players to cast skills without a skill book (innately) by gaining a skill.

    • 204
    • June 1, 2026
    • Mods
  • Nerfed Bone Meal project image

    Nerfed Bone Meal

    • 1.0K
    • Mods

    Disables Bone Meal's ability to grow crops and trees and, well, everything. It didn't just get nerfed, it got gutted.

    • 1.0K
    • May 27, 2026
    • Mods
  • Realms of Reverie project image

    Realms of Reverie

    • 531
    • Mods

    Realms of Reverie Modpack Mod

    • 531
    • May 24, 2026
    • Mods
    • +1
  • Realms Of Reverie project image

    Realms Of Reverie

    • 532
    • Modpacks

    A highly integrated RPG pack designed discovery, exploration, advancement, and long term community play.

    • 532
    • May 22, 2026
    • Modpacks
    • +4