生物头颅掉落机制 Mob Head Drops
生物头颅 与 神秘道具 的产出规则,同时是挖掘等级提升的第二条途径(配合 Mining Level Boost)。
- 实现:
iguanaman.iguanatweakstconstruct.mobheads.handlers.MobHeadHandler - 模块:
MobHeads(脉冲MobHeads) - 事件:
LivingDropsEvent,优先级LOWEST
第一步:清除原版头颅掉落
方法开头先遍历 event.drops,移除所有 Items.skull 且 getItemDamage() != 3 的掉落物:
if (item.getItem() == Items.skull && item.getItemDamage() != 3) i.remove();
注释 // remove regular skull drops (because we modify its drop chance)。meta 3 被特意保留——原版 3 号是普通骷髅头,走下面的统一概率重掷不会被误删。
第二步:计算概率
Entity entity = event.source.getEntity();
if (entity == null) return;
if (!(entity instanceof EntityPlayer)) return;
if (entity instanceof FakePlayer && !Config.headsFromFakePlayerKills) return;
然后读取玩家手中工具的 Beheading 等级:
int beheading = 0;
if (stack != null && stack.hasTagCompound() && stack.getItem() instanceof ToolCore) {
beheading = stack.getTagCompound().getCompoundTag("InfiTool").getInteger("Beheading");
if (stack.getItem() == TinkerTools.cleaver) beheading += 2; // 屠宰刀自带 +2
}
最终判定(nextInt(100) > 阈值 则放弃,即 nextInt(100) <= 阈值 时掉落):
阈值 = beheading × beheadingHeadDropChance + baseHeadDropChance
默认阈值 = beheading × 2 + 5 (单位:百分数,0~99)
| Beheading 等级 | 阈值 | 实际掉落概率 |
|---|---|---|
| 0(无修饰符) | 5 | 6% |
| 1 | 7 | 8% |
| 2 | 9 | 10% |
| 5 | 15 | 16% |
| 10 | 25 | 26% |
| 47 | 99 | 100%(上限饱和) |
Beheading 等级 ≥ 47 时阈值已达 99,再高也不再提升。若要 100% 掉落需改大 beheadingDropChange。
两个配置项(分类 MobHeads,见 MobHeads 配置):
| 配置键 | 类型 | 默认 | 范围 | 含义 |
|---|---|---|---|---|
baseDropChange |
int | 5 | 0~100 | 基础掉落百分数 |
beheadingDropChange |
int | 2 | 1~100 | 每级 Beheading 增加的百分点 |
headsFromFakePlayerKills |
boolean | false | — | 是否允许假玩家(自动化)击杀掉头颅 |
第三步:目标生物 → 掉落物
概率通过后,按生物类型查表(源码 if/else if 链):
| 目标生物 | 掉落物品 | meta | 说明 |
|---|---|---|---|
EntitySkeleton(含凋灵骷髅) |
原版 minecraft:skull |
((EntitySkeleton) mob).getSkeletonType() |
动态取骨骼类型,因此僵尸骷髅/骷髅/凋灵骷髅自动区分 |
EntityPigZombie |
Iguana Skull | META_PIGZOMBIE |
|
EntityZombie |
原版 minecraft:skull |
2 | 僵尸头 |
EntityCreeper |
原版 minecraft:skull |
4 | 苦力怕头 |
EntityEnderman |
Iguana Skull | META_ENDERMAN |
|
EntityBlaze |
Iguana Skull | META_BLAZE |
|
名为 "Blizz" 的实体 |
Iguana Skull | META_BLIZZ |
走 EntityList.getEntityString 的 mod 支持分支 |
| 其他 | 无(skullItem == null → return) |
— | 不产生任何掉落 |
注意:僵尸、苦力怕、骷髅用的是原版头颅物品,只有末影人、猪灵、烈焰人、暴雪怪用本 mod 的 Iguana Skull。Blizz 分支没有额外的 mod 加载守卫,只按实体注册名匹配。
末影人的下颚彩蛋
} else if (mob instanceof EntityEnderman) {
skullItem = IguanaMobHeads.skullItem;
skullId = IguanaSkull.META_ENDERMAN;
// sometimes, very very rarely, you'll only get the jaw :D
if (IguanaTweaksTConstruct.random.nextInt(1000) == 0) {
skullItem = IguanaMobHeads.wearables;
skullId = 2;
}
}
末影人命中掉落后,还有 1/1000 的独立判定把奖励换成 神秘道具 meta 2(末影人下颚)。
熔岩桶的裂桶彩蛋
同一段 1/1000 逻辑也出现在 黏土岩浆桶:桶被销毁且 MobHeads 脉冲已加载时,1/1000 出 神秘道具 meta 1。
掉落物生成
EntityItem entityitem = new EntityItem(mob.worldObj, mob.posX, mob.posY, mob.posZ,
new ItemStack(skullItem, 1, skullId));
entityitem.delayBeforeCanPickup = 10;
event.drops.add(entityitem);
10 tick(0.5 秒)拾取延迟。
工具 tooltip 提示
MobHeadHandler 还订阅 PlayerEvent.ItemCraftedEvent:玩家合成任何 instanceof ItemSkull 的物品时,向其 tooltip 追加一行 tooltip.decorative(装饰说明),用于区分「装饰用头颅」与功能性头颅。