Skip to content

Commit

Permalink
Partial damage cheat fix: node damages server side (#4981)
Browse files Browse the repository at this point in the history
* Damage cheat fix: server side

* Lava/Node damages overtime server side
* lava hurt interval is only for old protocol
  • Loading branch information
nerzhul committed Apr 15, 2017
1 parent b1e6c2a commit a9aad4d
Show file tree
Hide file tree
Showing 3 changed files with 48 additions and 29 deletions.
52 changes: 23 additions & 29 deletions src/clientenvironment.cpp
Expand Up @@ -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
*/
Expand Down
24 changes: 24 additions & 0 deletions src/content_sao.cpp
Expand Up @@ -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();
Expand Down
1 change: 1 addition & 0 deletions src/content_sao.h
Expand Up @@ -375,6 +375,7 @@ class PlayerSAO : public UnitSAO
// Timers
IntervalLimiter m_breathing_interval;
IntervalLimiter m_drowning_interval;
IntervalLimiter m_node_hurt_interval;

int m_wield_index;
bool m_position_not_sent;
Expand Down

0 comments on commit a9aad4d

Please sign in to comment.