Don't send objects or map data before definitions have been sent
authorPerttu Ahola <celeron55@gmail.com>
Thu, 1 Dec 2011 23:18:25 +0000 (01:18 +0200)
committerPerttu Ahola <celeron55@gmail.com>
Thu, 1 Dec 2011 23:18:25 +0000 (01:18 +0200)
src/server.cpp
src/server.h

index a461c95e80852e60127c93a9f44a252fff1d8716..3e7ee008db14e60fce856da71c131ba075f92f20 100644 (file)
@@ -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());
index 0fe1979b7c9d59c886a77a0cc683d006cb349977..e91821d04ab777af7e3a06dc607234a40eb5fa4e 100644 (file)
@@ -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;