+ if (m_drowning_interval.step(dtime, 2.0f)) {
+ // Get nose/mouth position, approximate with eye position
+ v3s16 p = floatToInt(getEyePosition(), BS);
+ MapNode n = m_env->getMap().getNodeNoEx(p);
+ const ContentFeatures &c = m_env->getGameDef()->ndef()->get(n);
+ // If node generates drown
+ if (c.drowning > 0 && m_hp > 0) {
+ if (m_breath > 0)
+ setBreath(m_breath - 1);
+
+ // No more breath, damage player
+ if (m_breath == 0) {
+ setHP(m_hp - c.drowning);
+ m_env->getGameDef()->SendPlayerHPOrDie(this);
+ }
+ }
+ }
+
+ if (m_breathing_interval.step(dtime, 0.5f)) {
+ // Get nose/mouth position, approximate with eye position
+ v3s16 p = floatToInt(getEyePosition(), BS);
+ MapNode n = m_env->getMap().getNodeNoEx(p);
+ const ContentFeatures &c = m_env->getGameDef()->ndef()->get(n);
+ // If player is alive & no drowning, breathe
+ if (m_hp > 0 && m_breath < m_prop.breath_max && c.drowning == 0)
+ setBreath(m_breath + 1);
+ }
+
+ 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);
+ }
+ }
+
+ if (!m_properties_sent) {