Skip to content

Commit

Permalink
更新了文档,适配UltiTools-API 6.0.6版本
Browse files Browse the repository at this point in the history
  • Loading branch information
wisdommen committed Jan 20, 2024
1 parent 88b67a3 commit 8927c10
Show file tree
Hide file tree
Showing 10 changed files with 327 additions and 119 deletions.
4 changes: 4 additions & 0 deletions .vitepress/config.mts
Original file line number Diff line number Diff line change
Expand Up @@ -229,6 +229,10 @@ export default withPwa(
{
text: 'IOC容器',
link: 'advanced/ioc-container'
},
{
text: 'GUI界面',
link: 'advanced/gui'
}
]
},
Expand Down
79 changes: 57 additions & 22 deletions docs/guide/advanced/auto-register.md
Original file line number Diff line number Diff line change
Expand Up @@ -2,8 +2,59 @@

这篇文章将会教你如何使用注解让UltiTools帮你完成一系列的、繁琐的注册任务。

## @UtiToolsModule 注解

在继承了 `UltiToolsPlugin` 的类的上方添加这一注解。

此注解仅可用于UltiTools模块主类,用于简化注解配置。

此注解包含了自动扫描并注册此类包名下的命令,监听器和配置文件。

如果你想要手动注册命令或监听器,可以将 `eventListener` 设置为 `false``cmdExecutor` 设置为 `false`

```java
import com.ultikits.ultitools.abstracts.UltiToolsPlugin;
import com.ultikits.ultitools.annotations.UltiToolsModule;
import lombok.Getter;
import org.springframework.beans.factory.annotation.Autowired;

@UltiToolsModule(
// 是否扫描并注册监听器
eventListener = true,
// 是否扫描并注册命令
cmdExecutor = true,
// 是否扫描并注册配置文件
config = true,
// 扫描包名
scanBasePackages = {"com.test.plugin"},
// 制定特定的扫描类
scanBasePackageClasses = {},
// 多语言支持
i18n = {"zh", "en"}
)
public class PluginMain extends UltiToolsPlugin {

@Getter
private static PluginMain pluginMain;

public PluginMain() {
super();
pluginMain = this;
}

@Override
public boolean registerSelf() {
return true;
}

...
}
```

## @EnableAutoRegister 注解

`@UtiToolsModule` 内包含了 `@EnableAutoRegister` 注解,在不适合使用 `@UtiToolsModule` 的情况下,你可以使用 `@EnableAutoRegister` 注解,比如你想在你自己的插件中使用 UltiTools 的自动注册。

在继承了 `UltiToolsPlugin` 的类的上方添加这一注解,UltiTools 在加载你的模块时会根据你的配置进行自动注册:

```java
Expand All @@ -25,16 +76,8 @@ public class UltiToolsConnector extends UltiToolsPlugin {
public boolean registerSelf() throws IOException {
return true;
}

@Override
public void unregisterSelf() {

}

@Override
public void reloadSelf() {
super.reloadSelf();
}

...
}
```

Expand All @@ -56,26 +99,18 @@ public class UltiToolsConnector extends UltiToolsPlugin {
public boolean registerSelf() throws IOException {
return true;
}

@Override
public void unregisterSelf() {

}

@Override
public void reloadSelf() {
super.reloadSelf();
}

...
}
```

## @CmdExecutor 注解
带有此注解的 `CommandExecutor` 类在自动注册启用的情况下被自动注册
带有此注解的继承 `AbstractCommandExecutor` 的类在自动扫描注册命令启用的情况下被自动注册

详情参见 [命令执行器](/guide/essentials/cmd-executor)

## @EventListener 注解

带有此注解的 `Listener` 类在自动注册启用的情况下被自动注册
带有此注解的实现 `Listener` 的类在自动扫描注册监听器启用的情况下被自动注册

详情参见 [事件监听器](/guide/essentials/event-listener)
79 changes: 79 additions & 0 deletions docs/guide/advanced/gui.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,79 @@
# GUI 编写

UltiTools 提供了obliviate-invs的 GUI API,您可以轻松地开发出 GUI 插件,而无需担心 GUI 的实现细节。

感谢Hamza Coşkun的开源项目 [obliviate-invs](https://github.com/hamza-cskn/obliviate-invs)

UltiTools-API 目前提供了两个预制的 GUI 界面:

分页界面 `PagingPage` 和 确认界面 `OkCancelPage`

## 创建一个 GUI

在这里我使用 `PagingPage` 作为例子。

首先,您需要创建一个 GUI 类,继承 `PagingPage` 类。

```java
public class WarpGui extends PagingPage {
// 新建一个 WarpService 实例(并不重要,只是演示)
private final WarpService warpService = new WarpService();

// 你需要重写一个构造函数,用于传递参数,这里的Player参数是必须的
public WarpGui(Player player) {
super(
// 打开GUI的玩家
player,
// GUI的ID
"Warp-list",
// GUI的标题
Component.text(BasicFunctions.getInstance().i18n("传送点列表"))
.color(TextColor.color(0xFF00A6)),
// GUI的行数
3
);
}

// 重写这个方法,用于设置GUI的内容
@Override
public List<Icon> setAllItems() {
List<Icon> icons = new ArrayList<>();
List<WarpData> allWarps = warpService.getAllWarps();
for (WarpData warpData : allWarps) {
Location location = WarpService.toLocation(warpData.getLocation());
Icon icon = new Icon(UltiTools.getInstance().getVersionWrapper().getEndEye());
TextComponent textComponent = Component.text(warpData.getName()).color(TextColor.color(0xFF00A6));
icon.toComp().setName(textComponent);
String world = String.format(ChatColor.YELLOW + BasicFunctions.getInstance().i18n("所在世界 %s"), location.getWorld().getName());
String xyz = String.format(ChatColor.GRAY + "X: %.2f Y: %.2f Z: %.2f", location.getX(), location.getY(), location.getZ());
icon.setLore(world, xyz);
// 按钮点击事件
icon.onClick((e) -> {
player.performCommand("warp tp " + warpData.getName());
player.closeInventory();
});
icons.add(icon);
}
return icons;
}
}
```

然后在你的命令执行器中调用这个 GUI 类即可。

```java

