Charm Effect(护符特效实体)
事实基准:
/Users/evlos/a/mirror/twilightforest(minecraftVersion = 1.7.10)逐行读源码。
基本信息
| 属性 | 值 | 来源 |
|---|---|---|
| 注册名 | TwilightForest:tfcharmeffect |
TwilightForestMod.java:843 |
| 实体 ID 常量 | idVehicleSpawnCharmEffect = 9 |
TwilightForestMod.java:187 |
| 注册形式 | EntityRegistry.registerModEntity 直调(无刷怪蛋) |
TwilightForestMod.java:841-848 |
| 跟踪距离 / 更新频率 | 80 / 3 | TwilightForestMod.java:846-847 |
| 类 | twilightforest.entity.EntityTFCharmEffect(222 行) |
entity/EntityTFCharmEffect.java:16 |
| 父类 | net.minecraft.entity.item.EntityItem |
EntityTFCharmEffect.java:16 |
| 体型 | setSize(0.25F, 0.25F) |
EntityTFCharmEffect.java:33 |
| 生成方 | TFEventListener(护符生效时) |
TFEventListener.java:441-451, 705-715 |
继承
EntityItem(掉落物实体)是为了复用物品渲染与iconcrack_粒子 —— 但本类把所有「掉落物」行为都禁掉了(见下)。
数值
| 属性 | 值 | 来源 |
|---|---|---|
环绕半径 DISTANCE |
1.0 格 | EntityTFCharmEffect.java:20 |
| 存活时长 | ticksExisted > 200(约 10 秒)后自毁 |
EntityTFCharmEffect.java:119-121 |
| 环绕角速度 | ticksExisted / 5.0 + offset(弧度) |
EntityTFCharmEffect.java:88 |
| 上下浮动 | sin(ticksExisted / 3.0 + offset) / 8 |
EntityTFCharmEffect.java:105 |
| 每 tick 粒子数 | 3 个 iconcrack_<物品ID> |
EntityTFCharmEffect.java:110-116 |
| 粒子散布范围 | 各轴 ±0.125 格 | EntityTFCharmEffect.java:111-113 |
| DataWatcher 键 | DATA_ITEMID = 16、DATA_OWNER = 17 |
EntityTFCharmEffect.java:18-19 |
特殊机制
环绕所有者
onUpdate(EntityTFCharmEffect.java:69-122)每 tick 把实体挪到所有者
(orbiting,玩家)眼睛高度 -0.5 的位置,再按环绕角偏移 1 格。
所有者名字存在 DataWatcher 的 DATA_OWNER(字符串),用
worldObj.getPlayerEntityByName 反查(EntityTFCharmEffect.java:144-154)。
所有者死亡或找不到时立即自毁(第 119 行)。
全部掉落物行为被禁用
| 覆写 | 行为 | 来源 |
|---|---|---|
onCollideWithPlayer |
空实现 —— 玩家捡不起来 | EntityTFCharmEffect.java:185-187 |
combineItems |
恒 false —— 不与地上的物品堆叠 |
EntityTFCharmEffect.java:193-196 |
handleWaterMovement |
恒 false —— 不受水影响 |
EntityTFCharmEffect.java:201-204 |
dealFireDamage |
空实现 —— 不会被烧毁 | EntityTFCharmEffect.java:210-212 |
attackEntityFrom |
恒 false —— 完全无敌 |
EntityTFCharmEffect.java:217-220 |
NBT 读写疑似颠倒
readEntityFromNBT 与 writeEntityToNBT 的实现互为镜像但方向反了
(EntityTFCharmEffect.java:169-180):readEntityFromNBT 调用的
getOwnerName() / getItemID() 在读取前仍是默认值(空串 / 0),
然后把默认值写回传入的 compound;writeEntityToNBT 则在
super.writeEntityToNBT 之前用 compound 的值覆写 DataWatcher。
两者的赋值方向与常规写法相反 —— 记录此事实,运行时后果未核实
(源码树内无法验证:需要实际存档 + 实体加载)。
相关条目
- Charm of Life I(魔力生命Ⅰ) - 触发本特效的护符
- Charm of Keeping I(保管符咒Ⅰ) - 触发本特效的护符