+ if (m_drowning_interval.step(dtime, 2.0)) {
+ // get head position
+ v3s16 p = floatToInt(m_base_position + v3f(0, BS * 1.6, 0), 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.5)) {
+ // get head position
+ v3s16 p = floatToInt(m_base_position + v3f(0, BS * 1.6, 0), BS);
+ MapNode n = m_env->getMap().getNodeNoEx(p);
+ const ContentFeatures &c = m_env->getGameDef()->ndef()->get(n);
+ // If player is alive & no drowning, breath
+ if (m_hp > 0 && m_breath < PLAYER_MAX_BREATH && c.drowning == 0)
+ setBreath(m_breath + 1);
+ }
+
+ if (m_node_hurt_interval.step(dtime, 1.0)) {
+ // Feet, middle and head
+ v3s16 p1 = floatToInt(m_base_position + v3f(0, BS*0.1, 0), BS);
+ MapNode n1 = m_env->getMap().getNodeNoEx(p1);
+ v3s16 p2 = floatToInt(m_base_position + v3f(0, BS*0.8, 0), BS);
+ MapNode n2 = m_env->getMap().getNodeNoEx(p2);
+ v3s16 p3 = floatToInt(m_base_position + v3f(0, BS*1.6, 0), BS);
+ MapNode n3 = m_env->getMap().getNodeNoEx(p3);
+
+ u32 damage_per_second = 0;
+ damage_per_second = MYMAX(damage_per_second,
+ m_env->getGameDef()->ndef()->get(n1).damage_per_second);
+ damage_per_second = MYMAX(damage_per_second,
+ m_env->getGameDef()->ndef()->get(n2).damage_per_second);
+ damage_per_second = MYMAX(damage_per_second,
+ m_env->getGameDef()->ndef()->get(n3).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) {