@CmdTarget(CmdTarget.CmdTargetType.PLAYER)
@CmdExecutor(alias = {"warp"}, manualRegister = true, permission = "ultikits.tools.command.warp", description = "传送点功能")
public class WarpCommands extends AbstractCommendExecutor {

@CmdMapping(format = "list")
public void listWarps(@CmdSender Player player) {
WarpGui warpGui = new WarpGui(player);
warpGui.open();
}

}
```

更多的GUI API用法请参考 [obliviate-invs Wiki](https://github.com/hamza-cskn/obliviate-invs/wiki)
5 changes: 1 addition & 4 deletions docs/guide/advanced/ioc-container.md
Original file line number Diff line number Diff line change
Expand Up @@ -42,10 +42,7 @@ import com.ultikits.ultitools.annotations.I18n;
import org.springframework.context.annotation.ComponentScan;
import org.springframework.stereotype.Component;

@Component
@ComponentScan
@I18n({"zh", "en"})
@EnableAutoRegister
@UltToolsModule
public class BasicFunctions extends UltiToolsPlugin {

@Override
Expand Down
126 changes: 96 additions & 30 deletions docs/guide/essentials/cmd-executor.md
Original file line number Diff line number Diff line change
Expand Up @@ -20,20 +20,25 @@ import com.ultikits.ultitools.annotations.command.CmdExecutor;
import com.ultikits.ultitools.annotations.command.CmdTarget;
import org.bukkit.command.CommandSender;

// 命令限制执行者为玩家和控制台
@CmdTarget(CmdTarget.CmdTargetType.BOTH)
@CmdExecutor(
permission = "ultikits.example.all",
description = "测试指令",
alias = {"test","ts"}
// 命令权限(可选)
permission = "ultikits.example.all",
// 命令描述(可选)
description = "测试指令",
// 命令别称
alias = {"test","ts"},
// 是否手动注册(可选)
manualRegister = false,
// 是否需要OP权限(可选)
requireOp = false
)
public class ExampleCommand extends AbstractCommendExecutor {

@Override
protected void handleHelp(CommandSender sender) {
sender.sendMessage("=== 测试指令 ===\n" +
"/test 测试指令\n" +
"/ts 测试指令\n" +
"===========");
// 向命令发送者发送帮助信息
}
}
```
Expand All @@ -44,6 +49,8 @@ public class ExampleCommand extends AbstractCommendExecutor {

和spigot开发一样,有了执行器,就需要去注册它。我们可以在 `registerSelf` 方法中使用 `getCommandManager().register()` 方法来注册命令。

如果你的模块存在大量的命令执行器而不想手动注册,也可以使用 UltiTools 提供的自动注册功能,详情可以查看[这篇文章](/guide/advanced/auto-register)

```java
import com.ultikits.plugin.ultikitsapiexample.context.ContextConfig;
import com.ultikits.ultitools.abstracts.UltiToolsPlugin;
Expand All @@ -63,12 +70,7 @@ public class UltiToolsConnector extends UltiToolsPlugin {

@Override
public boolean registerSelf() throws IOException {
getCommandManager().register(
new ExampleCommand(), //命令执行器
"permission.test", //命令权限
"示例功能", //命令描述
"test" //命令
);
getCommandManager().register(this, ExampleCommand.class);
return true;
}

Expand All @@ -85,22 +87,6 @@ public class UltiToolsConnector extends UltiToolsPlugin {

```

当然你也可以使用不添加后面三个参数,前提是在你的执行器类添加 `@CmdExecutor` 注解:

```java
@CmdExecutor(
permission = "ultikits.example.all",
description = "测试指令",
alias = {"test","ts"}
)
```

其中 `description` 为命令描述,`alias` 为命令别称(键入指令时的根命令,支持多个),`permission` 为命令权限。

如果你的模块存在大量的命令执行器而不想手动注册,也可以使用 UltiTools 提供的自动注册功能,详情可以查看[这篇文章](/guide/advanced/auto-register)

使用传统的命令执行器的编写方式仅需使用上述参数即可,使用基于映射的命令编写方式将会更加详细地介绍这个注解。

## 基于映射的命令执行器

### 快速上手
Expand All @@ -110,7 +96,7 @@ public class UltiToolsConnector extends UltiToolsPlugin {
那么这个命令应该会长这样:`/point add name`

如果是使用传统的方法,你需要判断参数输入的合法性,发送者以及权限等,如果还有其他功能,你还需要编写一大堆的 `switch ... case``if ... else` 语句,疯狂嵌套。
使得代码可读性变差,提高了维护的难度。~~还容易烧干你的CPU~~
使得代码可读性变差,提高了维护的难度。~~还容易烧干你的脑子~~

使用这个方法,你只需要编写最主要的逻辑即可,剩下的交给 UltiTools。

Expand Down Expand Up @@ -148,6 +134,86 @@ public void addPoint(@CmdSender Player player, @CmdParam("name") String name) {

至此,你只需要和传统方式一样注册命令执行器即可完成所有工作。

### 参数Tab提示补全

每次写完一个命令之后希望给自己的命令添加Tab提示补全,但是又不想写一大堆的代码?

为Tab补全绞尽脑汁判断每个命令的长度和之前的参数来生成一个补全List,这非常容易把人累死。

现在你只需要简单的为每一个参数写一个方法返回补全List即可!这个方法可以被反复利用,所有繁杂的参数数量判断都交给 UltiTools 来完成。

你所需要做的只是在 `@CmdParam` 注解中添加 `suggest` 属性,指定一个方法名即可。


```java
@CmdMapping(format = "add <name>")
public void addPoint(@CmdSender Player player, @CmdParam(value = "name", suggest="listName") String name) {
...
}

public List<String> listName(Player player, Command command, String[] args) {
...
}
```

UltiTools会首先在当前类中搜索匹配的方法名,并尝试调用此方法。

你的方法可以包含最多三个参数,分别对应的类型是 `Player``Command``String[]`,你可以选择任意的参数数量和顺序,但是类型只能是这三种,每种类型一个参数。

`Player` 代表了发送此命令的玩家,`Command` 代表了当前的命令,`String[]` 代表了当前命令的参数。

你的方法需要返回一个 `List<String>` 类型的值,UltiTools 将会将此值作为补全列表返回给玩家。

::: tip

如果你仅仅只是想返回一个简单的提示字符串,那么你只需要在 `suggest` 字段中写上你想要的字符串即可。这里的字符串也支持i18n国际化。

```java
@CmdMapping(format = "add <name>")
public void addPoint(@CmdSender Player player,
@CmdParam(value = "name", suggest="[名称]") String name) {
...
}

```
:::

::: tip

如果你对UltiTools生成的补全列表不满意,你可以重写 `suggest` 方法,自己生成补全列表。

```java
@Override
protected List<String> suggest(Player player, Command command, String[] strings) {
...
}
```
:::

#### @CmdSuggest 注解

如果你希望你的这个补全方法与其他命令类共享,那么你可以创建一个类,将想要复用的方法写在此类下。

在需要使用此类中的方法的类上添加 `@CmdSuggest` 注解,指定此类的类名即可。

```java
@CmdSuggest({PointSuggest.class})
public class PointCommand extends AbstractCommandExecutor {

@CmdMapping(format = "add <name>")
public void addPoint(@CmdSender Player player, @CmdParam(value = "name", suggest="listName") String name) {
...
}
}
```
```java
public class PointSuggest {
public List<String> listName(Player player, Command command, String[] args) {
...
}
}
```

### 权限

#### 方法权限
Expand Down
Loading

0 comments on commit 8927c10

Please sign in to comment.