Frienderman
基本信息
| 属性 | 值 |
|---|---|
| 注册名 | Frienderman |
| 内部名称 | EntityFrienderman |
| 类 | net.mcft.betterstorage.entity.EntityFrienderman |
| 基类 | EntityEnderman(末影人) |
| 实体 ID | 1 |
| 追踪范围 | 64 |
| 更新频率 | 4 |
| 发送恶魂 | 是(registerModEntity 末参 true) |
| 英文名 | Enderman(entity.betterstorage.Frienderman.name) |
来源:src/main/java/net/mcft/betterstorage/content/BetterStorageEntities.java:19-20;src/main/java/net/mcft/betterstorage/entity/EntityFrienderman.java;英文名 src/main/resources/assets/betterstorage/lang/en_US.lang。
功能
Frienderman 是一个不主动攻击玩家的末影人变种,但会偷走末影箱(Ender Chest)中的物品。
源码顶部的开发者注释(EntityFrienderman.java:25-27):
// In case anyone reads this: Even though this class is called "Frienderman"
// I would prefer it if you called the mob "friendly enderman". In my opinion,
// "Frienderman" implies friendship, whereas this mob is just friendly.
即作者认为名字有误导性——它是「友好的末影人」而非「朋友末影人」。
数值
| 属性 | 值 | 来源 |
|---|---|---|
| 最大生命值 | 40.0(原版末影人 40,此处显式重设为同值) | EntityFrienderman.java:43 |
| 主动寻找玩家 | 否(findPlayerToAttack() 返回 null) |
EntityFrienderman.java:47-49 |
| 可携带方块 | 仅 Blocks.ender_chest |
EntityFrienderman.java:32-34 |
| 实体 ID | 1 | BetterStorageEntities.java:20 |
可携带白名单定义在静态块中(EntityFrienderman.java:31-34):
public static IdentityHashMap<Block, Boolean> friendermanCarriable = new IdentityHashMap<Block, Boolean>(1);
static {
friendermanCarriable.put(Blocks.ender_chest, true);
}
即唯一能偷的方块是末影箱。
核心行为
- 白名单注入:
update()通过ReflectionUtils临时把EntityEnderman的私有静态字段carriable替换为friendermanCarriable(:109-110),执行完毕后还原原值(:129)——使该变种末影人只带走白名单内的方块 - 受伤反击:
attackEntityFrom被覆写(:65) - 每 tick 更新:
onLivingUpdate被覆写(:91) - 游戏规则遵守:导入
net.minecraft.world.GameRules(:22),源码中存在对游戏规则的检查 - 末影箱交互:
EntityFrienderman.java:136调用WorldUtils.get(worldObj, x, y, z, TileEntityBackpack.class),命中时把背包物品放入自身携带位
实体注册
EntityRegistry.registerModEntity(EntityFrienderman.class, "Frienderman", 1,
BetterStorage.instance, 64, 4, true);
来源:src/main/java/net/mcft/betterstorage/content/BetterStorageEntities.java:19-20。
参数依次为:实体类、注册名、ID(1)、所属 mod 实例、追踪范围(64)、更新频率(4)、是否发送恶魂(true)。
反射依赖
ReflectionUtils(src/main/java/net/mcft/betterstorage/utils/ReflectionUtils.java)是本 mod 的反射工具类。反射目标为 MCP 映射名 carriable(EntityEnderman 的私有静态字段),在不同的映射环境下存在失效风险。
相关条目
- Cluckington - 本 mod 另一个实体变种
- 实体注册 - 两个实体的注册表
- 背包 - 末影箱交互的相关容器