Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Partial damage cheat fix: node damages server side #4981

Merged
merged 5 commits into from Apr 15, 2017
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Jump to
Jump to file
Failed to load files.
Diff view
Diff view
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