Necrify

一个可定制的Velocity插件,允许管理各种惩罚。

资源图片
# Necrify Necrify 是一个惩罚插件,当前适用于 [Velocity](https://velocitypowered.com) (未来可能适用于 [Paper/BungeeCord](https://github.com/users/JvstvsHD/projects/5))。
## 目录 1. [插件安装](#plugin-installation) 2. [静音 (仅影响 Velocity)](#mutes) 3. [时长](#duration) 4. [命令](#commands) 5. [API](#punishment-api) * [安装](#installation) * [用法](#usage) ## 插件安装 1. [下载插件的最新版本](https://hangar.papermc.io/JvstvsHD/Necrify) 或下载开发 构建 [此处](https://ci.jvstvshd.de/job/Necrify/) (可能不稳定或无法工作) 2. 将下载的文件放入服务器的 ```plugins``` 文件夹中。 3. (重新)启动服务器。 ## 静音 随着 1.19.1,Minecraft 的聊天系统发生了改变 ([详细说明](https://gist.github.com/kennytv/ed783dd244ca0321bbd882c347892874))。 此后,由于签名聊天消息,由于 Velocity 中 ChatEvent 无法阻止聊天消息。 因此,聊天监听器不再阻止任何消息,这意味着静音实际上毫无用处。 解决此问题的方法是为实际游戏服务器开发扩展插件,以便在这些消息仍然可以被取消的地方。 此 paper 插件的下载地址在 [发布](https://github.com/JvstvsHD/necrify/releases/latest) 和 [dev 构建](https://ci.jvstvshd.de/job/Necrify/) 在 Jenkins 上。
有关 1.19.1 的更多信息,请参阅 [官方发布说明](https://www.minecraft.net/en-us/article/minecraft-java-edition-1-19-1) ## 命令 所有命令都使用 `/necrify` 前缀注册。 此外,通过设置 `allow-top-level-commands` 为 true (默认情况下启用) 也可以注册顶级命令。
图例: - \ 表示该参数是必需的 - \[arg\] 表示该参数是可选的 - 作为参数名称的玩家表示需要一个玩家名称或 UUID - 理由是指支持 [MiniMessage](https://docs.advntr.dev/minimessage/format.html) 的理由 - 作为参数名称的时长表示一个 [时长](#duration) ### 命令概览 - **/ban \ \[reason]** 永久封禁玩家,原因为给定或默认原因 - **/mute \ \[reason]** 永久静音玩家,原因为给定或默认原因 - **/tempban [reason]** 封禁该玩家指定时长,原因为给定或默认原因 - **/tempmute [reason]** 静音该玩家指定时长,原因为给定或默认原因 - **/unban ** 解封给定的玩家 - **/unmute ** 解静音给定的玩家 - **/necrify user \ \** 显示玩家的惩罚信息及其白名单状态, 删除此用户包括所有惩罚或反转其白名单状态 (从白名单到黑名单或反之亦然) - **/necrify punishment \ ** 取消/删除,更改或显示关于 给定的惩罚 (必须是一个 UUID) ### 时长 为了被 `PunishmentDuration#parse(String)` 解析,字符串必须遵循以下模式:
[0-9][s, m, h, d]
s - 秒(s)
m - 分钟(s)
h - 小时(s)
d - 天(s)
这些值可以组合,所有值都可以省略。
示例: 1d12h15m30s 表示一个时长为 1 天、12 小时、15 分钟和 30 秒。 ## Punishment API ### 安装 将 ```{version}``` 替换为当前版本,例如 1.2.3。 最新版本可以在 [此处](https://ci.jvstvshd.de/job/Necrify/lastSuccessfulBuild/) 找到。 请注意,您只需要使用 necrify-{platform}- 之后的字符串,并且不需要版本构建号。 #### Gradle (kotlin) ```kotlin repositories { mavenCentral() } dependencies { implementation("de.jvstvshd.necrify:necrify-api:{version}") } ``` #### Gradle (groovy) ```groovy repositories { mavenCentral() } dependencies { implementation 'de.jvstvshd.necrify:necrify-api:{version}' } ``` #### Maven ```xml de.jvstvshd.necrify necrify-api {version} ``` 您也可以依赖插件模块或 common 模块。 为了做到这一点,将 artifactId 替换为所需的模块名称。 请注意,API 模块之外的代码始终可能发生变化,并且可能不稳定。 它还设计为不允许 来自插件本身的外部访问和修改,并且通常没有文档。 ### 用法 #### 获取 api 实例 如果使用了 [插件](#plugin-installation),可以使用以下代码片段获取 api 实例: ```java try { Necrify api = (Necrify) server.getPluginManager().getPlugin("necrify").orElseThrow().getInstance().orElseThrow(); } catch(NoSuchElementException e) { logger.error("Punishment API is not available"); } ``` #### 惩罚玩家 所有惩罚都是通过目标用户发出的。 例如,封禁玩家可以这样完成: ```java //首先,获取用户实例 NecrifyUser user = api.getUserManager().getUser(uuid).orElseThrow(() -> new NoSuchElementException("User not found")); MiniMessage miniMessage = MiniMessage.miniMessage(); //临时封禁: Ban temporaryBan = user.ban(PunishmentDuration.parse(miniMessage.deserialize("You broke the server's rules! Don't cheat!"), PunishmentDuration.parse("1d"))).join();//1d 等于 1 天,时长相对于当前时间直到惩罚生效. //永久封禁: Ban permanentBan = user.banPermanent(miniMessage.deserialize("You broke the server's rules again! You are not allowed to join someday again!")).join(); //你获得的封禁实例通过 #join 是发出的惩罚。 请注意使用 #join 会阻塞当前 //线程,并且由于数据库操作需要一些时间来完成,因此建议使用 #whenComplete 或其他。 //您现在可以使用此实例来更改或取消惩罚: temporaryBan.cancel().whenComplete((punishment, throwable) -> { if(throwable != null) { logger.error("An error occurred while cancelling the punishment", throwable); return; } logger.info("The punishment was successfully cancelled"); }); //#cancel 应该始终返回你调用的相同实例 //即使永久封禁了无限时间,你仍然可以更改时长和理由: permanentBan.change(PunishmentDuration.parse("300d"), miniMessage.deseriaize("Okay, you may join again in 300 days!")).whenComplete((punishment, throwable) -> { if(throwable != null) { logger.error("An error occurred while changing the punishment", throwable); return; } logger.info("The punishment was successfully changed"); }); ``` 静音玩家的方式类似,只需将 'ban' 替换为 'mute'。
踢出玩家可以通过调用 `user.kick(Reason).join();` 来完成,其中调用 #join 是安全的,因为没有 执行同步数据库查询。这种惩罚形式不能被更改或取消,因为它只持续一瞬间。