橡皮鸡(Rubber Chicken)

基本信息

属性 值
类名 IguanaToolLeveling.rubberChicken(裸 Item,无子类)
注册名 rubberChicken
未本地化名 item.iguana.tcon.rubberChicken
显示名(en_US) Rubber Chicken
显示名(ru_RU) Резиновая курица
贴图 assets/iguanatweakstconstruct/textures/items/rubber_chicken.png
创造栏 无
最大堆叠 64(未覆写,走 Item 默认)

它是工具等级系统封顶后的替换物——工具升到 maxToolLevel (默认 6)就不再升级,而是变成一只橡皮鸡,原工具信息被存进 NBT 保留。

何时出现

leveling/LevelingLogic.java:158-162,工具达到 maxToolLevel 时:

tags.setString("Original", Item.itemRegistry.getNameForObject(tool.getItem()));
// rubber chicken yaaaaay
tool.func_150996_a(IguanaToolLeveling.rubberChicken);
tags.setLong(TAG_EXP, 0L);
tags.setInteger("CheatyXP", 0);

即:

  1. 把原物品的注册名写进 InfiTool NBT 的 Original 字段(字符串)
  2. 把工具的物品替换为橡皮鸡
  3. 经验清零:TAG_EXP(long)与 CheatyXP(int)都置 0

注意替换的是物品而不是整份 NBT,所以工具的材料、部件、附魔等仍留在 InfiTool 里, 这也是后续能原样还原的原因。

提示文本

leveling/handlers/LevelingToolTipHandler.java:36-43:当 stack.getItem() == rubberChicken 且 InfiTool 存在 Original 键时,在 tooltip 的 第 1、2 行(下标 1 与 2,不是追加到末尾)插入两行 DARK_RED / ITALIC 文本:

键 en_US 原文 插入位置
tooltip.chicken1 You dirty cheater. 下标 1
tooltip.chicken2 If you're sorry type '/imadirtycheater' 下标 2

判据里 hasKey("Original") 与替换时的 setString("Original", ...) 一致; 若 NBT 被外部改坏导致缺这个键,就不会显示任何提示。

在 NEI 中被隐藏

IguanaToolLeveling.preInit()(第 58-61 行):客户端且检测到 NEI 加载时 调用 codechicken.nei.api.API.hideItem(new ItemStack(rubberChicken))。

源码注释原文是 // sneaky rubber chicken——因为这个物品只能通过把满级工具替换过来获得, 无法合成也无需合成,所以刻意不让玩家在 NEI 里搜到。故用 NEI 搜不到这只鸡是正常行为, 不是注册失败。

取回原工具

用 /imadirtycheater 指令。处理逻辑 (CommandIAmADirtyCheater.java:76-85):

  1. 要求 InfiTool 存在 Original 键,否则直接返回
  2. 取出 Original 字符串,通过注册表查回 Item
  3. stack.func_150996_a(item) 换回原物品,并把 CheatyXP 置 0

⚠️ 该指令第 79 行 Item.itemRegistry.containsKey(unloc); 丢弃了返回值, 是残留的空检查,未起到任何保护作用。真正生效的是下一行 getItemByText(sender, unloc)(查不到会向发送者报错并返回 null)。 同理 LevelingLogic 用 Item.itemRegistry.getNameForObject(...) 记录原名时, 若 tool.getItem() 恰好不在注册表里会得到 null,setString 将写入字面量 "null", 此后 /imadirtycheater 就再也换不回来了——两个方向都是静默失败。

关联