魔法路牌标记
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 意味着吞掉这次「右键方块」事件,标记因此不能放置方块(包括原版方块)。真正的刻写逻辑在两处:
- 路牌 的
onBlockActivated:客户端检测手持物instanceof SignPostMarkerItem且该路牌markerId == 0,就打开铭文界面(跳转目标 = 玩家当前坐标)。这条路不消耗耐久。 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) - 实际刻写入口