项目名:Who Am I: Core(我非我:核心)
- Mod ID:
who_am_i_core - 包名:
net.zhaiji.who_am_i_core - Minecraft:1.21.1
- NeoForge:21.1.230
- ModDevGradle:2.0.140
- Parchment Mappings:2024.11.17
- Java:21
- 版本:1.2.7
前置模组:Chest Cavity Beyond(胸腔:超越),本模组为 CCB 的 Addon,核心机制是为不提供胸腔的原版/其他 mod 的生物添加可植入胸腔的器官。
src/main/java/net/zhaiji/who_am_i_core/
├── WhoAmICore.java # 主模组入口(@Mod),完成注册和事件总线绑定
├── WhoAmICoreClient.java # 客户端入口(@Mod Dist.CLIENT),注册客户端事件
│
├── api/
│ └── UseCondition.java # 可使用条件 API。Builder 模式定义哪些物品可被使用及使用效果
│
├── attachment/
│ └── HumoursData.java # 四体液学说数据(Attachment):仅保存血液/黄胆汁/黑胆汁/粘液当前值,上限由四个 MAX_* 属性提供
│
├── client/
│ ├── event/
│ │ ├── ClientEventManager.java # 客户端事件总线注册(双总线:modBus + gameBus)
│ │ └── ClientEventHandler.java # 客户端事件处理器实现
│ ├── overlay/
│ │ └── HumoursOverlay.java # 四体液 HUD 叠加层
│ └── tooltip/
│ └── ClientFrankensteinHeartTooltip.java # 弗兰肯斯坦心脏客户端工具提示
│
├── config/
│ └── WhoAmIClientConfig.java # 客户端配置
│
├── datagen/
│ ├── DataGenHandler.java # 数据生成入口(监听 GatherDataEvent)
│ ├── ItemModelProvider.java # 物品模型 JSON(遍历 WAICItem.ITEM.getEntries())
│ ├── ItemTagProvider.java # 物品标签 JSON(器官类型标签 + 自定义标签)
│ ├── LanguageProvider.java # 双语语言 JSON(EN_US + ZH_CN)
│ └── DamageTypeTagsProvider.java # 伤害类型标签
│
├── effect/
│ └── DragonPowerEffect.java # 龙之力药水效果(全部使用同一类,不同颜色区分)
│
├── entity/
│ └── HydraVenomBreathProjectile.java # 九头蛇毒物吐息投射物实体
│
├── event/
│ ├── CommonEventManager.java # 服务端事件总线注册(双总线:modBus + gameBus)
│ └── CommonEventHandler.java # 核心业务逻辑:器官注册、伤害处理、效果监听、胸腔注册等
│
├── inventory/tooltip/
│ └── FrankensteinHeartTooltip.java # 弗兰肯斯坦心脏服务端工具提示
│
├── item/
│ ├── ClothTeddyBearItem.java # 布织泰迪熊特殊物品
│ ├── DragonBloodPreparationItem.java # 龙之血药剂物品
│ ├── FrankensteinItem.java # 弗兰肯斯坦收纳袋物品(Bundle 类)
│ └── PaletteItem.java # 调色盘特殊物品
│
├── manager/
│ ├── UseConditionManager.java # 可使用条件管理器
│ ├── IceAndFireChestCavityTypeManager.java # 龙类和九头蛇胸腔类型定义
│ ├── WAICChestCavityTypeManager.java # 幻想种胸腔类型定义
│ ├── WAICDamageTagManager.java # 伤害类型标签常量(IS_MELEE)
│ └── WAICItemTagManager.java # 自定义物品标签常量(MAGIC, MECHANICAL, SUMMON, UNIQUE, 龙种, ICE, FIRE, LESION, CURSED_GOLD, EMBER_METAL, CLOTH_ORGAN 等)
│
├── mixin/
│ ├── ApplyBonusCountMixin.java # 抢夺/时运奖励次数(使用 WAIC 属性)
│ ├── ChestCavityDataMixin.java # 胸腔数据 mixin
│ ├── EnchantedCountIncreaseFunctionMixin.java # 附魔数量增加函数
│ ├── EntityUmvuthanaFollowerToPlayerMixin.java # 乌姆塔纳追随者关系转玩家
│ ├── ItemStackMixin.java # ItemStack mixin(UseCondition 使用流程支持)
│ ├── LivingEntityMixin.java # LivingEntity mixin
│ ├── MalkuthCannonEntityMixin.java # FDBosses 王国炮台 mixin
│ ├── MalkuthWeaknessHandlerMixin.java # 王国弱点处理器 mixin
│ ├── MalkuthWeaknessOverlayMixin.java # 王国弱点 HUD mixin
│ └── PoisonMobEffectMixin.java # 中毒效果 mixin(Access Transformer 访问)
│
├── mixinapi/
│ └── IEntityUmvuthanaFollowerToPlayer.java # Mixin API 接口
│
├── organ/ # ⚠ 核心目录:所有器官定义
│ ├── WAICOrgans.java # 本模组核心器官(墨水、颜料、木质、弗兰肯斯坦、病变、九狱、双子魔眼、拟态、幻想种、布织、独立器官)
│ ├── IceAndFireOrgans.java # 冰与火:火龙/冰龙/电龙器官、悚怖器官、九头蛇器官
│ ├── MowziesMobOrgans.java # Mowzie's Mobs:胸中新星、制御棒、衰老器官、禅心、泥峭系列
│ ├── FDBossesOrgans.java # FDBosses 逆卡巴拉:王国战士之心、王国、慈悲、严厉
│ ├── AnvilCraftOrgans.java # AnvilCraft:皇家钢、诅咒金、余烬金属、浮霜金属、超限合金
│ ├── CataclysmOrgans.java # 灾变:利维坦、冥行武弁、咒翼灵骸、斯库拉
│ └── IronSpellOrgans.java # Iron's Spells:死灵法师、死者之王
│
├── register/
│ ├── WAICAttachment.java # Attachment 注册器(四体液 HUMOURS)
│ ├── WAICAttribute.java # 自定义属性注册器(BLOCK, COUNTER_ATTACK, HEAL, MELEE_DAMAGE, RANGED_DAMAGE, MAGIC_DAMAGE, 各种百分比属性, LOOTING, FORTUNE, MAX_BLOOD, MAX_YELLOW_BILE, MAX_BLACK_BILE, MAX_PHLEGM)
│ ├── WAICCreativeModeTab.java # 创造模式标签页
│ ├── WAICEffect.java # 药水效果注册器(4种龙之力)
│ ├── WAICEntity.java # 实体注册器(九头蛇毒物吐息)
│ └── WAICItem.java # ⚠ 核心注册器:所有物品/器官的 DeferredRegister,static 块中调用所有 Organs.register()
│
├── task/
│ ├── ChestNovaTask.java # 胸中新星任务(燃烧周围器官、召唤乌姆塔纳追随者)
│ ├── DragonBreathCastingTask.java # 龙息施法任务
│ ├── HydraLungBreathTask.java # 九头蛇肺吐息任务
│ └── StraightIntestineTask.java # 直肠子掉落食物任务
│
└── util/
├── OrganUtil.java # 跨 mod 通用工具(邻接槽位计算、无情机制、冰火器官系统、弗兰肯斯坦聚合、几率判定等)
├── WAICOrganUtil.java # WAIC 器官工具类(墨水、病变、经验之心、布织泰迪熊、猩红、九狱、电荷系统、FDBosses 等)
├── WAICTooltipUtil.java # 工具提示生成工具
├── AnvilCraftOrganUtil.java # AnvilCraft 器官工具类(浮霜金属、超限合金)
├── CataclysmOrganUtil.java # 灾变器官工具类(涛浪提灯、风暴脊柱/肋骨、焰魔、巨兽、远古工厂、咒翼灵骸等)
├── CompanionsOrganUtil.java # Companions 器官工具类(教宗心脏/脾脏/阑尾)
├── IceAndFireOrganUtil.java # 冰火器官工具类(龙宝玉、吐息、悚怖命匣、九头蛇全套技能)
├── IronSpellOrganUtil.java # 铁魔法器官工具类(腐败魂灯、尸王脊柱/肋骨)
└── MowziesMobOrganUtil.java # Mowzie 器官工具类(护心镜、胸中新星、泥峭等)
本模组采用 EventManager + EventHandler 分层架构:
- Manager:仅负责通过
@SubscribeEvent或addListener将 Handler 方法绑定到对应总线 - Handler:纯静态方法,实现具体业务逻辑
- 双总线:
modEventBus(模组加载事件)+gameBus/NeoForge.EVENT_BUS(游戏运行时事件)
所有器官通过 Organ.builder() 构建,最终注册到 WAICItem.ITEM(一个 DeferredRegister<Item>)。
关键方法:
Organ.builder()— 默认构建器Organ.builder(Supplier<Item>)— 指定自定义 Item 类Organ.builder(Item existing)— 将已有物品包装为器官(如 IafItems 的心脏).addValueAttribute(Holder<Attribute>, double)— 添加属性加成.totalMultipliedAttribute(Holder<Attribute>, double)— 总乘算属性.baseMultipliedAttribute(Holder<Attribute>, double)— 基础乘算属性.skill(SkillFunction)— 设置主动技能(右键长按释放).skillOnCooldown(CooldownFunction)— 技能冷却中回调.cooldown(int)— 技能冷却时间(tick).attack(BiConsumer)— 攻击时回调.hurt(BiConsumer)— 受伤时回调.heal(BiConsumer)— 治疗时回调.tick(TickFunction)— 每 tick 回调.incomingDamage(IncomingDamageConsumer)— 即将受伤回调.modifier(ModifierFunction)— 动态属性修改器.totalMultiplierModifier(ModifierFunction)— 总乘算动态属性.chestCavityOpen/skill/close(Consumer)— 胸腔生命周期回调.added/removed(Consumer)— 器官添加/移除回调.otherChange(OtherChangeConsumer)— 其他槽位器官变化回调.skillTooltip(TooltipFunction)/.descriptionTooltip(TooltipFunction)— 工具提示.properties(Function)— 自定义 Item.Properties
器官在 WAICItem 的 static {} 块中按顺序注册:
- WAICOrgans.register()
- MowziesMobOrgans.register()
- IceAndFireOrgans.register()
- FDBossesOrgans.register()
- AnvilCraftOrgans.register()
- CataclysmOrgans.register()
- IronSpellOrgans.register()
每个 Organ 类提供一个空的 register() 方法,用于触发类加载和字段初始化。
冰与火的龙类心脏(火龙/冰龙/电龙/九头蛇)使用 IafItems 中已有的物品作为器官。这些在 IceAndFireOrgans.setupOrgans() 中通过 Organ.builder(IafItems.XXX_HEART.get()).build() 包装,该方法在 OrganRegisterEvent 中调用。
- BLOCK — 格挡,等值减少伤害
- COUNTER_ATTACK — 反击,受伤时对攻击者造成荆棘伤害
- HEAL — 治疗,定期恢复生命值
- MELEE_DAMAGE — 近战伤害加值(受武器伤害倍率影响)
- RANGED_DAMAGE — 远程伤害加值
- MAGIC_DAMAGE — 魔法伤害加值
- LOOTING — 抢夺等级
- FORTUNE — 时运等级
- MAX_BLOOD — 血液最大值
- MAX_YELLOW_BILE — 黄胆汁最大值
- MAX_BLACK_BILE — 黑胆汁最大值
- MAX_PHLEGM — 粘液最大值
- MELEE_DAMAGE_PERCENTAGE — 近战伤害最终倍率
- RANGED_DAMAGE_PERCENTAGE — 远程伤害最终倍率
- MAGIC_DAMAGE_PERCENTAGE — 魔法伤害最终倍率
伤害计算流程:
- 获取
BLOCK(格挡)和COUNTER_ATTACK(反击)属性 - 反击:对攻击者造成荆棘类型伤害
- 根据伤害类型确定加伤属性:
- IS_MELEE → MELEE_DAMAGE + MELEE_DAMAGE_PERCENTAGE
- IS_MAGIC → MAGIC_DAMAGE + MAGIC_DAMAGE_PERCENTAGE(来自 Tags.DamageTypes.IS_MAGIC)
- IS_PROJECTILE → RANGED_DAMAGE + RANGED_DAMAGE_PERCENTAGE
- 器官特定回调(九头蛇肋骨/肌肉、尸王脊柱、风暴脊柱)
- 最终计算:
max(0, damage - block + extraDamage) * finalMultiplier
冰火系统通过 FIRE / ICE 物品标签的器官数量计算,不使用连续属性值:
- 火龙/余烬金属/焰魔/原初受火者 → FIRE 标签
- 冰龙/悚怖/浮霜金属/幻影 → ICE 标签
- 无王国时,炽焰与冰霜互相抵消(差值可为负,弱势方给负加成作为冲突惩罚)
- 王国器官(MALKUTH)→ 双向计数(炽焰与冰霜互相计入,不再抵消)
getFireOrganCount(context)— 炽焰抵消冰霜后的数量(无王国: fire-ice,有王国: fire+ice)getIceOrganCount(context)— 冰霜抵消炽焰后的数量(同上对称)getLocalFireOrganCount(context)/getLocalIceOrganCount(context)— 九宫格局部版本(以自身槽位为中心3×3范围)- 影响:不灭薪火/焰魔肋甲(signum×sqrt(abs))、炽面甲/巨兽回路(max(0,...))、冰魂残片/冻结魂火/悚怖命匣(线性)、悚怖脊柱、教宗阑尾(正负判定)
HumoursData是NeoForge Attachment,仅保存血液、黄胆汁、黑胆汁和粘液的当前值,不保存最大值。四种体液的最大值分别由MAX_BLOOD、MAX_YELLOW_BILE、MAX_BLACK_BILE和MAX_PHLEGM属性提供,默认值均为100:
- 血液(Blood) — 暂未大规模使用
- 黄胆汁(Yellow Bile) — 暂未大规模使用
- 黑胆汁(Black Bile) — 腐败魂灯(消耗增级)、尸王脊柱(吸收伤害)、尸王肋骨(+上限)
- 粘液(Phlegm) — 涛浪提灯(消耗增伤)、风暴脊柱(吸收伤害转粘液)、风暴肋骨(+上限)
提供insertXxx/extractXxx便捷方法,支持simulate模式;属性上限变化后会统一夹紧当前值并通过Attachment同步。NeoForge使用StreamCodec自动进行客户端同步。
通过 Builder 模式定义哪些物品可以被玩家右键使用:
- 物品属性由
IItemExtensionMixin接管,使用流程由ItemStackMixin+LivingEntityMixin接管,不再依赖事件结算。 matchesItem(Predicate<ItemStack>)— 物品匹配条件matchesEntity(Predicate<LivingEntity>)— 实体匹配条件(通常检查是否有某器官)onUse(BiFunction)— 主使用逻辑afterUse(BiFunction)— 使用完成后的额外收尾foodProperties(Function)— 挂载FoodProperties,提供后就会进入原版食物管线eatAnimation()/drinkAnimation()— 使用动画类型useDuration(int)/fastUse()/instantUse()— 使用时长与使用模式- 只要条件提供了
FoodProperties,它就会被视为食物,后续是否为食物的判断都走getFoodProperties(...)
已注册的条件(在 ChestCavityRegisterEvent 中):
- 泥峭器官 → 可以使用泥土类物品
- 暴食器官 → 可以使用任何食物,速度减半
- 墨水瓶器官 → 可以喝铁魔法的墨水
ItemTagManager.ORGANS / HEART / LUNG / SPINE / STOMACH / INTESTINE / KIDNEY / SPLEEN / LIVER / APPENDIX / RIB / MUSCLE / SPECIAL
- MAGIC — 魔法器官(经验之心倍率、胸中新星不烧毁)
- MECHANICAL — 机械器官(胸中新星不烧毁)
- SUMMON — 召唤类
- UNIQUE — 唯一
- FIRE_DRAGON / ICE_DRAGON / LIGHTNING_DRAGON — 龙种聚合标签
- FIRE — 炽焰元素(火龙 + 余烬金属 + 火焰王国)
- ICE — 冰霜元素(冰龙 + 悚怖 + 浮霜 + 冰霜王国)
- LESION — 病变器官
- CURSED_GOLD — 诅咒金
- EMBER_METAL — 余烬金属
- CLOTH_ORGAN — 布织器官
- IS_MELEE(WAICDamageTagManager)— 近战伤害,用于区分近战/远程/魔法
- WAICChestCavityTypeManager.FANTASTICAL → 注册给 IafEntities.PIXIE(妖精)
- IceAndFireChestCavityTypeManager.FIRE_DRAGON → IafEntities.FIRE_DRAGON
- IceAndFireChestCavityTypeManager.ICE_DRAGON → IafEntities.ICE_DRAGON
- IceAndFireChestCavityTypeManager.LIGHTNING_DRAGON → IafEntities.LIGHTNING_DRAGON
- IceAndFireChestCavityTypeManager.HYDRA → IafEntities.HYDRA
- ChestNovaTask — 胸腔关闭时烧毁周围器官(魔法/机械除外),检测乌姆塔纳面具并召唤追随者
- StraightIntestineTask — 食用食物后 30% 几率在 3 秒后掉落该食物
九头蛇脾脏治疗效果已从独立 Task 改为器官
.tick()回调(IceAndFireOrganUtil.hydraSpleenTick),不再使用 Task 系统。
ApplyBonusCountMixin— 抢夺/时运使用 WAIC 自定义属性ChestCavityDataMixin— 胸腔数据扩展EnchantedCountIncreaseFunctionMixin— 附魔计算EntityUmvuthanaFollowerToPlayerMixin— 追随者归属改为玩家IItemExtensionMixin— 使 UseCondition 的食物属性注入生效ItemStackMixin— 使 UseCondition 的使用流程生效LivingEntityMixin— 生物实体扩展MalkuthCannonEntityMixin— FDBosses 王国炮台MalkuthWeaknessHandlerMixin+MalkuthWeaknessOverlayMixin— 王国弱点系统PoisonMobEffectMixin— 中毒效果(需要 Access Transformer)
who_am_i_core.mixins.json— Mixin 配置文件META-INF/accesstransformer.cfg— 仅一行:public net.minecraft.world.effect.PoisonMobEffectassets/who_am_i_core/textures/— GUI/物品/效果贴图assets/who_am_i_core/textures/item/— 约 200+ 个器官贴图
assets/who_am_i_core/lang/— en_us.json + zh_cn.jsonassets/who_am_i_core/models/item/— 所有物品模型 JSONdata/chestcavitybeyond/tags/item/organs/— 器官类型标签data/who_am_i_core/tags/— 自定义物品/伤害类型标签
| 模组 | 用途 | CurseForge ID |
|---|---|---|
| Chest Cavity Beyond(前置) | 器官系统核心 API | 1427715 |
| Ice and Fire: CE | 龙类器官、九头蛇、悚怖 | 1040076 |
| Mowzie's Mobs | 乌姆塔纳、泥峭、衰老器官 | 250498 |
| Cataclysm(灾变) | 利维坦、冥行武弁、斯库拉 | 551586 |
| FDBosses(逆卡巴拉) | 王国器官(Malkuth 冰火双向计数) | 1271707 |
| Iron's Spells 'n Spellbooks | 墨水、法术流派、死灵法师 | 855414 |
| AnvilCraft | 金属器官(浮霜/超限/诅咒金/余烬/皇家钢) | 986251 |
| Touhou Little Maid | 车万女仆 | 355044 |
| Companions | 同伴 | 1300341 |
库依赖(non-mod):GeckoLib, Architectury API, Curios, Player Animator, Knight Lib, FD Lib, Uranus, Jupiter, Lionfish API
getAdjacentSlots(int slotIndex)— 获取 3×9 网格中某槽位周围 8 格的索引列表mercilessBonus(ChestCavitySlotContext)—floor(sqrt(总附魔等级)),浮霜和超限的核心机制rollChance(entity)— 幸运判定次数:每 5 点幸运 = 1 次,余数每点 20% 几率rollResult(entity, chance)— 幸运加权概率判定getFireOrganCount(context)— 全局炽焰抵消冰霜后的数量(可为负,王国时双向计数)getIceOrganCount(context)— 全局冰霜抵消炽焰后的数量(同上对称)getLocalFireOrganCount(context)— 以自身槽位为中心3×3范围内炽焰抵消冰霜后的数量getLocalIceOrganCount(context)— 以自身槽位为中心3×3范围内冰霜抵消炽焰后的数量aggregateFrankensteinHeartAttributes(context, modifiers)— 弗兰肯斯坦心脏聚合内部器官属性isInChest(entity, stack)— 引用比较判断是否在胸腔中getSymmetricRibIndex(int index)— 获取对称槽位索引
- 墨水阑尾/肌肉、病变心脏/肌肉、经验之心、布织泰迪熊、猩红、九狱、电荷系统、FDBosses 等器官实现