Morphing Handler(变形核心)

基本信息

属性 值
类型 静态工具类(public final),单例 INSTANCE 监听 ItemTossEvent
注册位置 CommonProxy.preInit 通过 MinecraftForge.EVENT_BUS.register(MorphingHandler.INSTANCE)
作用 解析 modid 别名、维护每本书的 NBT 数据、执行变形/还原

行为

MorphingHandler 是整个 tome 系统的中枢,关键静态方法:

getModFromBlock(Block state)

解析方块注册名 modid:name,返回经 getModOrAlias 别名映射的小写 modid。

getModFromStack(ItemStack stack)

null 时返回 MINECRAFT(即 "minecraft"),否则按物品 delegate.name() 切分并应用别名。

getModOrAlias(String mod)

查询 ConfigHandler.aliases,未命中则原样返回。

doesStackHaveModAttached(ItemStack stack, String mod)

判断 TAG_TOME_DATA 桶中是否含给定 mod id。

getShiftStackForMod(ItemStack stack, String mod)

若 stack 没 NBT 或 stack 当前 mod 与目标 mod 相同 → 返回 stack;否则调用 makeMorphedStack(stack, mod, morphData) 返回新 stack。

containsItem(ItemStack tome, ItemStack stack)

按 mod id 排序后逐个解 NBT,还原 ItemStack 列表,匹配 itemStack.isItemEqual(stack)(用于配方去重判定)。

makeMorphedStack(ItemStack currentStack, String targetMod, NBTTagCompound morphData)

  1. 读取 currentStack 的 TAG_ITEM_DEFINED_MOD(缺省回退到 getModFromStack)作为 currentMod;
  2. 把 currentStack 的 NBT(去掉 TAG_TOME_DATA 防止嵌套)写回 morphData[currentMod] 桶(仅当 currentMod 不是 minecraft 或 akashictome);
  3. targetMod == MINECRAFT → 重建为 ModItems.tome;否则从 morphData 取出对应 NBT,反序列化为 stack;
  4. 在 stack 的 NBT 上写入 TAG_TOME_DATA = morphData、TAG_MORPHING = true;
  5. 若 stack 当前不是基础 tome:用 TAG_TOME_DISPLAY_NAME 缓存原显示名,并把显示名改为 Akashic Tome (<原书名>);
  6. stack.stackSize = 1;
  7. 把 currentStack 的所有附魔与 RepairCost 复制到新 stack(EnchantmentHelper.setEnchantments)。

getModNameForId(String modId)

返回 Loader.instance().getIndexedModList() 中对应 modid 的展示名(首次类加载时一次性建立 modNames 表,键为小写)。

isAkashicTome(ItemStack) / isMorphedTome(ItemStack)

  • isAkashicTome:stack 物品是 ModItems.tome 或 NBT 含 TAG_MORPHING=true;
  • isMorphedTome:isAkashicTome 且 stack 当前物品不是 ModItems.tome。

事件 onItemTossEvent

仅在玩家潜行 + 物品是变形 tome 时:

  • 用 makeMorphedStack(stack, MINECRAFT, morphData.copy()) 生成新 stack,移除 currentMod 桶;
  • 在世界中生成 EntityItem 实体(仅服务端);
  • 还原原 stack:清掉 display、TAG_MORPHING、TAG_TOME_DISPLAY_NAME、TAG_TOME_DATA,并把 TAG_TOME_DISPLAY_NAME 重新设回 original(仅当原本自定义显示名时)。

数值

常量 值
MINECRAFT "minecraft"
TAG_MORPHING "akashictome:is_morphing"
TAG_TOME_DATA "akashictome:data"
TAG_TOME_DISPLAY_NAME "akashictome:displayName"
TAG_ITEM_DEFINED_MOD "akashictome:definedMod"

限制

  • 变形 stack 的 stackSize 始终被强制设为 1(避免堆叠导致数据不一致)。
  • RepairCost 仅在 currentStack.getTagCompound().hasKey("RepairCost", Constants.NBT.TAG_INT) 时复制。
  • modNames 表在静态初始化时一次性构建;运行期新增 mod 不会自动刷新。

相关条目