]> git.lizzy.rs Git - dragonfireclient.git/blobdiff - src/client.cpp
Remove farmesh
[dragonfireclient.git] / src / client.cpp
index 5e682aaa32350c6a41144785aedc0ea0ed6c5c23..f9908ad2cbdc6d5f1b1625523e02080a9738d21e 100644 (file)
@@ -250,7 +250,7 @@ void * MediaFetchThread::Thread()
                        m_file_data.push_back(make_pair(i->name, data));
                } else {
                        m_failed.push_back(*i);
-                       infostream << "cURL request failed for " << i->name << std::endl;
+                       infostream << "cURL request failed for " << i->name << " (" << curl_easy_strerror(res) << ")"<< std::endl;
                }
                curl_easy_cleanup(curl);
        }
@@ -556,14 +556,14 @@ void Client::step(float dtime)
        
                        // Send TOSERVER_INIT
                        // [0] u16 TOSERVER_INIT
-                       // [2] u8 SER_FMT_VER_HIGHEST
+                       // [2] u8 SER_FMT_VER_HIGHEST_READ
                        // [3] u8[20] player_name
                        // [23] u8[28] password (new in some version)
                        // [51] u16 minimum supported network protocol version (added sometime)
                        // [53] u16 maximum supported network protocol version (added later than the previous one)
                        SharedBuffer<u8> data(2+1+PLAYERNAME_SIZE+PASSWORD_SIZE+2+2);
                        writeU16(&data[0], TOSERVER_INIT);
-                       writeU8(&data[2], SER_FMT_VER_HIGHEST);
+                       writeU8(&data[2], SER_FMT_VER_HIGHEST_READ);
 
                        memset((char*)&data[3], 0, PLAYERNAME_SIZE);
                        snprintf((char*)&data[3], PLAYERNAME_SIZE, "%s", myplayer->getName());
@@ -692,9 +692,14 @@ void Client::step(float dtime)
                                        m_client_event_queue.push_back(event);
                                }
                        }
+                       else if(event.type == CEE_PLAYER_BREATH)
+                       {
+                                       u16 breath = event.player_breath.amount;
+                                       sendBreath(breath);
+                       }
                }
        }
-       
+
        /*
                Print some info
        */
@@ -797,7 +802,8 @@ void Client::step(float dtime)
                        all_stopped &= !(*thread)->IsRunning();
                        while (!(*thread)->m_file_data.empty()) {
                                std::pair <std::string, std::string> out = (*thread)->m_file_data.pop_front();
-                               ++m_media_received_count;
+                               if(m_media_received_count < m_media_count)
+                                       m_media_received_count++;
 
                                bool success = loadMedia(out.second, out.first);
                                if(success){
@@ -1148,8 +1154,7 @@ void Client::ProcessData(u8 *data, u32 datasize, u16 sender_peer_id)
                infostream<<"Client: TOCLIENT_INIT received with "
                                "deployed="<<((int)deployed&0xff)<<std::endl;
 
-               if(deployed < SER_FMT_VER_LOWEST
-                               || deployed > SER_FMT_VER_HIGHEST)
+               if(!ser_ver_supported(deployed))
                {
                        infostream<<"Client: TOCLIENT_INIT: Server sent "
                                        <<"unsupported ser_fmt_ver"<<std::endl;
@@ -1294,6 +1299,7 @@ void Client::ProcessData(u8 *data, u32 datasize, u16 sender_peer_id)
                        */
                        //infostream<<"Updating"<<std::endl;
                        block->deSerialize(istr, ser_version, false);
+                       block->deSerializeNetworkSpecific(istr);
                }
                else
                {
@@ -1303,6 +1309,7 @@ void Client::ProcessData(u8 *data, u32 datasize, u16 sender_peer_id)
                        //infostream<<"Creating new"<<std::endl;
                        block = new MapBlock(&m_env.getMap(), p, this);
                        block->deSerialize(istr, ser_version, false);
+                       block->deSerializeNetworkSpecific(istr);
                        sector->insertBlock(block);
                }
 
@@ -1578,6 +1585,15 @@ void Client::ProcessData(u8 *data, u32 datasize, u16 sender_peer_id)
                        m_client_event_queue.push_back(event);
                }
        }
