- 版权类型
- 原创
- 插件中文名称
- 鱼子库
- 插件英文名称
- fishlib
- 原帖地址
- #
- 支持的核心(服务端)
- Spigot
- Paper
- 语言支持
- 多语言
- 适配版本(Java)
- 1.20
- 1.19
- 1.18
- 1.17
- 1.16
- 1.15
- 1.14
- 1.13
A generic bukkit library plugin that wraps common things in plugins for myself. - astro-angelfish/fishlib
老鱼我在野外写插件的时候经常遇到一些总是要重复写的代码,于是我就把那些看起来会经常用到的代码片段收集起来,加速插件的开发进程。经过一段时间之后发现好像集成了很多会用到的重复代码,已经成为glibc的形状了。
因此老鱼我以后的插件(如果能灵感迸发并且有执行力和时间写的话)大概率会依赖这个插件,该插件作为先行依赖插件发布,同时为简化其他Java开发者的工作量存在(基础不牢地动山摇)。
轮子列表
1. 你需要由
2. 由
3. 创建类,实现
4. 创建一个执行方法,必须由
对应第一个是/xxx test和/xxx test <arg1(字符串)>
5. 使用
moe.orangemc.fishlib.FishLibrary#getCommandHelper(org.bukkit.plugin.java.JavaPlugin)
获取到注册命令所需的moe.orangemc.fishlib.command.CommandHelper
2. 由
CommandHelper#buildAndRegisterCommand(org.bukkit.command.PluginCommand)
获取能够自动注册子命令的moe.orangemc.fishlib.command.FishBaseCommand
实例3. 创建类,实现
moe.orangemc.fishlib.command.SubCommandBase
接口,其中getName
返回子命令名称,返回getDescription
子命令的描述(如果同时启用了fishlib的国际化可使用对应的键名),返回getAliases
别名,最后getPermissionRequired
返回所需要的权限4. 创建一个执行方法,必须由
moe.orangemc.fishlib.command.annotation.FishCommandExecutor
注解并且第一个参数为org.bukkit.command.CommandSender
,其余参数必须被moe.orangemc.fishlib.command.annotation.FishCommandParameter
注解,注解参数为其命令参数的名称(JVM内部不保存参数名称),样例如下
Java:
@FishCommandExecutor
public void onCommand(CommandSender sender) {
sender.sendMessage("test");
}
@FishCommandExecutor
public void onCommand(CommandSender sender, @FishCommandParameter("arg1") String arg1) {
sender.sendMessage("test " + arg1);
}
5. 使用
FishBaseCommand#registerCommand(SubCommandBase)
完成命令的注册,
Java:
public class Main extends JavaPlugin {
@Override
public void onEnable() {
FishBaseCommand cmd = FishLibrary.getCommandHelper(this).buildAndRegisterCommand(getCommand("test"));
cmd.registerCommand(new TestCommand());
}
}
public class TestCommand implements SubCommandBase {
@Override
public String getName() {
return "test";
}
@Override
public String getPermission() {
return "test";
}
@Override
public String getUsage() {
return "/test";
}
@Override
public String getDescription() {
return "test";
}
@FishCommandExecutor
public void onCommand(CommandSender sender) {
sender.sendMessage("test");
}
@FishCommandExecutor
public void onCommand(CommandSender sender, @FishCommandParameter("arg1") String arg1) {
sender.sendMessage("test " + arg1);
}
}
1. 在上一章第一步获得
2. 使用
3. 按照mojang的brigadier中的
4. 使用
注意:你注册的新参数只能你自己使用,该参数对于其他使用fishlib的框架的插件来说是不可见/隔离在这个插件内的。
moe.orangemc.fishlib.command.CommandHelper
2. 使用
CommandHelper#getArgumentTypeManager
获取moe.orangemc.fishlib.command.argument.ArgumentTypeManager
,备用3. 按照mojang的brigadier中的
com.mojang.brigadier.arguments.ArgumentType
实现你自己的解析器
Java:
public class FishUTFStringArgumentType implements ArgumentType<String> {
@Override
public String parse(StringReader reader) throws CommandSyntaxException {
return readUTFString(reader);
}
public static String readUTFString(StringReader reader, Predicate<Character> matcher) throws CommandSyntaxException {
if (reader.peek() == '"' || reader.peek() == '\'') {
return reader.readQuotedString();
}
int start = reader.getCursor();
while (reader.canRead() && matcher.test(reader.peek())) {
reader.skip();
}
return reader.getString().substring(start, reader.getCursor());
}
public static String readUTFString(StringReader reader) throws CommandSyntaxException {
return readUTFString(reader, c -> !StringUtil.isBlankChar(c));
}
@Override
public <S> CompletableFuture<Suggestions> listSuggestions(CommandContext<S> context, SuggestionsBuilder builder) {
return ArgumentType.super.listSuggestions(context, builder);
}
@Override
public Collection<String> getExamples() {
return ArgumentType.super.getExamples();
}
}
ArgumentTypeManager#registerCommandArgumentType(ArgumentType<T>,java.lang.Class<T>)
将参数类型注册进对应的类型注意:你注册的新参数只能你自己使用,该参数对于其他使用fishlib的框架的插件来说是不可见/隔离在这个插件内的。
尽管你可以直接借助携带
1. 通过
2. 通过
3. 通过
4. 通过
org.bukkit.entity.Entity
/org.bukkit.entity.Player
参数的命令方法间接通过目标选择器来获取需要的实体,但仍然存在一些鞭长莫及的情况需要直接使用实体选择器。1. 通过
moe.orangemc.fishlib.command.CommandHelper#getSelectorManager
获取moe.orangemc.fishlib.command.selector.SelectorManager
2. 通过
SelectorManager#createSelector(org.bukkit.command.CommandSender)
创建一个新的moe.orangemc.fishlib.command.selector.Selector
实例3. 通过
Selector#updatePrompt(com.mojang.brigadier.StringReader)
来写入需要的选择器参数4. 通过
Selector#selectEntities
来获取实体列表,这个moe.orangemc.fishlib.command.argument.type.EntityList
可以直接通过for-each语法糖直接遍历fishlib同样提供了对应的在实体选择器上加入自定义筛选参数的接口
1. 如法炮制,用
2. 创建一个
2.1.
2.2. 当认为实体满足该参数指定的条件时,返回
3. 你可以通过
1. 如法炮制,用
moe.orangemc.fishlib.command.CommandHelper#getSelectorManager
获取moe.orangemc.fishlib.command.selector.SelectorManager
,备用2. 创建一个
moe.orangemc.fishlib.command.selector.SelectorArgument<T>
的实现类,该类将完成自定义参数所需要的所有功能。T为该参数所接受的类型,将在下一章说明其自定义类型。matchEntity
的parallelResult
参数为当该选择器参数出现多次时其他几次参数所给出的选择结果2.1.
getAcceptableClass
需要返回T的类实例,以便在泛型擦除后重新确定该参数接受的类型2.2. 当认为实体满足该参数指定的条件时,返回
true
即可,反之返回false
3. 你可以通过
Selector#getContext(java.lang.Class)
来获取一些创建选择器时所指定的一些数据(又称上下文),目前有moe.orangemc.fishlib.command.selector.context.SelectedEntitiesContext
(已选择的实体),moe.orangemc.fishlib.command.selector.context.LocationContext
(位置),moe.orangemc.fishlib.command.selector.context.VolumeDistanceContext
(体积位置)1. 按照国际惯例,通过
2. 自定义类型需要实现
3. 同样我们需要从字符串转化为上面我们所定义的类型,此时操作将类似gson,创建一个转换器,实现自
4. 实现adapter中的
moe.orangemc.fishlib.command.CommandHelper#getSelectorManager
获取moe.orangemc.fishlib.command.selector.SelectorManager
2. 自定义类型需要实现
moe.orangemc.fishlib.command.selector.type.ComplexSelectorArgumentType
,其中T为你需要适配的参数类型,moe.orangemc.fishlib.command.selector.type.ComplexSelectorArgumentType#matches
将用于检查实体是否符合所要求的条件3. 同样我们需要从字符串转化为上面我们所定义的类型,此时操作将类似gson,创建一个转换器,实现自
moe.orangemc.fishlib.command.selector.type.SelectorArgumentTypeAdapter
,这里的T则应为上面的自定义类型,同时在moe.orangemc.fishlib.command.selector.type.SelectorArgumentTypeAdapter#getProvidingClass
填入其类实例以应对编译时的泛型擦除4. 实现adapter中的
SelectorArgumentTypeAdapter#fromStringReader
,其第一个参数将为使用其转换器的选择器,第二个则是传入的字符串参数- 将物品栏包装成操作性类似swing的操作界面
- 物品堆快捷构建
- 基于玩家设置的
因特耐肾闹雷贼诶深国际化框架 - 动态地图画,但是服务器带宽待优化
与bungee连接的信道已弃用- mc底层相关反射(映射表未完成)
- 将记分板包装为易于操作的列表
- 杂七杂八的java轮子