Gollorum 集成
SignPosts 可以把路牌系统接入另一个同名但不同作者的 mod:gollorum.signpost(modid signpost,Minecraft 1.7.10 CurseForge 上的 Signposts / Sign-Posts)。接入后,传送改用该 mod 的经济系统计费,传送石(waystone)也会自动变成 Atlas 里的可点击标记。
⚠️ 该集成在本仓库的构建配置中并非运行时依赖:
dependencies.gradle里写的是compileOnly('curse.maven:signpost-261837:2922217') {transitive=false}—— compileOnly,即仅编译期可见,不作为发布依赖。@Mod注解里也没有声明dependencies对signpost的依赖(只有required-after:antiqueatlas)。mcmod.info的dependencies数组虽然列了"signpost",但 FML 并不读取mcmod.info的依赖信息(useDependencyInformation: true也不会覆盖注解)。结论:如果整合包里没装 modid 为
signpost的那个 mod,本集成完全不生效,全模组自动回落到 饥饿值支付。GollorumPaymentHandler与GollorumEventHandler都不是空壳/桩代码——它们调用了真实的gollorum.signpostAPI——但在这些类被链接的路径上,如果 mod 缺失,FML 不会加载它们(因为整段代码在Loader.isModLoaded守卫内)。
注册条件
SignPostsMod.preInit:
if (Loader.isModLoaded(GOLLORUM_SIGNPOST_MOD_ID)) { // GOLLORUM_SIGNPOST_MOD_ID = "signpost"
MinecraftForge.EVENT_BUS.register(new GollorumEventHandler());
SignPostsMod.addPaymentHandler(new GollorumPaymentHandler(), GOLLORUM_SIGNPOST_MOD_ID);
}
| 处理器 / 监听器 | 注册键 | 条件 |
|---|---|---|
GollorumPaymentHandler |
signpost |
Loader.isModLoaded("signpost") |
GollorumEventHandler |
事件总线 | 同上 |
注意 GOLLORUM_SIGNPOST_MOD_ID = "signpost"(无 s)与本模组自己的 ID = "signposts"(有 s)只差一个字母,且 1.7.10 未使用命名空间,两者共存不冲突。
GollorumPaymentHandler
public boolean pay(EntityPlayer player, int x, int y, int z) {
return PostHandler.pay(player, (int) player.posX, (int) player.posY, (int) player.posZ, x, y, z);
}
完整地把 6 个坐标(玩家当前位置 + 目标位置)转发给 gollorum.signpost.management.PostHandler.pay,并原样返回它的结果。与 PaymentHandler 恒返回 true 不同,这里的返回值由对方 mod 决定——即 Gollorum 集成下付不起是真的会失败(玩家留在原地)。
GollorumEventHandler
监听 gollorum.signpost 的两个事件(@SubscribeEvent):
UpdateWaystoneEvent
把 Gollorum 传送石的变化同步成 Atlas 全局标记:
event.type |
行为 |
|---|---|
PLACED |
addGollorumWaystone(world, x, y, z, name) |
DESTROYED |
removeGollorumWaystone(world, x, y, z) |
NAMECHANGED |
先 removeGollorumWaystone,再 addGollorumWaystone(..., event.name) |
| 其他 | break(无操作) |
private static void addGollorumWaystone(World world, int x, int y, int z, String name) {
int markerId = SignPostsMod.addGlobalMarker(x, z, name, world);
MarkerToTileMap.get(world).setTileForMarker(x, y, z, markerId);
}
removeGollorumWaystone 先用 map.getMarkerForTile(x, y, z) 反查,markerId == -1 就直接返回,否则 SignPostsMod.removeGlobalMarker(markerId, world) + map.removeMarker(markerId)。
UseSignpostEvent
ItemStack currentItemStack = event.player.getCurrentEquippedItem();
if (currentItemStack != null && currentItemStack.getItem() instanceof ItemAtlas) {
if (event.world.isRemote) {
atlasStack = currentItemStack;
SignPostsMod.proxy.openAtlasGui(atlasStack, SignPostsMod.GOLLORUM_SIGNPOST_MOD_ID);
}
event.setCanceled(true);
}
玩家手持 Antique Atlas 右键使用 Gollorum 路牌时,取消该事件并改开本模组的 Atlas 界面,且传入的支付处理器键是 "signpost"(而非 "signposts"),从而让后续点击走 GollorumPaymentHandler。setCanceled(true) 在客户端与服务端都会执行。
注册键如何决定用哪套支付
SignPostsAtlasGui 把 paymentHandlerKey 原样放进 JumpMessage,服务端 playerJump 用它查表:
| 打开 Atlas 的入口 | 支付处理器键 | 实际扣费 |
|---|---|---|
| 右键点击本模组的 路牌 | signposts |
饥饿值 |
手持 Atlas 右键使用 Gollorum 路牌(UseSignpostEvent) |
signpost |
Gollorum 经济系统 |
相关条目
- 饥饿值支付 - 未安装 Gollorum Signposts 时的默认处理器
- Antique Atlas 集成 - 传送石如何变成 Atlas 标记
- 网络消息 -
paymentHandler字段如何随消息传递