diff options
author | Loïc Blot <nerzhul@users.noreply.github.com> | 2017-04-15 09:25:43 +0200 |
---|---|---|
committer | GitHub <noreply@github.com> | 2017-04-15 09:25:43 +0200 |
commit | a9aad4d0616e798a8e61ac2a30dc31efd53b8c65 (patch) | |
tree | 73a9c207ad7557bcaa433cc8d6769ebbce0fba27 /src | |
parent | b1e6c2a9b8f10254c027fe227811fc300bae2048 (diff) | |
download | minetest-a9aad4d0616e798a8e61ac2a30dc31efd53b8c65.tar.gz minetest-a9aad4d0616e798a8e61ac2a30dc31efd53b8c65.tar.bz2 minetest-a9aad4d0616e798a8e61ac2a30dc31efd53b8c65.zip |
Partial damage cheat fix: node damages server side (#4981)
* Damage cheat fix: server side
* Lava/Node damages overtime server side
* lava hurt interval is only for old protocol
Diffstat (limited to 'src')
-rw-r--r-- | src/clientenvironment.cpp | 52 | ||||
-rw-r--r-- | src/content_sao.cpp | 24 | ||||
-rw-r--r-- | src/content_sao.h | 1 |
3 files changed, 48 insertions, 29 deletions
diff --git a/src/clientenvironment.cpp b/src/clientenvironment.cpp index 94c8e0dcb..4a8bbb066 100644 --- a/src/clientenvironment.cpp +++ b/src/clientenvironment.cpp @@ -252,37 +252,31 @@ void ClientEnvironment::step(float dtime) m_script->environment_step(dtime); } - /* - A quick draft of lava damage - */ - if(m_lava_hurt_interval.step(dtime, 1.0)) - { - v3f pf = lplayer->getPosition(); - - // Feet, middle and head - v3s16 p1 = floatToInt(pf + v3f(0, BS*0.1, 0), BS); - MapNode n1 = m_map->getNodeNoEx(p1); - v3s16 p2 = floatToInt(pf + v3f(0, BS*0.8, 0), BS); - MapNode n2 = m_map->getNodeNoEx(p2); - v3s16 p3 = floatToInt(pf + v3f(0, BS*1.6, 0), BS); - MapNode n3 = m_map->getNodeNoEx(p3); - - u32 damage_per_second = 0; - damage_per_second = MYMAX(damage_per_second, - m_client->ndef()->get(n1).damage_per_second); - damage_per_second = MYMAX(damage_per_second, - m_client->ndef()->get(n2).damage_per_second); - damage_per_second = MYMAX(damage_per_second, - m_client->ndef()->get(n3).damage_per_second); - - if(damage_per_second != 0) - { - damageLocalPlayer(damage_per_second, true); - } - } - // Protocol v29 make this behaviour obsolete if (getGameDef()->getProtoVersion() < 29) { + if (m_lava_hurt_interval.step(dtime, 1.0)) { + v3f pf = lplayer->getPosition(); + + // Feet, middle and head + v3s16 p1 = floatToInt(pf + v3f(0, BS * 0.1, 0), BS); + MapNode n1 = m_map->getNodeNoEx(p1); + v3s16 p2 = floatToInt(pf + v3f(0, BS * 0.8, 0), BS); + MapNode n2 = m_map->getNodeNoEx(p2); + v3s16 p3 = floatToInt(pf + v3f(0, BS * 1.6, 0), BS); + MapNode n3 = m_map->getNodeNoEx(p3); + + u32 damage_per_second = 0; + damage_per_second = MYMAX(damage_per_second, + m_client->ndef()->get(n1).damage_per_second); + damage_per_second = MYMAX(damage_per_second, + m_client->ndef()->get(n2).damage_per_second); + damage_per_second = MYMAX(damage_per_second, + m_client->ndef()->get(n3).damage_per_second); + + if (damage_per_second != 0) + damageLocalPlayer(damage_per_second, true); + } + /* Drowning */ diff --git a/src/content_sao.cpp b/src/content_sao.cpp index 282a6546c..bb2387d1a 100644 --- a/src/content_sao.cpp +++ b/src/content_sao.cpp @@ -941,6 +941,30 @@ void PlayerSAO::step(float dtime, bool send_recommended) 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) { m_properties_sent = true; std::string str = getPropertyPacket(); diff --git a/src/content_sao.h b/src/content_sao.h index 918830266..c1b01b6dd 100644 --- a/src/content_sao.h +++ b/src/content_sao.h @@ -375,6 +375,7 @@ private: // Timers IntervalLimiter m_breathing_interval; IntervalLimiter m_drowning_interval; + IntervalLimiter m_node_hurt_interval; int m_wield_index; bool m_position_not_sent; |