Send Player HP when setHP (or a setHP caller) is called instead of looping and testing the state change.

This commit is contained in:
Loic Blot 2015-03-02 17:31:31 +01:00
parent 056e8f7839
commit 64ff966bae
6 changed files with 54 additions and 42 deletions

@ -718,7 +718,6 @@ PlayerSAO::PlayerSAO(ServerEnvironment *env_, Player *player_, u16 peer_id_,
// public // public
m_moved(false), m_moved(false),
m_inventory_not_sent(false), m_inventory_not_sent(false),
m_hp_not_sent(false),
m_breath_not_sent(false), m_breath_not_sent(false),
m_wielded_item_not_sent(false), m_wielded_item_not_sent(false),
m_physics_override_speed(1), m_physics_override_speed(1),
@ -1081,27 +1080,18 @@ void PlayerSAO::setHP(s16 hp)
{ {
s16 oldhp = m_player->hp; s16 oldhp = m_player->hp;
if(hp < 0) if (hp < 0)
hp = 0; hp = 0;
else if(hp > PLAYER_MAX_HP) else if (hp > PLAYER_MAX_HP)
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; m_player->hp = hp;
if(hp != oldhp) { if (oldhp > hp)
m_hp_not_sent = true; m_damage += (oldhp - hp);
if(oldhp > hp)
m_damage += oldhp - hp;
}
// Update properties on death // Update properties on death
if((hp == 0) != (oldhp == 0)) if ((hp == 0) != (oldhp == 0))
m_properties_sent = false; m_properties_sent = false;
} }

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

@ -893,12 +893,7 @@ void Server::handleCommand_Damage(NetworkPacket* pkt)
<< std::endl; << std::endl;
playersao->setHP(playersao->getHP() - damage); playersao->setHP(playersao->getHP() - damage);
SendPlayerHPOrDie(playersao->getPeerID(), playersao->getHP() == 0);
if (playersao->getHP() == 0 && playersao->m_hp_not_sent)
DiePlayer(pkt->getPeerId());
if (playersao->m_hp_not_sent)
SendPlayerHP(pkt->getPeerId());
} }
} }
@ -1048,8 +1043,8 @@ void Server::handleCommand_Respawn(NetworkPacket* pkt)
RespawnPlayer(pkt->getPeerId()); RespawnPlayer(pkt->getPeerId());
actionstream<<player->getName()<<" respawns at " actionstream << player->getName() << " respawns at "
<<PP(player->getPosition()/BS)<<std::endl; << PP(player->getPosition()/BS) << std::endl;
// ActiveObject is added to environment in AsyncRunStep after // ActiveObject is added to environment in AsyncRunStep after
// the previous addition has been succesfully removed // the previous addition has been succesfully removed
@ -1234,8 +1229,24 @@ void Server::handleCommand_Interact(NetworkPacket* pkt)
).normalize(); ).normalize();
float time_from_last_punch = float time_from_last_punch =
playersao->resetTimeFromLastPunch(); playersao->resetTimeFromLastPunch();
s16 src_original_hp = pointed_object->getHP();
s16 dst_origin_hp = playersao->getHP();
pointed_object->punch(dir, &toolcap, playersao, pointed_object->punch(dir, &toolcap, playersao,
time_from_last_punch); 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 } // action == 0

@ -208,8 +208,26 @@ int ObjectRef::l_punch(lua_State *L)
time_from_last_punch = lua_tonumber(L, 3); time_from_last_punch = lua_tonumber(L, 3);
ToolCapabilities toolcap = read_tool_capabilities(L, 4); ToolCapabilities toolcap = read_tool_capabilities(L, 4);
dir.normalize(); dir.normalize();
s16 src_original_hp = co->getHP();
s16 dst_origin_hp = puncher->getHP();
// Do it // Do it
co->punch(dir, &toolcap, puncher, time_from_last_punch); 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; return 0;
} }
@ -243,6 +261,9 @@ int ObjectRef::l_set_hp(lua_State *L)
<<" hp="<<hp<<std::endl;*/ <<" hp="<<hp<<std::endl;*/
// Do it // Do it
co->setHP(hp); co->setHP(hp);
if (co->getType() == ACTIVEOBJECT_TYPE_PLAYER) {
getServer(L)->SendPlayerHPOrDie(((PlayerSAO*)co)->getPeerID(), co->getHP() == 0);
}
// Return // Return
return 0; return 0;
} }

@ -604,17 +604,6 @@ void Server::AsyncRunStep(bool initial_step)
if(playersao == NULL) if(playersao == NULL)
continue; 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 Send player breath if changed
*/ */
@ -1889,7 +1878,6 @@ void Server::SendPlayerHP(u16 peer_id)
DSTACK(__FUNCTION_NAME); DSTACK(__FUNCTION_NAME);
PlayerSAO *playersao = getPlayerSAO(peer_id); PlayerSAO *playersao = getPlayerSAO(peer_id);
assert(playersao); assert(playersao);
playersao->m_hp_not_sent = false;
SendHP(peer_id, playersao->getHP()); SendHP(peer_id, playersao->getHP());
m_script->player_event(playersao,"health_changed"); m_script->player_event(playersao,"health_changed");
@ -2588,9 +2576,9 @@ void Server::DiePlayer(u16 peer_id)
PlayerSAO *playersao = getPlayerSAO(peer_id); PlayerSAO *playersao = getPlayerSAO(peer_id);
assert(playersao); assert(playersao);
infostream<<"Server::DiePlayer(): Player " infostream << "Server::DiePlayer(): Player "
<<playersao->getPlayer()->getName() << playersao->getPlayer()->getName()
<<" dies"<<std::endl; << " dies" << std::endl;
playersao->setHP(0); playersao->setHP(0);
@ -2608,13 +2596,15 @@ void Server::RespawnPlayer(u16 peer_id)
PlayerSAO *playersao = getPlayerSAO(peer_id); PlayerSAO *playersao = getPlayerSAO(peer_id);
assert(playersao); assert(playersao);
infostream<<"Server::RespawnPlayer(): Player " infostream << "Server::RespawnPlayer(): Player "
<<playersao->getPlayer()->getName() << playersao->getPlayer()->getName()
<<" respawns"<<std::endl; << " respawns" << std::endl;
playersao->setHP(PLAYER_MAX_HP); playersao->setHP(PLAYER_MAX_HP);
playersao->setBreath(PLAYER_MAX_BREATH); playersao->setBreath(PLAYER_MAX_BREATH);
SendPlayerHP(peer_id);
bool repositioned = m_script->on_respawnplayer(playersao); bool repositioned = m_script->on_respawnplayer(playersao);
if(!repositioned){ if(!repositioned){
v3f pos = findSpawnPos(m_env->getServerMap()); v3f pos = findSpawnPos(m_env->getServerMap());

@ -372,6 +372,7 @@ public:
u8* ser_vers, u16* prot_vers, u8* major, u8* minor, u8* patch, u8* ser_vers, u16* prot_vers, u8* major, u8* minor, u8* patch,
std::string* vers_string); std::string* vers_string);
void SendPlayerHPOrDie(u16 peer_id, bool die) { die ? DiePlayer(peer_id) : SendPlayerHP(peer_id); }
// Bind address // Bind address
Address m_bind_addr; Address m_bind_addr;