Skip to content

制作扩展包

文: GrassBlock2022


注意:此部分需要读者拥有较强的Java和Bukkit功底。

引入依赖

事实上 quark.jar编译设为compileOnly即可 如何设置就不用我多说了对吧:)

另外项目还需要引入Bukkit支持库,环境方面可以支持AdventureAPI(Quark-Platform会带)

扩展包结构

其实就是个大号插件,主类继承特定的类用于注册内容,像这样:

java
@QuarkPackageProvider
public final class QuarkBase extends MultiPackageProvider {

    @Override
    public Set<PackageInitializer> createInitializers() {
        return Set.of(
                new JsonPackageInitializer(FeatureAvailability.PREMIUM, "/packages/quark_security.json"),);
    }
}

MultiPackageProvider实现了JavaPlugin, 所以这是一个有效的插件主类。 记得重写方法后要加super,否则无法唤起模块注入。

注册内容

方法1: 编写Json模块描述符初始化包

json
{
  "id": "quark-contents",
  "version": "0.10",
  "package_namespace": "org.atcraftmc.quark.contents",
  "modules": {
    "elevator": ".Elevator"
  },
  "languages": [
    "quark-contents:zh_cn"
  ],
  "configs": [
    "quark-contents"
  ]
}

方法2: 利用PackageBuilderInitializer初始化包

java
class Example{
    PackageBuilderInitializer init(){
        return new PackageBuilderInitializer("quark-core", FeatureAvailability.BOTH)
                .service(TaskService.class)
                .module("modrinth-version-check", ModrinthVersionCheck.class)
                .language("quark-core", "zh_cn")
                .language("quark-core", "en_us")
                .config("quark-core");
    }
}

编写模块

基础的模块框架和约定

java
package org.atcraftmc.quark.storage;

@QuarkModule(version="1.0")
public final class ExampleModule extends PackageModule {
    @Override
    public void enable(){
    }
    
    @Override
    public void disable(){
    }
}

检查平台兼容性

java
@QuarkModule(version="1.0")
public final class ExampleModule extends PackageModule {
    @Override
    public void checkCompatibility() throws APIIncompatibleException {
        Compatibility.requireClass(() -> Class.forName("org.bukkit.inventory.SmithingInventory"));
        Compatibility.requirePDC(); //require persistent data container API
        Compatibility.requirePlugin("WorldEdit"); //require plugin
    }
}

模块服务

java
@QuarkModule
@AutoRegister(ServiceType.EVENT_LISTEN)
public final class ExampleModule extends PackageModule {
    //your impl
}
java
package org.tbstcraft.quark.framework.module.services;

public interface ServiceType {
    String EVENT_LISTEN = "qb:el";
    String REMOTE_MESSAGE = "qb:rm";
    String PLUGIN_MESSAGE = "qb:pm";
    String CLIENT_MESSAGE = "qb:cm";
}

依赖注入

java
@QuarkModule(id = "chat-component", version = "1.3.0")
public final class ChatComponent extends PackageModule {
    @Inject("tip")
    private LanguageItem tip;
    
    @Inject("-quark.example.permission")
    private Permission examplePermission;
    
    @Inject
    private LanguageEntry language;

}