]> git.lizzy.rs Git - minetest.git/blobdiff - src/server.cpp
Fix android build using hardcoded path for data instead of using the one fetched...
[minetest.git] / src / server.cpp
index 122ea993d21551bb6a04a58700552523d138a6ae..262970c09a195bdd96615121d2b0e8e40683097d 100644 (file)
@@ -676,15 +676,15 @@ void Server::AsyncRunStep(bool initial_step)
        {
                float &counter = m_masterserver_timer;
                if(!isSingleplayer() && (!counter || counter >= 300.0) &&
-                               g_settings->getBool("server_announce") == true)
+                               g_settings->getBool("server_announce"))
                {
-                       ServerList::sendAnnounce(!counter ? "start" : "update",
-                                                                               m_clients.getPlayerNames(),
-                                                                               m_uptime.get(),
-                                                                               m_env->getGameTime(),
-                                                                               m_lag,
-                                                                               m_gamespec.id,
-                                                                               m_mods);
+                       ServerList::sendAnnounce(counter ? "update" : "start",
+                                       m_clients.getPlayerNames(),
+                                       m_uptime.get(),
+                                       m_env->getGameTime(),
+                                       m_lag,
+                                       m_gamespec.id,
+                                       m_mods);
                        counter = 0.01;
                }
                counter += dtime;
@@ -1169,10 +1169,15 @@ PlayerSAO* Server::StageTwoClientInit(u16 peer_id)
        std::string playername = "";
        PlayerSAO *playersao = NULL;
        m_clients.Lock();
