From 7e56637ed07d9f32b4bd9049009cf7e1e4cff884 Mon Sep 17 00:00:00 2001
From: Loic Blot <loic.blot@unix-experience.fr>
Date: Tue, 3 Mar 2015 16:23:47 +0100
Subject: [PATCH] Send Breath packet on event, don't check it at each
 AsyncRunStep

---
 src/content_sao.cpp                   |  1 -
 src/content_sao.h                     |  1 -
 src/network/packethandlers/server.cpp |  2 +-
 src/script/lua_api/l_object.cpp       |  6 +++++-
 src/server.cpp                        | 18 +++++++-----------
 src/server.h                          |  4 +++-
 6 files changed, 16 insertions(+), 16 deletions(-)

diff --git a/src/content_sao.cpp b/src/content_sao.cpp
index 835996cc7..26b721d39 100644
--- a/src/content_sao.cpp
+++ b/src/content_sao.cpp
@@ -718,7 +718,6 @@ PlayerSAO::PlayerSAO(ServerEnvironment *env_, Player *player_, u16 peer_id_,
 	// public
 	m_moved(false),
 	m_inventory_not_sent(false),
-	m_breath_not_sent(false),
 	m_wielded_item_not_sent(false),
 	m_physics_override_speed(1),
 	m_physics_override_jump(1),
diff --git a/src/content_sao.h b/src/content_sao.h
index efbece3ca..d6a494ae2 100644
--- a/src/content_sao.h
+++ b/src/content_sao.h
@@ -318,7 +318,6 @@ class PlayerSAO : public ServerActiveObject
 	// Some flags used by Server
 	bool m_moved;
 	bool m_inventory_not_sent;
-	bool m_breath_not_sent;
 	bool m_wielded_item_not_sent;
 
 	float m_physics_override_speed;
diff --git a/src/network/packethandlers/server.cpp b/src/network/packethandlers/server.cpp
index d9ba8c314..2deede0ca 100644
--- a/src/network/packethandlers/server.cpp
+++ b/src/network/packethandlers/server.cpp
@@ -922,7 +922,7 @@ void Server::handleCommand_Breath(NetworkPacket* pkt)
 	}
 
 	playersao->setBreath(breath);
-	m_script->player_event(playersao,"breath_changed");
+	SendPlayerBreath(pkt->getPeerId());
 }
 
 void Server::handleCommand_Password(NetworkPacket* pkt)
diff --git a/src/script/lua_api/l_object.cpp b/src/script/lua_api/l_object.cpp
index e6a50c3ba..0bc6c0bbc 100644
--- a/src/script/lua_api/l_object.cpp
+++ b/src/script/lua_api/l_object.cpp
@@ -812,7 +812,11 @@ int ObjectRef::l_set_breath(lua_State *L)
 	u16 breath = luaL_checknumber(L, 2);
 	// Do it
 	co->setBreath(breath);
-	co->m_breath_not_sent = true;
+
+	// If the object is a player sent the breath to client
+	if (co->getType() == ACTIVEOBJECT_TYPE_PLAYER)
+			getServer(L)->SendPlayerBreath(((PlayerSAO*)co)->getPeerID());
+
 	return 0;
 }
 
diff --git a/src/server.cpp b/src/server.cpp
index 3536471bf..84a8df4b8 100644
--- a/src/server.cpp
+++ b/src/server.cpp
@@ -604,20 +604,15 @@ void Server::AsyncRunStep(bool initial_step)
 			if(playersao == NULL)
 				continue;
 
-			/*
-				Send player breath if changed
-			*/
-			if(playersao->m_breath_not_sent) {
-				SendPlayerBreath(*i);
-			}
 
-			/*
-				Send player inventories if necessary
-			*/
 			if(playersao->m_moved) {
 				SendMovePlayer(*i);
 				playersao->m_moved = false;
 			}
+
+			/*
+				Send player inventories if necessary
+			*/
 			if(playersao->m_inventory_not_sent) {
 				UpdateCrafting(*i);
 				SendInventory(*i);
@@ -1892,8 +1887,8 @@ void Server::SendPlayerBreath(u16 peer_id)
 	DSTACK(__FUNCTION_NAME);
 	PlayerSAO *playersao = getPlayerSAO(peer_id);
 	assert(playersao);
-	playersao->m_breath_not_sent = false;
-	m_script->player_event(playersao,"breath_changed");
+
+	m_script->player_event(playersao, "breath_changed");
 	SendBreath(peer_id, playersao->getBreath());
 }
 
@@ -2604,6 +2599,7 @@ void Server::RespawnPlayer(u16 peer_id)
 	playersao->setBreath(PLAYER_MAX_BREATH);
 
 	SendPlayerHP(peer_id);
+	SendPlayerBreath(peer_id);
 
 	bool repositioned = m_script->on_respawnplayer(playersao);
 	if(!repositioned){
diff --git a/src/server.h b/src/server.h
index 5dbbcd22b..8c5ea2e1e 100644
--- a/src/server.h
+++ b/src/server.h
@@ -373,6 +373,8 @@ class Server : public con::PeerHandler, public MapEventReceiver,
 			std::string* vers_string);
 
 	void SendPlayerHPOrDie(u16 peer_id, bool die) { die ? DiePlayer(peer_id) : SendPlayerHP(peer_id); }
+	void SendPlayerBreath(u16 peer_id);
+
 	// Bind address
 	Address m_bind_addr;
 
@@ -397,7 +399,7 @@ class Server : public con::PeerHandler, public MapEventReceiver,
 	void SendChatMessage(u16 peer_id, const std::wstring &message);
 	void SendTimeOfDay(u16 peer_id, u16 time, f32 time_speed);
 	void SendPlayerHP(u16 peer_id);
-	void SendPlayerBreath(u16 peer_id);
+
 	void SendMovePlayer(u16 peer_id);
 	void SendLocalPlayerAnimations(u16 peer_id, v2s32 animation_frames[4], f32 animation_speed);
 	void SendEyeOffset(u16 peer_id, v3f first, v3f third);
-- 
GitLab