寻矿魔杖

基本信息

属性 值
注册名 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,因此魔杖永远不会被当作方块放置出去。

关键规则

  1. 一次只能生效一根:服务端取 findFirstInInventory(player.inventory),即主物品栏里第一个 ItemOreFinderTool;不是它的其它魔杖每 tick 只会把 damage 抄成主魔杖的值(主魔杖为 null 时抄 0),自己不扫描(ItemOreFinderTool.java:126-130)。提示文本对应 IFU.description3(“一次只可以寻找一种方块”)。
  2. 维度限制:enableEverywhere == false(默认)时,仅当 world.provider.dimensionId 为 0(主世界)或 -1(下界),或 world.provider.getDimensionName().equals("Twilight Forest") 才继续扫描;否则直接 return。
  3. 音效:客户端在 itemstack.getItemDamage() >= OreFinderSearch.MAX_FOUND / 2(即 ≥ 5)且 ConfigHandler.wandSound 为 true 时播放 world.playSound(..., "ic2:tools.Treetap", 0.6F, 0.8F, true)。
  4. 节流:world.getTotalWorldTime() % 20 != entity.hashCode() % 20 时跳过 —— 每秒扫一次,且按 entity.hashCode() % 20 让不同玩家错开 tick。
  5. 同位去重:props.isSameScan(cur_x, cur_y, cur_z, searchItem) 为真则跳过本次扫描(比较坐标 + ItemStack.areItemStacksEqual)。
  6. 筛选物无效:!target.canSearch() 时 damage 归 0 并 props.clearLastScan()。
  7. 矿脉揭示:扫描命中矿石时额外调用 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

相关条目

外部依赖(代码 import 可证)

  • GregTech 5 API:IOreMaterial、OreManager、OreInfo、OrePrefixes、GTUtility、GTModHandler、GTValues
  • GTNHLib:ColorResource(界面颜色)
  • VisualProspecting:VisualProspecting_API(矿脉揭示)
  • IndustrialCraft 2:ic2:tools.Treetap 音效资源
  • Twilight Forest:仅按维度名白名单识别,不含任何代码集成