summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorLoïc Blot <nerzhul@users.noreply.github.com>2017-04-15 09:25:43 +0200
committerGitHub <noreply@github.com>2017-04-15 09:25:43 +0200
commita9aad4d0616e798a8e61ac2a30dc31efd53b8c65 (patch)
tree73a9c207ad7557bcaa433cc8d6769ebbce0fba27 /src
parentb1e6c2a9b8f10254c027fe227811fc300bae2048 (diff)
downloadminetest-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.cpp52
-rw-r--r--src/content_sao.cpp24
-rw-r--r--src/content_sao.h1
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;