From 9d67037570ef4dae5d97a820ea7ccd0a1a4328b6 Mon Sep 17 00:00:00 2001
From: Perttu Ahola <celeron55@gmail.com>
Date: Fri, 2 Dec 2011 01:18:25 +0200
Subject: [PATCH] Don't send objects or map data before definitions have been
 sent

---
 src/server.cpp | 19 +++++++++++++++++--
 src/server.h   |  3 +++
 2 files changed, 20 insertions(+), 2 deletions(-)

diff --git a/src/server.cpp b/src/server.cpp
index a461c95e8..3e7ee008d 100644
--- a/src/server.cpp
+++ b/src/server.cpp
@@ -1448,6 +1448,12 @@ void Server::AsyncRunStep()
 			i.atEnd() == false; i++)
 		{
 			RemoteClient *client = i.getNode()->getValue();
+
+			// If definitions and textures have not been sent, don't
+			// send objects either
+			if(!client->definitions_sent)
+				continue;
+
 			Player *player = m_env->getPlayer(client->peer_id);
 			if(player==NULL)
 			{
@@ -2173,7 +2179,7 @@ void Server::ProcessData(u8 *data, u32 datasize, u16 peer_id)
 		// Send inventory to player
 		UpdateCrafting(peer_id);
 		SendInventory(peer_id);
-
+		
 		// Send player items to all players
 		SendPlayerItems();
 
@@ -2189,6 +2195,9 @@ void Server::ProcessData(u8 *data, u32 datasize, u16 peer_id)
 			m_con.Send(peer_id, 0, data, true);
 		}
 		
+		// Now the client should know about everything
+		getClient(peer_id)->definitions_sent = true;
+		
 		// Send information about server to player in chat
 		SendChatMessage(peer_id, getStatusString());
 		
@@ -2866,6 +2875,8 @@ void Server::ProcessData(u8 *data, u32 datasize, u16 peer_id)
 		if(player->hp != 0)
 			return;
 		
+		srp->m_respawn_active = false;
+
 		RespawnPlayer(player);
 		
 		actionstream<<player->getName()<<" respawns at "
@@ -4183,6 +4194,11 @@ void Server::SendBlocks(float dtime)
 			RemoteClient *client = i.getNode()->getValue();
 			assert(client->peer_id == i.getNode()->getKey());
 
+			// If definitions and textures have not been sent, don't
+			// send MapBlocks either
+			if(!client->definitions_sent)
+				continue;
+
 			total_sending += client->SendingCount();
 			
 			if(client->serialization_version == SER_FMT_VER_INVALID)
@@ -4400,7 +4416,6 @@ void Server::RespawnPlayer(Player *player)
 {
 	player->hp = 20;
 	ServerRemotePlayer *srp = static_cast<ServerRemotePlayer*>(player);
-	srp->m_respawn_active = false;
 	bool repositioned = scriptapi_on_respawnplayer(m_lua, srp);
 	if(!repositioned){
 		v3f pos = findSpawnPos(m_env->getServerMap());
diff --git a/src/server.h b/src/server.h
index 0fe1979b7..e91821d04 100644
--- a/src/server.h
+++ b/src/server.h
@@ -248,6 +248,8 @@ public:
 	// Version is stored in here after INIT before INIT2
 	u8 pending_serialization_version;
 
+	bool definitions_sent;
+
 	RemoteClient():
 		m_time_from_building(9999),
 		m_excess_gotblocks(0)
@@ -256,6 +258,7 @@ public:
 		serialization_version = SER_FMT_VER_INVALID;
 		net_proto_version = 0;
 		pending_serialization_version = SER_FMT_VER_INVALID;
+		definitions_sent = false;
 		m_nearest_unsent_d = 0;
 		m_nearest_unsent_reset_timer = 0.0;
 		m_nothing_to_send_counter = 0;