开发接口
LyDragonBlock 在插件主模块中定义了 LyDragonBlockAPI 接口,用于操作插件记录的龙核方块。当前接口只包含设置方块和移除方块两个方法,其中只有移除方法提供了实际逻辑。
接口状态
| 项目 | 当前状态 |
|---|---|
| 接口类 | Ly.dragon.block.client.plugin.api.LyDragonBlockAPI |
| 实现类 | Ly.dragon.block.server.api.LyDragonBlockAPIServer |
| API 获取方法 | Start#getApi() |
| API 注入方法 | Start#setApi(LyDragonBlockAPI api) |
setBlock | 已定义,但当前实现为空 |
removeBlock | 已实现 |
警告
当前项目代码中存在 API 字段、Getter、Setter 和实现类,但没有发现将 LyDragonBlockAPIServer 注入插件实例的初始化代码。因此,Start#getApi() 在当前代码构建中可能返回 null,调用前必须检查。
接口定义
java
package Ly.dragon.block.client.plugin.api;
import org.bukkit.Location;
import org.bukkit.entity.Player;
public interface LyDragonBlockAPI {
void setBlock(Location loc, Player placer, String dragonId, String matchId);
void removeBlock(Location loc);
}方法说明
| 方法 | 参数 | 返回值 | 当前行为 |
|---|---|---|---|
setBlock(Location loc, Player placer, String dragonId, String matchId) | 方块位置、放置者、龙核方块 ID、龙核匹配值 | 无 | 当前实现为空,不会放置方块,也不会创建或保存方块数据 |
removeBlock(Location loc) | 需要移除的方块位置 | 无 | 检查指定位置是否为插件已记录的头颅方块,符合条件时删除记录并将方块设为空气 |
获取 API
插件主类为 Ly.dragon.block.client.license.Start,其中提供了 getApi() 方法。接入插件应先声明对 LyDragonBlock 的依赖,并在调用前检查插件实例和 API 实例。
yaml
name: YourPlugin
main: your.package.YourPlugin
version: '1.0.0'
depend:
- LyDragonBlockjava
import Ly.dragon.block.client.license.Start;
import Ly.dragon.block.client.plugin.api.LyDragonBlockAPI;
import org.bukkit.Bukkit;
import org.bukkit.plugin.Plugin;
Plugin plugin = Bukkit.getPluginManager().getPlugin("LyDragonBlock");
if (!(plugin instanceof Start) || !plugin.isEnabled()) {
return;
}
LyDragonBlockAPI api = ((Start) plugin).getApi();
if (api == null) {
return;
}如果 LyDragonBlock 只是可选依赖,可以将 depend 改为 softdepend,但必须自行处理插件未安装、未启用或 API 未初始化的情况。
移除方块
java
api.removeBlock(location);removeBlock 会按以下顺序处理指定位置:
- 通过
Location获取当前位置的 Bukkit 方块。 - 使用世界名称和方块坐标生成存储 ID。
- 检查方块不是空气。
- 检查方块类型为
Material.SKULL。 - 检查该位置存在于 LyDragonBlock 的方块缓存中。
- 从内存缓存中移除方块记录。
- 尝试删除
plugins/LyDragonBlock/data/下对应的数据文件。 - 将当前位置的方块类型设为
Material.AIR。
存储 ID 的格式为:
text
世界名称_X坐标_Y坐标_Z坐标例如:
text
world_100_64_-20不会执行移除的情况
出现以下任一情况时,removeBlock 不会修改方块和保存数据:
- 指定位置为空气。
- 指定位置不是
Material.SKULL类型的头颅方块。 - 指定位置没有对应的 LyDragonBlock 缓存记录。
- 方块数据尚未完成加载,缓存中暂时不存在该位置。
该方法没有返回值,无法直接判断是否成功移除。调用方如果需要确认结果,应在调用前后自行检查方块状态。
设置方块
接口中定义了以下方法:
java
api.setBlock(location, player, dragonId, matchId);参数含义如下:
| 参数 | 类型 | 说明 |
|---|---|---|
loc | Location | 目标方块位置 |
placer | Player | 方块放置者 |
dragonId | String | 龙核方块 ID,对应方块配置文件的顶级配置键 |
matchId | String | 龙核方块配置中的匹配值 |
危险
当前 LyDragonBlockAPIServer#setBlock 方法体为空。调用该方法不会生成头颅方块、写入 dragon_id NBT、创建缓存或保存数据,不能用于程序化放置龙核方块。
需要发放可正常放置的方块物品时,应通过 /ldb open 打开方块总览并获取插件生成的物品。插件生成的物品会写入用于识别方块配置的 dragon_id NBT。
线程要求
removeBlock 会读取和修改 Bukkit 世界方块,同时操作插件缓存和数据文件。应在 Bukkit 主线程调用,不要直接从异步任务中执行。
如果当前代码处于异步线程,可以切换到主线程:
java
Bukkit.getScheduler().runTask(yourPlugin, () -> {
LyDragonBlockAPI api = ((Start) Bukkit.getPluginManager().getPlugin("LyDragonBlock")).getApi();
if (api != null) {
api.removeBlock(location);
}
});调用时还应确保:
Location不为null。Location#getWorld()不为null。- 对应世界已经加载。
- LyDragonBlock 已经启用并完成方块数据加载。
数据处理说明
每个已放置方块会在内存中保存一份 BlockCache,并在以下目录保存独立的数据文件:
text
plugins/LyDragonBlock/data/记录的数据包括:
| 数据 | 说明 |
|---|---|
location | 方块所在世界和坐标 |
placer-uuid | 放置者 UUID |
placer-name | 放置者名称 |
dragon-match | 方块使用的龙核匹配值 |
dragon-id | 对应的方块配置 ID |
origin-item | 放置时使用的原始物品数据 |
调用 removeBlock 时,只有方块类型和缓存记录均符合要求才会清理这些数据。直接通过 Bukkit 将方块设为空气不会自动调用 LyDragonBlock API,可能留下缓存和数据文件。
接口限制
当前公开接口未提供以下能力:
- 查询指定位置是否为 LyDragonBlock 方块。
- 获取方块 ID、放置者或原始物品。
- 获取方块配置或事件列表。
- 判断移除操作是否成功。
- 通过 API 创建并保存新的龙核方块。
- 注册方块放置、交互或移除回调。
不要直接修改插件内部的 BlockCache.caches 或 DragonConfigCache.caches。这些字段虽然在当前代码中公开,但属于内部实现,绕过现有流程可能导致内存缓存、世界方块和数据文件不同步。