Files
2026-01-20 20:33:59 +01:00

11 KiB

title, type, weight
title type weight
Système de Permissions docs 12

Le système de Permissions fournit un contrôle d'accès granulaire pour les commandes, les fonctionnalités de l'éditeur et les fonctionnalités personnalisées des plugins.

Package: com.hypixel.hytale.server.core.permissions

Vue d'Ensemble

Hytale utilise un système de permissions avec :

  • Permissions utilisateur - Directement assignées aux joueurs individuels
  • Permissions de groupe - Héritées par tous les membres d'un groupe
  • Fournisseurs de permissions - Logique personnalisée pour les permissions dynamiques

Accéder au Module de Permissions

import com.hypixel.hytale.server.core.permissions.PermissionsModule;

// Utiliser la méthode statique get() - PAS HytaleServer.get().getPermissionsModule()
PermissionsModule permissions = PermissionsModule.get();

Vérifier les Permissions

UUID playerUuid = player.getPlayerRef().getUuid();

// Vérifier si le joueur a la permission
boolean canEdit = permissions.hasPermission(playerUuid, "hytale.editor.asset");

// Vérifier dans le contexte de commande
if (permissions.hasPermission(ctx.sender().getUuid(), "myplugin.admin")) {
    // Logique réservée aux admins
}

Permissions Utilisateur

Gérer les permissions pour les joueurs individuels :

UUID playerUuid = player.getPlayerRef().getUuid();

// Ajouter des permissions
permissions.addUserPermission(playerUuid, Set.of(
    "myplugin.feature.create",
    "myplugin.feature.delete"
));

// Supprimer des permissions
permissions.removeUserPermission(playerUuid, Set.of(
    "myplugin.feature.delete"
));

Permissions de Groupe

Les groupes permettent de partager des permissions entre plusieurs joueurs :

Gérer les Groupes

// Ajouter un joueur à un groupe
permissions.addUserToGroup(playerUuid, "moderators");

// Retirer un joueur d'un groupe
permissions.removeUserFromGroup(playerUuid, "moderators");

// Obtenir tous les groupes d'un joueur
Set<String> groups = permissions.getGroupsForUser(playerUuid);

Événements de Permissions de Groupe

Écouter les changements de groupes en utilisant des sous-classes spécifiques :

import com.hypixel.hytale.server.core.event.events.permissions.*;

// Joueur AJOUTÉ à un groupe
getEventRegistry().register(PlayerGroupEvent.Added.class, event -> {
    UUID playerUuid = event.getPlayerUuid();
    String group = event.getGroupName();  // Note: getGroupName(), PAS getGroup()
    log("Joueur a rejoint le groupe : " + group);
});

// Joueur RETIRÉ d'un groupe
getEventRegistry().register(PlayerGroupEvent.Removed.class, event -> {
    UUID playerUuid = event.getPlayerUuid();
    String group = event.getGroupName();
    log("Joueur a quitté le groupe : " + group);
});

// Permissions du groupe AJOUTÉES
getEventRegistry().register(GroupPermissionChangeEvent.Added.class, event -> {
    String group = event.getGroupName();
    Set<String> added = event.getAddedPermissions();
    log("Groupe " + group + " a reçu les permissions : " + added);
});

// Permissions du groupe RETIRÉES
getEventRegistry().register(GroupPermissionChangeEvent.Removed.class, event -> {
    String group = event.getGroupName();
    Set<String> removed = event.getRemovedPermissions();
    log("Groupe " + group + " a perdu les permissions : " + removed);
});

// Permissions du joueur AJOUTÉES
getEventRegistry().register(PlayerPermissionChangeEvent.PermissionsAdded.class, event -> {
    UUID playerUuid = event.getPlayerUuid();
    Set<String> added = event.getAddedPermissions();
});

// Permissions du joueur RETIRÉES
getEventRegistry().register(PlayerPermissionChangeEvent.PermissionsRemoved.class, event -> {
    UUID playerUuid = event.getPlayerUuid();
    Set<String> removed = event.getRemovedPermissions();
});

Permissions Intégrées

Hytale inclut de nombreuses permissions intégrées :

Permissions de Commandes

Permission Description
hytale.command.* Accès à toutes les commandes
hytale.command.gamemode Changer de mode de jeu
hytale.command.tp Téléportation
hytale.command.give Donner des objets
hytale.command.time Contrôle du temps

Permissions de l'Éditeur

Permission Description
hytale.editor.asset Édition des assets
hytale.editor.packs.* Gestion des packs
hytale.editor.builderTools Accès aux outils de construction
hytale.editor.brush.* Outils de pinceau
hytale.editor.prefab.* Édition des prefabs
hytale.editor.selection.* Outils de sélection
hytale.editor.history Historique annuler/rétablir

Permissions de Caméra

Permission Description
hytale.camera.flycam Mode caméra libre

Fournisseur de Permission Personnalisé

Implémentez PermissionProvider pour une logique de permission dynamique :

{{< callout type="info" >}} Note : PermissionProvider est une interface qui fournit des ensembles de permissions, pas une simple vérification hasPermission. Le PermissionsModule vérifie ces ensembles. {{< /callout >}}

import com.hypixel.hytale.server.core.permissions.provider.PermissionProvider;

