寻矿魔杖
基本信息
| 属性 | 值 |
|---|---|
| 注册名 | ifu:ifu_buildingKit |
| 实现类 | com.encraft.dz.items.ItemOreFinderTool(extends Item) |
| 中文名 | 寻矿魔杖(assets/ifu/lang/zh_CN.lang:item.ifu_buildingKit.name) |
| 英文名 | Ore Finder Wand(en_US.lang) |
| 最大堆叠 | 1(setMaxStackSize(1),ItemOreFinderTool.java:42) |
| 耐久 | 无:继承 Item 且未调用 setMaxDamage,耐久条被改用作"命中计数" |
| 附魔适用 | 任意(未覆写 getItemEnchantability) |
| 可编辑方块 | 否:canItemEditBlocks() 返回 false,禁止生成模式瞬间挖方块 |
| 创造标签 | IFU(IFU.java:32-37,getTabIconItem() 返回本物品) |
| GUI ID | 10(IFU.GUI_ORE_FINDER) |
注册名是怎么来的
// IFUItems.java:13-18
oreFinder = new ItemOreFinderTool().setCreativeTab(IFU.creativeTab)
.setUnlocalizedName(IFU.MOD_ID + "_" + "buildingKit");
GameRegistry.registerItem(oreFinder, oreFinder.getUnlocalizedName().substring(5));
substring(5)去掉item.前缀(5 个字符),得到注册名ifu_buildingKit。- 两处独立佐证注册名就是
ifu_buildingKit:语言文件键item.ifu_buildingKit.name;配方里GTModHandler.getModItem("ifu", "ifu_buildingKit", 1, GTValues.W)。 - 另注意:构造函数里先设了一次
setUnlocalizedName(IFU.MOD_ID + "_" + "buildingKitItem")(ItemOreFinderTool.java:41),IFUItems.load()随后再设成ifu_buildingKit。
metadata 与"变体"
物品声明了 setHasSubtypes(true),但这里的 damage 值不是真正的 subtype,而是每次扫描的命中方块数(0 ~ MAX_FOUND = 10)。渲染时按 damage 选贴图:
| damage(命中数) | 贴图 | 含义 |
|---|---|---|
| 0 | ifu:meter0 |
未发现(耐久条隐藏) |
| 1 ~ 3 | ifu:meter1 |
少量 |
| 4 ~ 6 | ifu:meter2 |
中等 |
| 7 ~ 9 | ifu:meter3 |
丰富 |
| ≥ 10 | ifu:meter4 |
达到/超过 MAX_FOUND,扫描提前结束 |
贴图共 5 张 assets/ifu/textures/items/meter0.png ~ meter4.png,由 registerIcons 一次性注册进 IIcon[5];判定分支见 getIconFromDamage。
耐久条:
showDurabilityBar(stack)→stack.getItemDamage() > 0(为 0 时不画条)getDurabilityForDisplay(stack)→GTUtility.linearCurve(stack.getItemDamage(), 0, 1d, OreFinderSearch.MAX_FOUND, 0d),即 damage 从 0 增到 10 时耐久条由满(1.0)走到空(0.0)
使用方式
| 使用方式 | 触发条件 | 使用效果 | 条件 / 限制 |
|---|---|---|---|
| 快捷栏右键(潜行) | onItemUse 且 entityPlayer.isSneaking() |
打开筛选界面:openGui(IFU.instance, IFU.GUI_ORE_FINDER, world, (int)posX, (int)posY, (int)posZ) |
仅服务端执行(if (!world.isRemote)) |
| 快捷栏右键(不潜行) | ConfigHandler.debugBlockInfo == true |
聊天栏打印该方块注册名 + metadata + 矿石材质/stoneType/isNatural/isSmall,以及筛选物解析结果 | 关闭时不输出;仅服务端执行 |
| 被动扫描(物品栏 tick) | onUpdate |
每秒扫描一次,把命中数写入 damage | 仅服务端执行;魔杖须在玩家主物品栏内 |
| 装备 / 穿戴 | — | 无:不是护甲也不是饰品,未实现 onWornTick |
— |
| 投掷使用 | — | 无:未实现 onEntityItemUpdate |
— |
| 左键点击 | — | 无:未实现 onLeftClickBlock / onLeftClickEntity |
— |
| 悬浮 SHIFT + 右键 | — | 无 | — |
onItemUse 无论哪条分支都 return true,因此魔杖永远不会被当作方块放置出去。
关键规则
- 一次只能生效一根:服务端取
findFirstInInventory(player.inventory),即主物品栏里第一个ItemOreFinderTool;不是它的其它魔杖每 tick 只会把 damage 抄成主魔杖的值(主魔杖为 null 时抄 0),自己不扫描(ItemOreFinderTool.java:126-130)。提示文本对应IFU.description3(“一次只可以寻找一种方块”)。 - 维度限制:
enableEverywhere == false(默认)时,仅当world.provider.dimensionId为0(主世界)或-1(下界),或world.provider.getDimensionName().equals("Twilight Forest")才继续扫描;否则直接 return。 - 音效:客户端在
itemstack.getItemDamage() >= OreFinderSearch.MAX_FOUND / 2(即 ≥ 5)且ConfigHandler.wandSound为 true 时播放world.playSound(..., "ic2:tools.Treetap", 0.6F, 0.8F, true)。 - 节流:
world.getTotalWorldTime() % 20 != entity.hashCode() % 20时跳过 —— 每秒扫一次,且按entity.hashCode() % 20让不同玩家错开 tick。 - 同位去重:
props.isSameScan(cur_x, cur_y, cur_z, searchItem)为真则跳过本次扫描(比较坐标 +ItemStack.areItemStacksEqual)。 - 筛选物无效:
!target.canSearch()时 damage 归 0 并props.clearLastScan()。 - 矿脉揭示:扫描命中矿石时额外调用 VisualProspecting 把匹配矿脉推给客户端(详见「矿石勘探效果」条目)。
合成配方
postInit 调 new Recipes().run(),用 GTModHandler.addCraftingRecipe 注册(输出 tag 为 GTValues.W):
XrX
SGS
RIR
| 符号 | GT 物品 | 说明 |
|---|---|---|
X |
OrePrefixes.stick(Materials.IronMagnetic) |
磁铁棒 |
S |
OrePrefixes.stick(Materials.Wood) |
木棍 |
G |
OrePrefixes.ring(Materials.Gold) |
金环 |
I |
OrePrefixes.stick(Materials.Iron) |
铁棒 |
R |
OrePrefixes.dust(Materials.Redstone) |
红石粉 |
输出 1 个 ifu:ifu_buildingKit,位标记 BUFFERED | NOT_REMOVABLE | DO_NOT_CHECK_FOR_COLLISIONS。
物品 NBT
魔杖本体不存任何数据:onCreated 只写入一个空的 stackTagCompound(itemStack.stackTagCompound = new NBTTagCompound()),没有 NBT 字段名。
筛选物存在玩家的扩展属性里,不在魔杖上 —— 完整 NBT 路径见「筛选界面与数据同步」条目。
提示文本(addInformation,仅客户端)
| 行 | lang 键 | 内容 |
|---|---|---|
| 1 | IFU.FindTarget |
“正在寻找: %s”,参数是筛选物显示名;仅当筛选格非空时输出 |
| 2 ~ 4 | IFU.description1/2/3 |
放入要寻找的矿石方块 / 对地面 shift+右击打开 GUI / 一次只可以寻找一种方块 |
| 5 | IFU.SearchRadiusText |
“X轴和Z轴的搜索半径为%s,Y轴搜索半径为%s”,参数为 xzAreaRadius 与 yAreaRadius |
| 6 ~ 7 | IFU.disableAtSomewhereWarning1/2 |
维度限制警告,仅当 enableEverywhere == false 时输出 |
数值
| 属性 | 值 |
|---|---|
命中计数上限 MAX_FOUND |
10 |
| 默认扫描半径 X/Z | 5(可配 1 ~ 16) |
| 默认扫描半径 Y | 60(可配 1 ~ 60) |
| 默认矿脉揭示半径 | 24(可配 xzAreaRadius ~ 64) |
| 扫描间隔 | 20 tick(1 秒) |
| 音效触发阈值 | damage ≥ 5 |
| 音效参数 | ic2:tools.Treetap,音量 0.6F,音调 0.8F,向周围广播 |
| 最大堆叠 | 1 |
相关条目
- 矿石勘探效果 - damage 计数从哪来、扫描范围、
MatchTarget4 种判定、矿脉揭示 - 筛选界面与数据同步 - 潜行右键打开的界面、槽位限制、NBT 与网络消息
- 寻矿魔杖配置 - 影响本物品全部行为的 9 个配置项
外部依赖(代码 import 可证)
- GregTech 5 API:
IOreMaterial、OreManager、OreInfo、OrePrefixes、GTUtility、GTModHandler、GTValues - GTNHLib:
ColorResource(界面颜色) - VisualProspecting:
VisualProspecting_API(矿脉揭示) - IndustrialCraft 2:
ic2:tools.Treetap音效资源 - Twilight Forest:仅按维度名白名单识别,不含任何代码集成