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 的私有静态字段),在不同的映射环境下存在失效风险。

相关条目