forked from Mirrorlandia_minetest/minetest
Send Player HP when setHP (or a setHP caller) is called instead of looping and testing the state change.
This commit is contained in:
parent
056e8f7839
commit
64ff966bae
@ -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;
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user