From 9d67037570ef4dae5d97a820ea7ccd0a1a4328b6 Mon Sep 17 00:00:00 2001 From: Perttu Ahola 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 a461c95e..3e7ee008 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<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(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 0fe1979b..e91821d0 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;