诅咒系统

基本信息

属性 值
诅咒种类 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 条。

相关条目