+ if (m_node_hurt_interval.step(dtime, 1.0f)) {
+ u32 damage_per_second = 0;
+ // Lowest and highest damage points are 0.1 within collisionbox
+ float dam_top = m_prop.collisionbox.MaxEdge.Y - 0.1f;
+
+ // Sequence of damage points, starting 0.1 above feet and progressing
+ // upwards in 1 node intervals, stopping below top damage point.
+ for (float dam_height = 0.1f; dam_height < dam_top; dam_height++) {
+ v3s16 p = floatToInt(m_base_position +
+ v3f(0.0f, dam_height * BS, 0.0f), BS);
+ MapNode n = m_env->getMap().getNodeNoEx(p);
+ damage_per_second = std::max(damage_per_second,
+ m_env->getGameDef()->ndef()->get(n).damage_per_second);
+ }
+
+ // Top damage point
+ v3s16 ptop = floatToInt(m_base_position +
+ v3f(0.0f, dam_top * BS, 0.0f), BS);
+ MapNode ntop = m_env->getMap().getNodeNoEx(ptop);
+ damage_per_second = std::max(damage_per_second,
+ m_env->getGameDef()->ndef()->get(ntop).damage_per_second);
+
+ if (damage_per_second != 0 && m_hp > 0) {
+ s16 newhp = ((s32) damage_per_second > m_hp ? 0 : m_hp - damage_per_second);
+ setHP(newhp);
+ m_env->getGameDef()->SendPlayerHPOrDie(this);
+ }
+ }
+