public class VIPPermissionProvider implements PermissionProvider {
    private final Map<UUID, Set<String>> vipPermissions = new ConcurrentHashMap<>();
    private final Map<UUID, Set<String>> vipGroups = new ConcurrentHashMap<>();

    @Override
    @Nonnull
    public String getName() {
        return "VIPPermissionProvider";
    }

    @Override
    public Set<String> getUserPermissions(@Nonnull UUID uuid) {
        // Retourner les permissions pour cet utilisateur
        // Les utilisateurs VIP reçoivent des permissions supplémentaires automatiquement
        if (isVIP(uuid)) {
            Set<String> perms = new HashSet<>(vipPermissions.getOrDefault(uuid, Collections.emptySet()));
            perms.add("vip.lounge");
            perms.add("vip.cosmetics");
            return perms;
        }
        return vipPermissions.getOrDefault(uuid, Collections.emptySet());
    }

    @Override
    public void addUserPermissions(@Nonnull UUID uuid, @Nonnull Set<String> permissions) {
        vipPermissions.computeIfAbsent(uuid, k -> new HashSet<>()).addAll(permissions);
    }

    @Override
    public void removeUserPermissions(@Nonnull UUID uuid, @Nonnull Set<String> permissions) {
        Set<String> userPerms = vipPermissions.get(uuid);
        if (userPerms != null) {
            userPerms.removeAll(permissions);
        }
    }

    @Override
    public Set<String> getGroupPermissions(@Nonnull String group) {
        return Collections.emptySet();
    }

    @Override
    public void addGroupPermissions(@Nonnull String group, @Nonnull Set<String> permissions) {}

    @Override
    public void removeGroupPermissions(@Nonnull String group, @Nonnull Set<String> permissions) {}

    @Override
    public Set<String> getGroupsForUser(@Nonnull UUID uuid) {
        return vipGroups.getOrDefault(uuid, Collections.emptySet());
    }

    @Override
    public void addUserToGroup(@Nonnull UUID uuid, @Nonnull String group) {
        vipGroups.computeIfAbsent(uuid, k -> new HashSet<>()).add(group);
    }

    @Override
    public void removeUserFromGroup(@Nonnull UUID uuid, @Nonnull String group) {
        Set<String> groups = vipGroups.get(uuid);
        if (groups != null) {
            groups.remove(group);
        }
    }

    private boolean isVIP(UUID uuid) {
        // Votre logique de vérification VIP
        return vipDatabase.contains(uuid);
    }
}

Enregistrer des Fournisseurs Personnalisés

@Override
public void start() {
    PermissionsModule permissions = PermissionsModule.get();
    permissions.addProvider(new VIPPermissionProvider());
}

Wildcards de Permission

Les permissions supportent les correspondances avec wildcard :

// Accorder toutes les permissions sous un namespace
permissions.addUserPermission(playerUuid, Set.of("myplugin.*"));

// Ceci passe maintenant :
permissions.hasPermission(playerUuid, "myplugin.anything");
permissions.hasPermission(playerUuid, "myplugin.feature.nested");

Intégration des Permissions de Commandes

Les commandes vérifient automatiquement les permissions basées sur leur ID :

public class AdminCommand extends AbstractCommand {

    public AdminCommand() {
        super("admin", "myplugin.commands.admin.description");
        // La vérification de permission est automatique basée sur l'enregistrement de la commande
    }

    @Override
    protected CompletableFuture<Void> execute(CommandContext ctx) {
        // Seuls les joueurs avec la permission appropriée arrivent ici
        return null;
    }
}

Exemples Pratiques

Accès Basé sur les Rôles

public class RoleManager {
    private final PermissionsModule permissions;

    public RoleManager() {
        this.permissions = PermissionsModule.get();
    }

    public void promoteToModerator(UUID playerUuid) {
        permissions.addUserToGroup(playerUuid, "moderators");
        permissions.addUserPermission(playerUuid, Set.of(
            "server.kick",
            "server.mute",
            "server.warn"
        ));
    }

    public void demoteFromModerator(UUID playerUuid) {
        permissions.removeUserFromGroup(playerUuid, "moderators");
        permissions.removeUserPermission(playerUuid, Set.of(
            "server.kick",
            "server.mute",
            "server.warn"
        ));
    }

    public boolean canModerate(UUID playerUuid) {
        return permissions.getGroupsForUser(playerUuid).contains("moderators");
    }
}

Verrouillage de Fonctionnalités

public void useFeature(Player player, String featureName) {
    UUID uuid = player.getPlayerRef().getUuid();
    PermissionsModule perms = PermissionsModule.get();

    String permission = "myplugin.feature." + featureName;
    if (!perms.hasPermission(uuid, permission)) {
        player.sendMessage(Message.translation("error.no_permission"));
        return;
    }

    // Exécuter la fonctionnalité
    executeFeature(player, featureName);
}

Bonnes Pratiques

{{< callout type="info" >}} Directives des Permissions :

  • Utilisez des permissions avec namespace (ex: myplugin.feature.name)
  • Préférez les groupes pour l'accès basé sur les rôles plutôt que les permissions individuelles
  • Vérifiez les permissions aux points d'entrée, pas profondément dans la logique
  • Utilisez les wildcards avec parcimonie et intentionnellement {{< /callout >}}

{{< callout type="warning" >}} Note de Sécurité : Validez toujours les permissions côté serveur. Ne faites jamais confiance aux états de permission rapportés par le client. {{< /callout >}}