-       RemoteClient* client = m_clients.lockedGetClientNoEx(peer_id, CS_InitDone);
-       if (client != NULL) {
-               playername = client->getName();
-               playersao = emergePlayer(playername.c_str(), peer_id);
+       try {
+               RemoteClient* client = m_clients.lockedGetClientNoEx(peer_id, CS_InitDone);
+               if (client != NULL) {
+                       playername = client->getName();
+                       playersao = emergePlayer(playername.c_str(), peer_id);
+               }
+       } catch (std::exception &e) {
+               m_clients.Unlock();
+               throw;
        }
        m_clients.Unlock();
 
@@ -1448,14 +1453,21 @@ void Server::ProcessData(u8 *data, u32 datasize, u16 peer_id)
                /*
                        Set up player
                */
-
-               // Get player name
                char playername[PLAYERNAME_SIZE];
-               for(u32 i=0; i<PLAYERNAME_SIZE-1; i++)
-               {
-                       playername[i] = data[3+i];
+               unsigned int playername_length = 0;
+               for (; playername_length < PLAYERNAME_SIZE; playername_length++ ) {
+                       playername[playername_length] = data[3+playername_length];
+                       if (data[3+playername_length] == 0)
+                               break;
+               }
+
+               if (playername_length == PLAYERNAME_SIZE) {
+                       actionstream<<"Server: Player with name exceeding max length "
+                                       <<"tried to connect from "<<addr_s<<std::endl;
+                       DenyAccess(peer_id, L"Name too long");
+                       return;
                }
-               playername[PLAYERNAME_SIZE-1] = 0;
+
 
                if(playername[0]=='\0')
                {
@@ -1732,14 +1744,20 @@ void Server::ProcessData(u8 *data, u32 datasize, u16 peer_id)
 
                if (playersao == NULL) {
                        errorstream
-                               << "TOSERVER_CLIENT_READY stage 2 client init failed for peer "
+                               << "TOSERVER_CLIENT_READY stage 2 client init failed for peer_id: "
                                << peer_id << std::endl;
+                       m_con.DisconnectPeer(peer_id);
                        return;
                }
 
 
-               if(datasize < 2+8)
+               if(datasize < 2+8) {
+                       errorstream
+                               << "TOSERVER_CLIENT_READY client sent inconsistent data, disconnecting peer_id: "
+                               << peer_id << std::endl;
+                       m_con.DisconnectPeer(peer_id);
                        return;
+               }
 
                m_clients.setClientVersion(
                                peer_id,
@@ -1789,18 +1807,20 @@ void Server::ProcessData(u8 *data, u32 datasize, u16 peer_id)
        }
 
        Player *player = m_env->getPlayer(peer_id);
-       if(player == NULL){
+       if(player == NULL) {
                errorstream<<"Server::ProcessData(): Cancelling: "
                                "No player for peer_id="<<peer_id
-                               <<std::endl;
+                               << " disconnecting peer!" <<std::endl;
+               m_con.DisconnectPeer(peer_id);
                return;
        }
 
        PlayerSAO *playersao = player->getPlayerSAO();
-       if(playersao == NULL){
+       if(playersao == NULL) {
                errorstream<<"Server::ProcessData(): Cancelling: "
                                "No player object for peer_id="<<peer_id
-                               <<std::endl;
+                               << " disconnecting peer!" <<std::endl;
+               m_con.DisconnectPeer(peer_id);
                return;
        }
 
@@ -2537,14 +2557,17 @@ void Server::ProcessData(u8 *data, u32 datasize, u16 peer_id)
                                if(is_valid_dig && n.getContent() != CONTENT_IGNORE)
                                        m_script->node_on_dig(p_under, n, playersao);
 
+                               v3s16 blockpos = getNodeBlockPos(floatToInt(pointed_pos_under, BS));
+                               RemoteClient *client = getClient(peer_id);
                                // Send unusual result (that is, node not being removed)
                                if(m_env->getMap().getNodeNoEx(p_under).getContent() != CONTENT_AIR)
                                {
                                        // Re-send block to revert change on client-side
-                                       RemoteClient *client = getClient(peer_id);
-                                       v3s16 blockpos = getNodeBlockPos(floatToInt(pointed_pos_under, BS));
                                        client->SetBlockNotSent(blockpos);
                                }
+                               else {
+                                       client->ResendBlockIfOnWire(blockpos);
+                               }
                        }
                } // action == 2
 
@@ -2586,15 +2609,21 @@ void Server::ProcessData(u8 *data, u32 datasize, u16 peer_id)
 
                        // If item has node placement prediction, always send the
                        // blocks to make sure the client knows what exactly happened
-                       if(item.getDefinition(m_itemdef).node_placement_prediction != ""){
-                               RemoteClient *client = getClient(peer_id);
-                               v3s16 blockpos = getNodeBlockPos(floatToInt(pointed_pos_above, BS));
+                       RemoteClient *client = getClient(peer_id);
+                       v3s16 blockpos = getNodeBlockPos(floatToInt(pointed_pos_above, BS));
+                       v3s16 blockpos2 = getNodeBlockPos(floatToInt(pointed_pos_under, BS));
+                       if(item.getDefinition(m_itemdef).node_placement_prediction != "") {
                                client->SetBlockNotSent(blockpos);
-                               v3s16 blockpos2 = getNodeBlockPos(floatToInt(pointed_pos_under, BS));
-                               if(blockpos2 != blockpos){
+                               if(blockpos2 != blockpos) {
                                        client->SetBlockNotSent(blockpos2);
                                }
                        }
+                       else {
+                               client->ResendBlockIfOnWire(blockpos);
+                               if(blockpos2 != blockpos) {
+                                       client->ResendBlockIfOnWire(blockpos2);
+                               }
+                       }
                } // action == 3
 
                /*
@@ -3845,7 +3874,7 @@ void Server::SendBlocks(float dtime)
                        RemoteClient *client = m_clients.lockedGetClientNoEx(*i, CS_Active);
 
                        if (client == NULL)
-                               return;
+                               continue;
 
                        total_sending += client->SendingCount();
                        client->GetNextBlocks(m_env,m_emerge, dtime, queue);
@@ -4572,8 +4601,13 @@ bool Server::hudSetFlags(Player *player, u32 flags, u32 mask) {
 
        SendHUDSetFlags(player->peer_id, flags, mask);
        player->hud_flags = flags;
+       
+       PlayerSAO* playersao = player->getPlayerSAO();
+       
+       if (playersao == NULL)
+               return false;
 
-       m_script->player_event(player->getPlayerSAO(),"hud_changed");
+       m_script->player_event(playersao, "hud_changed");
        return true;
 }