← SableCraft Standards

Permissions

A built-in permission handler for a server that has not installed one. Optional, and dormant unless you choose it - install LuckPerms instead and nothing here changes.

The gap it fills

With no permissions mod, you cannot grant anybody anything.

NeoForge's own default handler is four lines of substance: every answer is the node's own default. standards.fly is op-or-nothing. A trusted regular cannot have flight, a donor cannot have ten homes, and a builder cannot have /craft without being made an operator - which hands them /stop as well.

That is the same gap the built-in economy fills, and it gets the same answer: ship something that works, and step aside the moment a real one arrives.

Not a Vault - one more handler

NeoForge is the arbitrator. It already was.

PermissionAPI is the facade, and handlers register themselves against it. The server owner chooses which one is active - an explicit setting, not a priority contest:

# config/neoforge-server.toml
permissionHandler = "standards:permissions"

and /rank appears. Standards already calls that same facade for every check it makes, so it behaves the same way under any handler - LuckPerms works out of the box, with no configuration on either side.

permissionHandler Who ends up answering
neoforge:default_handler (the shipped value) LuckPerms, if installed - otherwise the do-nothing default.
standards:permissions Standards' own handler.

Dormant unless you pick it. Leave that config line alone and this handler never runs - /rank is not even registered. Switching either way is that one line, with nothing to import and nothing to migrate off.

How a question gets answered

Nearest the player first.

Tier Checked
1 The player's own grants and denials.
2 The groups they are directly in.
3 Those groups' parents, then theirs, outward - breadth-first.
4 The default group, which everybody is in without being put there.
5 The node's own default resolver - so op still means op, and everyone-nodes still work, for anyone nothing has been said about.

The first tier that says anything wins outright. That is what makes "an explicit deny on the player beats everything" and "a deny in a group beats a grant in its parent" the same rule instead of two.

Within one tier, the most specific pattern wins: exact standards.fly beats standards.home.* beats standards.* beats *. A trailing wildcard covers the bare node too - standards.home.* matches standards.home, because granting the wildcard and finding the plain command still refused reads as the system being broken.

A tie inside one tier resolves to no. Somebody in both donor (granting) and guest (denying), at the same distance, with no weights to separate them - quietly taking the permissive half of a contradiction is the wrong direction to guess in.

Falling through to tier 5 is what makes this safe to switch on: a server that enables it and grants nothing behaves exactly as it did before. Booleans only - an integer, string or other typed node falls through to its own resolver untouched.

It tells you why

Not just yes or no - which rule answered.

Every hour lost to a permissions system is spent asking why a player has something, and a plain yes-or-no makes you bisect it by hand.

> rank check Sablednah standards.home.others
 standards.home.others = yes (from donor, via standards.home.*)
> rank group donor set standards.home.others false
> rank check Sablednah standards.home.others
 standards.home.others = no (from donor, via standards.home.others)
