Player Permissions
Player Permissions
Section titled “Player Permissions”This document covers how to check and manage permissions on player entities.
Package Location
Section titled “Package Location”com.hypixel.hytale.server.core.permissions
Overview
Section titled “Overview”Players implement the PermissionHolder interface, allowing permission checks directly on player objects. The PermissionsModule singleton provides full permission management.
PermissionHolder Interface
Section titled “PermissionHolder Interface”Interface implemented by entities that can have permissions:
package com.hypixel.hytale.server.core.permissions;
public interface PermissionHolder { // Check if holder has permission (default: false) boolean hasPermission(String permissionId);
// Check with custom default value boolean hasPermission(String permissionId, boolean defaultValue);}Player Implementation
Section titled “Player Implementation”The Player class implements PermissionHolder:
package com.hypixel.hytale.server.core.entity.entities;
public class Player implements PermissionHolder { @Override public boolean hasPermission(String id) { return PermissionsModule.get().hasPermission(this.getUuid(), id); }
@Override public boolean hasPermission(String id, boolean def) { return PermissionsModule.get().hasPermission(this.getUuid(), id, def); }}PermissionsModule
Section titled “PermissionsModule”Central permission management singleton:
package com.hypixel.hytale.server.core.permissions;
public class PermissionsModule { // Singleton access public static PermissionsModule get();
// Permission checks public boolean hasPermission(UUID uuid, String id); public boolean hasPermission(UUID uuid, String id, boolean defaultValue);
// User permissions public void addUserPermission(UUID uuid, Set<String> permissions); public void removeUserPermission(UUID uuid, Set<String> permissions);
// Group management public Set<String> getGroupsForUser(UUID uuid); public void addUserToGroup(UUID uuid, String group); public void removeUserFromGroup(UUID uuid, String group);}Usage Examples
Section titled “Usage Examples”Checking Permissions on Player
Section titled “Checking Permissions on Player”import com.hypixel.hytale.server.core.entity.entities.Player;
Player player = /* player reference */;
// Basic permission check (false if not set)if (player.hasPermission("hytale.command.teleport")) { // Player can use teleport command}
// Check with custom defaultif (player.hasPermission("custom.feature", true)) { // Feature enabled by default unless explicitly denied}
// Common permission patternsif (player.hasPermission("hytale.admin")) { // Player is admin}
if (player.hasPermission("myplugin.use")) { // Player can use your plugin}Using PermissionsModule
Section titled “Using PermissionsModule”import com.hypixel.hytale.server.core.permissions.PermissionsModule;import java.util.UUID;import java.util.Set;
PermissionsModule perms = PermissionsModule.get();UUID playerUuid = player.getUuid();
// Check permission via moduleif (perms.hasPermission(playerUuid, "hytale.command.fly")) { // Player can fly}
// Grant permissionperms.addUserPermission(playerUuid, Set.of("custom.permission"));
// Revoke permissionperms.removeUserPermission(playerUuid, Set.of("custom.permission"));
// Check multiple permissionsSet<String> requiredPerms = Set.of("a.perm", "b.perm");boolean hasAll = requiredPerms.stream() .allMatch(p -> perms.hasPermission(playerUuid, p));Group Management
Section titled “Group Management”PermissionsModule perms = PermissionsModule.get();UUID playerUuid = player.getUuid();
// Add player to groupperms.addUserToGroup(playerUuid, "admin");perms.addUserToGroup(playerUuid, "moderator");
// Remove from groupperms.removeUserFromGroup(playerUuid, "moderator");
// Get player's groupsSet<String> groups = perms.getGroupsForUser(playerUuid);for (String group : groups) { System.out.println("Player is in group: " + group);}
// Check group membershipif (groups.contains("admin")) { // Player is an admin}Permission-Gated Command
Section titled “Permission-Gated Command”import com.hypixel.hytale.server.core.command.system.AbstractPlayerCommand;import com.hypixel.hytale.server.core.command.system.CommandContext;import com.hypixel.hytale.server.core.entity.entities.Player;
public class AdminCommand extends AbstractPlayerCommand<AdminCommand> { public AdminCommand() { super("admin", "Admin-only command"); }
@Override protected void execute(CommandContext context, Player player) { // Check permission before executing if (!player.hasPermission("myplugin.admin")) { context.sendError("You don't have permission to use this command."); return; }
// Execute admin functionality context.sendSuccess("Admin command executed!"); }}Permission in Event Handler
Section titled “Permission in Event Handler”getEventRegistry().register(PlayerChatEvent.class, event -> { PlayerRef sender = event.getSender();
// Get player entity to check permissions Player player = sender.getPlayer(); if (player == null) return;
// Check for chat bypass permission if (player.hasPermission("chat.bypass.filter")) { // Skip chat filter return; }
// Apply chat filter String filtered = filterMessage(event.getContent()); event.setContent(filtered);});Permission Syntax
Section titled “Permission Syntax”Wildcards
Section titled “Wildcards”| Pattern | Matches |
|---|---|
* | All permissions |
hytale.* | All hytale permissions |
hytale.command.* | All hytale command permissions |
Negation
Section titled “Negation”| Pattern | Effect |
|---|---|
-* | Deny all permissions |
-hytale.admin | Deny specific permission |
-hytale.command.ban | Deny ban command |
Resolution Order
Section titled “Resolution Order”Permissions are resolved in order:
- User direct permissions (most specific)
- Group permissions
- Virtual groups (game mode, etc.)
- Default value
Explicit grants/denies take precedence over wildcards.
Best Practices
Section titled “Best Practices”Use Descriptive Permission Names
Section titled “Use Descriptive Permission Names”// Good - hierarchical and descriptive"myplugin.command.spawn""myplugin.feature.fly""myplugin.admin.config"
// Bad - unclear hierarchy"spawn""fly""config"Provide Sensible Defaults
Section titled “Provide Sensible Defaults”// Default to false for dangerous actionsif (player.hasPermission("myplugin.dangerous", false)) { }
// Default to true for basic featuresif (player.hasPermission("myplugin.basic", true)) { }Cache Permission Checks
Section titled “Cache Permission Checks”// For frequently checked permissions, cache the resultprivate boolean canUseFeature;
public void onPlayerJoin(Player player) { canUseFeature = player.hasPermission("myplugin.feature");}Group Common Permissions
Section titled “Group Common Permissions”// Define permission groups in config// Group "vip": myplugin.feature.a, myplugin.feature.b// Group "admin": myplugin.*, -myplugin.dangerous
// Then assign groups to playersperms.addUserToGroup(playerUuid, "vip");Related
Section titled “Related”- Permission System - Full permission API
- Commands - Command system
- Event System - Event handling