+       else if(command == TOCLIENT_BREATH)
+       {
+               std::string datastring((char*)&data[2], datasize-2);
+               std::istringstream is(datastring, std::ios_base::binary);
+               Player *player = m_env.getLocalPlayer();
+               assert(player != NULL);
+               u16 breath = readU16(is);
+               player->setBreath(breath) ;
+       }
        else if(command == TOCLIENT_MOVE_PLAYER)
        {
                std::string datastring((char*)&data[2], datasize-2);
@@ -1731,15 +1747,9 @@ void Client::ProcessData(u8 *data, u32 datasize, u16 sender_peer_id)
        }
        else if(command == TOCLIENT_MEDIA)
        {
-               if (m_media_count == 0)
-                       return;
                std::string datastring((char*)&data[2], datasize-2);
                std::istringstream is(datastring, std::ios_base::binary);
 
-               // Mesh update thread must be stopped while
-               // updating content definitions
-               assert(!m_mesh_update_thread.IsRunning());
-
                /*
                        u16 command
                        u16 total number of file bunches
@@ -1754,11 +1764,31 @@ void Client::ProcessData(u8 *data, u32 datasize, u16 sender_peer_id)
                */
                int num_bunches = readU16(is);
                int bunch_i = readU16(is);
-               int num_files = readU32(is);
+               u32 num_files = readU32(is);
                infostream<<"Client: Received files: bunch "<<bunch_i<<"/"
                                <<num_bunches<<" files="<<num_files
                                <<" size="<<datasize<<std::endl;
-               for(int i=0; i<num_files; i++){
+
+               // Check total and received media count
+               assert(m_media_received_count <= m_media_count);
+               if (num_files > m_media_count - m_media_received_count) {
+                       errorstream<<"Client: Received more files than requested:"
+                               <<" total count="<<m_media_count
+                               <<" total received="<<m_media_received_count
+                               <<" bunch "<<bunch_i<<"/"<<num_bunches
+                               <<" files="<<num_files
+                               <<" size="<<datasize<<std::endl;
+                       num_files = m_media_count - m_media_received_count;
+               }
+               if (num_files == 0)
+                       return;
+
+               // Mesh update thread must be stopped while
+               // updating content definitions
+               assert(!m_mesh_update_thread.IsRunning());
+
+               for(u32 i=0; i<num_files; i++){
+                       assert(m_media_received_count < m_media_count);
                        m_media_received_count++;
                        std::string name = deSerializeString(is);
                        std::string data = deSerializeLongString(is);
@@ -2344,6 +2374,20 @@ void Client::sendDamage(u8 damage)
        Send(0, data, true);
 }
 
+void Client::sendBreath(u16 breath)
+{
+       DSTACK(__FUNCTION_NAME);
+       std::ostringstream os(std::ios_base::binary);
+
+       writeU16(os, TOSERVER_BREATH);
+       writeU16(os, breath);
+       // Make data buffer
+       std::string s = os.str();
+       SharedBuffer<u8> data((u8*)s.c_str(), s.size());
+       // Send as reliable
+       Send(0, data, true);
+}
+
 void Client::sendRespawn()
 {
        DSTACK(__FUNCTION_NAME);
@@ -2679,7 +2723,7 @@ u16 Client::getBreath()
 {
        Player *player = m_env.getLocalPlayer();
        assert(player != NULL);
-       return player->breath;
+       return player->getBreath();
 }
 
 bool Client::getChatMessage(std::wstring &message)
@@ -2850,6 +2894,7 @@ void Client::afterContentReceived(IrrlichtDevice *device, gui::IGUIFont* font)
        m_tsrc->rebuildImagesAndTextures();
 
        // Rebuild shaders
+       infostream<<"- Rebuilding shaders"<<std::endl;
        m_shsrc->rebuildShaders();
 
        // Update node aliases