魔法路牌标记

SignPostMarkerItem —— 全模组唯一的物品(signposts:signPostMarker,英文名 Magic Sign-Post Marker)。作用是刻写路牌的传送目标:对着一个尚未刻写的 路牌 右键,会弹出铭文输入界面并记录玩家当前所在位置。刻写完成后,标记自身消耗 1 点耐久。

基本信息

属性 值
注册名 signposts:signPostMarker
类 harceroi.mc.signposts.item.SignPostMarkerItem extends Item
贴图 signposts:emeraldSignPostMarker(textures/items/emeraldSignPostMarker.png)
最大堆叠 1(maxStackSize = 1,硬编码)
最大耐久 ConfigurationHandler.getMarkerMaxUsage(),默认 5(markerMaxUsage);为 -1 时不调用 setMaxDamage
每次使用消耗 1 点耐久
使用后是否消失 耐久耗尽时 player.destroyCurrentEquippedItem()
附魔适用 否(未覆写 getItemEnchantability,继承 Item 默认值 0)
创造模式标签页 CreativeTabs.tabTools
创造模式物品栏 源码中未调用 setCreativeTab 注册到 tabTools 之外;tabTools 本身在 1.7.10 不对玩家可见,仅创意模式使用

合成配方

   .E.        E = 原版绿宝石(Items.emerald)
   .E.
   .E.

3 颗绿宝石竖排(GameRegistry.addRecipe 普通有序配方,不可合成区)。绿宝石在 GTNH 中是通用货币材料,因此这个配方是路牌刻写机制的主要成本来源。

功能

标记本身不实现任何自定义的方块交互逻辑。onItemUse 被覆写为无条件 return true:

public boolean onItemUse(ItemStack itemStack, EntityPlayer player, World world,
                         int x, int y, int z, int side, float a, float b, float c) {
    return true;
}

返回 true 意味着吞掉这次「右键方块」事件,标记因此不能放置方块(包括原版方块)。真正的刻写逻辑在两处:

  1. 路牌 的 onBlockActivated:客户端检测手持物 instanceof SignPostMarkerItem 且该路牌 markerId == 0,就打开铭文界面(跳转目标 = 玩家当前坐标)。这条路不消耗耐久。
  2. SignPostsMod.addJumpTarget:服务端写入坐标与新 markerId 之后,扣 1 点耐久。

使用方式

使用方式 触发条件 使用效果 消耗
右键点击方块(onItemUse) 对任意方块右键 吞掉事件,阻止方块放置 不扣耐久
右键点击未刻写的路牌 手持标记 + 路牌 markerId == 0 弹出铭文界面,记录玩家当前坐标为传送目标 不扣耐久(仅开界面)
在铭文界面点「完成」 文本框内容任意 服务端写入 jumpX/Y/Z + markerId,路牌成为 Atlas 标记 扣 1 点耐久
右键点击已刻写的路牌 手持标记 + 路牌 markerId != 0 无反应(return false) 不扣耐久

耐久与消耗

耐久处理逻辑在 SignPostsMod.addJumpTarget 中:

int maxItemUsages = ConfigurationHandler.getMarkerMaxUsage();
if (maxItemUsages != -1) {
  currentItemStack.damageItem(1, player);
  if (currentItemStack.getItemDamage() == currentItemStack.getMaxDamage()) {
    player.destroyCurrentEquippedItem();
  }
}
markerMaxUsage 效果
5(默认) 一个标记刻写 5 个路牌后消失
-1 无限使用。物品构造时不调用 setMaxDamage(保持 0),且 getDamage(ItemStack) 被覆写为恒返回 0
0 代码注释写的是「禁用标记」,但实际行为是每次刻写都立刻销毁手持物品:maxDamage 保持 0,模组自己的 getItemDamage() == getMaxDamage() 判据 0 == 0 成立,随即 destroyCurrentEquippedItem()

⚠️ 判定条件是 != -1 而非 > 0,所以配置注释宣称的 0 = 禁用标记 与实现不一致。详见 [配置项(…/setting/configuration)。

未实现的能力(已 grep 确认)

  • 无附魔:enchantment 目录不存在;物品未覆写 getItemEnchantability。
  • 无 Tooltip:addInformation 未被覆写,因此物品不显示任何价格/费用信息——传送费用只由服务端静默扣除。
  • 无 NBT 子类型:未覆写 getUnlocalizedName(ItemStack) / setAdditionalInformation,所有堆叠完全同质。
  • 无染色/修复:ItemColor、addInformation、右击修复均未实现。

相关条目

  • 路牌 - 被刻写的目标方块,markerId 存于其 TileEntity
  • [配置项(…/setting/configuration) - markerMaxUsage 决定最大耐久
  • [传送目标流程(…/setting/jump-flow) - 标记 → 坐标 → Atlas 标记的链路
  • [铭文输入界面(…/setting/inscription-gui) - 实际刻写入口