死亡惩罚

基本信息

属性 值
事件 net.minecraftforge.event.entity.player.PlayerEvent.Clone
触发条件 event.wasDeath == true(死亡或返回主世界重生)
默认值 deathPenaltyMin=30, deathPenaltyLoss=15, deathPenaltyReset=true

功能

玩家死亡时,按配置给每个 Nutrient 扣 deathPenaltyLoss,下限 deathPenaltyMin,避免营养值过低导致减益死亡循环。

实现

for (Nutrient nutrient : NutrientList.get()) {
    float value = manager.get(event.original, nutrient);

    // If reset is disabled, only reduce to cap when above its value
    if (NutritionConfig.death.deathPenaltyReset || value > NutritionConfig.death.deathPenaltyMin) {
        // Subtract death penalty from each nutrient, to cap
        value = Math.max(NutritionConfig.death.deathPenaltyMin, value - NutritionConfig.death.deathPenaltyLoss);
    }
    values.put(nutrient, value);
}

// Remove the old player data, and insert the new player data,
// considering if the EntityPlayer object has been remade.
manager.evict(event.original);
manager.setAll(event.entityPlayer, values);

行为矩阵

死亡前值 deathPenaltyReset=true deathPenaltyReset=false
value > deathPenaltyMin value - deathPenaltyLoss(不低于 deathPenaltyMin) value - deathPenaltyLoss(不低于 deathPenaltyMin)
value ≤ deathPenaltyMin 强制设为 deathPenaltyMin 保持原值不动

非死亡克隆(End 返回重生)

else 分支处理 wasDeath == false 的情况(如从末地返回主世界,玩家对象被 remade):

manager.setAll(event.entityPlayer, manager.evict(event.original));

把旧玩家的数据按 name 匹配迁移到新玩家对象,保留全部 Nutrient 值。

同步

死亡后新玩家对象的数据同步由 EventPlayerJoinWorld.entityJoinWorldEvent 触发 SPacketNutrients.send(player),注释明确说明:

“This is synced automatically in EventPlayerJoinWorld#EntityJoinWorldEvent”

相关条目