metro-altroutes 目前不提供对外公开的 Java API。第三方插件可以通过以下方式集成:
如果服务器安装了 PlaceholderAPI,请使用 metroaltroutes 扩展标识符。
metro-altroutes 完全基于 Metro 的公开 API (org.cubexmc.metro.api.MetroAPI) 构建。所有 metro-altroutes 管理的线路操作最终通过 MetroAPI 执行:
- 状态写入统一调用
MetroAPI#setLineStatus,以便触发 Metro 的LineStatusChangeEvent(缓存失效与统计依赖它); - 线路/站点几何查询使用
getStopManager().getBestStopContainingLocation(...)、getLinesForStop(...); - 编译期使用 Metro 1.1.9(jar 由仓库自带:
libs/metro-1.1.9.jar),构建时自动安装到本地仓库, 因为上游仓库已迁到 Gradle 且不能独立构建。
构建侧注意:paper-api 26.x 是 Java 25 字节码,需用 JDK 25 编译;本插件产出 Java 17 字节码, 因此同一个 jar 在 1.20.4 与 26.3 服务端均可加载。
以下类对外暴露,但不保证跨版本兼容。如果其他插件需要集成,建议通过 MetroAPI + PlaceholderAPI 间接交互。
// 获取插件实例
MetroAltroutes plugin = MetroAltroutes.getInstance();
// 获取 MetroAPI
MetroAPI api = plugin.getMetroAPI();
// 获取缓存
RouteCache cache = plugin.getRouteCache();
// 获取数据管理器
LineDataManager dataManager = plugin.getLineDataManager();
// 获取铁路线路记录管理器
RecordManager recordManager = plugin.getRecordManager();
// 获取手动驾驶监听器
MinecartDriveListener drive = plugin.getMinecartDriveListener();LineStatus getStatus(String lineId);
String getSuspensionMessage(String lineId);
boolean isSuspended(String lineId);
boolean isMaintenance(String lineId);
boolean isBoardable(String lineId);
MetroAPI.LineSnapshot getSnapshot(String lineId);
List<LineSummary> getAllLineSummaries();
void invalidate(String lineId);
void invalidateAll();
void refreshAll();替代路线查询请统一用
LineDataManager#getAlternativeRoutes(带优先级排序)。RouteCache早期版本里的替代路线索引已删除,避免与 Metro 的alternativeRouteIds形成两套数据源。
// Metro 侧的状态变更(含 Metro 自带的 /m line setstatus)
@EventHandler
public void onLineStatusChange(LineStatusChangeEvent event) { ... }LineStatusListener 会据此使 RouteCache 立即失效,并从 NORMAL/MAINTENANCE → SUSPENDED 时累加暂停统计。
| 路径 | 默认 | 说明 |
|---|---|---|
boarding.block-maintenance |
true |
检修线路是否禁止非管理员乘坐 |
boarding.bypass-permission |
metroaltroutes.bypass |
绕过权限节点 |
boarding.message-cooldown-ms |
3000 |
拦截提示冷却 |
boarding.record-stats |
true |
是否记录拦截统计 |
maintenance-assist.* |
见 config.yml | 速度显示 / 脱轨救援 / 手动推进 |
record.* |
见 config.yml | 铁路线路记录(开关 / 路径点上限 / 每人条数 / 记录时自动驾驶) |
driving.* |
见 config.yml | W/S 手动驾驶(速度 / 加速度 / 刹车 / 是否影响运营车 / BossBar) |
List<String> getAlternativeRoutes(String lineId); // 优先级排序
void setAlternativeRoute(String lineId, String altId, int priority);
boolean removeAlternativeRoute(String lineId, String altId);
boolean clearAlternativeRoutes(String lineId);
void setAutoRecover(String lineId, int minutes);
boolean cancelAutoRecover(String lineId);
Integer getAutoRecoverMinutesLeft(String lineId);
void setSchedule(String lineId, String start, String end);
boolean clearSchedule(String lineId);
ScheduleEntry getSchedule(String lineId);
LineStats getStats(String lineId);
void recordSuspend(String lineId);
void recordIntercept(String lineId);
void recordAltRecommend(String lineId);
void reload();int suspendCount(); // 暂停次数
int interceptCount(); // 拦截人数
int altRecommendCount(); // 推荐替代路线次数boolean isWithinWindow(int currentMinute);
String getFormattedStart(); // HH:mm
String getFormattedEnd(); // HH:mmStartResult start(Player player, String name); // 开始记录(名称 1-24 字符)
RecordedLine stop(Player player); // 结束并保存;未采集到有效轨道返回 null
boolean cancel(Player player); // 取消记录
boolean isRecording(Player player);
SessionSnapshot getSession(Player player); // 实时进度(方块数/长度/用时)
List<RecordedLine> getAll(); // 按创建时间排序
List<String> getNames();
RecordedLine get(String name);
boolean delete(String name);
void save();记录数据保存在
plugins/metro-altroutes/recordings.yml;RecordedLine#points()返回压缩后的折线顶点(int[]{x, y, z})。
boolean isDriving(Player player);
boolean setDriving(Player player, boolean enabled, boolean notify);
boolean enableForRecording(Player player); // 记录开始时自动开启(原本未开启时)
boolean disableIfAutoRecording(Player player); // 记录结束时关闭“自动开启”的驾驶
boolean isInputApiAvailable(); // 服务端是否支持玩家输入事件
static boolean supportsPlayerInput(); // 静态探测(Paper 1.21.4+)
MinecartDriveListener依赖 Paper 1.21.4+ 的PlayerInputEvent;旧版服务端上 该监听器仍可加载,但isInputApiAvailable()为 false 时手动驾驶整体停用。 驾驶参数通过MetroAltroutes的driving.*配置 getter 读取。
MetroAltroutes plugin = MetroAltroutes.getInstance();
RouteCache cache = plugin.getRouteCache();
if (!cache.isBoardable("line1")) {
// 线路暂停或维护
}LineDataManager dm = MetroAltroutes.getInstance().getLineDataManager();
LineDataManager.LineStats stats = dm.getStats("line1");
int suspended = stats.suspendCount();
int intercepted = stats.interceptCount();List<String> alts = dm.getAlternativeRoutes("line1");
// 返回 ["line2", "line3"] 按优先级升序RecordManager rm = MetroAltroutes.getInstance().getRecordManager();
RecordManager.RecordedLine line = rm.get("环城线");
if (line != null) {
int blocks = line.blocks(); // 轨道长度(格)
List<int[]> vertices = line.points(); // 压缩后的折线顶点
}| API 级别 | 稳定性 | 说明 |
|---|---|---|
| PlaceholderAPI 占位符 | ✅ 稳定 | 语义化版本内保证兼容 |
MetroAltroutes.getInstance() |
可能随插件重构改变 | |
LineDataManager 方法 |
方法签名可能调整 | |
RecordManager 方法与记录数据 |
记录存储格式可能调整 | |
MinecartDriveListener 方法 |
驾驶行为与参数可能调整 | |
RouteCache 方法 |
缓存策略可能调整 |