• 周年纪念勋章活动已圆满结束,如有已购买但仍未申请的用户,可以通过对应勋章的下载链接申请~
资源图标

原创 开源 前置/API 工具 Fishlib——老鱼的一系列杂七杂八的工具 0.0.1-SNAPSHOT

版权类型
原创
插件中文名称
鱼子库
插件英文名称
fishlib
原帖地址
#
支持的核心(服务端)
  1. Spigot
  2. Paper
语言支持
多语言
适配版本(Java)
  1. 1.20
  2. 1.19
  3. 1.18
  4. 1.17
  5. 1.16
  6. 1.15
  7. 1.14
  8. 1.13
前言
老鱼我在野外写插件的时候经常遇到一些总是要重复写的代码,于是我就把那些看起来会经常用到的代码片段收集起来,加速插件的开发进程。经过一段时间之后发现好像集成了很多会用到的重复代码,已经成为glibc的形状了。
因此老鱼我以后的插件(如果能灵感迸发并且有执行力和时间写的话)大概率会依赖这个插件,该插件作为先行依赖插件发布,同时为简化其他Java开发者的工作量存在(基础不牢地动山摇)。兵马未动,粮草先行

轮子列表
  • 包装了mojang已经弃坑brigadier的指令模块, 利用注解和注册机制实现了快速构建指令及其子指令
1. 你需要由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);
    }
对应第一个是/xxx test和/xxx 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. 在上一章第一步获得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();
    }
}
4. 使用ArgumentTypeManager#registerCommandArgumentType(ArgumentType<T>,java.lang.Class<T>)将参数类型注册进对应的类型

注意:你注册的新参数只能你自己使用,该参数对于其他使用fishlib的框架的插件来说是不可见/隔离在这个插件内的。
尽管你可以直接借助携带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. 如法炮制,用moe.orangemc.fishlib.command.CommandHelper#getSelectorManager获取moe.orangemc.fishlib.command.selector.SelectorManager,备用
2. 创建一个moe.orangemc.fishlib.command.selector.SelectorArgument<T>的实现类,该类将完成自定义参数所需要的所有功能。T为该参数所接受的类型,将在下一章说明其自定义类型。matchEntityparallelResult参数为当该选择器参数出现多次时其他几次参数所给出的选择结果
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. 按照国际惯例,通过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轮子
教程待更
作者
Astro Angelfish
下载
393
查看
540
首次发布
最后更新

评分

0.00 星 0 次评分

最新更新

  1. 更新地图模块,补充文档

    https://github.com/astro-angelfish/fishlib/commit/3056abb189272cafc327ba1baa8c665090e8b82e
后退
顶部 底部