死亡惩罚
基本信息
| 属性 | 值 |
|---|---|
| 事件 | 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”