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
Changes from all commits
Commits
File filter...
Filter file types
Jump to…
Jump to file or symbol
Failed to load files and symbols.

Always

Just for now

@@ -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
*/
@@ -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();
@@ -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;
ProTip! Use n and p to navigate between commits in a pull request.
You can’t perform that action at this time.