诅咒系统
基本信息
| 属性 | 值 |
|---|---|
| 诅咒种类 | 11 种(CurseType 枚举常量,damage 0–10) |
| 诅咒物品 | curse(ItemCurse),栈上限 32 |
| 永恒变体 | 伤害值 bit 8(0b100000000) |
| 数据源 | mechanics/curse/CurseType.java:35-522 |
功能
CurseType 是一个 11 常量的枚举,每个常量封装一个匿名 ICurseHandler 实现,定义该诅咒对生物、方块与玩家的每 tick 效果。诅咒以「可堆叠的 curse 物品」形式存在,通过配方合成,可附着到玩家或被诅咒的生物上。
每个常量用两个数字构造:CurseType(int damage, ICurseHandler handler)(CurseType.java:544-547)。CurseType.VALUES = values()(CurseType.java:522)供全局遍历。
isEternal(int damage) 判定 bit 8:(damage & 0b100000000) != 0(CurseType.java:534-536)—— 永恒诅咒无法被消耗抵消。
数值
11 种诅咒
| 常量 | damage | 合成材料 1 | 2 | 3 | 4 |
|------|--------|----------|—|—|—|—|
| TELEPORTATION | 0 | 末影珍珠 | 末影珍珠 | 末影珍珠 | 末影珍珠 |
| CONFUSION | 1 | 燧石 | 黑色染料 | instability_orb | 烈焰粉 |
| TRANQUILITY | 2 | 燧石 | 黑色染料 | 线 | 皮革 |
| SLOWNESS | 3 | 糖 | 糖 | 发酵蜘蛛眼 | 发酵蜘蛛眼 |
| WEAKNESS | 4 | 烈焰粉 | 烈焰粉 | 发酵蜘蛛眼 | 发酵蜘蛛眼 |
| BLINDNESS | 5 | 燧石 | 发酵蜘蛛眼 | 黑色染料 | 黑色染料 |
| DEATH | 6 | 烈焰棒 | ectoplasm | silverfish_blood | 骨头 |
| DECAY | 7 | stardust | stardust | 铁锭 | instability_orb |
| VAMPIRE | 8 | 荧石粉 | 石英 | igneous_rock | silverfish_blood |
| REBOUND | 9 | 末影之眼 | 金粒 | 燧石 | 金粒 |
| LOSS | 10 | instability_orb | 书 | 红石 | 绿宝石 |
合成材料定义在静态初始化块 CurseType.java:469-520(setRecipe(o1,o2,o3,o4),:549-561)。getRecipeItem(int index) 返回对应 ItemStack(CurseType.java:620-622)。
使用次数区间
由静态块中的 .setUses(EnumCurseUse.X, min, max) 设定,运行时用 getUses(useType, rand) 随机取值(CurseType.java:624-635):
| 常量 | BLOCK | ENTITY | PLAYER |
|---|---|---|---|
TELEPORTATION |
22–34 | 7–12 | 3–6 |
CONFUSION |
11–15 | 6–10 | —(未设置) |
TRANQUILITY |
34–48 | 75–105 | — |
SLOWNESS |
35–42 | 16–21 | 5–8 |
WEAKNESS |
35–42 | 16–21 | 5–8 |
BLINDNESS |
30–39 | 12–16 | 3–5 |
DEATH |
28–36 | 12–16 | 6–9 |
DECAY |
18–25 | 14–19 | 9–14 |
VAMPIRE |
15–22 | 8–13 | 6–9 |
REBOUND |
20–26 | 15–22 | 12–16 |
LOSS |
14–19 | 10–12 | 8–11 |
TRANQUILITY 的源码写作 68 >> 1 / 96 >> 1 / 150 >> 1 / 210 >> 1(CurseType.java:478),即 34/48/75/105。PLAYER 列为空表示该常量没有调用 setUses(PLAYER, ...),getUses 会落到 default: return 0(CurseType.java:633)。
颜色
每个常量通过 setColor1h(hue)(HSV,饱和 75 亮度 90)或 setColor1g(value)(灰度)设定两套颜色,getColor(pass) 返回 color1 / color2 / 16777215(CurseType.java:616-618)。setColor1h → setColor1(hue, 75, 90)(:563-569),setColor1g → setColor1(0, 0, value)(:567-576)。
交互
各诅咒的实现要点
| 常量 | 实现要点 | 位置 |
|---|---|---|
TELEPORTATION |
冷却 20–79 tick,每 tick 最多尝试 200 次落点;要求落点方块存在、不在液体中、无碰撞;传送成功时广播 C22EffectLine + C21EffectEntity |
CurseType.java:37-121 |
CONFUSION |
对 EntityCreature 改写目标为 16 格内随机生物;对 EntityGhast 反射改写 targetedEntity 为 64 格内随机生物;冷却 60 |
CurseType.java:123-179 |
TRANQUILITY |
给 followRange 属性加 -1 修饰符(ID "HEE NoNavigationCurse",op 2),并清空 EntityCreature 的 getEntityToAttack/getAttackTarget |
CurseType.java:181-210 |
SLOWNESS |
无 Potion.moveSlowdown 或其 amplifier < 1 / 时长 < 25 时,重新施加 PotionEffect(Potion.moveSlowdown.getId(), 125, 1, true) |
CurseType.java:212、218-221 |
WEAKNESS |
同构,作用于 Potion.weakness,PotionEffect(…, 125, 1, true) |
CurseType.java:230、236-239 |
BLINDNESS |
无 Potion.blindness 或其时长 < 25 时施加 PotionEffect(Potion.blindness.getId(), 125, 0, true)(不要求 amplifier) |
CurseType.java:248、254-257 |
DEATH |
entity.hurtTime == 0 时 attackEntityFrom(DamageSource.magic, 1.5F) —— 每次受击 1.5 点真实伤害 |
CurseType.java:266、270-272 |
DECAY |
计时器存在 NBT tag HEE_C7_t;为 0 时初始化 21 + rand(20),递减到 1 时触发(EntityPlayer 走玩家分支) |
CurseType.java:280、286-290 |
VAMPIRE |
每 20 tick(ticksExisted % 20 == 0)判定:白天 + getBrightness(1F) > 0.5F + 能看见天空时吸血 |
CurseType.java:354、358-362 |
REBOUND |
把 worldObj.getTotalWorldTime() 写入 NBT HEE_C9_l;HEE_C9_a 置位时移除该 tag 并返回 true |
CurseType.java:377、382-386 |
LOSS |
计时器 61–120 tick 后随机摧毁一个物品:玩家从主背包 + 护甲(索引 -4…35)中随机抽 1 个丢弃;生物从装备中抽 1 件,且耐久 ≤ 最大值的物品会被额外随机扣耐久(maxDmg = max(最大耐久 − 25, 1)) |
CurseType.java:396-467 |
每个 handler 都有 end(EntityLivingBase, ICurseCaller) 清理 NBT tag(各常量末尾)。注意 CONFUSION 的 end 移除的是 HEE_C1_t,而其 tickEntity 写入的是 HEE_C1_c(CurseType.java:159 vs :177)—— 这是源码中 tag 键名不对称的事实记录;仓库中无测试、无注释、无 commit 提及该差异,故仅记录,不断言为缺陷。
事件注册:CurseEvents,HardcoreEnderExpansion.java:144。伤害来源接口 ICurseCaller(mechanics/curse/ICurseCaller.java)。
合成配方
mechanics/RecipeList.java:162-186 对 CurseType.VALUES 循环注册 2 条配方,共 11 × 2 = 22 条:
1. 诅咒本体(11 条,RecipeList.java:163-179)
PAP
DLB
PCP
产出 ItemStack(ItemList.curse, 8, curse.damage)。材料:
| 符号 | 物品 |
|---|---|
P |
end_powder |
L |
living_matter |
A |
curse.getRecipeItem(0) |
B |
curse.getRecipeItem(1) |
C |
curse.getRecipeItem(2) |
D |
curse.getRecipeItem(3) |
2. 永恒诅咒(11 条,RecipeList.java:181-185)
无序配方:ItemStack(curse, 1, curse.damage) + stardust + arcane_shard → ItemStack(curse, 1, curse.damage | 0b100000000)。
配方总数核对:29 个
addShapedRecipe调用点 − 1(诅咒循环)= 28 静态;8 个addShapelessRecipe− 1(诅咒循环)− 1(染料循环)= 6 静态;循环产生 11 + 11 + 14 = 36;静态 34 + 36 = 70;再加 1 条熔炼配方(RecipeList.java:365)= 71 条。