• 欢迎来到Minecraft插件百科!
  • 对百科编辑一脸懵逼?帮助:快速入门带您快速熟悉百科编辑!
  • 因近日遭受攻击,百科现已限制编辑,有意编辑请加入插件百科企鹅群:223812289

LuckPerms:修订间差异

来自Minecraft插件百科
跳转到导航 跳转到搜索
(有待进一步简化)
 
(未显示5个用户的20个中间版本)
第1行: 第1行:
欢迎来到 LuckPerms wiki。这里你将会找到本插件的完整的使用文档,包括了安装、设置、配置和如何高效的使用 LuckPerms。
{{急需改进|页面冗长,需要拆分子页面}}
{{Plugin Infobox
|外文名    = LuckPerms
|图片      = [[File:LuckPerm banner.png]]
|作者      = Luck
|插件类型  = Spigot / CraftBukkit / Sponge
|最新版本  = 4.0.18(Bukkit) / 4.0.60(Sponge)
|兼容服务端 = 1.7, 1.8, 1.9, 1.10, 1.11, 1.12,1.13,1.14,1.15,1.16,1.17,1.18,1.19,1.20
|前置插件  =
|源地址    = [https://www.spigotmc.org/resources/luckperms-an-advanced-permissions-plugin.28140/ SpigotMC]<br>[https://ore.spongepowered.org/Luck/LuckPerms SpongePowered]
}}


'''从何开始?'''
'''LuckPerms'''是Minecraft服务端(Bukkit / Spigot,BungeeCord等)的权限插件。它允许服务器管理员通过创建组和分配权限来控制玩家可以使用的功能,由Luck开发。
 
如果您从未使用过任意权限插件,我推荐你从头开始看。
 
基础都在[[https://github.com/PluginsCDTribe/LuckPerms/wiki/Usage 使用教程]]页面。
 
完整的命令使用在[[https://github.com/PluginsCDTribe/LuckPerms/wiki/Command-Usage 命令使用]]页面。
 
'''什么也没找到?'''
 
如果你有更多的问题是这篇Wiki没有解决的,你可以通过以下几种方式联系我。
 
* [[https://discord.gg/W3FzxHA Discord 服务器]] (就算我不在,也有很多人帮助你!)
* 在 irc.esper.net 我是 "Luck",我也在 irc.spi.gt 和 chat.freenode.net
* 在 SpigotMC 和 Sponge 论坛我是 "Luck"
* 在[[https://github.com/lucko/LuckPerms/issues GitHub]]提交一个 issue (如果你要提交一个BUG,这是最好的方式)
 
'''一些有用的链接'''
* [[https://ci.lucko.me/job/LuckPerms 开发构建]]
* [[https://luckperms.lucko.me/javadocs/ Javadocs]]


==为什么选择LuckPerms?==
==为什么选择LuckPerms?==
'''这是另外一款全新的权限插件?'''
是的,我认为LuckPerm相比其他权限插件还有很大的发展空间。
LuckPerm是一款先进、高等的权限插件,仅仅以'''快速'''、'''稳定可靠'''、'''灵活多变'''的特点,
LuckPerm是一款先进、高等的权限插件,仅仅以'''快速'''、'''稳定可靠'''、'''灵活多变'''的特点,


第38行: 第25行:


并且,luckperms还兼容各式各类Minecraft服务器软件&支持多种数据存储的选择。
并且,luckperms还兼容各式各类Minecraft服务器软件&支持多种数据存储的选择。
'''我已经使用某插件很长一段时间了,它对我的帮助很大,我也很熟悉它了,为什么我要更换它而选择LuckPerm呢?'''
现在主流的权限插件大多数都是老牌插件了,并且都是在Bukkit早期就被创造出来了。
虽然,这可能意味着它们非常的稳定可靠,但通常也意味着它们被原作者抛弃,并且一般不会再有任何更新、修复,
但LuckPerm却任然是一个需要成长、需要磨砺的插件!
我会尽力及时查看并回复所有的bug报告、问题,以及可实现的新功能建议
'''你说的不错,但是我更加偏爱某插件,因为仅凭它就完成了我需要的一切'''
这没关系,我完全理解你的这种心态,我并不是想要说你**必须**用LuckPerm来作为你服务器的权限插件。
当然还有更多适合你服务器权限插件,但是LuckPerm确实是个很棒的选择,不是么?


'''来吧兄弟,告诉我,我为什么要使用LuckPerm?'''
'''来吧兄弟,告诉我,我为什么要使用LuckPerm?'''
第74行: 第45行:


'''Verbose(权限查看系统)'''
'''Verbose(权限查看系统)'''
Verbose是Luckperms一套完整的权限查看系统。


LuckPerm有一套完整的权限查看系统,是的,它叫做[[https://github.com/PluginsCDTribe/LuckPerms/wiki/Verbose verbose]]。
他可以实时监视并检测其他插件所需的权限
 
他可以实时监视并检测其他插件所需的权限,就像下面示例的动态图那样:【图片过大 请去wiki页面查看】


你也可以把录像上传到网上,方便查看、分析和阅读:
你也可以把录像上传到网上,方便查看、分析和阅读:
第516行: 第486行:


==配置==
==配置==
不同平台的 LuckPerms 的配置文件可以在这里找到。
请见子页面:[[LuckPerms/配置]]


{|
==特性==
! 平台
请见子页面:[[Luckperms/特性]]
! 位置
|-
| Bukkit/Spigot
| [https://github.com/PluginsCDTribe/LuckPerms/blob/master/bukkit/src/main/resources/config.yml <code>/plugins/LuckPerms/config.yml</code>]
|-
| BungeeCord
| [https://github.com/PluginsCDTribe/LuckPerms/blob/master/bungee/src/main/resources/config.yml <code>/plugins/LuckPerms/config.yml</code>]
|-
| Sponge
| [https://github.com/PluginsCDTribe/LuckPerms/blob/master/sponge/src/main/resources/luckperms.conf <code>/config/luckperms/luckperms.conf</code>]
|}


请注意配置文件不能在有新配置的时候自动添加,如果文件中没有找到任何东西,我们将使用默认选项。
== 开发者 ==
=== 开发者 API ===
==== 简介 ====


=== 索引 ===
LuckPerms API 允许你更改大量的插件内部编程,并且能够轻松地将 LuckPerms 深度集成到你的插件和系统里。


==== 基础 ====
大多数的其他的权限要么没有 API,要么有很差的 API,或者是有很差的文档的 API,而且里面的方法和类可能随机在不同版本里消失或是移动。Vault 项目就是一个很好的接口,并且是将大量插件一次性集成的很好的方法,可惜他的功能实在是太少了。


* [[#server|<code>server</code>]]
LuckPerms 遵循 Semantic 版本控制,也就是意味着一个不向后兼容的新的 API 出现时,主版本会增加这个 API,你可以放心你的集成不会因为版本的不同而崩溃,主要的版本是保持不变的。
* [[#include-global|<code>include-global</code>]]
* [[#include-global-world|<code>include-global-world</code>]]
* [[#apply-global-groups|<code>apply-global-groups</code>]]
* [[#apply-global-world-groups|<code>apply-global-world-groups</code>]]
* [[#use-server-uuids|<code>use-server-uuids</code>]]
* [[#log-notify|<code>log-notify</code>]]
* [[#world-rewrite|<code>world-rewrite</code>]]
* [[#group-name-rewrite|<code>group-name-rewrite</code>]]
* [[#temporary-add-behaviour|<code>temporary-add-behaviour</code>]]
* [[#primary-group-calculation|<code>primary-group-calculation</code>]]
==== 权限计算====
* [[#apply-wildcards|<code>apply-wildcards</code>]]
* [[#apply-regex|<code>apply-regex</code>]]
* [[#apply-shorthand|<code>apply-shorthand</code>]] ===== Bukkit=====
* [[#apply-bukkit-child-permissions|<code>apply-bukkit-child-permissions</code>]]
* [[#apply-bukkit-default-permissions|<code>apply-bukkit-default-permissions</code>]]
* [[#apply-bukkit-attachment-permissions|<code>apply-bukkit-attachment-permissions</code>]] ===== Bungee=====
* [[#apply-bungee-config-permissions|<code>apply-bungee-config-permissions</code>]] ===== Sponge=====
* [[#apply-sponge-implicit-wildcards|<code>apply-sponge-implicit-wildcards</code>]]
* [[#apply-sponge-default-subjects|<code>apply-sponge-default-subjects</code>]] ==== 服务器管理员 / Vault (仅 Bukkit 版本)====
* [[#enable-ops|<code>enable-ops</code>]]
* [[#auto-op|<code>auto-op</code>]]
* [[#commands-allow-op|<code>commands-allow-op</code>]]
* [[#use-vault-server|<code>use-vault-server</code>]]
* [[#vault-server|<code>vault-server</code>]]
* [[#vault-include-global|<code>vault-include-global</code>]]
* [[#vault-ignore-world|<code>vault-ignore-world</code>]]
* [[#vault-debug|<code>vault-debug</code>]] ### 存储
* [[#storage-method|<code>storage-method</code>]]
* [[#watch-files|<code>watch-files</code>]]
* [[#split-storage|<code>split-storage</code>]]
* [[#data|<code>data</code>]]
* [[#pool-size|<code>pool-size</code>]]
* [[#table-prefix|<code>table-prefix</code>]]
* [[#sync-minutes|<code>sync-minutes</code>]]
* [[#messaging-service|<code>messaging-service</code>]]
* [[#auto-push-updates|<code>auto-push-updates</code>]]
* [[#redis|<code>redis</code>]]


=== 基础 ===
==== 如何在项目里使用 API ====


LuckPerms 的 API 包是 [https://github.com/lucko/LuckPerms/tree/master/api/src/main/java/me/lucko/luckperms <code>me.lucko.luckperms.api</code>]


我的 Nexus 服务器可以在这里找到 https://nexus.lucko.me/,你在你的构建脚本里需要的仓库在 https://repo.lucko.me/


==== <code>server</code> ====
==== 其他有用的链接 ====


服务器的名称,用于制定服务器的权限。
* [https://luckperms.lucko.me/javadocs/ JavaDocs]
* [https://ci.lucko.me/job/LuckPerms/ CI Server]


如果设置为 &quot;global&quot; 这个设置将会被忽略,更多关于服务器指定的权限可以在[https://github.com/PluginsCDTribe/LuckPerms/wiki/Advanced-Setup 这里]找到。
==== Maven ====


===== 示例 =====
<source lang="xml"><repositories>
    <repository>
        <id>luck-repo</id>
        <url>https://repo.lucko.me/</url>
    </repository>
</repositories>


<pre class="yaml">server: global</pre>
<dependencies>
    <dependency>
        <groupId>me.lucko.luckperms</groupId>
        <artifactId>luckperms-api</artifactId>
        <version>3.2</version>
        <scope>provided</scope>
    </dependency>
</dependencies></source>
==== Gradle ====


-----
<pre class="gradle">repositories {
    maven {
        name &quot;luck-repo&quot;
        url &quot;https://repo.lucko.me/&quot;
    }
}


==== <code>include-global</code> ====
dependencies {
    compile (&quot;me.lucko.luckperms:luckperms-api:3.2&quot;)
}</pre>
==== 使用指南 ====


这个服务器的玩家是否应该应用他们的全局权限。(没有指定服务器的权限)
使用 API,你需要获得 LuckPermsApi 接口的实例,这可以通过几个方法完成。


如果这个选项被设置为 false,只有指定在此服务器的权限才会被应用。如果上方的 &quot;server&quot; 选项设置为 global,请不要将其设置为 false。更多的有关服务器指定的权限可以在[https://github.com/PluginsCDTribe/LuckPerms/wiki/Advanced-Setup 这里]找到。
<source lang="java">// 所有平台 (抛出 IllegalStateException 如果 API 没有被加载)
final LuckPermsApi api = LuckPerms.getApi();


===== 示例 =====
// 或者可选的
Optional<LuckPermsApi> provider = LuckPerms.getApiSafe();
if (provider.isPresent()) {
    final LuckPermsApi api = provider.get();
}


<pre class="yaml">include-global: true</pre>
// Bukkit/Spigot
ServicesManager manager = Bukkit.getServicesManager();
if (manager.isProvidedFor(LuckPermsApi.class)) {
    final LuckPermsApi api = manager.getRegistration(LuckPermsApi.class).getProvider();
}


-----
// Sponge
Optional<LuckPermsApi> provider = Sponge.getServiceManager().provide(LuckPermsApi.class);
if (provider.isPresent()) {
    final LuckPermsApi api = provider.get();
}</source>
===== 线程安全的警告 =====


==== <code>include-global-world</code> ====
所有 LuckPerms 内部,包括 API 都是线程安全的,你可以在异步线程任意调用 API 而不用担心发生错误。


与上方的选项相似,只是这个选项用于世界的设定。如果设置为 false,只有指定了世界的权限才会被应用至玩家。任何没有指定世界的权限都不会被应用。
但是,请注意一些操作,(尤其是存储类)是阻塞的。[https://docs.oracle.com/javase/8/docs/api/java/util/concurrent/CompletableFuture.html CompletableFuture] 就是用于这种情况:防止由于较差的处理导致的增加的错误,当出现 IO 时主线程等待处理完成。注意在添加 Callback 时指定正确的处理器。


===== 示例 =====
===== 我想将 LuckPerms 作为依赖项 =====


<pre class="yaml">include-global-world: true</pre>
在 Bukkit/Bungee,你需要在你的 plugin.yml 添加以下信息


-----
<pre class="yml">depend: [LuckPerms]</pre>
在 Sponge, 在你的插件声明添加这些。


==== <code>apply-global-groups</code> ====
<source lang="java">@Plugin(
        id = "myplugin",
        dependencies = {
                @Dependency(id = "luckperms")
        }
)
public class MyPlugin {
    ...
}</source>
===== 事件 =====


这个选项与 &quot;include-global&quot; 选项类似,但是此选项更改了组的继承设定。
LuckPerms 有一个完整的读写API,也有一个事件监听系统。由于插件的多平台的原因,我们使用了内部的事件系统,而不是每个平台已经使用的事件系统(举个例子,Bukkit Event API)。这意味着简单的注册你的平台的监听器将不会生效。


当计算玩家的权限时,插件将会给继承树设定范围,递归解析组成员关系。如果这个设置设置为 false,如果一个组没有被应用,那么它的父组都不会被计算,继承查询将会在此终止。
所有的事件都是'''异步触发'''的。这意味着不应该在监听器里交互或者调用任何不是线程安全的方法。


这意味着就算一个玩家没有在一个特定服务器直接继承一个组,如果这个组通过了一个没有指定服务器的组继承,这个组将不会被应用。
值得注意的是,大多数的 Bukkit/Sponge 都不是线程安全的,并且只应该使用主服务器线程来交互。你应该使用调度器来访问 LuckPerms 的监听器。


举个例子,当设置为 false,使用以下设置:
===== 我怎样才能监听一个事件 =====


<pre>用户 &quot;Luck&quot; 继承自全局组 &quot;admin&quot;,admin 继承自某服务器的 &quot;default&quot; 组。</pre>
所有的事件接口都可以在 [https://github.com/lucko/LuckPerms/tree/master/api/src/main/java/me/lucko/luckperms/api/event me.lucko.luckperms.api.event] 包里找到,它们都继承了 [https://github.com/lucko/LuckPerms/blob/master/api/src/main/java/me/lucko/luckperms/api/event/LuckPermsEvent.java LuckPermsEvent] 类。
尽管 Luck 在指定服务器上继承了默认组,它将不会被应用,因为继承查询在 admin 停止。admin 的父组将不被考虑。


===== 示例 =====
监听事件应该获得 [https://github.com/lucko/LuckPerms/blob/master/api/src/main/java/me/lucko/luckperms/api/event/EventBus.java EventBus] 实例,使用 [https://github.com/lucko/LuckPerms/blob/master/api/src/main/java/me/lucko/luckperms/api/LuckPermsApi.java#L68 LuckPermsApi#getEventBus]即可。


<pre class="yaml">apply-global-groups: true</pre>
为你的监听器创建另一个类常常是个好想法,这是一个你可以用来参考的类。


-----
<source lang="java">package me.lucko.test;


==== <code>apply-global-world-groups</code> ====
import me.lucko.luckperms.api.event.EventBus;
import me.lucko.luckperms.api.event.log.LogPublishEvent;
import me.lucko.luckperms.api.event.user.UserLoadEvent;
import me.lucko.luckperms.api.event.user.track.UserPromoteEvent;


与上面的选项相似,但是这个选项用于世界的设定。如果设置为 false,只有指定了世界的组才会被分配,给用户解析。任何没有指定世界的组都不会被应用。
public class TestListener {
    private final MyPlugin plugin;


===== 示例 =====
    public TestListener(MyPlugin plugin, LuckPermsApi api) {
        this.plugin = plugin;


<pre class="yaml">apply-global-world-groups: true</pre>
        EventBus eventBus = api.getEventBus();


-----
        // use a lambda
        eventBus.subscribe(LogPublishEvent.class, e -> e.getCancellationState().set(true));
        eventBus.subscribe(UserLoadEvent.class, e -> {
            System.out.println("User " + e.getUser().getName() + " was loaded!");
            if (e.getUser().hasPermission("some.perm", true)) {
                // Do something
            }
        });


==== <code>use-server-uuids</code> ====
        // use a method reference
        eventBus.subscribe(UserPromoteEvent.class, this::onUserPromote);
    }


如果使用服务器的UUID,或者根据之前的连接的用户名来查询,那么这个设定应该使用 true,除非你很确定你在做什么。
    private void onUserPromote(UserPromoteEvent event) {
        Bukkit.getScheduler().runTask(plugin, () -> {
            Bukkit.broadcastMessage(event.getUser().getName() + " was promoted to" + event.getGroupTo().get() + "!");


一般的,当这个选项设置为 true 时,当玩家登入时,LuckPerms 将会使用服务器提供的用户名/UUID来标识玩家。这个在大多数的服务器都是适用的。
            Player player = Bukkit.getPlayer(event.getUser().getUuid());
            if (player != null) {
                player.sendMessage("Congrats!");
            }
        });
    }


当设置为 false,LuckPerms 将会检查玩家是否曾经在服务器登录过,如果找到了一个玩家,那么之前映射的UUID将会被使用,否则将会回到默认的使用服务器的UUID的方法。
}</source>
[https://github.com/lucko/LuckPerms/blob/master/api/src/main/java/me/lucko/luckperms/api/event/EventBus.java#L43 EventBus#subscribe] 返回一个 [https://github.com/lucko/LuckPerms/blob/master/api/src/main/java/me/lucko/luckperms/api/event/EventHandler.java EventHander] 实例,可以用来在插件停止的时候取消注册监听器。


在离线模式(破解版)的服务器,玩家的UUID基于他们的用户名创建。
==== 示例用法 ====


'''重要'''
下面就是一些简短的实例,使用了一些基本的 API 功能。


如果你在运行一个 BungeeCord 服务器,你必须开启 IP forward 设置,这将让服务器使用正确的UUID。
===== 获得玩家的组 =====


[https://www.spigotmc.org/wiki/bungeecord-ip-forwarding/ Spigot] [https://docs.spongepowered.org/stable/en/server/getting-started/bungeecord.html Sponge]. SpongeForge 推荐使用 [https://github.com/HexagonMC/BungeeCord HexaCord], 这是一个 BungeeCord 分支,支持 Forge 的 IP forwarding。
如果你只是想找到一个玩家的组,我非常建议你使用以下的方法(你甚至不需要使用 API)。


如果你的 BungeeCord 代理运行于离线模式并且你使用了 Spigot,你也应该像下方一样开启 IP forwarding,但是推荐你安装 [https://ci.destroystokyo.com/job/PaperSpigot/ Paper] 并设置 paper.yml 中的 <code>bungee-online-mode: false</code>
<source lang="java">public static String getPlayerGroup(Player player, List<String> possibleGroups) {
    for (String group : possibleGroups) {
        if (player.hasPermission("group." + group)) {
            return group;
        }
    }
    return null;
}</source>
记住将你的组排列为优先级的顺序(比如组长在前,成员在后)。


如果还有什么原因导致了你无法设置 Ip forwarding,你可能需要将其设置为 false,请确保这样做之前你知道这样做的后果。
===== 为一个玩家添加权限 =====


===== 示例 =====
<source lang="java">LuckPermsApi api = null; // See above for how to get the API instance.


<pre class="yaml">use-server-uuids: true</pre>
Optional<User> user = api.getUserSafe(uuid);
if (!user.isPresent()) {
    return false; // The user isn't loaded in memory.
}


-----
// Build the permission node we want to set
Node node = api.getNodeFactory().newBuilder(permission).setValue(true).build();


==== <code>log-notify</code> ====
// Set the permission, and return true if the user didn't already have it set.
try {
    user.get().setPermission(node);


当任何权限被修改后是否向玩家发送长的提醒。提醒将只发送给拥有正确权限的用户。
    // Now we need to save the user back to the storage
    api.getStorage().saveUser(u);


提醒可以在游戏中使用 <code>/lp log notify off</code> 临时关闭。
    return true;
} catch (ObjectAlreadyHasException e) {
    return false;
}</source>
===== 为(可能的)离线玩家添加权限 =====


===== 示例 =====
CompletionStage API 可以用来轻松交互插件的存储,查看[https://docs.oracle.com/javase/8/docs/api/java/util/concurrent/CompletionStage.html 这里] 和 [https://docs.oracle.com/javase/8/docs/api/java/util/concurrent/CompletableFuture.html 这里] 来查看这两个类的详细信息。


<pre class="yaml">log-notify: true</pre>
<source lang="java">LuckPermsApi api = null; // See above for how to get the API instance.


-----
// load the user in from storage. we can specify "null" for their username,
// since it's unknown to us.
api.getStorage().loadUser(uuid, "null").thenComposeAsync(success -> {
    // loading the user failed, return straight away
    if (!success) {
        return CompletableFuture.completedFuture(false);
    }
   
    // get the user instance, they're now loaded in memory.
    User user = api.getUser(uuid);


==== <code>world-rewrite</code> ====
    // Build the permission node we want to set
    Node node = api.getNodeFactory().newBuilder(permission).setValue(true).build();


允许你给发送的世界设置别名,别名附加于真正的世界名,递归应用。
    // Set the permission, and return true if the user didn't already have it set.
    try {
        user.setPermission(node);
       
        // now we've set the permission, but still need to save the user data
        // back to the storage.
       
        // first save the user
        return api.getStorage().saveUser(user)
                .thenCompose(b -> {
                    // then cleanup their user instance so we don't create
                    // a memory leak.
                    api.cleanupUser(user);
                    return CompletableFuture.completedFuture(b);
                });
       
    } catch (ObjectAlreadyHasException e) {
        return CompletableFuture.completedFuture(false);
    }
   
}, api.getStorage().getAsyncExecutor());</source>
===== 获得玩家的前缀 =====


===== 示例 =====
LuckPerms 有一个(复杂的)缓存系统,用于非常快速的权限/信息查询。这些类都在 API 里,并且可以在可能的地方使用。


<pre class="yaml">world-rewrite:
<source lang="java">LuckPermsApi api = null; // See above for how to get the API instance.
  world_nether: world
  world_the_end: world</pre>


-----
// Get the user, or null if they're not loaded.
User user = api.getUserSafe(uuid).orElse(null);
if (user == null) {
    return Optional.empty(); // The user isn't loaded. :(
}


==== <code>group-name-rewrite</code> ====
// Now get the users "Contexts". This is basically just data about the players current state.
// Don't worry about it too much, just know we need it to get their cached data.
Contexts contexts = api.getContextForUser(user).orElse(null);
if (contexts == null) {
    return Optional.empty();
}


允许你设置组名的别名。它们是纯粹的显示名称,实际上的名称不会改变,只有命令/信息的输出会改变。
// Ah, now we're making progress. We can use the Contexts to get the users "MetaData". This is their cached meta data.
MetaData metaData = user.getCachedData().getMetaData(contexts);


===== 示例 =====
// MetaData#getPrefix returns null if they have no prefix.
return metaData.getPrefix();</source>
===== 获得玩家请求的权限 =====


<pre class="yaml">group-name-rewrite:
我们也可以使用这个缓存系统来获得一个包含用户权限的 Map 实例,包含了基础的权限查询。
  default: Member</pre>


-----
<source lang="java">// All retrieved in the same way as shown above.
User user;
Contexts contexts;


==== <code>temporary-add-behaviour</code> ====
PermissionData permissionData = user.getCachedData().getPermissionData(contexts);
Map<String, Boolean> data = permissionData.getImmutableBacking();</source>
===== 寻找权限 =====


控制临时的权限/父类/元数据,默认是 <code>deny</code>
你可以使用 Java 8 的流轻松过滤并返回一个用户请求的权限


* '''<code>accumulate</code>''' - 任何添加的节点将被添加
<source lang="java">public boolean hasPermissionStartingWith(UUID uuid, String startingWith) {
* '''<code>replace</code>''' - 临时的节点持续的最长的时间,其他的节点将被忽略
    // Get the user, if they're online.
* '''<code>deny</code>''' - 如果你试图添加一个重复的临时节点命令将被拒绝
    Optional<User> user = api.getUserSafe(uuid);


===== 示例 =====
    // If they're online, perform the check, otherwise, return false.
    return user.map(u -> u.getPermissions().stream()
            .filter(Node::getValue)
            .filter(Node::isPermanent)
            .filter(n -> !n.isServerSpecific())
            .filter(n -> !n.isWorldSpecific())
            .anyMatch(n -> n.getPermission().startsWith(startingWith))
    ).orElse(false);
}</source>
===== 创建新的组并分配权限 =====


<pre class="yaml">temporary-add-behaviour: deny</pre>
这个方法不是阻塞的,所以可以安全的在主线程调用,一旦操作完成,回调会异步运行。


-----
<source lang="java">api.getStorage().createAndLoadGroup("my-new-group").thenAcceptAsync(success -> {
    if (!success) {
        return;
    }


==== <code>primary-group-calculation</code> ====
    Group group = api.getGroup("my-new-group");
    if (group == null) {
        return;
    }


LuckPerms 如何决定用户的主组,Bukkit/Bungee 默认的是 <code>stored</code>,Sponge 默认的是 <code>parents-by-weight</code>。
    Node permission = api.buildNode("test.permission").build();


* '''<code>stored</code>''' - 使用存储的记录在文件/数据库的数据
    try {
* '''<code>parents-by-weight</code>''' - 使用用户权重最高的父组
        group.setPermission(permission);
* '''<code>all-parents-by-weight</code>''' - 像上面的一样,但是计算所有的继承,包括直接继承和间接继承
    } catch (ObjectAlreadyHasException ignored) {}


===== 示例 =====
    // Now save the group back to storage
    api.getStorage().saveGroup(group);
}, api.getStorage().getAsyncExecutor());</source>
==== 版本控制 ====


<pre class="yaml">primary-group-calculation: stored</pre>
在 2.0 版本里,LuckPerms 遵循了 Semantic 版本控制。


-----
唯一不同的是 patch 号不包含在任何地方,除了 pom,并且每次构建都会计算,基于上次提交后的提交数量。(每个新的小版本都会创建新的标签)


=== 权限计算 ===
这意味着 API 版本不再有 patch 号(在 patch 里没有 API 的变化),API 版本会是 x.y,每个不同的 LuckPerms 构建都会遵循 x.y.z。


===== 变更日志 =====


-----
* 版本 2.x 保持了几个月的稳定,没有任何向后不兼容的变更,但是在之后的版本里很多的方法变为弃用状态,并且事件 API 的确应该重写一遍。
* 版本 3.x 包含了以下的向后不兼容的变化。 https://gist.github.com/PluginsCDTribe/fdf6ae4b2d9e466d8103dd9c68e5db9e


==== <code>apply-wildcards</code> ====
== 其他 ==
=== 语言文件 ===
LuckPerms 插件中所有的消息(包括颜色和格式代码)都能够修改。(似乎合情合理)


插件是否应用带有通配符的权限。
将下面的文件之一下载然后存储到LuckPerms的文件夹中,然后命名为 '''&quot;lang.yml&quot;'''。


如果插件的作者没有提供他们自己的通配符权限,那么开启这个选项将会让 LuckPerms 转换它们。Bukkit 尤其不认同这种做法,但是它们在管理员中间适用的相当普遍。在 Sponge,这个选项控制 &quot;node.part.*&quot; 类型的通配符是否生效。
将文件中的消息文本改成你喜欢的样子,然后重启你的服务器就好了。


===== 示例 =====
* [https://github.com/lucko/LuckPerms/blob/master/.locale/en_US.yml '''en_US''' - 英语]
* [https://github.com/lucko/LuckPerms/blob/master/.locale/es_ES.yml '''es_ES''' - 西班牙语]
* [https://github.com/lucko/LuckPerms/blob/master/.locale/ru_RU.yml '''ru_RU''' - 俄语]
* [https://github.com/lucko/LuckPerms/blob/master/.locale/zh-CN.yml '''zh-CN''' - 简体中文]
* [https://github.com/lucko/LuckPerms/blob/master/.locale/pl_PL.yml '''pl_PL''' - 波兰语]


<pre class="yaml">apply-wildcards: true</pre>
=== PlaceholderAPI ===


-----
在 extended_clip 的 [https://www.spigotmc.org/resources/placeholderapi.6245/ PlaceholderAPI] 插件中,LuckPerms 也注册了一些变量(Placeholders)。


==== <code>apply-regex</code> ====
LuckPerms 插件所使用的标识符是 '''luckperms'''。


插件是否转换正则表达式权限。
==== 使用 ====


如果设置为 true,LuckPerms 将会检测任何正则表达式权限,正则表达式权限节点以 &quot;r=&quot; 开头,返回所有匹配这个节点的请求。如果你没有任何正则表达式权限的设置,开启这个将没有任何性能的影响。这个特点的更多信息可以在[https://github.com/PluginsCDTribe/LuckPerms/wiki/Advanced-Setup#regex 这里]找到。
要想使用变量的话,你需要运行下列命令。 这些命令的作用就是安装 LuckPerms 的变量扩展,安装后你就可以使用下面列举出的变量了。


===== 示例 =====
<code>/papi ecloud download LuckPerms</code>


<pre class="yaml">apply-regex: true</pre>
<code>/papi reload</code>  


-----
请记住使用这些指令你需要OP权限(或者你也可以选择在控制台中运行这些指令)


==== <code>apply-shorthand</code> ====
同时请注意,如果你想得到玩家的前缀或后缀数据,——如果你在服务器上安装了Vault插件和Vault的变量扩展的话,你也可以使用 Vault 插件所提供的变量。


是否允许GLOB风格的速记权限。
==== Placeholders ====


更多这个特性的信息可以在[https://github.com/PluginsCDTribe/LuckPerms/wiki/Advanced-Setup#shorthand-permissions 这里]找到。
<code>%luckperms_group_name%</code>


===== 示例 =====
'''使用说明:''' 返回玩家当前所在组的名字<br />
'''使用示例:''' n/a


<pre class="yaml">apply-shorthand: true</pre>


-----
-----


==== <code>apply-bukkit-child-permissions</code> ====
<code>%luckperms_context_&lt;context key&gt;%</code>


插件是否应用Bukkit子权限。
'''使用说明:''' 返回给定内容关键字的值,如果内容没有值的话会返回空 '''使用示例:''' %luckperms_context_server%


插件的作者可以给他们的插件定义自定义权限结构,如果设置为 true,LuckPerms 将会使用他们。
这个选项是默认启用的,因为这是一个基础的Bukkit特性,大多数的服务器管理员都需要,但是如果你不希望使用这个系统,它将可以被安全关闭。
===== 示例 =====
<pre class="yaml">apply-bukkit-child-permissions: true</pre>


-----
-----


==== <code>apply-bukkit-default-permissions</code> ====
<code>%luckperms_groups%</code>


插件是否应该应用Bukkit的默认权限。
'''使用说明:''' 返回服务器上的权限组列表,用逗号分割 '''使用示例:''' n/a


插件作者可以给所有的用户默认权限,或者设置应该/不应该给OP玩家。如果这个设置为 false,LuckPerms将会忽略这些默认权限。
这个选项是默认启用的,因为这是一个基础的Bukkit特性,大多数的服务器管理员都需要,但是如果你不希望使用这个系统,它将可以被安全关闭。
===== 示例 =====
<pre class="yaml">apply-bukkit-default-permissions: true</pre>


-----
-----


==== <code>apply-bukkit-attachment-permissions</code> ====
<code>%luckperms_has_permission_&lt;permission&gt;%</code>
 
插件是否应该应用Bukkit的附加权限。


服务器的其他插件可以添加它们自身的&quot;权限附加&quot;到玩家,这允许大量的玩家附加权限持续到回话结束,或者被移除。如果这个设置被设置为 false,LuckPerms 在考虑玩家是否有某一特定的权限时,将不会包括这些附加的权限。
'''使用说明:''' 检查玩家是否直接拥有该权限,不会检查通配符或继承的权限 '''使用示例:''' %luckperms_has_permission_essentials.ban%


你在开启这个选项后可能会见到一个小的性能提升,关闭 OP 系统后,这个系统可以非常有效的阻止恶意插件给玩家任意权限的尝试。
这个选项是默认启用的,因为这是一个基础的Bukkit特性,大多数的服务器管理员都需要,但是如果你不希望使用这个系统,它将可以被安全关闭。
===== 示例 =====
<pre class="yaml">apply-bukkit-attachment-permissions: true</pre>


-----
-----


==== <code>apply-bungee-config-permissions</code> ====
<code>%luckperms_check_permission_&lt;permission&gt;%</code>
 
插件是否应用 BungeeCord config.yml 里设置的权限和组。
 
如果设置为 false,LuckPerms 将会忽略这些值。
 
这个是默认关闭的,因为所有的权限都应该通过 LuckPerms 来设置,这样他们可以在游戏中查看和编辑。


===== 示例 =====
'''使用说明:''' 检查玩家是否拥有指定权限,这个变量工作的方式和正常插件的检查方式没有区别 '''使用示例:''' %luckperms_check_permission_some.cool.permission%


<pre class="yaml">apply-bungee-config-permissions: false</pre>


-----
-----


==== <code>apply-sponge-implicit-wildcards</code> ====
<code>%luckperms_in_group_&lt;group&gt;%</code>
 
插件是否解析并应用Sponge的通配符集成系统的权限。


如果一个玩家获得了 <code>example</code>,那么他将自动获得 <code>example.function</code> 权限,<code>example.another</code>,<code>example.deeper.nesting</code> 等。
'''使用说明:''' 返回玩家是否为给定组的成员,不包括继承组 '''使用示例:''' %luckperms_in_group_admin%


如果这个选项被设置为 false,系统将不会被应用。
这个选项是默认启用的,因为这是一个基础的Sponge特性,大多数的服务器管理员都需要,但是如果你不希望使用这个系统,它将可以被安全关闭。
===== 示例 =====
<pre class="hocon">apply-sponge-implicit-wildcards=true</pre>


-----
-----


==== <code>apply-sponge-default-subjects</code> ====
<code>%luckperms_inherits_group_&lt;group&gt;%</code>
 
插件是否应用Sponge的默认权限。
 
插件将会授予玩家一组默认权限,如果设置为 false,那么插件将在考虑玩家是否拥有某权限时忽略这一组权限。
 
这个选项是默认启用的,因为这是一个基础的Sponge特性,大多数的服务器管理员都需要,但是如果你不希望使用这个系统,它将可以被安全关闭。
 
===== 示例 =====


<pre class="hocon">apply-sponge-default-subjects=true</pre>
'''使用说明:''' 返回玩家是否在给定组或继承给定组 '''使用示例:''' %luckperms_inherits_group_vip%
=== Server Operator / Vault (Bukkit version only) ===




-----
-----


==== <code>enable-ops</code> ====
<code>%luckperms_on_track_&lt;track&gt;%</code>


是否使用原版的OP系统。
'''使用说明:''' 返回玩家的权限组是否在给定权限组树上 '''使用示例:''' %luckperms_on_track_staff%


如果设置为 false,所有玩家都不是 op,op/deop 命令将被禁止。
===== 示例 =====
<pre class="yaml">enable-ops: true</pre>


-----
-----


==== <code>auto-op</code> ====
<code>%luckperms_has_groups_on_track_&lt;track&gt;%</code>
 
如果设置为 true,任何拥有 &quot;luckperms.autoop&quot; 权限的玩家将会自动设置为服务器OP。
 
这个权限可以被继承,或者设置在特定的服务器/世界,临时的等等。另外,设置此选项为 true 将会强制上方的选项 &quot;enable-ops&quot; 为 false。所有的用户都将被 deop 直到他们有了这个权限节点,并且 op/deop 命令将被禁止。
 
有一点需要注意的是,自动OP检测只有在玩家进入服务器和切换世界时生效,这意味着,简单的移除他们的权限并不会自动去除玩家的OP,玩家必须重新登陆才能使其生效。
 
推荐使用这个选项而不是简单的分配一个 &quot;*&quot; 权限。


===== 示例 =====
'''使用说明:''' 检查玩家是否继承给定权限组树中的任何一个组 '''使用示例:''' %luckperms_on_track_donor%


<pre class="yaml">auto-op: false</pre>


-----
-----


==== <code>commands-allow-op</code> ====
<code>%luckperms_highest_group_by_weight%</code>
 
OP玩家是否有权限使用 LuckPerms 指令。


设置为 false 将只允许有命令指定的权限的玩家使用。
'''使用说明:''' 返回玩家所在权限组树种的最高级权限组 '''使用示例:''' n/a


===== 示例 =====
<pre class="yaml">commands-allow-op: true</pre>


-----
-----


==== <code>use-vault-server</code> ====
<code>%luckperms_lowest_group_by_weight%</code>


下方的 <code>vault-server</code> 选项是否应该使用。
'''使用说明:''' 返回玩家所在权限组树种的最低级权限组 '''使用示例:''' n/a


当这个选项设置为 false 时,&quot;server&quot; 值用于 Vault 操作。
===== 示例 =====
<pre class="yaml">use-vault-server: false</pre>


-----
-----


==== <code>vault-server</code> ====
<code>%luckperms_first_group_on_tracks_&lt;tracks&gt;%</code>


Vault 操作中使用的服务器名称。
'''使用说明:''' 返回玩家在给定权限组树上所在的第一个组,权限组树会返回一组用逗号分隔的权限组名,权限组树中的每一个权限组都正序排列。 '''使用示例:''' %luckperms_first_group_on_tracks_staff,donor%


如果你不想让 Vault 操作为特定服务器,将其设置为 &quot;global&quot;。
只有当 <code>use-vault-server</code> 设置为 true 时生效。
===== 示例 =====
<pre class="yaml">vault-server: global</pre>


-----
-----


==== <code>vault-include-global</code> ====
<code>%luckperms_last_group_on_tracks_&lt;tracks&gt;%</code>
 
玩家组接受元数据时是否考虑全局权限。


===== 示例 =====
'''使用说明:''' 返回玩家在给定权限组树上所在的最后一个组,权限组树会返回一组用逗号分隔的权限组名,权限组树中的每一个权限组都倒序排列。 '''使用示例:''' %luckperms_last_group_on_tracks_staff,donor%


<pre class="yaml">vault-include-global: true</pre>


-----
-----


==== <code>vault-ignore-world</code> ====
<code>%luckperms_expiry_time_&lt;permission&gt;%</code>


Vault 操作是否应该忽略提供的世界参数。
'''使用说明:''' 获得玩家拥有的临时权限剩余的时间,如果玩家没有该权限的话会返回空 '''使用示例:''' %luckperms_expiry_time_essentials.fly%


默认情况下,如果没有提供世界参数,权限将会设置在玩家当前的世界。(Vault 的设计给满分)。设置为 true 来更改这项操作的结果。
===== 示例 =====
<pre class="yaml">vault-ignore-world: false</pre>


-----
-----


==== <code>vault-debug</code> ====
<code>%luckperms_group_expiry_time_&lt;group name&gt;%</code>
 
LuckPerms 是否应当在一个插件使用了 Vault 的功能后打印 debug 信息。
 
===== 示例 =====


<pre class="yaml">vault-debug: false</pre>
'''使用说明:''' 获得玩家拥有的临时权限组所剩余的时间,如果玩家不在该权限组的话会返回空 '''使用示例:''' %luckperms_group_expiry_time_vip%
=== Storage ===




-----
-----


==== <code>storage-method</code> ====
<code>%luckperms_prefix%</code>
 
插件应该使用哪个存储方法。
 
查看[https://github.com/PluginsCDTribe/LuckPerms/wiki/Choosing-a-Storage-type 这里]查看支持的所有类型。
 
'''接受''': <code>mysql</code>, <code>mariadb</code>, <code>postgresql</code>, <code>sqlite</code>, <code>h2</code>, <code>json</code>, <code>yaml</code>, <code>mongodb</code>


如果你的 MySQL 支持,那么 <code>mariadb</code> 选项比 <code>mysql</code> 更好,<code>h2</code> 当然也比 <code>sqlite</code> 更好。
'''使用说明:''' 返回玩家的前缀,使用Vault所提供的变量所输出的结果可能会更精确,这一项不会被Vault的配置设置影响 '''使用示例:''' n/a


===== 示例 =====
<pre class="yaml">storage-method: h2</pre>


-----
-----


==== <code>watch-files</code> ====
<code>%luckperms_suffix%</code>


当使用基于文件的存储系统,LuckPerms将会监视数据文件的变化,并在文件变化被检测到的时候自动规划更新数据、
'''使用说明:''' 返回玩家的后缀,使用Vault所提供的变量所输出的结果可能会更精确,这一项不会被Vault的配置设置影响 '''使用示例:''' n/a


如果不想让这个发生,那么将此选项设置为 false。
===== 示例 =====
<pre class="yaml">watch-files: true</pre>


-----
-----


==== <code>split-storage</code> ====
<code>%luckperms_meta_&lt;meta key&gt;%</code>


分离存储允许你为不用的数据类型使用不同的存储选项。
'''使用说明:''' 返回与指定Meta关键字联系的值 '''使用示例:''' %luckperms_meta_some-key%


'''不同类型的数据有:''' * '''<code>user</code>''' - 关于用户的数据,包含权限、父组和元数据 * '''<code>group</code>''' - 关于组的数据,包括了组权限、继承组和元数据 * '''<code>track</code>''' - 关于轨道的数据(或者说是梯子) * '''<code>uuid</code>''' - LuckPerms 适用的 <code>uuid &lt;-- --&gt; username</code> 缓存,当 <code>/lp user</code> 使用的是用户名而不是 UUID * '''<code>log</code>''' - LuckPerms 存储的日志 允许的数据类型在上方列出
===== 示例 =====
<pre class="yaml">split-storage:
  enabled: true
  methods:
    user: mariadb
    group: yaml
    track: yaml
    uuid: mariadb
    log: mariadb</pre>


-----
-----
== Link ==


==== <code>data</code> ====
* [https://discord.gg/W3FzxHA Discord 服务器]
 
* 在 irc.esper.net 我是 "Luck",我也在 irc.spi.gt 和 chat.freenode.net
此选项用于指定数据库的存储凭据。
* SpigotMC 和 Sponge 论坛: "Luck"
 
* [https://github.com/lucko/LuckPerms/issues GitHub]
* '''<code>address</code>''' - 数据库的地址,如果使用默认的端口可以不填写,如果使用了特定端口,请使用 <code>host:port</code>
* '''<code>database</code>''' - LuckPerms 应该使用的数据库
* '''<code>username</code>''' - 使用的用户名
* '''<code>password</code>''' - 使用的密码,留空则不使用验证
 
===== 示例 =====
 
<pre class="yaml">data:
  address: localhost
  database: minecraft
  username: root
  password: ''</pre>
 
-----
 
==== <code>pool-size</code> ====
 
MySQL 连接池大小。
 
默认为 <code>10</code>,应该适合大部分服务器。只有你清楚你在干什么再更改这项设置。
 
查看[https://github.com/brettwooldridge/HikariCP/wiki/About-Pool-Sizing 这里]了解更多关于连接池大小的信息。
 
===== 示例 =====
 
<pre class="yaml">data:
  pool-size: 10 # The size of the MySQL connection pool.</pre>
 
-----
 
==== <code>sync-minutes</code> ====
 
此选项控制 LuckPerms 多长时间进行一次同步任务。
 
同步任务将会刷新存储中的所有信息,保证插件使用的是最新的数据。
 
这个选项默认关闭,因为大多数的用户都是不需要这个功能的,但是如果你使用远程存储,又没有设置信息服务,那么你可能将其设置为像 3 这样的数值。
 
设置为 -1 来完全停用这个任务。
 
===== 示例 =====
 
<pre class="yaml">data:
  sync-minutes: 3</pre>
 
-----
 
==== <code>messaging-service</code> ====
 
设置信息服务。
 
如果开启并且正确配置了,LuckPerms 可以使用消息系统来通知其他连接的服务器更改。使用命令 <code>/luckperms networksync</code> 来推送更改,使用这个服务不会存储数据,只是用于消息平台。
 
如果你决定开启这个功能,你应该设置 &quot;sync-minutes&quot; 为 -1,因为没有必要将数据推至数据库。
 
'''可用的选项:'''
 
* '''<code>bungee</code>''' - 使用插件的 messaging channel。必须在所有的子服务器开启才能使用,并且要在 Bungee 安装 LuckPerms。
* '''<code>lilypad</code>''' - 使用 LilyPad 的 pub sub 来推送更改。你需要安装 LilyPad-Connect 插件。
* '''<code>redis</code>''' - 使用 Redis 的 pub sub 来推送更改。
* '''<code>none</code>''' - 啥都没有!
 
===== 示例 =====
 
<pre class="yaml">messaging-service: none</pre>
 
-----
 
==== <code>auto-push-updates</code> ====
 
LuckPerms 是否应该在命令执行后自动推送更改。
 
===== 示例 =====
 
<pre class="yaml">auto-push-updates: true</pre>
 
-----
 
==== <code>redis</code> ====
 
Redis的设定。
 
* '''<code>address</code>''' - redis 使用的地址,默认使用默认端口(6379),如果你有特定的端口,请使用 <code>host:port</code>。
* '''<code>password</code>''' - 使用 Redis 需要的密码。留空则不使用验证。
 
===== 示例 =====
 
<pre class="yaml">redis:
  enabled: true
  address: localhost
  password: 'passw0rd'</pre>
 
=== 命令使用 ===
当输入无效的参数时,命令的使用方法将会打印在控制台/聊天中,'''简单的输入 /lp 或者 /lpb''' 会显示当前用户的权限能够使用的所有命令。
 
如果输入命令后返回的只有插件版本,那么你没有权限使用任何插件,你需要使用服务器控制台来[https://github.com/PluginsCDTribe/LuckPerms/wiki/Usage#granting-full-access-to-modify-permissions 给自己使用 LuckPerms 命令的权限]。
 
==== 别名 ====
 
每个平台的可用的别名都列在下方,每个命令的效果都是一样的,所以你可以选择自己喜欢的来使用。
 
{|
! Bukkit / Sponge
! BungeeCord
|-
| /luckperms
| /luckpermsbungee
|-
| /perms
| /bperms
|-
| /permissions
| /bpermissions
|-
| /perm
| /bperm
|-
| /lp
| /lpb
|}
 
'''重要''' 在BungeeCord上命令有所不同,这可以让你选择命令使用的地方,如果命令全部相同,那么你就没有机会控制你的子服务器了。
 
如果你在使用 Bukkit/Spigot,作为默认,所有是OP的玩家都有使用LuckPerms命令的权限,你可以在配置文件中更改这项选项。
 
==== 什么是上下文(Context) ====
 
参数 <code>context</code> 在LuckPerms中使用频率很高,他的意义对大多数的用户可能不是那么显而易见。
 
Context,在常识中,意味着环境,某个权限,父组,前缀后缀抑或是元数据。
 
上下文分为两部分,键和值。LuckPerms提供了默认的两种上下文,服务器和世界上下文,但是可能服务器的其他的插件提供更多可用的上下文,用户的&quot;金钱&quot;上下文可以在使用用户命令时找到。
 
举个例子,如果我想要在特定的世界设定我的权限,我就会使用世界上下文,解释的更详细些,我们假设这个世界叫做&quot;nether&quot;,我在命令中使用的上下文就将是<code>world=nether</code>。
 
当在命令中使用时,上下文 &quot;key&quot; 和 &quot;value&quot; 使用 <code>=</code> 分隔,你可以指定任意多的上下文,但是请记住所有的上下文都应该指定玩家相关的来应用权限之类的东西。
 
最终,举个例子,我想将 &quot;luckperms.info&quot; 权限在 &quot;nether&quot; 世界设置为 true,只有在 &quot;factions&quot; 服务器有效,命令将会是:
 
<code>/luckperms user Luck permission set luckperms.info true server=factions world=nether</code>.
 
这就是用来接收上下文的命令的相同的格式。
 
<blockquote>最终,给老用户的一些提醒,在命令的最后添加两个额外的 <code>[服务器] [世界]</code> 参数仍然被支持!
</blockquote>
==== 概览 ====
 
===== 参数键值: ====
* <code>&lt;必需&gt;</code> - 运行指令时你 ''必需'' 指定这个参数
* <code>[可选]</code> - 如果没有指定将会使用默认
 
如果你想在参数中添加空格,你必须像这样 <code>&quot; &quot;</code> 使用引号把参数包起来。
 
下方使用的别名 (/lp) 可以使用上方介绍的别名中的任意一个替换。
 
===== 基础 =====
 
* [[#lp|/lp]]
* [[#lp-sync|/lp <code>sync</code>]]
* [[#lp-info|/lp <code>info</code>]]
* [[#lp-verbose|/lp <code>verbose</code> &lt;on | record | off | paste&gt; [filter]]]
* [[#lp-tree|/lp <code>tree</code> [selection] [max level] [player]]]
* [[#lp-search|/lp <code>search</code> &lt;permission&gt;]]
* [[#lp-check|/lp <code>check</code> &lt;user&gt; &lt;permission&gt;]]
* [[#lp-networksync|/lp <code>networksync</code>]]
* [[#lp-import|/lp <code>import</code> &lt;file&gt;]]
* [[#lp-export|/lp <code>export</code> &lt;file&gt;]]
* [[#lp-reloadconfig|/lp <code>reloadconfig</code>]]
* [[#lp-bulkupdate|/lp <code>bulkupdate</code>]]
* [[#lp-migration|/lp <code>migration</code>]]
* [[#lp-creategroup|/lp <code>creategroup</code> &lt;group&gt;]]
* [[#lp-deletegroup|/lp <code>deletegroup</code> &lt;group&gt;]]
* [[#lp-listgroups|/lp <code>listgroups</code>]]
* [[#lp-createtrack|/lp <code>createtrack</code> &lt;track&gt;]]
* [[#lp-deletetrack|/lp <code>deletetrack</code> &lt;track&gt;]]
* [[#lp-listtracks|/lp <code>listtracks</code>]]
 
===== 用户 (/lp user &lt;user&gt; ...) =====
 
* [[#lp-user-user-info|/lp user &lt;user&gt; <code>info</code>]]
* [[#permission---lp-user-user-permission---lp-group-group-permission-|/lp user &lt;user&gt; <code>permission</code>]]
* [[#parent---lp-user-user-parent---lp-group-group-parent-|/lp user &lt;user&gt; <code>parent</code>]]
* [[#meta---lp-user-user-meta---lp-group-group-meta-|/lp user &lt;user&gt; <code>meta</code>]]
* [[#lp-user-user-editor|/lp user &lt;user&gt; <code>editor</code>]]
* [[#lp-user-user-switchprimarygroup|/lp user &lt;user&gt; <code>switchprimarygroup</code> &lt;group&gt;]]
* [[#lp-user-user-promote|/lp user &lt;user&gt; <code>promote</code> &lt;track&gt; [context...]]]
* [[#lp-user-user-demote|/lp user &lt;user&gt; <code>demote</code> &lt;track&gt; [context...]]]
* [[#lp-user-user-showtracks|/lp user &lt;user&gt; <code>showtracks</code>]]
* [[#lp-user-user-clear|/lp user &lt;user&gt; <code>clear</code> [context...]]]
 
===== 组 (/lp group &lt;group&gt; ...) =====
 
* [[#lp-group-group-info|/lp group &lt;group&gt; <code>info</code>]]
* [[#permission---lp-user-user-permission---lp-group-group-permission-|/lp group &lt;group&gt; <code>permission</code>]]
* [[#parent---lp-user-user-parent---lp-group-group-parent-|/lp group &lt;group&gt; <code>parent</code>]]
* [[#meta---lp-user-user-meta---lp-group-group-meta-|/lp group &lt;group&gt; <code>meta</code>]]
* [[#lp-group-group-editor|/lp group &lt;group&gt; <code>editor</code>]]
* [[#lp-group-group-listmembers|/lp group &lt;group&gt; <code>listmembers</code> [page]]]
* [[#lp-group-group-setweight|/lp group &lt;group&gt; <code>setweight</code> &lt;weight&gt;]]
* [[#lp-group-group-showtracks|/lp group &lt;group&gt; <code>showtracks</code>]]
* [[#lp-group-group-clear|/lp group &lt;group&gt; <code>clear</code> [context...]]]
* [[#lp-group-group-rename|/lp group &lt;group&gt; <code>rename</code> &lt;new name&gt;]]
* [[#lp-group-group-clone|/lp group &lt;group&gt; <code>clone</code> &lt;name of clone&gt;]]
 
===== 权限 (/lp user &lt;user&gt; permission ... | /lp group &lt;group&gt; permission ...) =====
 
* [[#lp-usergroup-usergroup-permission-info|<code>info</code>]]
* [[#lp-usergroup-usergroup-permission-set|<code>set</code> &lt;node&gt; &lt;true/false&gt; [context...]]]
* [[#lp-usergroup-usergroup-permission-unset|<code>unset</code> &lt;node&gt; [context...]]]
* [[#lp-usergroup-usergroup-permission-settemp|<code>settemp</code> &lt;node&gt; &lt;true/false&gt; &lt;duration&gt; [context...]]]
* [[#lp-usergroup-usergroup-permission-unsettemp|<code>unsettemp</code> &lt;node&gt; [context...]]]
* [[#lp-usergroup-usergroup-permission-check|<code>check</code> &lt;node&gt; [context...]]]
* [[#lp-usergroup-usergroup-permission-checkinherits|<code>checkinherits</code> &lt;node&gt; [context...]]]
 
===== 继承 (/lp user &lt;user&gt; parent ... | /lp group &lt;group&gt; parent ...) =====
 
* [[#lp-usergroup-usergroup-parent-info|<code>info</code>]]
* [[#lp-usergroup-usergroup-parent-set|<code>set</code> &lt;group&gt; [context...]]]
* [[#lp-usergroup-usergroup-parent-add|<code>add</code> &lt;group&gt; [context...]]]
* [[#lp-usergroup-usergroup-parent-remove|<code>remove</code> &lt;group&gt; [context...]]]
* [[#lp-usergroup-usergroup-parent-settrack|<code>settrack</code> &lt;track&gt; &lt;group&gt; [context...]]]
* [[#lp-usergroup-usergroup-parent-addtemp|<code>addtemp</code> &lt;group&gt; &lt;duration&gt; [context...]]]
* [[#lp-usergroup-usergroup-parent-removetemp|<code>removetemp</code> &lt;group&gt; [context...]]]
* [[#lp-usergroup-usergroup-parent-clear|<code>clear</code> [context...]]]
* [[#lp-usergroup-usergroup-parent-cleartrack|<code>cleartrack</code> &lt;track&gt; [context...]]]
 
===== 元数据 (/lp user &lt;user&gt; meta ... | /lp group &lt;group&gt; meta ...) =====
 
* [[#lp-usergroup-usergroup-meta-info|<code>info</code>]]
* [[#lp-usergroup-usergroup-meta-set|<code>set</code> &lt;key&gt; &lt;value&gt; [context...]]]
* [[#lp-usergroup-usergroup-meta-unset|<code>unset</code> &lt;key&gt; [context...]]]
* [[#lp-usergroup-usergroup-meta-settemp|<code>settemp</code> &lt;key&gt; &lt;value&gt; &lt;duration&gt; [context...]]]
* [[#lp-usergroup-usergroup-meta-unsettemp|<code>unsettemp</code> &lt;key&gt; [context...]]]
* [[#lp-usergroup-usergroup-meta-addprefix|<code>addprefix</code> &lt;priority&gt; &lt;prefix&gt; [context...]]]
* [[#lp-usergroup-usergroup-meta-addsuffix|<code>addsuffix</code> &lt;priority&gt; &lt;suffix&gt; [context...]]]
* [[#lp-usergroup-usergroup-meta-removeprefix|<code>removeprefix</code> &lt;priority&gt; [prefix] [context...]]]
* [[#lp-usergroup-usergroup-meta-removesuffix|<code>removesuffix</code> &lt;priority&gt; [suffix] [context...]]]
* [[#lp-usergroup-usergroup-meta-addtempprefix|<code>addtempprefix</code> &lt;priority&gt; &lt;prefix&gt; &lt;duration&gt; [context...]]]
* [[#lp-usergroup-usergroup-meta-addtempsuffix|<code>addtempsuffix</code> &lt;priority&gt; &lt;suffix&gt; &lt;duration&gt; [context...]]]
* [[#lp-usergroup-usergroup-meta-removetempprefix|<code>removetempprefix</code> &lt;priority&gt; [prefix] [context...]]]
* [[#lp-usergroup-usergroup-meta-removetempsuffix|<code>removetempsuffix</code> &lt;priority&gt; [suffix] [context...]]]
* [[#lp-usergroup-usergroup-meta-clear|<code>clear</code> [context...]]]
 
===== 轨道 (/lp track &lt;track&gt; ...) =====
 
* [[#lp-track-track-info|/lp track &lt;track&gt; <code>info</code>]]
* [[#lp-track-track-append|/lp track &lt;track&gt; <code>append</code> &lt;group&gt;]]
* [[#lp-track-track-insert|/lp track &lt;track&gt; <code>insert</code> &lt;group&gt; &lt;position&gt;]]
* [[#lp-track-track-remove|/lp track &lt;track&gt; <code>remove</code> &lt;group&gt;]]
* [[#lp-track-track-clear|/lp track &lt;track&gt; <code>clear</code>]]
* [[#lp-track-track-rename|/lp track &lt;track&gt; <code>rename</code> &lt;new name&gt;]]
* [[#lp-track-track-clone|/lp track &lt;track&gt; <code>clone</code> &lt;name of clone&gt;]]
 
===== 日志 (/lp log ...) =====
 
* [[#lp-log-recent|/lp log <code>recent</code> [user] [page]]]
* [[#lp-log-search|/lp log <code>search</code> &lt;query&gt; [page]]]
* [[#lp-log-notify|/lp log <code>notify</code> [on|off]]]
* [[#lp-log-export|/lp log <code>export</code> &lt;file&gt;]]
* [[#lp-log-userhistory|/lp log <code>userhistory</code> &lt;user&gt; [page]]]
* [[#lp-log-grouphistory|/lp log <code>grouphistory</code> &lt;group&gt; [page]]]
* [[#lp-log-trackhistory|/lp log <code>trackhistory</code> &lt;track&gt; [page]]]
 
==== 命令细节 ====
 
===== 基础 =====
 
 
-----
 
====== <code>/lp</code> ======
 
'''权限''': n/a<br />
基础的 LuckPerms 命令。将会打印用户有权限使用的所有的命令,包含每个命令的基础信息,和接受的参数。
 
 
-----
 
====== <code>/lp sync</code> ======
 
'''权限''': luckperms.sync<br />
刷新所有加载的数据,如果存储中有变化,那么这个命令将会将服务器的信息添加存储中的更改。
 
 
-----
 
====== <code>/lp info</code> ======
 
'''权限''': luckperms.info<br />
列出 LuckPerms 的一些信息/数据,包括 debug 输出,统计,设置和配置中的一些重要的值。
 
 
-----
 
====== <code>/lp verbose</code> ======
 
'''权限''': luckperms.verbose<br />
'''参数''':<br />
* <code>&lt;on|record|off|paste&gt;</code> - 启用或禁用日志,或者粘贴日志输出 * <code>[filter]</code> - 排序输出使用的过滤器
 
控制 LuckPerms 日志输出系统,这允许你坚挺所有对玩家的权限检查,当插件检查了玩家的权限,检查会被 verbose handler 处理。
 
如果你的过滤器匹配了权限检查,你就会被通知。
 
<code>on</code> 将会启用这个系统,并且当过滤器匹配时在聊天栏向你发送警告。<code>record</code> 会做相同的事,但是不会向你发送聊天中的警告。<code>off</code> 将会关闭这个系统,<code>paste</code> 将会把前 3500 个结果上传到 GitHub 的 pastebin,并向你提供链接。
 
过滤器用来匹配玩家检查到的权限的开头,你可以使用 <code>&amp;</code>(与)和 <code>|</code>(或)符号,或者用 <code>!</code> 来否定一个匹配。<code>( )</code> 也是支持的。
 
'''例子:'''<br />
* <code>Luck &amp; (essentials | worldedit)</code> - 匹配每个检查 Luck 的以 &quot;essentials&quot; 或 &quot;worldedit&quot; 开头的权限。 * <code>!Luck &amp; !anticheat</code> - 匹配每个对不是 Luck 的玩家的对以不是 &quot;anticheat&quot; 开头的权限的检查。 * <code>anticheat &amp; !anticheat.check</code> - matches any checks starting with &quot;anticheat&quot; but not starting with &quot;anticheat.check&quot;
 
更多的信息可以在[https://github.com/PluginsCDTribe/LuckPerms/wiki/Verbose '''这里''']找到。
 
 
-----
 
====== <code>/lp tree</code> ======
 
'''权限''': luckperms.tree<br />
'''参数''':<br />
* <code>[selection]</code> - 树的根 (指定 <code>.</code> 包含所有的权限) * <code>[max level]</code> - 最多返回多少子分支 (换句话说,树的宽度) * <code>[player]</code> - 检查的在线玩家的名称
 
生成注册在服务器的权限的树来查看,树由服务器中的插件的数据提供而构建,当插件检查权限时这棵树将会扩大。
 
所有的参数都是可选的。默认的选择是 <code>.</code> (只是一个点,代表所有),默认的最大等级是 <code>5</code>。
 
选择允许你只生成树的一部分,比如,选择 <code>luckperms.user</code> 将只会返回树中以 <code>luckperms.user</code> 开头的分支。
 
Max level 允许你定义最多包括的子分支,举个例子,如果你设置最大等级为 <code>2</code>,&quot;luckperms.user&quot; 将会被返回,但是 &quot;luckperms.user.info&quot; 将不会被显示。
 
 
-----
 
====== <code>/lp search</code> ======
 
'''权限''': luckperms.search<br />
'''参数''':<br />
* <code>&lt;permission&gt;</code> - 搜索的权限
 
搜索所有用户/组的特定权限,返回分页的所有条目的列表。
 
 
-----
 
====== <code>/lp check</code> ======
 
'''权限''': luckperms.check<br />
'''参数''':<br />
* <code>&lt;user&gt;</code> - 检查的玩家 * <code>&lt;permission&gt;</code> - 检查的权限
 
执行一个普通的对在线玩家的权限检查,返回结果,这个检查与其他插件的权限检查的结果相同。
 
 
-----
 
====== <code>/lp networksync</code> ======
 
'''权限''': luckperms.sync<br />
刷新所有存储提供的缓存数据,接着(如果提供了的话)使用消息服务来请求连接的其他的服务器并请求所有服务器同步。
 
 
-----
 
====== <code>/lp import</code> ======
 
'''权限''': luckperms.import<br />
'''参数''':<br />
* <code>&lt;file&gt;</code> - 导入的文件
 
从文件导入 LuckPerms 的数据,文件必须是一列命令,以 &quot;/luckperms&quot; 开头,这个文件可以使用 export 命令生成,文件必须在插件的目录下。
 
 
-----
 
====== <code>/lp export</code> ======
 
'''权限''': luckperms.export<br />
'''参数''':<br />
* <code>&lt;file&gt;</code> - 导出的文件
 
将 LuckPerms 的数据导出到一个文件,这个文件也可以作为一个备份,或者在 LuckPerms 的安装之间转移数据。这个文件可以使用 import 命令重新导入,生成的文件在插件的目录下。
 
 
-----
 
====== <code>/lp reloadconfig</code> ======
 
'''权限''': luckperms.reloadconfig<br />
重载配置文件的部分值。不是所有的条目都会被这个命令重载,有些需要一次完全的服务器重启才能生效(比如存储的设置)。
 
 
-----
 
====== <code>/lp bulkupdate</code> ======
 
'''权限''': '''仅控制台'''<br />
允许你执行一次对所有权限数据的块编辑。详细的指南可以在[https://github.com/PluginsCDTribe/LuckPerms/wiki/Bulk-Editing 这里]找到。
 
 
-----
 
====== <code>/lp migration</code> ======
 
'''权限''': luckperms.migration<br />
迁移系统使用的主命令。允许你从其他的权限插件导入权限数据,更多的关于这个特性的信息可以在[https://github.com/PluginsCDTribe/LuckPerms/wiki/Migration 这里]找到。
 
 
-----
 
====== <code>/lp creategroup</code> ======
 
'''权限''': luckperms.creategroup<br />
'''参数''':<br />
* <code>&lt;name&gt;</code> - 组的名称
 
创建一个新的组。
 
 
-----
 
====== <code>/lp deletegroup</code> ======
 
'''权限''': luckperms.deletegroup<br />
'''参数''':<br />
* <code>&lt;name&gt;</code> - 组的名称
 
永久的删除一个组。
 
 
-----
 
====== <code>/lp listgroups</code> ======
 
'''权限''': luckperms.listgroups<br />
显示当前的所有的组。
 
 
-----
 
====== <code>/lp createtrack</code> ======
 
'''权限''': luckperms.createtrack<br />
'''参数''':<br />
* <code>&lt;name&gt;</code> - 路线名称
 
创建新的路线。
 
 
-----
 
====== <code>/lp deletetrack</code> ======
 
'''权限''': luckperms.deletetrack<br />
'''参数''':<br />
* <code>&lt;name&gt;</code> - 路线的名称
 
永久删除一个路线。
 
 
-----
 
====== <code>/lp listtracks</code> ======
 
'''权限''': luckperms.listtracks<br />
显示当前所有的路线。
 
 
-----
 
===== 用户 (/lp user &lt;user&gt; ...) =====
 
 
-----
 
====== <code>/lp user &lt;user&gt; info</code> ======
 
'''权限''': luckperms.user.info<br />
显示一个用户的信息,包括用户名,主组,继承组,和当前的上下文。
 
 
-----
 
====== <code>/lp user &lt;user&gt; editor</code> ======
 
'''权限''': luckperms.user.editor<br />
开启编辑指定的用户的权限的网页接口,当更改保存后,你将会收到一条命令,使用后使更改生效。
 
 
-----
 
====== <code>/lp user &lt;user&gt; switchprimarygroup</code> ======
 
'''权限''': luckperms.user.switchprimarygroup<br />
'''参数''':<br />
* <code>&lt;group&gt;</code> - 切换的组
 
这个命令允许你更改用户的主组,如果他们还不是这个组的成员,他们将被添加到新的组。这不应该作为 &quot;parent set&quot; 命令的替代,他们的现有的主组将不会被移除,而是作为继承组(一个用户可以有多个继承组)。
 
如果 <code>primary-group-calculation</code> 选项被设置为不是 &quot;stored&quot; 的其他东西,你应该使用 <code>parent add</code>(#lp-usergroup-usergroup-parent-add) 或者 <code>parent set</code>(#lp-usergroup-usergroup-parent-set) 命令而不是这个命令。
 
 
-----
 
====== <code>/lp user &lt;user&gt; promote</code> ======
 
'''权限''': luckperms.user.promote<br />
'''参数''':<br />
* <code>&lt;track&gt;</code> - 升级遵循的路线 * <code>[context...]</code> - 升级使用的上下文
 
这个命令将会沿着一条路线提升玩家,命令会检查玩家在给出的上下文里是否在这个路线上,如果用户没有在这条路线,他们将会被加入这条路线的第一个组,如果玩家在这条路线上的不止一个组,命令将会执行失败。在其他情况下,玩家将会被成功提升,并将会被从现有的组移除。如果路线动作影响了用户的主组,他们也会被更新。
 
 
-----
 
====== <code>/lp user &lt;user&gt; demote</code> ======
 
'''权限''': luckperms.user.demote<br />
'''参数''':<br />
* <code>&lt;track&gt;</code> - 降级的遵循的路线 * <code>[context...]</code> - 降级使用的上下文
 
这个命令将会沿着一条路线降级玩家,命令会检查玩家在给出的上下文里是否在这个路线上,如果用户没有在这条路线,或者玩家在这条路线上的不止一个组,命令将会执行失败。在其他情况下,玩家将会被成功降级,并将会被从现有的组移除。如果路线动作影响了用户的主组,他们也会被更新。
 
 
-----
 
====== <code>/lp user &lt;user&gt; showtracks</code> ======
 
'''权限''': luckperms.user.showtracks<br />
显示玩家当前所在的全部路线。
 
 
-----
 
====== <code>/lp user &lt;user&gt; clear</code> ======
 
'''权限''': luckperms.user.clear<br />
'''参数''':<br />
* <code>[context...]</code> - 用于过滤的上下文
 
清除玩家的权限,继承组和元数据。
 
 
-----
 
===== 组 (/lp group &lt;group&gt; ...) =====
 
 
-----
 
====== <code>/lp group &lt;group&gt; info</code> ======
 
'''权限''': luckperms.group.info<br />
显示一个组的信息。
 
 
-----
 
====== <code>/lp group &lt;group&gt; editor</code> ======
 
'''权限''': luckperms.group.editor<br />
开启编辑指定的组的权限的网页接口,当更改保存后,你将会收到一条命令,使用后使更改生效。
 
 
-----
 
====== <code>/lp group &lt;group&gt; listmembers</code> ======
 
'''权限''': luckperms.group.listmembers<br />
'''参数''':<br />
* <code>[page]</code> - 查看的页数
 
显示直接继承这个组的用户/组
 
 
-----
 
====== <code>/lp group &lt;group&gt; setweight</code> ======
 
'''权限''': luckperms.group.setweight<br />
'''参数''':<br />
* <code>&lt;weight&gt;</code> - 设置的权重
 
设置组的权重值,这决定了决定用户的权限的顺序。越大的值代表越高的权重。
 
 
-----
 
====== <code>/lp group &lt;group&gt; showtracks</code> ======
 
'''权限''': luckperms.group.showtracks<br />
显示一个组所在的所有的路线。
 
 
-----
 
====== <code>/lp group &lt;group&gt; clear</code> ======
 
'''权限''': luckperms.group.clear<br />
'''参数''':<br />
* <code>[context...]</code> - 用于过滤的上下文
 
清除组的权限,继承组和元数据。
 
 
-----
 
====== <code>/lp group &lt;group&gt; rename</code> ======
 
'''权限''': luckperms.group.rename<br />
'''参数''':<br />
* <code>&lt;new name&gt;</code> - 组的新的名称
 
更改组的名称,注意任何组的成员都不会知道这个变更,他们还将在原来的旧组的组名。如果你希望更新这些状态,你应该使用块变更特性来更新存在的条目。
 
 
-----
 
====== <code>/lp group &lt;group&gt; clone</code> ======
 
'''权限''': luckperms.group.clone<br />
'''参数''':<br />
* <code>&lt;new name&gt;</code> - 复制的名称
 
创建一个组的不同名称的拷贝。
 
 
-----
 
===== 权限 (/lp user &lt;user&gt; permission ... | /lp group &lt;group&gt; permission ...) =====
 
 
-----
 
====== <code>/lp user/group &lt;user|group&gt; permission info</code> ======
 
'''权限''': luckperms.user.permission.info 或 luckperms.group.permission.info<br />
显示一个用户/组拥有的所有的权限。
 
 
-----
 
====== <code>/lp user/group &lt;user|group&gt; permission set</code> ======
 
'''权限''': luckperms.user.permission.set or luckperms.group.permission.set<br />
'''参数''':<br />
* <code>&lt;node&gt;</code> - 设置的权限节点 * <code>&lt;true|false&gt;</code> - 设置权限的值 * <code>[context...]</code> - 设置权限的上下文
 
设置(或给予)某个用户/组一个权限,提供 false 值将会否定这个权限。
 
 
-----
 
====== <code>/lp user/group &lt;user|group&gt; permission unset</code> ======
 
'''权限''': luckperms.user.permission.unset or luckperms.group.permission.unset<br />
'''参数''':<br />
* <code>&lt;node&gt;</code> - 取消设置的权限节点 * <code>[context...]</code> - 取消设置权限的上下文
 
取消设置一个用户或组的权限节点。
 
 
-----
 
====== <code>/lp user/group &lt;user|group&gt; permission settemp</code> ======
 
'''权限''': luckperms.user.permission.settemp or luckperms.group.permission.settemp<br />
'''参数''':<br />
* <code>&lt;node&gt;</code> - 设置的权限节点 * <code>&lt;true|false&gt;</code> - 设置的权限的值 * <code>&lt;duration&gt;</code> - 权限过期的时间 * <code>[context...]</code> - 权限设置的上下文
 
给一个玩家/组设置临时权限,提供 false 值将会否定这个权限。持续时间应为时间段或者一个标准的 Unix 时间戳,比如 &quot;3d13h45m&quot; 将会设置权限在 3 天, 13 小时 45 分钟后过期。&quot;1482694200&quot; 会设置过期时间为 7:30PM 于 25th December 2016。
 
 
-----
 
====== <code>/lp user/group &lt;user|group&gt; permission unsettemp</code> ======
 
'''权限''': luckperms.user.permission.unsettemp or luckperms.group.permission.unsettemp<br />
'''参数''':<br />
* <code>&lt;node&gt;</code> - 取消设置的权限节点 * <code>[context...]</code> - 取消设置权限的上下文
 
取消设置一个用户或组的临时权限节点。
 
 
-----
 
====== <code>/lp user/group &lt;user|group&gt; permission check</code> ======
 
'''权限''': luckperms.user.permission.check or luckperms.group.permission.check<br />
'''参数''':<br />
* <code>&lt;node&gt;</code> - 检查的权限节点 * <code>[context...]</code> - 检查的权限节点的上下文
 
检查一个组或者玩家有特定的权限
 
 
-----
 
====== <code>/lp user/group &lt;user|group&gt; permission checkinherits</code> ======
 
'''权限''': luckperms.user.permission.checkinherits or luckperms.group.permission.checkinherits<br />
'''参数''':<br />
* <code>&lt;node&gt;</code> - 检查的权限节点 * <code>[context...]</code> - 检查的权限节点的上下文
 
检查一个组或者玩家继承了特定的权限,如果是,从哪里继承的。
 
 
-----
 
===== 继承组 (/lp user &lt;user&gt; parent ... | /lp group &lt;group&gt; parent ...) =====
 
 
-----
 
====== <code>/lp user/group &lt;user|group&gt; parent info</code> ======
 
'''权限''': luckperms.user.parent.info or luckperms.group.parent.info<br />
显示一个用户/组的继承的组
 
 
-----
 
====== <code>/lp user/group &lt;user|group&gt; parent set</code> ======
 
'''权限''': luckperms.user.parent.set or luckperms.group.parent.set<br />
'''参数''':<br />
* <code>&lt;group&gt;</code> - 设置的组 * <code>[context...]</code> - 设置的组的上下文
 
设置一个用户/组的继承组,不像是 &quot;parent add&quot; 命令,这个命令将会清空所有已经存在的组。&quot;add&quot; 命令只会简单的将组添加到已经存在的组里,如果命令执行时没有上下文环境,这个插件也会更新玩家的主组。
 
 
-----
 
====== <code>/lp user/group &lt;user|group&gt; parent add</code> ======
 
'''权限''': luckperms.user.parent.add or luckperms.group.parent.add<br />
'''参数''':<br />
* <code>&lt;group&gt;</code> - 添加的组 * <code>[context...]</code> - 添加的组用的上下文
 
添加一个集成组到一个玩家/组,不像是 &quot;parent set&quot; 命令,这个命令只会将组添加进已经存在的组的列表。没有已经存在的继承组会被移除,用户的主组也不会被影响。
 
 
-----
 
====== <code>/lp user/group &lt;user|group&gt; parent remove</code> ======
 
'''权限''': luckperms.user.parent.remove or luckperms.group.parent.remove<br />
'''参数''':<br />
* <code>&lt;group&gt;</code> - 移除的组 * <code>[context...]</code> - 移除的组的上下文
 
移除一个用户/组的继承组。
 
 
-----
 
====== <code>/lp user/group &lt;user|group&gt; parent settrack</code> ======
 
'''权限''': luckperms.user.parent.settrack or luckperms.group.parent.settrack<br />
'''参数''':<br />
* <code>&lt;track&gt;</code> - 设置的路线 * <code>&lt;group&gt;</code> - 设置的组,或者这个路线的组的相对位置 * <code>[context...]</code> - 设置的组的上下文
 
设置用户/组在给出的路线的位置,这个跟 set 命令相同,除了这个将会清除在指定的路线上已经存在的组,其他继承组不会被影响。
 
 
-----
 
====== <code>/lp user/group &lt;user|group&gt; parent addtemp</code> ======
 
'''权限''': luckperms.user.parent.addtemp or luckperms.group.parent.addtemp<br />
'''参数''':<br />
* <code>&lt;group&gt;</code> - 添加的组 * <code>&lt;duration&gt;</code> - 组的过期时间 * <code>[context...]</code> - 添加组的上下文
 
给一个玩家/组添加临时继承组。持续时间应为时间段或者一个标准的 Unix 时间戳,比如 &quot;3d13h45m&quot; 将会设置权限在 3 天, 13 小时 45 分钟后过期。&quot;1482694200&quot; 会设置过期时间为 7:30PM 于 25th December 2016。
 
 
-----
 
====== <code>/lp user/group &lt;user|group&gt; parent removetemp</code> ======
 
'''权限''': luckperms.user.parent.removetemp or luckperms.group.parent.removetemp<br />
'''参数''':<br />
* <code>&lt;group&gt;</code> - 移除的组 * <code>[context...]</code> - 移除的组的上下文
 
移除一个用户/组的临时继承组。
 
 
-----
 
====== <code>/lp user/group &lt;user|group&gt; parent clear</code> ======
 
'''权限''': luckperms.user.parent.clear or luckperms.group.parent.clear<br />
'''参数''':<br />
* <code>[context...]</code> - 用于过滤的上下文
 
移除所有继承组。
 
 
-----
 
====== <code>/lp user/group &lt;user|group&gt; parent cleartrack</code> ======
 
'''权限''': luckperms.user.parent.cleartrack or luckperms.group.parent.cleartrack<br />
'''参数''':<br />
* <code>&lt;track&gt;</code> - 移除的路线 * <code>[context...]</code> - 用于过滤的上下文
 
移除指定路线的玩家/组的所有继承组。
 
 
-----
 
===== 元数据 (/lp user &lt;user&gt; meta ... | /lp group &lt;group&gt; meta ...) =====
 
 
-----
 
====== <code>/lp user/group &lt;user|group&gt; meta info</code> ======
 
'''权限''': luckperms.user.meta.info or luckperms.group.meta.info<br />
显示用户/组的继承元数据,前缀和后缀。
 
 
-----
 
====== <code>/lp user/group &lt;user|group&gt; meta set</code> ======
 
'''权限''': luckperms.user.meta.set or luckperms.group.meta.set<br />
'''参数''':<br />
* <code>&lt;key&gt;</code> - 设置的键值 * <code>&lt;value&gt;</code> - 设置的键值的值 * <code>[context...]</code> - 设置的元数据的上下文
 
设置用户/组的键值对元数据,这些值可以用于读取并且可以通过其他使用 Vault 或者 Sponge Permissions API 的插件更改。
 
 
-----
 
====== <code>/lp user/group &lt;user|group&gt; meta unset</code> ======
 
'''权限''': luckperms.user.meta.unset or luckperms.group.meta.unset<br />
'''参数''':<br />
* <code>&lt;key&gt;</code> - 取消设置的键 * <code>[context...]</code> - 取消设置的元数据的上下文
 
取消设置一个用户或组的元数据键值。
 
 
-----
 
====== <code>/lp user/group &lt;user|group&gt; meta settemp</code> ======
 
'''权限''': luckperms.user.meta.settemp or luckperms.group.meta.settemp<br />
'''参数''':<br />
* <code>&lt;key&gt;</code> - 设置的键值 * <code>&lt;value&gt;</code> - 设置的键的值 * <code>&lt;duration&gt;</code> - 元数据过期的时间 * <code>[context...]</code> - 设置的元数据的上下文
 
给一个玩家/组设置临时元数据键值,提供 false 值将会否定这个权限。持续时间应为时间段或者一个标准的 Unix 时间戳,比如 &quot;3d13h45m&quot; 将会设置权限在 3 天, 13 小时 45 分钟后过期。&quot;1482694200&quot; 会设置过期时间为 7:30PM 于 25th December 2016。
 
 
-----
 
====== <code>/lp user/group &lt;user|group&gt; meta unsettemp</code> ======
 
'''权限''': luckperms.user.meta.unsettemp or luckperms.group.meta.unsettemp<br />
'''参数''':<br />
* <code>&lt;key&gt;</code> - 取消设置的键 * <code>[context...]</code> - 取消设置的元数据的上下文
 
取消设置一个用户或组的临时元数据。
 
 
-----
 
====== <code>/lp user/group &lt;user|group&gt; meta addprefix</code> ======
 
'''权限''': luckperms.user.meta.addprefix or luckperms.group.meta.addprefix<br />
'''参数''':<br />
* <code>&lt;priority&gt;</code> - 添加前缀的优先度 * <code>&lt;prefix&gt;</code> - 实际的前缀字符串 * <code>[context...]</code> - 添加前缀的上下文
 
给一个玩家/组设置前缀,使用 &quot; &quot; 来添加空格。
 
 
-----
 
====== <code>/lp user/group &lt;user|group&gt; meta addsuffix</code> ======
 
'''权限''': luckperms.user.meta.addsuffix or luckperms.group.meta.addsuffix<br />
'''参数''':<br />
* <code>&lt;priority&gt;</code> - 添加后缀的优先度 * <code>&lt;suffix&gt;</code> - 实际的后缀字符串 * <code>[context...]</code> - 添加后缀的上下文
 
给一个玩家/组设置后缀,使用 &quot; &quot; 来添加空格。
 
 
-----
 
====== <code>/lp user/group &lt;user|group&gt; meta removeprefix</code> ======
 
'''权限''': luckperms.user.meta.removeprefix or luckperms.group.meta.removeprefix<br />
'''参数''':<br />
* <code>&lt;priority&gt;</code> - 移除前缀的优先度 * <code>&lt;prefix&gt;</code> - 实际的前缀字符串 * <code>[context...]</code> - 添加前缀的上下文
 
给一个玩家/组移除前缀,使用 &quot; &quot; 来添加空格。
 
 
-----
 
====== <code>/lp user/group &lt;user|group&gt; meta removesuffix</code> ======
 
'''权限''': luckperms.user.meta.removesuffix or luckperms.group.meta.removesuffix<br />
'''参数''':<br />
* <code>&lt;priority&gt;</code> - 移除后缀的优先度 * <code>&lt;suffix&gt;</code> - 实际的后缀字符串 * <code>[context...]</code> - 添加后缀的上下文
 
给一个玩家/组移除后缀,使用 &quot; &quot; 来添加空格。
 
 
-----
 
====== <code>/lp user/group &lt;user|group&gt; meta addtempprefix</code> ======
 
'''权限''': luckperms.user.meta.addtempprefix or luckperms.group.meta.addtempprefix<br />
'''参数''':<br />
* <code>&lt;priority&gt;</code> - 添加前缀的优先度 * <code>&lt;prefix&gt;</code> - 实际的前缀字符串 * <code>&lt;duration&gt;</code> - 前缀过期的时间 * <code>[context...]</code> - 添加前缀的上下文
 
给一个玩家/组设置临时前缀,提供 false 值将会否定这个权限。持续时间应为时间段或者一个标准的 Unix 时间戳,比如 &quot;3d13h45m&quot; 将会设置权限在 3 天, 13 小时 45 分钟后过期。&quot;1482694200&quot; 会设置过期时间为 7:30PM 于 25th December 2016。
 
 
-----
 
====== <code>/lp user/group &lt;user|group&gt; meta addtempsuffix</code> ======
 
'''权限''': luckperms.user.meta.addtempsuffix or luckperms.group.meta.addtempsuffix<br />
'''参数''':<br />
* <code>&lt;priority&gt;</code> - 添加后缀的优先度 * <code>&lt;suffix&gt;</code> - 实际的后缀字符串 * <code>&lt;duration&gt;</code> - 后缀过期的时间 * <code>[context...]</code> - 添加后缀的上下文
 
给一个玩家/组设置临时后缀,提供 false 值将会否定这个权限。持续时间应为时间段或者一个标准的 Unix 时间戳,比如 &quot;3d13h45m&quot; 将会设置权限在 3 天, 13 小时 45 分钟后过期。&quot;1482694200&quot; 会设置过期时间为 7:30PM 于 25th December 2016。
 
 
-----
 
====== <code>/lp user/group &lt;user|group&gt; meta removetempprefix</code> ======
 
'''权限''': luckperms.user.meta.removetempprefix or luckperms.group.meta.removetempprefix<br />
'''参数''':<br />
* <code>&lt;priority&gt;</code> - 移除前缀的优先度 * <code>&lt;prefix&gt;</code> - 实际的前缀字符串 * <code>[context...]</code> - 添加前缀的上下文
 
给一个玩家/组移除临时前缀,使用 &quot; &quot; 来添加空格。
 
 
-----
 
====== <code>/lp user/group &lt;user|group&gt; meta removetempsuffix</code> ======
 
'''权限''': luckperms.user.meta.removetempsuffix or luckperms.group.meta.removetempsuffix<br />
'''参数''':<br />
* <code>&lt;priority&gt;</code> - 移除后缀的优先度 * <code>&lt;suffix&gt;</code> - 实际的后缀字符串 * <code>[context...]</code> - 添加后缀的上下文
 
给一个玩家/组移除临时后前缀,使用 &quot; &quot; 来添加空格。
 
 
-----
 
====== <code>/lp user/group &lt;user|group&gt; meta clear</code> ======
 
'''权限''': luckperms.user.meta.clear or luckperms.group.meta.clear<br />
'''参数''':<br />
* <code>[context...]</code> - 用于过滤的上下文
 
移除所有的元数据,前后缀。
 
 
-----
 
===== 路线 (/lp track &lt;track&gt; ...) =====
 
 
-----
 
====== <code>/lp track &lt;track&gt; info</code> ======
 
'''权限''': luckperms.track.info<br />
显示路线中的组。
 
 
-----
 
====== <code>/lp track &lt;track&gt; append</code> ======
 
'''权限''': luckperms.track.info<br />
'''参数''':<br />
* <code>&lt;group&gt;</code> - 添加的组
 
在路线结尾追加一个组。
 
 
-----
 
====== <code>/lp track &lt;track&gt; insert</code> ======
 
'''权限''': luckperms.track.insert<br />
'''参数''':<br />
* <code>&lt;group&gt;</code> - 插入的组 * <code>&lt;position&gt;</code> - 插入的组的位置
 
在指定的路线的位置插入一个组,为 1 的位置将会是路径的开始。
 
 
-----
 
====== <code>/lp track &lt;track&gt; remove</code> ======
 
'''权限''': luckperms.track.remove<br />
'''参数''':<br />
* <code>&lt;group&gt;</code> - 移除的组
 
从路线移除一个组。
 
 
-----
 
====== <code>/lp track &lt;track&gt; clear</code> ======
 
'''权限''': luckperms.track.clear<br />
移除路线中的所有的组。
 
 
-----
 
====== <code>/lp track &lt;track&gt; rename</code> ======
 
'''权限''': luckperms.track.rename<br />
'''参数''':<br />
* <code>&lt;new name&gt;</code> - 路线的新名称
 
更改路线的名称。
 
 
-----
 
====== <code>/lp track &lt;track&gt; clone</code> ======
 
'''权限''': luckperms.track.clone<br />
'''参数''':<br />
* <code>&lt;new name&gt;</code> - 拷贝的名称
 
创建路线的不同名称的拷贝。
 
 
-----
 
===== 日志 (/lp log ...) =====
 
 
-----
 
====== <code>/lp log recent</code> ======
 
'''权限''': luckperms.log.recent<br />
'''参数''':<br />
* <code>[user]</code> - 用于过滤的名称、UUID * <code>[page]</code> - 查看的页数
 
显示最近的动作。
 
 
-----
 
====== <code>/lp log search</code> ======
 
'''权限''': luckperms.log.search<br />
'''参数''':<br />
* <code>&lt;query&gt;</code> - 查询的查询 * <code>[page]</code> - 查看的页数
 
搜索匹配查询的所有日志条目。
 
 
-----
 
====== <code>/lp log notify</code> ======
 
'''权限''': luckperms.log.notify<br />
'''参数''':<br />
* <code>[on|off]</code> - 是否开启
 
开关向发送者发送提醒的功能。
 
 
-----
 
====== <code>/lp log export</code> ======
 
'''权限''': luckperms.log.export<br />
'''参数''':<br />
* <code>&lt;file&gt;</code> - the file to export to
 
将日志导出为一列命令,可以被 &quot;/lp import&quot; 命令识别,这个特性应该尽量不使用,推荐使用 &quot;/lp export&quot; 命令。
 
 
-----
 
====== <code>/lp log userhistory</code> ======
 
'''权限''': luckperms.log.userhistory<br />
'''参数''':<br />
* <code>&lt;user&gt;</code> - 搜索的玩家 * <code>[page]</code> - 查看的页数
 
搜索有关给出玩家的日志。
 
 
-----
 
====== <code>/lp log grouphistory</code> ======
 
'''权限''': luckperms.log.grouphistory<br />
'''参数''':<br />
* <code>&lt;group&gt;</code> - 搜索的组 * <code>[page]</code> - 查看的页数
 
搜索有关给出组的日志。
 
 
-----
 
====== <code>/lp log trackhistory</code> ======
 
'''权限''': luckperms.log.trackhistory<br />
'''参数''':<br />
* <code>&lt;track&gt;</code> - 搜索的路线 * <code>[page]</code> - 查看的页数
 
搜索有关给出路线的日志。
 
 
-----
 
==== 指令权限 ====
 
'''注意''': 你可以使用通配符 * '''All commands''' - luckperms.'' '' '''All user commands''' - luckperms.user.'' '' '''All group commands''' - luckperms.group.'' '' '''All track commands''' - luckperms.track.'' '' '''All log commands''' - luckperms.log.*
 
===== 基础 =====
 
* luckperms.sync
* luckperms.info
* luckperms.verbose
* luckperms.tree
* luckperms.search
* luckperms.check
* luckperms.import
* luckperms.export
* luckperms.reloadconfig
* luckperms.migration
* luckperms.creategroup
* luckperms.deletegroup
* luckperms.listgroups
* luckperms.createtrack
* luckperms.deletetrack
* luckperms.listtracks
 
===== 用户 =====
 
* luckperms.user.info
* luckperms.user.permission.info
* luckperms.user.permission.set
* luckperms.user.permission.unset
* luckperms.user.permission.settemp
* luckperms.user.permission.unsettemp
* luckperms.user.permission.check
* luckperms.user.permission.checkinherits
* luckperms.user.parent.info
* luckperms.user.parent.set
* luckperms.user.parent.add
* luckperms.user.parent.remove
* luckperms.user.parent.addtemp
* luckperms.user.parent.removetemp
* luckperms.user.parent.clear
* luckperms.user.meta.info
* luckperms.user.meta.set
* luckperms.user.meta.unset
* luckperms.user.meta.settemp
* luckperms.user.meta.unsettemp
* luckperms.user.meta.addprefix
* luckperms.user.meta.addsuffix
* luckperms.user.meta.removeprefix
* luckperms.user.meta.removesuffix
* luckperms.user.meta.addtempprefix
* luckperms.user.meta.addtempsuffix
* luckperms.user.meta.removetempprefix
* luckperms.user.meta.removetempsuffix
* luckperms.user.meta.clear
* luckperms.user.editor
* luckperms.user.switchprimarygroup
* luckperms.user.showtracks
* luckperms.user.promote
* luckperms.user.demote
* luckperms.user.clear
 
===== 组 =====
 
* luckperms.group.info
* luckperms.group.permission.info
* luckperms.group.permission.set
* luckperms.group.permission.unset
* luckperms.group.permission.settemp
* luckperms.group.permission.unsettemp
* luckperms.group.permission.check
* luckperms.group.permission.checkinherits
* luckperms.group.parent.info
* luckperms.group.parent.set
* luckperms.group.parent.add
* luckperms.group.parent.remove
* luckperms.group.parent.addtemp
* luckperms.group.parent.removetemp
* luckperms.group.parent.clear
* luckperms.group.meta.info
* luckperms.group.meta.set
* luckperms.group.meta.unset
* luckperms.group.meta.settemp
* luckperms.group.meta.unsettemp
* luckperms.group.meta.addprefix
* luckperms.group.meta.addsuffix
* luckperms.group.meta.removeprefix
* luckperms.group.meta.removesuffix
* luckperms.group.meta.addtempprefix
* luckperms.group.meta.addtempsuffix
* luckperms.group.meta.removetempprefix
* luckperms.group.meta.removetempsuffix
* luckperms.group.meta.clear
* luckperms.group.editor
* luckperms.group.listmembers
* luckperms.group.showtracks
* luckperms.group.setweight
* luckperms.group.clear
* luckperms.group.rename
* luckperms.group.clone
 
===== 路线 =====
 
* luckperms.track.info
* luckperms.track.append
* luckperms.track.insert
* luckperms.track.remove
* luckperms.track.clear
* luckperms.track.rename
* luckperms.track.clone
 
===== 日志 =====
 
* luckperms.log.recent
* luckperms.log.search
* luckperms.log.notify
* luckperms.log.export
* luckperms.log.userhistory
* luckperms.log.grouphistory
* luckperms.log.trackhistory
 
===从其他插件迁移数据===
LuckPerms 有内置的支持其他的权限插件轻松迁移到 LuckPerms 的功能。
 
==== 开始之前 ====
 
需要注意的是这个系统还不是那么的完美,在绝大多数情况下,它在转变数据时相当不错,但是不是所有的数据都是相同的,并且有时我可能没有考虑这么多。
 
LuckPerms 有和其他权限插件相同的地方,但是有些部分从根本上不同,有些迁移运用了一些技巧。
 
另外,让插件迁移你的所有的数据意味着你没有机会学习任何一个 LuckPerms 命令,这可能会是一个麻烦的地方,如果你是从 PermissionsEx 或者 GroupManager 迁移来的数据,你应该看看 [https://github.com/PluginsCDTribe/LuckPerms/wiki/GM-&-PEX-Command-Equivalents GM PEX 的等同命令]
 
如果你使用了老版本的权限插件,或者你根本不喜欢的,现在可能是一个机会来重新构建清理,顺便学习 LuckPerms 的命令!
 
不?!就喜欢你现在的权限插件?让我们来迁移。
 
==== 目前支持的插件 ====
 
{|
! Bukkit / Spigot
! BungeeCord
! Sponge
|-
| GroupManager
| BungeePerms
| PermissionsEx
|-
| PermissionsEx
|
 
| PermissionManager
|-
| zPermissions
|
 
|
 
|-
| PowerfulPerms
|
 
|
 
|-
| bPermissions
|
 
|
 
|}
 
==== 怎么做 ===
 
迁移的处理很简单,但是每个平台可能有不同。
 
# 将 LuckPerms jar 文件放入你的服务器文件夹。
# 保证两个权限插件的文件夹在同一个文件夹里(现在还不要卸载)
# 开启服务器,你可以在活跃的服务器来进行这个操作,但是我建议在没有人的服务器上进行。
 
'''运行一下命令: <code>lp migration &lt;插件名&gt;</code>'''
 
有些插件需要你填写额外的选项/标签,如果需要,你会在迁移之前被通知。
 
接着只需要让 LuckPerms 处理剩下的事了!你将会被提示迁移进度,完成时也会被提示。
 
当处理完成,停止服务器,移除其他权限插件的 jar,再次开启你的服务器。
 
控制台的输出一定是冗长繁杂的,以 &quot;(LP) LOG&quot; 开头的命令都可以忽略,但是栈堆信息不应该忽略(一般表示出现了什么问题)。如果你的迁移输出含有栈堆信息,请反馈给我,更多的信息在这一个页面的底部。
 
===== PowerfulPerms =====
 
处理 PowerfulPerms 的过程更加复杂。
 
玩家的信息只有在加入服务器时才被加载,插件 API 没有方法一次性获得所有的玩家的数据。
 
这意味着我们在导入数据时,我们必须得查询 PowerfulPerms MySQL 表来获得所有玩家的信息。
 
命令使用将会不同。
 
<code>/luckperms migration powerfulperms [address] [database] [username] [password] [db table]</code>
 
解释: * address = MySQL 服务器的 IP 地址,比如 127.0.0.1:3306 * database = PowerfulPerms 插件使用的数据库的名称 * username = SQL 服务器登入需要的用户名 * password = SQL 服务器登入需要的密码 * db table = 存储玩家数据的表名(尽管我们只关注 UUID 列表)
 
默认的表名,据我所知,是 &quot;players&quot;,但是如果你添加了表名的前缀,你需要添加他们。
 
比如如果我的表的前缀是 &quot;pp_&quot;,那么 db table = &quot;pp_players&quot;(不需要引号)
 
比如: <code>/luckperms migration powerfulperms 127.0.0.1:3306 minecraft root passw0rd players</code>
 
==== 错误 ====
 
如果这个命令不存在,请检查这个插件是否正确加载。
 
如果处理没有完成,并且打印了错误消息,请在 GitHub 提交 issue 或者 [https://github.com/PluginsCDTribe/LuckPerms/wiki#cant-find-something 在这里联系我],我将尽力尽可能快的回复你。
 
===GM&PEX对应等效指令===
我编写这部分WIKI内容的目的是为了帮助用户们适应从GM/PEX到LuckPerm的转变, 这里我制作了一份对应等效指令的表格,方便用户随时查阅。
 
==== Group Manager ====
 
{|
! Group Manager 命令
! LuckPerms 命令
|-
| manuadd &lt;玩家&gt; &lt;组&gt;
| lp user &lt;玩家&gt; parent set &lt;组&gt;
|-
| manudel &lt;玩家&gt;
| lp user &lt;玩家&gt; clear
|-
| manuaddsub &lt;玩家&gt; &lt;组&gt;
| lp user &lt;玩家&gt; parent add &lt;组&gt;
|-
| manudelsub &lt;玩家&gt; &lt;组&gt;
| lp user &lt;玩家&gt; parent remove &lt;组&gt;
|-
| manpromote &lt;玩家&gt; &lt;组&gt;
| lp user &lt;玩家&gt; promote &lt;track&gt;
|-
| mandemote &lt;玩家&gt; &lt;组&gt;
| lp user &lt;玩家&gt; demote &lt;track&gt;
|-
| manwhois &lt;玩家&gt;
| lp user &lt;玩家&gt; info
|-
| manuaddp &lt;玩家&gt; &lt;权限&gt;
| lp user &lt;玩家&gt; permission set &lt;权限&gt; true
|-
| manudelp &lt;玩家&gt; &lt;权限&gt;
| lp user &lt;玩家&gt; permission unset &lt;权限&gt;
|-
| manulistp &lt;玩家&gt;
| lp user &lt;玩家&gt; permission info
|-
| manucheckp &lt;玩家&gt; &lt;权限&gt;
| lp user &lt;玩家&gt; haspermission &lt;权限&gt;
|-
| manuaddv &lt;玩家&gt; prefix &lt;值&gt;
| lp user &lt;玩家&gt; meta addprefix &lt;优先级&gt; &lt;值&gt;
|-
| manuaddv &lt;玩家&gt; suffix &lt;值&gt;
| lp user &lt;玩家&gt; meta addsuffix &lt;优先级&gt; &lt;值&gt;
|-
| manuaddv &lt;玩家&gt; &lt;变量&gt; &lt;值&gt;
| lp user &lt;玩家&gt; meta set &lt;变量&gt; &lt;值&gt;
|-
| manudelv &lt;玩家&gt; &lt;变量&gt;
| lp user &lt;玩家&gt; meta unset &lt;变量&gt;
|-
| manulistv &lt;玩家&gt;
| lp user &lt;玩家&gt; meta info
|-
|
 
|
 
|-
| mangadd &lt;组&gt;
| lp creategroup &lt;组&gt;
|-
| mangdel &lt;组&gt;
| lp deletegroup &lt;组&gt;
|-
| mangaddi &lt;组1&gt; &lt;组2&gt;
| lp group &lt;组1&gt; parent add &lt;组2&gt;
|-
| mangdeli &lt;组1&gt; &lt;组2&gt;
| lp group &lt;组1&gt; parent remove &lt;组2&gt;
|-
| listgroups
| lp listgroups
|-
| mangaddp &lt;组&gt; &lt;权限&gt;
| lp group &lt;组&gt; permission set &lt;权限&gt; true
|-
| mangdelp &lt;组&gt; &lt;权限&gt;
| lp group &lt;组&gt; permission unset &lt;权限&gt;
|-
| manglistp &lt;组&gt;
| lp group &lt;组&gt; permission info
|-
| mangcheckp &lt;组&gt; &lt;权限&gt;
| lp group &lt;组&gt; haspermission &lt;权限&gt;
|-
| mangaddv &lt;玩家&gt; prefix &lt;值&gt;
| lp group &lt;组&gt; meta addprefix &lt;优先级&gt; &lt;值&gt;
|-
| mangaddv &lt;玩家&gt; suffix &lt;值&gt;
| lp group &lt;组&gt; meta addsuffix &lt;优先级&gt; &lt;值&gt;
|-
| mangaddv &lt;玩家&gt; &lt;变量&gt; &lt;值&gt;
| lp group &lt;组&gt; meta set &lt;变量&gt; &lt;值&gt;
|-
| mangdelv &lt;玩家&gt; &lt;变量&gt;
| lp group &lt;组&gt; meta unset &lt;变量&gt;
|-
| manglistv &lt;玩家&gt;
| lp group &lt;组&gt; meta info
|-
|
 
|
 
|-
| mansave
| lp sync
|-
| manload
| lp sync
|}
 
==== PermissionsEx ====
 
{|
!width="44%"| PermissionsEx 命令
!width="55%"| LuckPerms 命令
|-
| pex
| lp
|-
| pex reload
| lp sync
|-
| pex toggle debug
| lp verbose true
|-
| pex user &lt;用户&gt; check &lt;权限&gt;
| lp user &lt;用户&gt; haspermission &lt;权限&gt;
|-
| pex backend
| lp info
|-
| pex import &lt;backend&gt;
| lp export &lt;file&gt; / lp import &lt;file&gt;
|-
| pex set default group &lt;组&gt;
| (in the config file)
|-
|
 
|
 
|-
| pex user &lt;用户&gt; list
| lp user &lt;用户&gt; permission info
|-
| pex user &lt;用户&gt; prefix
| lp user &lt;用户&gt; meta info
|-
| pex user &lt;用户&gt; prefix &lt;前缀&gt;
| lp user &lt;用户&gt; meta addprefix &lt;优先级&gt; &lt;前缀&gt;
|-
| pex user &lt;用户&gt; suffix
| lp user &lt;用户&gt; meta info
|-
| pex user &lt;用户&gt; suffix &lt;后缀&gt;
| lp user &lt;用户&gt; meta addsuffix &lt;优先级&gt; &lt;后缀&gt;
|-
| pex user &lt;用户&gt; delete
| lp user &lt;用户&gt; clear
|-
| pex user &lt;用户&gt; add &lt;权限&gt; &lt;世界&gt;
| lp user &lt;用户&gt; permission set &lt;权限&gt; true global &lt;世界&gt;
|-
| pex user &lt;用户&gt; remove &lt;权限&gt; &lt;世界&gt;
| lp user &lt;用户&gt; permission unset &lt;权限&gt; global &lt;世界&gt;
|-
| pex user &lt;用户&gt; timed add &lt;权限&gt; &lt;时间&gt; &lt;世界&gt;
| lp user &lt;用户&gt; permission settemp &lt;权限&gt; true &lt;时间&gt; global &lt;世界&gt;
|-
| pex user &lt;用户&gt; timed remove &lt;权限&gt; &lt;时间&gt; &lt;世界&gt;
| lp user &lt;用户&gt; permission settemp &lt;权限&gt; true &lt;时间&gt; global &lt;世界&gt;
|-
| pex user &lt;用户&gt; set &lt;option&gt; &lt;值&gt; &lt;世界&gt;
| lp user &lt;用户&gt; meta set &lt;option&gt; &lt;值&gt; global &lt;世界&gt;
|-
|
 
|
 
|-
| pex user &lt;用户&gt; group list
| lp user &lt;用户&gt; parent info
|-
| pex user &lt;用户&gt; group add &lt;组&gt; &lt;世界&gt;
| lp user &lt;用户&gt; parent add &lt;组&gt; global &lt;世界&gt;
|-
| pex user &lt;用户&gt; group add &lt;组&gt; &lt;世界&gt; &lt;时间&gt;
| lp user &lt;用户&gt; parent addtemp &lt;组&gt; &lt;时间&gt; global &lt;世界&gt;
|-
| pex user &lt;用户&gt; group set &lt;组&gt;
| lp user &lt;用户&gt; parent set &lt;组&gt;
|-
| pex user &lt;用户&gt; group remove &lt;组&gt; &lt;世界&gt;
| lp user &lt;用户&gt; parent remove &lt;组&gt; global &lt;世界&gt;
|-
| pex groups list
| lp listgroups
|-
| pex group &lt;组&gt; list
| lp group &lt;组&gt; permission info
|-
| pex group &lt;组&gt; prefix
| lp group &lt;组&gt; meta info
|-
| pex group &lt;组&gt; prefix &lt;前缀&gt;
| lp group &lt;组&gt; meta addprefix &lt;优先级&gt; &lt;前缀&gt;
|-
| pex group &lt;组&gt; suffix
| lp group &lt;组&gt; meta info
|-
| pex group &lt;组&gt; suffix &lt;后缀&gt;
| lp group &lt;组&gt; meta addsuffix &lt;优先级&gt; &lt;后缀&gt;
|-
| pex group &lt;组&gt; create
| lp creategroup &lt;组&gt;
|-
| pex group &lt;组&gt; delete
| lp deletegroup &lt;组&gt;
|-
| pex group &lt;组&gt; parents list
| lp group &lt;组&gt; parent info
|-
| pex group &lt;组&gt; parents set &lt;parents&gt;
| lp group &lt;组&gt; parent add &lt;parent&gt;
|-
| pex group &lt;组&gt; add &lt;权限&gt; &lt;世界&gt;
| lp group &lt;组&gt; permission set &lt;权限&gt; true global &lt;世界&gt;
|-
| pex group &lt;组&gt; remove &lt;权限&gt; &lt;世界&gt;
| lp group &lt;组&gt; permission unset &lt;权限&gt; global &lt;世界&gt;
|-
| pex group &lt;组&gt; timed add &lt;权限&gt; &lt;时间&gt; &lt;世界&gt;
| lp group &lt;组&gt; permission settemp &lt;权限&gt; true &lt;时间&gt; global &lt;世界&gt;
|-
| pex group &lt;组&gt; timed remove &lt;权限&gt; &lt;时间&gt; &lt;世界&gt;
| lp group &lt;组&gt; permission settemp &lt;权限&gt; true &lt;时间&gt; global &lt;世界&gt;
|-
| pex group &lt;组&gt; set &lt;option&gt; &lt;值&gt; &lt;世界&gt;
| lp group &lt;组&gt; meta set &lt;option&gt; &lt;值&gt; global &lt;世界&gt;
|-
|
 
|
 
|-
| pex group &lt;组&gt; user add &lt;用户&gt;
| lp user &lt;用户&gt; parent add &lt;组&gt;
|-
| pex group &lt;组&gt; user remove &lt;用户&gt;
| lp user &lt;用户&gt; parent remove &lt;组&gt;
|-
| pex promote &lt;用户&gt; &lt;ladder&gt;
| lp user &lt;用户&gt; promote &lt;ladder&gt;
|-
| pex demote &lt;用户&gt; &lt;ladder&gt;
| lp user &lt;用户&gt; demote &lt;ladder&gt;
|}
 
===常见问题===
 
这些是我经常被问到的问题,我很高兴你在直接问我之前看了这些问题。
 
==== 我在用 EssentialsChat 然后它不工作了 ====
 
请确保你在使用最新版的 [https://ci.drtshock.net/job/essentialsx/ EssentialsX] 并且你安装了 [https://dev.bukkit.org/bukkit-plugins/vault/ Vault]。EssentialsX 的 X 是很重要的,老的版本不会工作。
 
==== 我在哪里安装 LuckPerms 呢? ====
 
如果你在运行很多的服务器,你应该将 LuckPerms 放入每个服务器的 plugins 文件夹。
 
如果你想使用 BungeeCord 来应用权限,你需要将 LuckPermsBungee.jar 放入 BungeeCord 插件文件夹。
 
如果你选择只在 BungeeCord 安装 LuckPerms,他将不会影响任何 Spigot/Sponge 服务器的权限检查,如果你想要使用 LuckPerms,你必须将 LuckPerms 安装在这些服务器。
 
==== 我可以只在 BungeeCord 安装 LuckPerms 吗? ====
 
在 BungeeCord 上的权限系统是完全独立于 Spigot/Sponge 服务器的。
 
如果你想让 Spigot/Sponge 的权限检查被 LuckPerms 处理的话,在每个 Spigot/Sponge 服务器都安装 LuckPerms。
 
如果你想让 BungeeCord 服务器的权限检查被 LuckPerms 处理,在 BungeeCord 服务器安装 LuckPerms。
 
你可以'''只'''在 BungeeCord 安装 LuckPerms,但是 Spigot/Sponge 服务器的权限检查将不会被 LuckPerms 处理。
 
==== 我应该怎样在多个服务器中同步权限呢? ====
 
将每个 LuckPerms 连接到同一个 MySQL/MongoDB 服务器,你可以使用 /luckperms sync 来从数据库获得最后的权限更新。你也可以 [https://github.com/PluginsCDTribe/LuckPerms/wiki/Instant-Update-Propagation#messaging-services 建立一个通讯服务] 来立刻在你的服务器之间同步更改。
 
==== LuckPerms 不能连接到我的 Redis 服务器 ====
 
检查以下是否正常:
 
* 你正在使用正确的地址和端口
* 你的密码是正确的
* 没有防火墙规则阻拦了连接
* Redis 服务器正在运行
 
==== LuckPerms 不能连接到我的 MySQL 服务器 ====
 
检查以下是否正常:
 
* 你正在使用正确的地址和端口
* 你使用了正确的用户名 / 密码
* 数据库存在并且用户可以访问
* 该服务器在线并且接受连接
* 没有防火墙规则阻拦了连接
* MySQL 正确绑定了端口,并且安装 LuckPerms 的服务器可以访问
* 检查 MySQL 的连接限制没有超过,默认 LuckPerms 会使用 10 个连接,如果你有过多的插件连接了同一个服务器,你需要增加这个限制。
 
如果你得到了 <code>Communications link failure</code> 的错误,或者由于超时导致的错误,那么上面的有一条是不正常的。
 
给玩家 LuckPerms 表的权限,使用
 
<source lang="sql">GRANT ALL PRIVILEGES ON [databasename].* TO '[username]'@'[ipaddress]';</source>
记得替换 [ ] 里的东西。
 
比如:
 
<source lang="sql">GRANT ALL PRIVILEGES ON luckperms.* TO 'luck'@'%';</source>
接着当你完成这个更改后,使用
 
<source lang="sql">FLUSH PRIVILEGES;</source>
 
==特性==
===权限检查系统(Verbose)===
你曾经经历过想要找到某条命令或某种特性的使用权限,但找不到作者提供的帮助文档这种情况吗?
 
可能作者提供的帮助文档过期了,或是内含的信息不正确。可能你想要修复玩家没有正确权限的问题,或是仅仅是对插件所检查的权限感兴趣……
 
权限检查系统能够让你监视一段时间内的权限检查操作!😄
 
==== 如何使用本系统 ====
 
指令的使用方法如下:
 
<code>/lp verbose &lt;on|record|off|paste&gt; [filter]</code>
 
第一个参数会启用/禁用本系统,第二个参数设置权限筛选器。
 
{|
! 选项
! 描述
|-
| <code>on</code>
| 启用本系统,并且在设置的筛选权限被检查时会发消息提示您。
|-
| <code>record</code>
| 与“on”的作用相同,但是您的聊天框不会收到提醒。
|-
| <code>off</code>
| 会禁用本系统,清除内存中所有的存储记忆。
|-
| <code>paste</code>
| 与“off”的作用相同,但是会将最先的500个结果上传到一个网页上,然后提供给你一个链接。
|}
 
==== 筛选器 ====
 
筛选器是用来匹配权限节点的工具,它会过滤掉你不需要的权限。它可以筛选玩家名,或更高级的东西。
 
筛选器输入的字符能够匹配所有带有该字符的权限的开头,或是玩家的全名。
 
你可以使用 <code>&amp;</code> (表示 和), <code>|</code> (表示 或), 和 <code>!</code> (表示 非)来设置筛选文本,输入时也支持使用小括号 <code>(  )</code> 。
 
===== 一些使用示例 =====
 
* <code>Luck &amp; (essentials | worldedit)</code> —— 会匹配玩家“Luck”的所有以“essentials”或“worldedit”开头的权限检查
* <code>Luck &amp; !anticheat</code> —— 会匹配玩家“Luck”所有不以“anticheat”为开头的权限检查
* <code>anticheat &amp; !anticheat.check</code> —— 会匹配所有玩家以“anticheat”开头,但不是 &quot;anticheat.check&quot; 权限的权限检查
 
==== 示例 ====
 
我使用了指令 <code>/lp verbose record Luck &amp; minecraft</code>,这打开了权限检查系统,然后会检查 &quot;Luck&quot; 玩家所有以 &quot;minecraft&quot; 开头的权限。
 
然后我使用了 <code>/help</code> 命令(来让服务器对我进行权限检查),然后我输入了 <code>/lp verbose paste</code>。
 
然后插件就会将检查的结果上传,然后返回了这个链接。[https://git.io/vDUba <code>https://git.io/vDUba</code>]
 
如果你点开这个链接看看的话,你会看到检查的结果的。 😄
 
在Metadata数据信息下面,你会看到一些有关于检查的数据。
 
你可以注意到 <code>Count: 58 / 72</code>,这就是说在这段检查期间,共检查了72条权限,其中58条符合你设定的筛选器。
 
那些满足筛选器的检查结果已经列出来了。


=== 大量编辑 ===
[[分类:Spigot插件]][[分类:CraftBukkit插件]][[分类:Sponge插件]]
[[Category:管理]][[Category:安全]]

2024年3月30日 (六) 10:23的最新版本

Minecraft插件百科提醒您,此条目或需要大幅度整改,建议新用户不要模仿此条目格式建立新条目。

原因在于:

  • 页面冗长,需要拆分子页面
若您清楚改善现状的方法,可以尝试帮忙改进
LuckPerms
外文名LuckPerms
作者Luck
插件类型Spigot / CraftBukkit / Sponge
最新版本4.0.18(Bukkit) / 4.0.60(Sponge)
兼容服务端1.7, 1.8, 1.9, 1.10, 1.11, 1.12,1.13,1.14,1.15,1.16,1.17,1.18,1.19,1.20
源地址SpigotMC
SpongePowered

LuckPerms是Minecraft服务端(Bukkit / Spigot,BungeeCord等)的权限插件。它允许服务器管理员通过创建组和分配权限来控制玩家可以使用的功能,由Luck开发。

为什么选择LuckPerms?

LuckPerm是一款先进、高等的权限插件,仅仅以快速稳定可靠灵活多变的特点,

便可以替代现有的许多权限插件,例如PermissionsEX、GroupManagerX、z/bPermissions、BungeePerms等主流权限插件。

LuckPerms这个插件的计划,本来是围绕着两个主要特点来制作的:高性能、强大且广泛的功能,

填补其他同类插件的功能缺陷、并且建立在同类现有功能上更进一步的优化功能。

LuckPerms还包括了非常广泛的API支持,这是为开发人员的添加的,

并且,luckperms还兼容各式各类Minecraft服务器软件&支持多种数据存储的选择。

来吧兄弟,告诉我,我为什么要使用LuckPerm?

LuckPerm能做很多事情,至少单在技术层面,LuckPerm就胜过大部分同类插件。

我认为这不取决于我制作插件的水平,而是取决于我在LuckPerm上面花费的精力与时间。

LuckPerm是我在2016年开始准备编写的插件,但因为Bukkit变得流行起来,许多同一时期的插件都变成了老牌稳定插件,

不过,这也为我编写LuckPerm提供的很好的参考帮助,因为我可以避免其它同类插件的缺陷,

并且明白它们哪些地方做的特别出色,我可以在其基础之上进一步优化,使那部分功能变得更加引人瞩目。

记着,如果你对LuckPerm技术性方面的内容感兴趣,我推荐你从[命令使用]部分开始阅读

或者看看wiki列出的其他部分内容,在本节的其余部分,我会将阅读重点放到LuckPerm一些全新的特色功能上面。

这些内容是你不太可能从其他插件中找到的,专属luckPerm的特色功能!

Verbose(权限查看系统) Verbose是Luckperms一套完整的权限查看系统。

他可以实时监视并检测其他插件所需的权限

你也可以把录像上传到网上,方便查看、分析和阅读:

[https://git.io/vQitM]

权限树系统

LuckPerm允许你在服务器所有已知权限上建立编写"权限树"。

权限树上的数据是由你所有的插件在服务器注册的权限构成的。

随着你服务器运营时间的增长,因为服务器添加了许多插件,它们都会注册权限,这些数据都会被纳入权限树中。

这是个清真的例子 [https://git.io/vQiti]。 你看到的权限树的颜色,代表了你的玩家是否拥有对应的权限,这一机制很方便的让你查阅到服务器的相应权限。

这还是那个清真的例子 [[1]]

指令界面&TAB补全

LuckPerm的指令系统被我设计的尽可能便捷、易用、人性化,

这样一来,你除了查阅LuckPerm的[大量相关帮助文档],还可以在游戏中查看指令用法、以及指令列表。

LuckPerm的所有指令皆可使用TAB补全功能,这就意味着,你可以通过输入更少的指令来完成你的工作!

这是不是在一定程度极大地提高了你的工作效率呢?就像下面那样:

网站编辑器

除了使用指令来编辑服务器权限相关,LuckPerm还提供了更加便捷的编辑方式,

你可以使用Web网站编辑器来对服务器的权限数据进行快速更改,

任何人都能够使用网站编辑器,不论你使用了哪种存储方式!

网站编辑功能非常容易使用,且易于上手

【图片过大 请去wiki页面查看】

行为记录仪

为了防止服务器中出现心存不轨的管理员,想要私自给自己添加权限,

LuckPerm详细的记录了服务器各类权限的微小变化,

你可以通过行为记录仪来搜索每个人的详细操作。

你也可以查看所有东西的详细历史。

安装

安装

初始设置

1. 下载适合你平台的 `LuckPerms-???-x.x.x.jar` 文件。你可以点这里查看最新的版本。

2. 打开你的 Mod 或插件所在路径,这路径通常要么是 `/server/plugins/` ,要么是 `/server/mods/`。

然后把 LuckPerms 的 jar 文件放入文件夹中。

3. 请完全关闭你的服务器,然后再打开,这会生成默认配置。

4. 完全关闭你的服务器,打开配置文件。配置文件的位置在 `/plugins/LuckPerms/config.yml` 或 `/config/luckperms/luckperms.conf`。

5. 请浏览配置文件,然后根据你的服务器修改设置,尤其是请注意存储相关设置。

6. 再次开启你的服务器。

你可以更改配置文件中的很多内容,文件有很细节化的注释,每个设置的作用注释中都解释的很清楚。

需求

LuckPerms 插件只有一个环境需求。

  • Java 8

没错,唯一需求就是你必须使用 Java 8,LuckPerms 插件在旧版本的Java上不会工作。

到目前为止很多服务器提供商都已经升级到Java 8了,但是如果你的服务器提供商没有升级的话,请温和地和他们谈谈,让他们去升级。

如果你是自己租主机开服的话,你应该对你还没有升级Java感到羞愧!

升级的过程是很简单的,如果你想升级的话网上也有大量的教程。

使用过期的软件肯定不是好的:)

Bukkit版本过旧

如果你收到了类似于 "NoSuchMethod" 或 "ClassNotFound" 这类错误的话,十有八九就是你在使用较旧的Bukkit版本。

在将它作为错误报告给我之前,请尝试使用"Development Builds"(构建版本)下载页面的"Bukkit-Legacy"(Bukkit-旧版)版本。

切换存储类型

LuckPerms 插件所使用的默认数据存储类型是 H2 数据库

所有的数据都会储存在LuckPerms插件目录下的 `luckperms.db.mv.db` 文件之中。

(插件目录为 `/plugins/LuckPerms/` 或 `/luckperms/`)

这个数据格式普通的文本编辑器是**不能读取**的。

如果你想要手动阅读/编辑LuckPerms插件的数据的话,你就需要切换到**YAML或JSON**存储格式,更改 `config.yml` 文件中的配置选项就好了。

更多相关于存储类型的有关信息请阅读[下一节]

选择存储类型

LuckPerms 插件带有很多存储数据的方式,你可以从中选择。

存储类型选项可以在 `config.yml` 或 `luckperms.conf` 文件中修改。

# Which storage method the plugin should use.
# Currently supported: mysql, postgresql, sqlite, h2, json, yaml, mongodb
# Fill out connection info below if you're using MySQL, PostgreSQL or MongoDB
storage-method: h2

请记住如果你想改变存储类型的话,你的数据不会自动转移到新的存储库中。

要想手动在数据存储方式间转移数据的话,请查看这里来获得更多信息。

可用的选项都列在了下面。

H2 / SQLite

默认的存储类型是 H2

这两种文件类型都是以SQL数据库为基础的。

所有的数据都会存储在LuckPerms插件目录下的一个文件之中。

和YAML和JSON方式的不同之处在于,这个文件不能用文本编辑器打开。

你必须使用插件提供的命令才能编辑或查看数据。

如果你选择使用 H2 数据库的话(默认设置),所有的数据都会储存在 `luckperms-h2.mv.db` 文件中。

SQLite 类型所提供的存储文件是 `luckperms-sqlite.db`。

要想使用这两种类型中的一种,请将配置设置为:

storage-method: h2
# or
storage-method: sqlite

JSON / YAML

JSON 和 YAML 存储类型会将数据存储在可读可编辑的文本文件中。YAML 类型所提供的文件扩展名为 `.yml` ,JSON类型所提供的文件扩展名为 `.json`。

这两种类型的存储格式很相似,只是在一些句法上不同。

示例 YAML 文件

uuid: c1d60c50-70b5-4722-8057-87767557e50d
name: Luck
primary-group: default
permissions:
- group.default:
    value: true
- test.permission:
    value: true
    server: factions
- other.test.permission:
    value: false

示例 JSON 文件

{
  "uuid": "c1d60c50-70b5-4722-8057-87767557e50d",
  "name": "Luck",
  "primaryGroup": "default",
  "permissions": [
    {
      "group.default": {
        "value": true
      }
    },
    {
      "test.permission": {
        "value": true,
        "server": "factions"
      }
    },
    {
      "other.test.permission": {
        "value": false,
        "server": "test"
      }
    }
  ]
}

要想使用这两种类型中的一种,请将配置设置为:

storage-method: yaml
# or
storage-method: json

MySQL / PostgreSQL

储存在 MySQL 类型和 PostgreSQL 类型中的数据格式上与上文提及的 H2/SQLite 类型相同,但是数据是储存在远程服务器上的。

这意味着你可以跨服分享相同的数据。

你需要在配置文件中输入你数据库服务器的地址,端口,数据库名,用户名和密码。

这种类型推荐要存储大量数据的用户,或是想要搭建群组服务器的用户所使用。

如果你已经在运行群组服务器,并且想要在子服务器之间同步数据的话,你就必须选择这种类型了。

格式布局示例在这里

要想使用这两种选项中的一种,请将配置设置为:

storage-method: mysql
# or
storage-method: postgresql

MongoDB

LuckPerms 也支持 MongoDB 类型的存储,它也是一种远程数据库,在有些方面上和 MySQL 相似。

这种类型也只会被一小部分的用户所使用。

要想使用这种类型的存储,请将配置设置为:

storage-method: mongodb

使用教程

这篇教程是为之前从来没有使用过权限管理插件的人所准备的。

如果你已经很熟悉权限管理等相关概念了的话,我认为你应该就能够理解命令中的东西了。

这样我就推荐你去阅读命令和权限页面,这样更加“直奔主题”,你也能够更容易理解插件的工作方法。

如果你正在努力想弄明白权限管理相关概念的话,这篇教程就是你起步的最佳地方:)


关键术语

权限

在你的服务器上会有大量的**特性,命令和一些新功能**。

这其中的一些特性是服务器自带的,另一些是由“插件”所添加的。

与这些特性相联系的大多数行为都是由权限所控制的,因此你可以控制哪些用户可以使用你指定的特性或权限。

    • 权限仅仅是个字符串**,并且使用英文的句号(半角 → . ←)分成几部分。

举个例子, “minecraft.command.ban” 就是原版 /ban 命令所使用的权限。

显然我们不想让所有用户都能执行这个命令,所以我们只给我们信任的玩家这个权限。

代表特定行为的使用许可的字符串,我们就称之为权限,它又名“权限节点”,简称“权限”。

权限组

代替单独为每个用户设置权限,我们可以将**权限捆绑为一组**,然后直接将这一组**给予玩家**。

举个例子,在我设置的“admin”权限组中,我可能会添加使用ban和unban指令的权限,然后将玩家加入admin权限组中。

这意味着他们能够获得“admin”权限组所设置的所有权限和他们自身被设置的权限。

继承

用户和权限组能够**互相继承权限**。

举个例子,默认地,所有的用户都会从“default”权限组继承权限。

你可以为你自己的服务器设置你自己的权限组与继承方式,或是制作你自己独特的系统。

举个例子,我设置了三个权限组, “default”, “moderator” 和 “admin”。

我想让“moderator”权限组从“default”权限组继承所有权限,“admin”权限组从“moderator”权限组继承所有权限。

起步

如果你还没有将LuckPerms插件安装在你的服务器上的话,我们推荐你先阅读安装有关的教程。

然后,请确保你在继续之前已经阅读了选择数据存储类型的有关章节。

虽然你在后期也能实现数据之间的转移,但第一次就将他们弄对位置是更好的。

给予修改权限的全部权限

你想做的第一件事情就是给你本插件的所有权限。

当本插件首次安装后,没有人能够使用LuckPerms插件的有关命令。

要想做到这个的话,你需要在服务器控制台输入 `/luckperms user Luck permission set luckperms.* true` 。

当然,请把我的名字换成你自己的(不用担心,这条命令的使用方法之后会详细讲解)

这应该就是运行的结果:

实际上,这条命令起的效果,就是给了 `Luck` 用户 `luckperms.*` 权限。(或者说,为用户设置权限为 true)

你可能已经注意到了我们刚才在权限字符串的末端使用的 `*` 字符了。

这个字符叫做通配符,它会给玩家**所有**以 "luckperms" 为开头的权限。

创建第一个权限组

我们可以使用创建权限组命令来创建一个新的权限组。

让我们创建一个叫做“admin”的权限组,然后给它附加一条权限吧。

首先,运行 `/luckperms creategroup admin` 命令。

这会创建一个叫做“admin”的空权限组。

接下来,我们想为“admin”权限组增加一条权限。

用来修改权限组的命令是 `/luckperms group <group>`

如果你执行这条命令的话,它会为你显示所有可用的子命令。

你可能注意到了第一个子命令是“info”命令。它只会列举出一些权限组相关的信息。

我们可以运行 `/luckperms group admin info` 来查看新建立的“admin”权限组的一些信息。

接下来就是“permission”命令。这能够帮助你修改权限组的权限。

再一次,使用 `/luckperms group admin permission` 命令会列出所有可用的子命令。

再一次,我们看到了更多我们可以执行的命令。

第一个就是另一个 "info" 子命令。

因为它是“permission”子命令下的又一子命令,它就会显示某一权限组所拥有的所有权限。

下面的命令是“set”子命令。

你还记得吗,之前我们使用相似的指令来给玩家 "luckperms.*" 权限。这里它也相同

只需要不加参数运行该命令就可以返回该命令的使用方法。举个例子:

举个例子,我想给我的“admin”用户组 "minecraft.command.ban" 权限。

因此我可以输入 `/luckperms group admin permission set minecraft.command.ban true`

这条命令就会给予 `admin` 用户组 `minecraft.command.ban permission` 权限。

末端的true控制我们设置的权限的启用与否。

你可以将权限的启用与否设置为 `true` 或 `false` 。

为用户或权限组将权限设置为 true 能够让他们拥有该权限,设置为 false 即该权限无效。(指定他们没有该权限)

如果晚些时候我决定不再让“admin”用户组拥有这个权限了,我可以使用 unset 命令来移除该权限的设定。

输入 `/luckperms group admin permission unset minecraft.command.ban`

将玩家加入到权限组中

将用户加入到权限组中需要使用 "parent" 命令。(在我们的命令使用页我们经常用“permission”替换“parent”)

举个例子,把我自己加入“admin”权限组中,我需要使用 `/luckperms user Luck parent add admin`

这条命令会将用户 `Luck` 加入到 `admin` 权限组中。

这意味着任何“admin”权限组所拥有的权限我现在也继承下来了。

让一个权限组继承另一个权限组

就像用户能够继承一样,权限组也能够继承另一个权限组。

举个例子,想想下面这种情况的设置方法。(有些权限仅仅是为了演示而编造出来的)

Admin Mod Default
minecraft.command.ban minecraft.command.mute minecraft.command.say
minecraft.command.pardon minecraft.command.unmute minecraft.command.me
some.cool.admin.perm some.cool.mod.perm
someplugin.vanish |

我想让“admin”权限组中的用户拥有“mod”和“default”权限组的权限,同时“mod”权限组中的用户拥有“default”权限组中的权限。要想实现这个的话,我可以设置用户组之间的相互继承。

`/luckperms group admin parent add mod` 命令会让“admin”权限组继承所有“mod”权限组中的权限。

然后要想让“mod”继承“default”,同样的道理,我可以输入 `/luckperms group mod parent add default`。

继承是可递归的,所以这样以后“admin”权限组就不仅仅继承了“mod”权限组,还继承了“default”权限组。

这意味着“admin”权限组中的玩家拥有“mod”**和**“default”两权限组中的权限了。

在“admin”组的一位用户因此拥有 `minecraft.command.ban`,`minecraft.command.mute` *和* `minecraft.command.say` 权限。

移除继承权限组

要想移除权限组间的继承关系只需要输入一个类似的命令就好了。

要想让我自己不再继承“admin”权限组,我只要输入 `/luckperms user Luck parent remove admin` 就好了。

配置

请见子页面:LuckPerms/配置

特性

请见子页面:Luckperms/特性

开发者

开发者 API

简介

LuckPerms API 允许你更改大量的插件内部编程,并且能够轻松地将 LuckPerms 深度集成到你的插件和系统里。

大多数的其他的权限要么没有 API,要么有很差的 API,或者是有很差的文档的 API,而且里面的方法和类可能随机在不同版本里消失或是移动。Vault 项目就是一个很好的接口,并且是将大量插件一次性集成的很好的方法,可惜他的功能实在是太少了。

LuckPerms 遵循 Semantic 版本控制,也就是意味着一个不向后兼容的新的 API 出现时,主版本会增加这个 API,你可以放心你的集成不会因为版本的不同而崩溃,主要的版本是保持不变的。

如何在项目里使用 API

LuckPerms 的 API 包是 me.lucko.luckperms.api

我的 Nexus 服务器可以在这里找到 https://nexus.lucko.me/,你在你的构建脚本里需要的仓库在 https://repo.lucko.me/

其他有用的链接

Maven

<repositories>
    <repository>
        <id>luck-repo</id>
        <url>https://repo.lucko.me/</url>
    </repository>
</repositories>

<dependencies>
    <dependency>
        <groupId>me.lucko.luckperms</groupId>
        <artifactId>luckperms-api</artifactId>
        <version>3.2</version>
        <scope>provided</scope>
    </dependency>
</dependencies>

Gradle

repositories {
    maven {
        name "luck-repo"
        url "https://repo.lucko.me/"
    }
}

dependencies {
    compile ("me.lucko.luckperms:luckperms-api:3.2")
}

使用指南

使用 API,你需要获得 LuckPermsApi 接口的实例,这可以通过几个方法完成。

// 所有平台 (抛出 IllegalStateException 如果 API 没有被加载)
final LuckPermsApi api = LuckPerms.getApi();

// 或者可选的
Optional<LuckPermsApi> provider = LuckPerms.getApiSafe();
if (provider.isPresent()) {
    final LuckPermsApi api = provider.get();
}

// Bukkit/Spigot
ServicesManager manager = Bukkit.getServicesManager();
if (manager.isProvidedFor(LuckPermsApi.class)) {
    final LuckPermsApi api = manager.getRegistration(LuckPermsApi.class).getProvider();
}

// Sponge
Optional<LuckPermsApi> provider = Sponge.getServiceManager().provide(LuckPermsApi.class);
if (provider.isPresent()) {
    final LuckPermsApi api = provider.get();
}
线程安全的警告

所有 LuckPerms 内部,包括 API 都是线程安全的,你可以在异步线程任意调用 API 而不用担心发生错误。

但是,请注意一些操作,(尤其是存储类)是阻塞的。CompletableFuture 就是用于这种情况:防止由于较差的处理导致的增加的错误,当出现 IO 时主线程等待处理完成。注意在添加 Callback 时指定正确的处理器。

我想将 LuckPerms 作为依赖项

在 Bukkit/Bungee,你需要在你的 plugin.yml 添加以下信息

depend: [LuckPerms]

在 Sponge, 在你的插件声明添加这些。

@Plugin(
        id = "myplugin",
        dependencies = {
                @Dependency(id = "luckperms")
        }
)
public class MyPlugin {
    ...
}
事件

LuckPerms 有一个完整的读写API,也有一个事件监听系统。由于插件的多平台的原因,我们使用了内部的事件系统,而不是每个平台已经使用的事件系统(举个例子,Bukkit Event API)。这意味着简单的注册你的平台的监听器将不会生效。

所有的事件都是异步触发的。这意味着不应该在监听器里交互或者调用任何不是线程安全的方法。

值得注意的是,大多数的 Bukkit/Sponge 都不是线程安全的,并且只应该使用主服务器线程来交互。你应该使用调度器来访问 LuckPerms 的监听器。

我怎样才能监听一个事件

所有的事件接口都可以在 me.lucko.luckperms.api.event 包里找到,它们都继承了 LuckPermsEvent 类。

监听事件应该获得 EventBus 实例,使用 LuckPermsApi#getEventBus即可。

为你的监听器创建另一个类常常是个好想法,这是一个你可以用来参考的类。

package me.lucko.test;

import me.lucko.luckperms.api.event.EventBus;
import me.lucko.luckperms.api.event.log.LogPublishEvent;
import me.lucko.luckperms.api.event.user.UserLoadEvent;
import me.lucko.luckperms.api.event.user.track.UserPromoteEvent;

public class TestListener {
    private final MyPlugin plugin;

    public TestListener(MyPlugin plugin, LuckPermsApi api) {
        this.plugin = plugin;

        EventBus eventBus = api.getEventBus();

        // use a lambda
        eventBus.subscribe(LogPublishEvent.class, e -> e.getCancellationState().set(true));
        eventBus.subscribe(UserLoadEvent.class, e -> {
            System.out.println("User " + e.getUser().getName() + " was loaded!");
            if (e.getUser().hasPermission("some.perm", true)) {
                // Do something
            }
        });

        // use a method reference
        eventBus.subscribe(UserPromoteEvent.class, this::onUserPromote);
    }

    private void onUserPromote(UserPromoteEvent event) {
        Bukkit.getScheduler().runTask(plugin, () -> {
            Bukkit.broadcastMessage(event.getUser().getName() + " was promoted to" + event.getGroupTo().get() + "!");

            Player player = Bukkit.getPlayer(event.getUser().getUuid());
            if (player != null) {
                player.sendMessage("Congrats!");
            }
        });
    }

}

EventBus#subscribe 返回一个 EventHander 实例,可以用来在插件停止的时候取消注册监听器。

示例用法

下面就是一些简短的实例,使用了一些基本的 API 功能。

获得玩家的组

如果你只是想找到一个玩家的组,我非常建议你使用以下的方法(你甚至不需要使用 API)。

public static String getPlayerGroup(Player player, List<String> possibleGroups) {
    for (String group : possibleGroups) {
        if (player.hasPermission("group." + group)) {
            return group;
        }
    }
    return null;
}

记住将你的组排列为优先级的顺序(比如组长在前,成员在后)。

为一个玩家添加权限
LuckPermsApi api = null; // See above for how to get the API instance.

Optional<User> user = api.getUserSafe(uuid);
if (!user.isPresent()) {
    return false; // The user isn't loaded in memory.
}

// Build the permission node we want to set
Node node = api.getNodeFactory().newBuilder(permission).setValue(true).build();

// Set the permission, and return true if the user didn't already have it set.
try {
    user.get().setPermission(node);

    // Now we need to save the user back to the storage
    api.getStorage().saveUser(u);

    return true;
} catch (ObjectAlreadyHasException e) {
    return false;
}
为(可能的)离线玩家添加权限

CompletionStage API 可以用来轻松交互插件的存储,查看这里这里 来查看这两个类的详细信息。

LuckPermsApi api = null; // See above for how to get the API instance.

// load the user in from storage. we can specify "null" for their username,
// since it's unknown to us.
api.getStorage().loadUser(uuid, "null").thenComposeAsync(success -> {
    // loading the user failed, return straight away
    if (!success) {
        return CompletableFuture.completedFuture(false);
    }
    
    // get the user instance, they're now loaded in memory.
    User user = api.getUser(uuid);

    // Build the permission node we want to set
    Node node = api.getNodeFactory().newBuilder(permission).setValue(true).build();

    // Set the permission, and return true if the user didn't already have it set.
    try {
        user.setPermission(node);
        
        // now we've set the permission, but still need to save the user data
        // back to the storage.
        
        // first save the user
        return api.getStorage().saveUser(user)
                .thenCompose(b -> {
                    // then cleanup their user instance so we don't create
                    // a memory leak.
                    api.cleanupUser(user);
                    return CompletableFuture.completedFuture(b);
                });
        
    } catch (ObjectAlreadyHasException e) {
        return CompletableFuture.completedFuture(false);
    }
    
}, api.getStorage().getAsyncExecutor());
获得玩家的前缀

LuckPerms 有一个(复杂的)缓存系统,用于非常快速的权限/信息查询。这些类都在 API 里,并且可以在可能的地方使用。

LuckPermsApi api = null; // See above for how to get the API instance.

// Get the user, or null if they're not loaded.
User user = api.getUserSafe(uuid).orElse(null);
if (user == null) {
    return Optional.empty(); // The user isn't loaded. :(
}

// Now get the users "Contexts". This is basically just data about the players current state.
// Don't worry about it too much, just know we need it to get their cached data.
Contexts contexts = api.getContextForUser(user).orElse(null);
if (contexts == null) {
    return Optional.empty();
}

// Ah, now we're making progress. We can use the Contexts to get the users "MetaData". This is their cached meta data.
MetaData metaData = user.getCachedData().getMetaData(contexts);

// MetaData#getPrefix returns null if they have no prefix.
return metaData.getPrefix();
获得玩家请求的权限

我们也可以使用这个缓存系统来获得一个包含用户权限的 Map 实例,包含了基础的权限查询。

// All retrieved in the same way as shown above.
User user;
Contexts contexts;

PermissionData permissionData = user.getCachedData().getPermissionData(contexts);
Map<String, Boolean> data = permissionData.getImmutableBacking();
寻找权限

你可以使用 Java 8 的流轻松过滤并返回一个用户请求的权限

public boolean hasPermissionStartingWith(UUID uuid, String startingWith) {
    // Get the user, if they're online.
    Optional<User> user = api.getUserSafe(uuid);

    // If they're online, perform the check, otherwise, return false.
    return user.map(u -> u.getPermissions().stream()
            .filter(Node::getValue)
            .filter(Node::isPermanent)
            .filter(n -> !n.isServerSpecific())
            .filter(n -> !n.isWorldSpecific())
            .anyMatch(n -> n.getPermission().startsWith(startingWith))
    ).orElse(false);
}
创建新的组并分配权限

这个方法不是阻塞的,所以可以安全的在主线程调用,一旦操作完成,回调会异步运行。

api.getStorage().createAndLoadGroup("my-new-group").thenAcceptAsync(success -> {
    if (!success) {
        return;
    }

    Group group = api.getGroup("my-new-group");
    if (group == null) {
        return;
    }

    Node permission = api.buildNode("test.permission").build();

    try {
        group.setPermission(permission);
    } catch (ObjectAlreadyHasException ignored) {}

    // Now save the group back to storage
    api.getStorage().saveGroup(group);
}, api.getStorage().getAsyncExecutor());

版本控制

在 2.0 版本里,LuckPerms 遵循了 Semantic 版本控制。

唯一不同的是 patch 号不包含在任何地方,除了 pom,并且每次构建都会计算,基于上次提交后的提交数量。(每个新的小版本都会创建新的标签)

这意味着 API 版本不再有 patch 号(在 patch 里没有 API 的变化),API 版本会是 x.y,每个不同的 LuckPerms 构建都会遵循 x.y.z。

变更日志

其他

语言文件

LuckPerms 插件中所有的消息(包括颜色和格式代码)都能够修改。(似乎合情合理)

将下面的文件之一下载然后存储到LuckPerms的文件夹中,然后命名为 "lang.yml"

将文件中的消息文本改成你喜欢的样子,然后重启你的服务器就好了。

PlaceholderAPI

在 extended_clip 的 PlaceholderAPI 插件中,LuckPerms 也注册了一些变量(Placeholders)。

LuckPerms 插件所使用的标识符是 luckperms

使用

要想使用变量的话,你需要运行下列命令。 这些命令的作用就是安装 LuckPerms 的变量扩展,安装后你就可以使用下面列举出的变量了。

/papi ecloud download LuckPerms 
/papi reload 

请记住使用这些指令你需要OP权限(或者你也可以选择在控制台中运行这些指令)

同时请注意,如果你想得到玩家的前缀或后缀数据,——如果你在服务器上安装了Vault插件和Vault的变量扩展的话,你也可以使用 Vault 插件所提供的变量。

Placeholders

%luckperms_group_name%

使用说明: 返回玩家当前所在组的名字
使用示例: n/a



%luckperms_context_<context key>%

使用说明: 返回给定内容关键字的值,如果内容没有值的话会返回空 使用示例: %luckperms_context_server%



%luckperms_groups%

使用说明: 返回服务器上的权限组列表,用逗号分割 使用示例: n/a



%luckperms_has_permission_<permission>%

使用说明: 检查玩家是否直接拥有该权限,不会检查通配符或继承的权限 使用示例: %luckperms_has_permission_essentials.ban%



%luckperms_check_permission_<permission>%

使用说明: 检查玩家是否拥有指定权限,这个变量工作的方式和正常插件的检查方式没有区别 使用示例: %luckperms_check_permission_some.cool.permission%



%luckperms_in_group_<group>%

使用说明: 返回玩家是否为给定组的成员,不包括继承组 使用示例: %luckperms_in_group_admin%



%luckperms_inherits_group_<group>%

使用说明: 返回玩家是否在给定组或继承给定组 使用示例: %luckperms_inherits_group_vip%



%luckperms_on_track_<track>%

使用说明: 返回玩家的权限组是否在给定权限组树上 使用示例: %luckperms_on_track_staff%



%luckperms_has_groups_on_track_<track>%

使用说明: 检查玩家是否继承给定权限组树中的任何一个组 使用示例: %luckperms_on_track_donor%



%luckperms_highest_group_by_weight%

使用说明: 返回玩家所在权限组树种的最高级权限组 使用示例: n/a



%luckperms_lowest_group_by_weight%

使用说明: 返回玩家所在权限组树种的最低级权限组 使用示例: n/a



%luckperms_first_group_on_tracks_<tracks>%

使用说明: 返回玩家在给定权限组树上所在的第一个组,权限组树会返回一组用逗号分隔的权限组名,权限组树中的每一个权限组都正序排列。 使用示例: %luckperms_first_group_on_tracks_staff,donor%



%luckperms_last_group_on_tracks_<tracks>%

使用说明: 返回玩家在给定权限组树上所在的最后一个组,权限组树会返回一组用逗号分隔的权限组名,权限组树中的每一个权限组都倒序排列。 使用示例: %luckperms_last_group_on_tracks_staff,donor%



%luckperms_expiry_time_<permission>%

使用说明: 获得玩家拥有的临时权限剩余的时间,如果玩家没有该权限的话会返回空 使用示例: %luckperms_expiry_time_essentials.fly%



%luckperms_group_expiry_time_<group name>%

使用说明: 获得玩家拥有的临时权限组所剩余的时间,如果玩家不在该权限组的话会返回空 使用示例: %luckperms_group_expiry_time_vip%



%luckperms_prefix%

使用说明: 返回玩家的前缀,使用Vault所提供的变量所输出的结果可能会更精确,这一项不会被Vault的配置设置影响 使用示例: n/a



%luckperms_suffix%

使用说明: 返回玩家的后缀,使用Vault所提供的变量所输出的结果可能会更精确,这一项不会被Vault的配置设置影响 使用示例: n/a



%luckperms_meta_<meta key>%

使用说明: 返回与指定Meta关键字联系的值 使用示例: %luckperms_meta_some-key%



Link

  • Discord 服务器
  • 在 irc.esper.net 我是 "Luck",我也在 irc.spi.gt 和 chat.freenode.net
  • SpigotMC 和 Sponge 论坛: "Luck"
  • GitHub