]> git.lizzy.rs Git - minetest.git/blobdiff - src/client.cpp
Merge remote branch 'origin/master'
[minetest.git] / src / client.cpp
index 46b53c6d725e4a4ddda2c534d389cba0f15bae26..be35db5dead72267a1589a1e95cd801fd0a02172 100644 (file)
@@ -1,6 +1,6 @@
 /*
-Minetest-c55
-Copyright (C) 2010 celeron55, Perttu Ahola <celeron55@gmail.com>
+Minetest
+Copyright (C) 2013 celeron55, Perttu Ahola <celeron55@gmail.com>
 
 This program is free software; you can redistribute it and/or modify
 it under the terms of the GNU Lesser General Public License as published by
@@ -236,6 +236,7 @@ void * MediaFetchThread::Thread()
                        i != m_file_requests.end(); i++) {
                curl = curl_easy_init();
                assert(curl);
+               curl_easy_setopt(curl, CURLOPT_NOSIGNAL, 1);
                curl_easy_setopt(curl, CURLOPT_URL, (m_remote_url + i->name).c_str());
                curl_easy_setopt(curl, CURLOPT_FAILONERROR, true);
                std::ostringstream stream;
@@ -332,6 +333,9 @@ Client::Client(
 
                m_env.addPlayer(player);
        }
+
+       for (size_t i = 0; i < g_settings->getU16("media_fetch_threads"); ++i)
+               m_media_fetch_threads.push_back(new MediaFetchThread(this));
 }
 
 Client::~Client()
@@ -355,6 +359,10 @@ Client::~Client()
                        delete i->second;
                }
        }
+
+       for (core::list<MediaFetchThread*>::Iterator i = m_media_fetch_threads.begin();
+                       i != m_media_fetch_threads.end(); i++)
+               delete *i;
 }
 
 void Client::connect(Address address)
@@ -771,11 +779,11 @@ void Client::step(float dtime)
        */
        if (m_media_receive_started) {
                bool all_stopped = true;
-               for (core::list<MediaFetchThread>::Iterator thread = m_media_fetch_threads.begin();
+               for (core::list<MediaFetchThread*>::Iterator thread = m_media_fetch_threads.begin();
                                thread != m_media_fetch_threads.end(); thread++) {
-                       all_stopped &= !thread->IsRunning();
-                       while (thread->m_file_data.size() > 0) {
-                               std::pair <std::string, std::string> out = thread->m_file_data.pop_front();
+                       all_stopped &= !(*thread)->IsRunning();
+                       while ((*thread)->m_file_data.size() > 0) {
+                               std::pair <std::string, std::string> out = (*thread)->m_file_data.pop_front();
                                ++m_media_received_count;
 
                                bool success = loadMedia(out.second, out.first);
@@ -807,19 +815,18 @@ void Client::step(float dtime)
                }
                if (all_stopped) {
                        core::list<MediaRequest> fetch_failed;
-                       for (core::list<MediaFetchThread>::Iterator thread = m_media_fetch_threads.begin();
+                       for (core::list<MediaFetchThread*>::Iterator thread = m_media_fetch_threads.begin();
                                        thread != m_media_fetch_threads.end(); thread++) {
-                               for (core::list<MediaRequest>::Iterator request = thread->m_failed.begin();
-                                               request != thread->m_failed.end(); request++)
+                               for (core::list<MediaRequest>::Iterator request = (*thread)->m_failed.begin();
+                                               request != (*thread)->m_failed.end(); request++)
                                        fetch_failed.push_back(*request);
-                               thread->m_failed.clear();
+                               (*thread)->m_failed.clear();
                        }
                        if (fetch_failed.size() > 0) {
                                infostream << "Failed to remote-fetch " << fetch_failed.size() << " files. "
                                                << "Requesting them the usual way." << std::endl;
                                request_media(fetch_failed);
                        }
-                       m_media_fetch_threads.clear();
                }
        }
 
@@ -1507,6 +1514,26 @@ void Client::ProcessData(u8 *data, u32 datasize, u16 sender_peer_id)
                        }
                }
        }
+       else if(command == TOCLIENT_MOVEMENT)
+       {
+               std::string datastring((char*)&data[2], datasize-2);
+               std::istringstream is(datastring, std::ios_base::binary);
+               Player *player = m_env.getLocalPlayer();
+               assert(player != NULL);
+
+               player->movement_acceleration_default = readF1000(is) * BS;
+               player->movement_acceleration_air = readF1000(is) * BS;
+               player->movement_acceleration_fast = readF1000(is) * BS;
+               player->movement_speed_walk = readF1000(is) * BS;
+               player->movement_speed_crouch = readF1000(is) * BS;
+               player->movement_speed_fast = readF1000(is) * BS;
+               player->movement_speed_climb = readF1000(is) * BS;
+               player->movement_speed_jump = readF1000(is) * BS;
+               player->movement_liquid_fluidity = readF1000(is) * BS;
+               player->movement_liquid_fluidity_smooth = readF1000(is) * BS;
+               player->movement_liquid_sink = readF1000(is) * BS;
+               player->movement_gravity = readF1000(is) * BS;
+       }
        else if(command == TOCLIENT_HP)
        {
                std::string datastring((char*)&data[2], datasize-2);
@@ -1650,22 +1677,18 @@ void Client::ProcessData(u8 *data, u32 datasize, u16 sender_peer_id)
                        request_media(file_requests);
                } else {
                        #if USE_CURL
-                       for (size_t i = 0; i < g_settings->getU16("media_fetch_threads"); ++i) {
-                               m_media_fetch_threads.push_back(MediaFetchThread(this));
-                       }
-
-                       core::list<MediaFetchThread>::Iterator cur = m_media_fetch_threads.begin();
+                       core::list<MediaFetchThread*>::Iterator cur = m_media_fetch_threads.begin();
                        for(core::list<MediaRequest>::Iterator i = file_requests.begin();
                                        i != file_requests.end(); i++) {
-                               cur->m_file_requests.push_back(*i);
+                               (*cur)->m_file_requests.push_back(*i);
                                cur++;
                                if (cur == m_media_fetch_threads.end())
                                        cur = m_media_fetch_threads.begin();
                        }
-                       for (core::list<MediaFetchThread>::Iterator i = m_media_fetch_threads.begin();
+                       for (core::list<MediaFetchThread*>::Iterator i = m_media_fetch_threads.begin();
                                        i != m_media_fetch_threads.end(); i++) {
-                               i->m_remote_url = remote_media;
-                               i->Start();
+                               (*i)->m_remote_url = remote_media;
+                               (*i)->Start();
                        }
                        #endif
 
@@ -1897,6 +1920,22 @@ void Client::ProcessData(u8 *data, u32 datasize, u16 sender_peer_id)
                }
                inv->deSerialize(is);
        }
+       else if(command == TOCLIENT_SHOW_FORMSPEC)
+       {
+               std::string datastring((char*)&data[2], datasize-2);
+               std::istringstream is(datastring, std::ios_base::binary);
+
+               std::string formspec = deSerializeLongString(is);
+               std::string formname = deSerializeString(is);
+
+               ClientEvent event;
+               event.type = CE_SHOW_FORMSPEC;
+               // pointer is required as event is a struct only!
+               // adding a std:string to a struct isn't possible
+               event.show_formspec.formspec = new std::string(formspec);
+               event.show_formspec.formname = new std::string(formname);
+               m_client_event_queue.push_back(event);
+       }
        else
        {
                infostream<<"Client: Ignoring unknown command "