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.signpost API——但在这些类被链接的路径上,如果 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 经济系统

相关条目