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)
- 读取
currentStack的TAG_ITEM_DEFINED_MOD(缺省回退到getModFromStack)作为currentMod; - 把 currentStack 的 NBT(去掉
TAG_TOME_DATA防止嵌套)写回morphData[currentMod]桶(仅当 currentMod 不是minecraft或akashictome); targetMod == MINECRAFT→ 重建为ModItems.tome;否则从morphData取出对应 NBT,反序列化为 stack;- 在 stack 的 NBT 上写入
TAG_TOME_DATA = morphData、TAG_MORPHING = true; - 若 stack 当前不是基础 tome:用
TAG_TOME_DISPLAY_NAME缓存原显示名,并把显示名改为Akashic Tome (<原书名>); stack.stackSize = 1;- 把 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 不会自动刷新。
相关条目
- Akashic Tome - 物品条目,附魔传递与显示名注入的最终消费方
- Attachement Recipe 配方行为说明 -
getModFromStack与containsItem的调用方 - 配置文件白/黑名单 -
aliases的来源