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

Send Player HP when setHP (or a setHP caller) is called #2420

Closed
wants to merge 1 commit into from
Closed
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

@@ -718,7 +718,6 @@ PlayerSAO::PlayerSAO(ServerEnvironment *env_, Player *player_, u16 peer_id_,
// public
m_moved(false),
m_inventory_not_sent(false),
m_hp_not_sent(false),
m_breath_not_sent(false),
m_wielded_item_not_sent(false),
m_physics_override_speed(1),
@@ -1081,27 +1080,18 @@ void PlayerSAO::setHP(s16 hp)
{
s16 oldhp = m_player->hp;

if(hp < 0)
if (hp < 0)
hp = 0;
else if(hp > PLAYER_MAX_HP)
else if (hp > PLAYER_MAX_HP)
hp = PLAYER_MAX_HP;

if(hp < oldhp && g_settings->getBool("enable_damage") == false)
{
m_hp_not_sent = true; // fix wrong prediction on client
return;
}

m_player->hp = hp;

if(hp != oldhp) {
m_hp_not_sent = true;
if(oldhp > hp)
m_damage += oldhp - hp;
}
if (oldhp > hp)
m_damage += (oldhp - hp);

// Update properties on death
if((hp == 0) != (oldhp == 0))
if ((hp == 0) != (oldhp == 0))
m_properties_sent = false;
}

@@ -318,7 +318,6 @@ class PlayerSAO : public ServerActiveObject
// Some flags used by Server
bool m_moved;
bool m_inventory_not_sent;
bool m_hp_not_sent;
bool m_breath_not_sent;
bool m_wielded_item_not_sent;

@@ -893,12 +893,7 @@ void Server::handleCommand_Damage(NetworkPacket* pkt)
<< std::endl;

playersao->setHP(playersao->getHP() - damage);

if (playersao->getHP() == 0 && playersao->m_hp_not_sent)
DiePlayer(pkt->getPeerId());

if (playersao->m_hp_not_sent)
SendPlayerHP(pkt->getPeerId());
SendPlayerHPOrDie(playersao->getPeerID(), playersao->getHP() == 0);
}
}

@@ -1048,8 +1043,8 @@ void Server::handleCommand_Respawn(NetworkPacket* pkt)

RespawnPlayer(pkt->getPeerId());

actionstream<<player->getName()<<" respawns at "
<<PP(player->getPosition()/BS)<<std::endl;
actionstream << player->getName() << " respawns at "
<< PP(player->getPosition()/BS) << std::endl;

// ActiveObject is added to environment in AsyncRunStep after
// the previous addition has been succesfully removed
@@ -1234,8 +1229,24 @@ void Server::handleCommand_Interact(NetworkPacket* pkt)
).normalize();
float time_from_last_punch =
playersao->resetTimeFromLastPunch();

s16 src_original_hp = pointed_object->getHP();
s16 dst_origin_hp = playersao->getHP();

pointed_object->punch(dir, &toolcap, playersao,
time_from_last_punch);

// If the object is a player and its HP changed
if (src_original_hp != pointed_object->getHP() &&
pointed_object->getType() == ACTIVEOBJECT_TYPE_PLAYER) {
SendPlayerHPOrDie(((PlayerSAO*)pointed_object)->getPeerID(),
pointed_object->getHP() == 0);
}

// If the puncher is a player and its HP changed
if (dst_origin_hp != playersao->getHP()) {
SendPlayerHPOrDie(playersao->getPeerID(), playersao->getHP() == 0);
}
}

} // action == 0
@@ -208,8 +208,26 @@ int ObjectRef::l_punch(lua_State *L)
time_from_last_punch = lua_tonumber(L, 3);
ToolCapabilities toolcap = read_tool_capabilities(L, 4);
dir.normalize();

s16 src_original_hp = co->getHP();
s16 dst_origin_hp = puncher->getHP();

// Do it
co->punch(dir, &toolcap, puncher, time_from_last_punch);

// If the punched is a player, and its HP changed
if (src_original_hp != co->getHP() &&
co->getType() == ACTIVEOBJECT_TYPE_PLAYER) {
getServer(L)->SendPlayerHPOrDie(((PlayerSAO*)co)->getPeerID(),
co->getHP() == 0);
}

// If the puncher is a player, and its HP changed
if (dst_origin_hp != puncher->getHP() &&
puncher->getType() == ACTIVEOBJECT_TYPE_PLAYER) {
getServer(L)->SendPlayerHPOrDie(((PlayerSAO*)puncher)->getPeerID(),
puncher->getHP() == 0);
}
return 0;
}

@@ -243,6 +261,9 @@ int ObjectRef::l_set_hp(lua_State *L)
<<" hp="<<hp<<std::endl;*/
// Do it
co->setHP(hp);
if (co->getType() == ACTIVEOBJECT_TYPE_PLAYER) {
getServer(L)->SendPlayerHPOrDie(((PlayerSAO*)co)->getPeerID(), co->getHP() == 0);
}
// Return
return 0;
}
@@ -604,17 +604,6 @@ void Server::AsyncRunStep(bool initial_step)
if(playersao == NULL)
continue;

/*
Handle player HPs (die if hp=0)
*/
if(playersao->m_hp_not_sent && g_settings->getBool("enable_damage"))
{
if(playersao->getHP() == 0)
DiePlayer(*i);
else
SendPlayerHP(*i);
}

/*
Send player breath if changed
*/
@@ -1889,7 +1878,6 @@ void Server::SendPlayerHP(u16 peer_id)
DSTACK(__FUNCTION_NAME);
PlayerSAO *playersao = getPlayerSAO(peer_id);
assert(playersao);
playersao->m_hp_not_sent = false;
SendHP(peer_id, playersao->getHP());
m_script->player_event(playersao,"health_changed");

@@ -2588,9 +2576,9 @@ void Server::DiePlayer(u16 peer_id)
PlayerSAO *playersao = getPlayerSAO(peer_id);
assert(playersao);

infostream<<"Server::DiePlayer(): Player "
<<playersao->getPlayer()->getName()
<<" dies"<<std::endl;
infostream << "Server::DiePlayer(): Player "
<< playersao->getPlayer()->getName()
<< " dies" << std::endl;

playersao->setHP(0);

@@ -2608,13 +2596,15 @@ void Server::RespawnPlayer(u16 peer_id)
PlayerSAO *playersao = getPlayerSAO(peer_id);
assert(playersao);

infostream<<"Server::RespawnPlayer(): Player "
<<playersao->getPlayer()->getName()
<<" respawns"<<std::endl;
infostream << "Server::RespawnPlayer(): Player "
<< playersao->getPlayer()->getName()
<< " respawns" << std::endl;

playersao->setHP(PLAYER_MAX_HP);
playersao->setBreath(PLAYER_MAX_BREATH);

SendPlayerHP(peer_id);

bool repositioned = m_script->on_respawnplayer(playersao);
if(!repositioned){
v3f pos = findSpawnPos(m_env->getServerMap());
@@ -372,6 +372,7 @@ class Server : public con::PeerHandler, public MapEventReceiver,
u8* ser_vers, u16* prot_vers, u8* major, u8* minor, u8* patch,
std::string* vers_string);

void SendPlayerHPOrDie(u16 peer_id, bool die) { die ? DiePlayer(peer_id) : SendPlayerHP(peer_id); }
// Bind address
Address m_bind_addr;

ProTip! Use n and p to navigate between commits in a pull request.
You can’t perform that action at this time.