aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorPerttu Ahola <celeron55@gmail.com>2011-12-02 01:18:25 +0200
committerPerttu Ahola <celeron55@gmail.com>2011-12-02 01:18:25 +0200
commit9d67037570ef4dae5d97a820ea7ccd0a1a4328b6 (patch)
treea5622aa48846b17822cb37eb5d6a27f2e5a000e6
parente4daa4c0658dc8547352dd2039ab74d963a48ff0 (diff)
downloadminetest-9d67037570ef4dae5d97a820ea7ccd0a1a4328b6.tar.gz
minetest-9d67037570ef4dae5d97a820ea7ccd0a1a4328b6.tar.bz2
minetest-9d67037570ef4dae5d97a820ea7ccd0a1a4328b6.zip
Don't send objects or map data before definitions have been sent
-rw-r--r--src/server.cpp19
-rw-r--r--src/server.h3
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;