跳到主要内容

MagmaCore 开发者指南

生成的 Java 参考提供可搜索的类、方法与签名,并记录各模块的源码版本和提交。

MagmaCore 是通过 shade 打包进使用方插件的库。它不是独立服务器插件,不应在 depend 中将其当作玩家能够安装的 MagmaCore 插件 JAR。

依赖与打包

当前开发坐标为 com.magmaguy:MagmaCore:2.2.0-SNAPSHOT,可从 MagmaGuy 快照仓库获取。快照内容可能改变而版本字符串不变。需要可复现构建时,请记录实际解析的构件。

Gradle Kotlin DSL
repositories {
maven("https://repo.magmaguy.com/snapshots")
}

dependencies {
implementation("com.magmaguy:MagmaCore:2.2.0-SNAPSHOT")
}
Maven sections
<repositories>
<repository>
<id>magmaguy-snapshots</id>
<url>https://repo.magmaguy.com/snapshots</url>
</repository>
</repositories>

<dependencies>
<dependency>
<groupId>com.magmaguy</groupId>
<artifactId>MagmaCore</artifactId>
<version>2.2.0-SNAPSHOT</version>
</dependency>
</dependencies>

这些声明用于解析依赖。还需配置 shading 任务,将其包含在最终插件 JAR 中。遵循集成需求相同的现有使用方的重定位规则,改变包名时检查基于字符串的反射查找。分发包已将 org.luajorg.reflections 重定位到 com.magmaguy.shaded

每个插件都可以加载自己的库副本。不同插件类加载器中的同名 Java 类是不同类型。请使用明确的跨插件约定,例如 EliteMobs Lua 技能服务与位置注册表适配器。不要将其他插件私有的 MagmaCore 对象强制转换为你的副本中的类型。

模块与职责

模块职责
core插件生命周期、配置、命令、菜单、对局、位置查询、Lua 脚本、Nightbreak 内容和共享工具
nms:coreNMSManagerNMSAdapter 及不依赖版本的 EasyMinecraftGoals 接口
nms:v*NMS 约定的服务器版本实现
dist包含核心与活动适配器的 shaded 分发包

共享附魔、物品操作、账号处理、设置菜单、目录与更新属于核心服务。为使用方添加行为时,复用负责该功能的组件。

插件生命周期

最小核心生命周期遵循现有使用方的模式:

CoreConsumer.java
package example;

import com.magmaguy.magmacore.MagmaCore;
import org.bukkit.plugin.java.JavaPlugin;

public final class CoreConsumer extends JavaPlugin {
@Override
public void onLoad() {
MagmaCore.createInstance(this);
}

@Override
public void onEnable() {
MagmaCore.onEnable(this);
}

@Override
public void onDisable() {
MagmaCore.shutdown(this);
}
}

这种初始化不只是获取一个工具对象。它会初始化账号处理、共享命令、监听器和临时方块支持。重载方法 createInstance(plugin, NightbreakPluginSpec) 用于提供插件专属的共享命令文案。

优先使用显式接收所属插件的方法。getInstance() 指向当前加载库副本的单例,请求方插件在实例创建时确定。不要用它推断每个使用方的所有权。

shutdown(plugin) 清除该插件的下载器、内容刷新器、初始化和更新器注册,之后也会关闭当前加载副本的共享运行时。它不只是删除一条注册记录。请在你的插件关闭时,对自己嵌入的库调用;不要为了重置集成而关闭其他插件的库。

onLoad 中调用 createInstance,使插件的配置归档所有者能在其他插件为其导入内容之前注册。归档通过目标插件自己的 shaded 实现执行;不要使用你的 MagmaCore 副本解释其他插件的淘汰规则。

分阶段启动可使用 startInitialization,传入异步工作、同步工作、成功和失败回调。它会在调用异步初始化之前归档匹配的过时配置。Bukkit 世界和实体操作应放在同步阶段。耗时异步工作应在阶段之间检查 isShutdownRequested(plugin)getInitializationStateisPluginReady 提供初始化管理器状态。

NMS 与数据包实体

仅在插件需要时,通过 com.magmaguy.easyminecraftgoals 中的 NMSManager.initializeAdapter(plugin) 初始化 NMS。使用依赖适配器的功能前,检查 NMSManager.isEnabled()。初始化可能失败,也可能发现服务器版本不受支持。

分发包包含以下适配器系列:

适配器Minecraft 版本
v1_21_R31.21.4
v1_21_R41.21.5
v1_21_R51.21.6, 1.21.7, 1.21.8
v1_21_R61.21.9, 1.21.10
v1_21_R7_spigot, v1_21_R7_paper1.21.11,Spigot 与 Paper 分别实现
v2626.1 及当前 26.x 适配器系列

选中适配器并不保证所有未来服务器版本兼容。NMSManager 中的运行时选择器决定当前服务器能否加载适配器。早于 1.21.4 的版本不在当前适配器范围内。

EasyMinecraftGoals 管理仅通过数据包存在的实体、可见性与交互路由,以及移动和寻路工具。它们不是普通世界实体。应通过所属 API 管理,并在适配器仍可用时清理你的使用方创建的对象。

位置与保护查询

com.magmaguy.magmacore.location.LocationQueryRegistry 提供地牢及区域保护查询,包括 isInAnyDungeonisInAnyProtectedRegioncanBuild

通过 registerDungeonLocatorregisterProtectionProvider 注册自定义提供方;所属插件停用时注销同一个提供方。注册表包含现有插件适配器,并能发现跨插件地牢提供方,而无需使用方共用一个 MagmaCore 类加载器。

请选择符合操作的查询。位于地牢外不等于拥有该位置的建造权限。涉及 Bukkit 或保护插件的查询应在服务器线程执行。

库变更后重建使用方

使用 JDK 21,并通过 ./gradlew publishToMavenLocal 将 MagmaCore 发布到 Maven Local;Windows 下使用 .\gradlew.bat publishToMavenLocal。确认使用方解析该仓库及所需版本,再重建其 shaded JAR。替换 Maven Local 中的库不会更新已经构建的插件。

已安装插件的 API 见开发者索引。这类集成通常使用 providedcompileOnly;MagmaCore 的嵌入式库打包约定不同。