> rank check Sablednah standards.god
 standards.god = no (nothing set - the node's own default)

That last line matters as much as the other two: a bare no reads as a denial somebody configured, and sends an admin looking for a rule that does not exist.

A rank is a group, not just a bundle of nodes

That's the reason this exists.

Put somebody in moderator and they get their permission nodes, a chat tag, and visibility to every other mod on the server - one edit, no second list to keep in sync. A faction mod, a party mod or a quest mod can ask who your moderators are, because ranks are published through the same groups API as everything else here, as standards:role.

Permissions on their own are a solved problem. Ranks that the rest of the server can actually see are not - that's the part worth building.

A guest ladder that runs itself

Automatic promotions.

Move players up a rank ladder on their own - guest to regular, and whatever comes after - without an admin doing it by hand.

startingGroup = "guest"
promote = true
promotions = ["guest -> regular after 24h and 2h played"]

A rule is one line, and takes any of three shapes: after 24h (wall-clock time since first seen), after 2h played (online and not AFK), or after 24h and 2h played (both must pass).

Two clocks, because they answer different questions. Real time since a player was first seen asks for patience - a few minutes is enough to lose the fly-by griefer who is on another server by now, and it costs an honest new player nothing. Played time asks them to have actually done something, and is counted only while they are not AFK - unlike Minecraft's own play-time statistic, which happily counts a player idling in a corner all night. Give both and both must pass.

Requires Standards' own handler. Promotions move a player between its groups, so they need permissionHandler = "standards:permissions" to be the active one. Under LuckPerms, the server says so at startup and does nothing - LuckPerms has its own "tracks" for the same job.

startingGroup is not defaultGroup. The default group is consulted last for everybody and nobody is a member of it. startingGroup is real membership a player can be promoted out of - a player who already has a group is left alone, so an admin's own ranking is never undone by a later login. The group must already exist (/rank group guest create), or nothing happens.

Conditions are a seam rather than a fixed pair - a vote, a website purchase, a moderator's nod are the same shape as a clock, and there is nothing stopping the list from growing beyond time and playtime.

What it is not

Enough to run a server, and honest about the line.

No per-world contexts, no temporary nodes, no promotion tracks, no weights, no SQL backend, no web editor. If you need any of that, a dedicated permissions mod is a better tool - and switching to one costs a single config line, with nothing to import and nothing to migrate off.

In - all built

  • Groups, with inheritance
  • Players in groups
  • Per-player grants
  • Explicit deny, beating a grant
  • Wildcards - standards.*, standards.home.*
  • A default group everyone gets
  • A chat tag per group, through the existing seam

Out - and staying out

  • Contexts (per-world, per-dimension, per-server)
  • Temporary nodes and expiry
  • Promotion tracks
  • Weights, priorities, meta values
  • SQL backends, a web editor

Generated from the source

Every node.

86 declared nodes, plus a couple built at runtime. Ask a running server what it actually has with /standards nodes, which lists every node really registered, runtime ones included.

Switches

Node Default What it allows
standards.fly ops Use /fly.
standards.fly.others ops Use /fly on another player.
standards.god ops Use /god.
standards.god.others ops Use /god on another player.
standards.smite ops Call down lightning. A gamemaster's tool, not a toy.
standards.vanish ops Hide from other players.
standards.vanish.others ops Use /vanish on another player.
standards.vanish.see ops See through someone else's vanish. Ops by default so staff are not invisible to each other.

Movement

Node Default What it allows
standards.back everyone Use /back.
standards.back.ondeath nobody Returning to your corpse is a gameplay decision, not a convenience. Off even though /back itself is open.
standards.jump ops Use /jump.
standards.top everyone Use /top.

Homes

Node Default What it allows
standards.delhome everyone Use /delhome.
standards.home everyone Use /home.
standards.home.limit.unlimited ops Any number of homes, beating every numbered home.limit.<n>.
standards.home.others ops Use /home on another player.
standards.sethome everyone Use /sethome.

Putting a player right, and moving them about

Node Default What it allows
standards.bottom ops Op-only: near bedrock this is a crude ore finder as much as a travel command.
standards.feed ops Use /feed.
standards.feed.others ops Use /feed on another player.
standards.gc everyone Reading server health is not sensitive; knowing the TPS helps players report problems.
standards.heal ops Use /heal.
standards.heal.others ops Use /heal on another player.
standards.kit everyone Use /kit.
standards.mail everyone Use /mail.
standards.rest ops Use /rest.
standards.rest.others ops Use /rest on another player.
standards.setkit ops Use /setkit.
standards.setspawn ops Use /setspawn.
standards.spawn everyone Use /spawn.
standards.speed ops Use /speed.
standards.speed.others ops Use /speed on another player.
standards.tpoffline ops Op-only: logging off should not broadcast where you were.

Away

Node Default What it allows
standards.afk everyone Use /afk.
standards.afk.exempt ops Never auto-kicked for idling. Ops and, typically, whoever runs the map render.

Talking

Node Default What it allows
standards.anvil nobody Use /anvil.
standards.craft nobody Portable workstations - nobody by default, including operators. That is the design, not an oversight.
standards.enderchest nobody Use /enderchest.
standards.grindstone nobody Use /grindstone.
standards.invsee ops Use /invsee.
standards.msg everyone Use /msg.
standards.msg.override ops Message someone who has /msgtoggle on. Staff need it; it is not for everyone.
standards.mute ops Use /mute.
standards.socialspy ops Use /socialspy.
standards.tempban ops Use /tempban.
standards.trashcan nobody Use /trashcan.

Teleport requests

Node Default What it allows
standards.tpa everyone Use /tpa.
standards.tpa.override ops Ask someone who has /tptoggle on anyway. Staff need it, or /tptoggle becomes a place to hide from moderation.
standards.tpahere everyone Use /tpahere.
standards.tptoggle everyone Use /tptoggle.

Warps

Node Default What it allows
standards.setwarp ops Use /setwarp.
standards.warp everyone Use /warp.

Economy

Node Default What it allows
standards.balance everyone Use /balance.
standards.balance.others ops Use /balance on another player.
standards.baltop everyone Use /baltop.
standards.eco ops Use /eco.
standards.pay everyone Use /pay.

Item tools

Node Default What it allows
standards.condense everyone Merge your own partial stacks - the only one of these a normal player wants, since it creates nothing and converts nothing.
standards.itemlore ops Use /itemlore.
standards.itemname ops Use /itemname.
standards.more ops Fill the held stack. Item duplication, plainly - ops only.
standards.powertool ops Bind a command to an item. Runs as the holder, so it is a shortcut and not an escalation.
standards.repair ops Repair the held item. A cheat - an anvil and the levels you did not spend.
standards.repair.all ops Repair everything you are carrying at once.

Where you are

Node Default What it allows
standards.compass everyone Use /compass.
standards.depth everyone Your depth and your bearing. Everyone - F3 already shows both on an ordinary server.
standards.playtime everyone How long people have actually played. A scoreboard, not a secret.
standards.playtime.others everyone Use /playtime on another player.
standards.sudo ops Run a command as somebody, with their permissions. It cannot give anybody an ability they lack, because the command is parsed against their source.
standards.world ops /world and /worlds - moving between dimensions keeping your coordinates.

Admin teleports

Node Default What it allows
standards.butcher ops Clearing entities in a radius. A lag tool, and a griefing tool.
standards.item ops Spawning items out of nothing. Ops, obviously - on a survival server this is the single most consequential thing in the mod.
standards.motd everyone /motd, /rules and /info - owner-written text. Everyone reads them.
standards.tp ops /tpx and /tppos - moving yourself about at will. A node rather than an op check, so a builder can be given this without also being given /stop.
standards.tp.others ops Moving other people - /tphere, and the two-player form of /tpx.

Nicknames

Node Default What it allows
standards.group everyone Founding and running a lightweight group. A social feature, like homes.
standards.nick everyone Set your own. A social feature, not a privilege.
standards.nick.color ops Colour codes in a nickname. Ops only - obfuscated codes render as animated gibberish on every line its owner speaks, and cannot be read, reported or typed back.
standards.nick.others ops Set or clear somebody else's - the moderator's undo for a nickname that had to go.
standards.realname everyone Look a nickname up. Deliberately open to everyone.

Teleport bypasses

Node Default What it allows
standards.combat.bypass ops Leave a fight anyway. A permission and not an op check, so staff can have it without also getting /stop.
standards.teleport.instant ops Skip the teleport warmup - arrive immediately.
standards.teleport.nocooldown ops Skip the wait between teleports.

Admin

Node Default What it allows
standards.admin ops /standards - administering the mod itself, not using it.
standards.permissions ops Editing the built-in permission handler's groups and grants. Separate from admin because the two are different jobs: reloading messages is a caretaker's task, and handing out permissions is how somebody becomes an operator by proxy.
standards.rank everyone See your own rank with a bare /rank, and what you are working towards.

Built at runtime

Not declared in source - the server builds these from what it actually holds, so a permissions mod only sees them after a restart.

Node What it allows
standards.home.limit.<n> That many homes. The highest granted number wins, and home.limit.unlimited beats them all.
standards.kit.<name> One particular kit. Its default follows the kit's own access - see /kitaccess. A kit created since the last restart has no node, and is answered from that access directly.

Commands

/rank, and also /perm.

Only present when Standards' own handler is the active one. Node standards.permissions, ops by default - deliberately separate from standards.admin, so a moderator can reload messages without also being able to grant themselves everything. Players are named rather than selected, so an offline player can be granted a rank.

Command Description
/rank groups Every group on the server.
/rank group <name> create | delete | info
/rank group <name> set <node> [true|false] Grant or deny a node on the group.
/rank group <name> unset <node> Clear it back to inherited.
/rank group <name> parent add|remove <other> Add or remove a parent group - inheritance.
/rank group <name> tag <tag|-> The chat label, if roles are rendered.
/rank user <player> group add|remove <group> Players are named, not selected - an offline player can be granted a rank.
/rank user <player> set <node> [true|false] · unset <node> A grant or denial on the player directly.
/rank user <player> info Their groups, their grants, and what it adds up to.
/rank check <player> <node> One node, and which rule answered it - not just yes or no.

/rank is the reliable name. Also at /perm, but LuckPerms claims /perm as an alias of /luckperms - so on a server carrying both, a bare /perm runs LuckPerms' help while our subcommands still work underneath it. /rank is claimed by nothing and always works.