]> git.lizzy.rs Git - dragonfireclient.git/blobdiff - src/client.cpp
Make dungeon masters though and make oerkkis disappear when they get to you (because...
[dragonfireclient.git] / src / client.cpp
index 81dedd1446336f3b3fe0263ee49addd63b2e39fd..c40c9e5136db6eff9f450fca75c84cfbfca2d296 100644 (file)
@@ -28,6 +28,8 @@ with this program; if not, write to the Free Software Foundation, Inc.,
 #include "mapsector.h"
 #include "mapblock_mesh.h"
 #include "mapblock.h"
+#include "settings.h"
+#include "profiler.h"
 
 /*
        QueuedMeshUpdate
@@ -151,7 +153,7 @@ void * MeshUpdateThread::Thread()
                        continue;
                }
 
-               ScopeProfiler sp(&g_profiler, "mesh make");
+               ScopeProfiler sp(g_profiler, "mesh make");
 
                scene::SMesh *mesh_new = NULL;
                mesh_new = makeMapBlockMesh(q->data);
@@ -327,7 +329,7 @@ void Client::step(float dtime)
                        core::list<v3s16> deleted_blocks;
 
                        float delete_unused_sectors_timeout = 
-                               g_settings.getFloat("client_delete_unused_sectors_timeout");
+                               g_settings->getFloat("client_delete_unused_sectors_timeout");
        
                        // Delete sector blocks
                        /*u32 num = m_env.getMap().unloadUnusedData
@@ -429,7 +431,7 @@ void Client::step(float dtime)
                        snprintf((char*)&data[23], PASSWORD_SIZE, "%s", m_password.c_str());
                        
                        // This should be incremented in each version
-                       writeU16(&data[51], 1);
+                       writeU16(&data[51], 3);
 
                        // Send as unreliable
                        Send(0, data, false);
@@ -449,10 +451,10 @@ void Client::step(float dtime)
        const float map_timer_and_unload_dtime = 5.25;
        if(m_map_timer_and_unload_interval.step(dtime, map_timer_and_unload_dtime))
        {
-               ScopeProfiler sp(&g_profiler, "Client: map timer and unload");
+               ScopeProfiler sp(g_profiler, "Client: map timer and unload");
                core::list<v3s16> deleted_blocks;
                m_env.getMap().timerUpdate(map_timer_and_unload_dtime,
-                               g_settings.getFloat("client_unload_unused_data_timeout"),
+                               g_settings->getFloat("client_unload_unused_data_timeout"),
                                &deleted_blocks);
                                
                /*if(deleted_blocks.size() > 0)
@@ -520,24 +522,6 @@ void Client::step(float dtime)
                // Step environment
                m_env.step(dtime);
                
-               /*
-                       Handle active blocks
-                       NOTE: These old objects are DEPRECATED. TODO: Remove
-               */
-               for(core::map<v3s16, bool>::Iterator
-                               i = m_active_blocks.getIterator();
-                               i.atEnd() == false; i++)
-               {
-                       v3s16 p = i.getNode()->getKey();
-
-                       MapBlock *block = m_env.getMap().getBlockNoCreateNoEx(p);
-                       if(block == NULL)
-                               continue;
-                       
-                       // Step MapBlockObjects
-                       block->stepObjects(dtime, false, m_env.getDayNightRatio());
-               }
-
                /*
                        Get events
                */
@@ -1189,16 +1173,11 @@ void Client::ProcessData(u8 *data, u32 datasize, u16 sender_peer_id)
        }
        //DEBUG
        else if(command == TOCLIENT_OBJECTDATA)
-       //else if(0)
        {
                // Strip command word and create a stringstream
                std::string datastring((char*)&data[2], datasize-2);
                std::istringstream is(datastring, std::ios_base::binary);
                
-               { //envlock
-               
-               //JMutexAutoLock envlock(m_env_mutex); //bulk comment-out
-
                u8 buf[12];
 
                /*
@@ -1248,106 +1227,16 @@ void Client::ProcessData(u8 *data, u32 datasize, u16 sender_peer_id)
 
                /*
                        Read block objects
-                       NOTE: Deprecated stuff here, TODO: Remove
+                       NOTE: Deprecated stuff
                */
 
                // Read active block count
-               is.read((char*)buf, 2);
-               u16 blockcount = readU16(buf);
-               
-               // Initialize delete queue with all active blocks
-               core::map<v3s16, bool> abs_to_delete;
-               for(core::map<v3s16, bool>::Iterator
-                               i = m_active_blocks.getIterator();
-                               i.atEnd() == false; i++)
-               {
-                       v3s16 p = i.getNode()->getKey();
-                       /*dstream<<"adding "
-                                       <<"("<<p.x<<","<<p.y<<","<<p.z<<") "
-                                       <<" to abs_to_delete"
-                                       <<std::endl;*/
-                       abs_to_delete.insert(p, true);
-               }
-
-               /*dstream<<"Initial delete queue size: "<<abs_to_delete.size()
-                               <<std::endl;*/
-               
-               for(u16 i=0; i<blockcount; i++)
-               {
-                       // Read blockpos
-                       is.read((char*)buf, 6);
-                       v3s16 p = readV3S16(buf);
-                       // Get block from somewhere
-                       MapBlock *block = NULL;
-                       try{
-                               block = m_env.getMap().getBlockNoCreate(p);
-                       }
-                       catch(InvalidPositionException &e)
-                       {
-                               //TODO: Create a dummy block?
-                       }
-                       if(block == NULL)
-                       {
-                               dstream<<"WARNING: "
-                                               <<"Could not get block at blockpos "
-                                               <<"("<<p.X<<","<<p.Y<<","<<p.Z<<") "
-                                               <<"in TOCLIENT_OBJECTDATA. Ignoring "
-                                               <<"following block object data."
-                                               <<std::endl;
-                               return;
-                       }
-
-                       /*dstream<<"Client updating objects for block "
-                                       <<"("<<p.X<<","<<p.Y<<","<<p.Z<<")"
-                                       <<std::endl;*/
-
-                       // Insert to active block list
-                       m_active_blocks.insert(p, true);
-
-                       // Remove from deletion queue
-                       if(abs_to_delete.find(p) != NULL)
-                               abs_to_delete.remove(p);
-
-                       /*
-                               Update objects of block
-                               
-                               NOTE: Be sure this is done in the main thread.
-                       */
-                       block->updateObjects(is, m_server_ser_ver,
-                                       m_device->getSceneManager(), m_env.getDayNightRatio());
-               }
-               
-               /*dstream<<"Final delete queue size: "<<abs_to_delete.size()
-                               <<std::endl;*/
-               
-               // Delete objects of blocks in delete queue
-               for(core::map<v3s16, bool>::Iterator
-                               i = abs_to_delete.getIterator();
-                               i.atEnd() == false; i++)
-               {
-                       v3s16 p = i.getNode()->getKey();
-                       try
-                       {
-                               MapBlock *block = m_env.getMap().getBlockNoCreate(p);
-                               
-                               // Clear objects
-                               block->clearObjects();
-                               // Remove from active blocks list
-                               m_active_blocks.remove(p);
-                       }
-                       catch(InvalidPositionException &e)
-                       {
-                               dstream<<"WARNAING: Client: "
-                                               <<"Couldn't clear objects of active->inactive"
-                                               <<" block "
-                                               <<"("<<p.X<<","<<p.Y<<","<<p.Z<<")"
-                                               <<" because block was not found"
-                                               <<std::endl;
-                               // Ignore
-                       }
+               u16 blockcount = readU16(is);
+               if(blockcount != 0){
+                       dstream<<"WARNING: TOCLIENT_OBJECTDATA: blockcount != 0 "
+                                       "not supported"<<std::endl;
+                       return;
                }
-
-               } //envlock
        }
        else if(command == TOCLIENT_TIME_OF_DAY)
        {
@@ -1403,7 +1292,7 @@ void Client::ProcessData(u8 *data, u32 datasize, u16 sender_peer_id)
        }
        else if(command == TOCLIENT_ACTIVE_OBJECT_REMOVE_ADD)
        {
-               //if(g_settings.getBool("enable_experimental"))
+               //if(g_settings->getBool("enable_experimental"))
                {
                        /*
                                u16 command
@@ -1462,7 +1351,7 @@ void Client::ProcessData(u8 *data, u32 datasize, u16 sender_peer_id)
        }
        else if(command == TOCLIENT_ACTIVE_OBJECT_MESSAGES)
        {
-               //if(g_settings.getBool("enable_experimental"))
+               //if(g_settings->getBool("enable_experimental"))
                {
                        /*
                                u16 command
@@ -1588,6 +1477,22 @@ void Client::ProcessData(u8 *data, u32 datasize, u16 sender_peer_id)
                        }
                }
        }
+       else if(command == TOCLIENT_DEATHSCREEN)
+       {
+               std::string datastring((char*)&data[2], datasize-2);
+               std::istringstream is(datastring, std::ios_base::binary);
+               
+               bool set_camera_point_target = readU8(is);
+               v3f camera_point_target = readV3F1000(is);
+               
+               ClientEvent event;
+               event.type = CE_DEATHSCREEN;
+               event.deathscreen.set_camera_point_target = set_camera_point_target;
+               event.deathscreen.camera_point_target_x = camera_point_target.X;
+               event.deathscreen.camera_point_target_y = camera_point_target.Y;
+               event.deathscreen.camera_point_target_z = camera_point_target.Z;
+               m_client_event_queue.push_back(event);
+       }
        else
        {
                dout_client<<DTIME<<"WARNING: Client: Ignoring unknown command "
@@ -1634,39 +1539,45 @@ void Client::groundAction(u8 action, v3s16 nodepos_undersurface,
        Send(0, data, true);
 }
 
-void Client::clickObject(u8 button, v3s16 blockpos, s16 id, u16 item)
+void Client::clickActiveObject(u8 button, u16 id, u16 item_i)
 {
        if(connectedAndInitialized() == false){
-               dout_client<<DTIME<<"Client::clickObject() "
+               dout_client<<DTIME<<"Client::clickActiveObject() "
                                "cancelled (not connected)"
                                <<std::endl;
                return;
        }
-       
-       /*
-               [0] u16 command=TOSERVER_CLICK_OBJECT
-               [2] u8 button (0=left, 1=right)
-               [3] v3s16 block
-               [9] s16 id
-               [11] u16 item
-       */
-       u8 datasize = 2 + 1 + 6 + 2 + 2;
-       SharedBuffer<u8> data(datasize);
-       writeU16(&data[0], TOSERVER_CLICK_OBJECT);
-       writeU8(&data[2], button);
-       writeV3S16(&data[3], blockpos);
-       writeS16(&data[9], id);
-       writeU16(&data[11], item);
-       Send(0, data, true);
-}
 
-void Client::clickActiveObject(u8 button, u16 id, u16 item)
-{
-       if(connectedAndInitialized() == false){
-               dout_client<<DTIME<<"Client::clickActiveObject() "
-                               "cancelled (not connected)"
-                               <<std::endl;
+       Player *player = m_env.getLocalPlayer();
+       if(player == NULL)
                return;
+
+       ClientActiveObject *obj = m_env.getActiveObject(id);
+       if(obj){
+               if(button == 0){
+                       ToolItem *titem = NULL;
+                       std::string toolname = "";
+
+                       InventoryList *mlist = player->inventory.getList("main");
+                       if(mlist != NULL)
+                       {
+                               InventoryItem *item = mlist->getItem(item_i);
+                               if(item && (std::string)item->getName() == "ToolItem")
+                               {
+                                       titem = (ToolItem*)item;
+                                       toolname = titem->getToolName();
+                               }
+                       }
+
+                       v3f playerpos = player->getPosition();
+                       v3f objpos = obj->getPosition();
+                       v3f dir = (objpos - playerpos).normalize();
+                       
+                       bool disable_send = obj->directReportPunch(toolname, dir);
+                       
+                       if(disable_send)
+                               return;
+               }
        }
        
        /*
@@ -1681,49 +1592,10 @@ void Client::clickActiveObject(u8 button, u16 id, u16 item)
        writeU16(&data[0], TOSERVER_CLICK_ACTIVEOBJECT);
        writeU8(&data[2], button);
        writeU16(&data[3], id);
-       writeU16(&data[5], item);
+       writeU16(&data[5], item_i);
        Send(0, data, true);
 }
 
-void Client::sendSignText(v3s16 blockpos, s16 id, std::string text)
-{
-       /*
-               u16 command
-               v3s16 blockpos
-               s16 id
-               u16 textlen
-               textdata
-       */
-       std::ostringstream os(std::ios_base::binary);
-       u8 buf[12];
-       
-       // Write command
-       writeU16(buf, TOSERVER_SIGNTEXT);
-       os.write((char*)buf, 2);
-       
-       // Write blockpos
-       writeV3S16(buf, blockpos);
-       os.write((char*)buf, 6);
-
-       // Write id
-       writeS16(buf, id);
-       os.write((char*)buf, 2);
-
-       u16 textlen = text.size();
-       // Write text length
-       writeS16(buf, textlen);
-       os.write((char*)buf, 2);
-
-       // Write text
-       os.write((char*)text.c_str(), textlen);
-       
-       // 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::sendSignNodeText(v3s16 p, std::string text)
 {
        /*
@@ -1856,6 +1728,20 @@ void Client::sendDamage(u8 damage)
        Send(0, data, true);
 }
 
+void Client::sendRespawn()
+{
+       DSTACK(__FUNCTION_NAME);
+       std::ostringstream os(std::ios_base::binary);
+
+       writeU16(os, TOSERVER_RESPAWN);
+
+       // 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::sendPlayerPos()
 {
        //JMutexAutoLock envlock(m_env_mutex); //bulk comment-out
@@ -1961,7 +1847,8 @@ void Client::addNode(v3s16 p, MapNode n)
        try
        {
                //TimeTaker timer3("Client::addNode(): addNodeAndUpdate");
-               m_env.getMap().addNodeAndUpdate(p, n, modified_blocks);
+               std::string st = std::string("");
+               m_env.getMap().addNodeAndUpdate(p, n, modified_blocks, st);
        }
        catch(InvalidPositionException &e)
        {}
@@ -2080,71 +1967,6 @@ void Client::inventoryAction(InventoryAction *a)
        sendInventoryAction(a);
 }
 
-MapBlockObject * Client::getSelectedObject(
-               f32 max_d,
-               v3f from_pos_f_on_map,
-               core::line3d<f32> shootline_on_map
-       )
-{
-       //JMutexAutoLock envlock(m_env_mutex); //bulk comment-out
-
-       core::array<DistanceSortedObject> objects;
-
-       for(core::map<v3s16, bool>::Iterator
-                       i = m_active_blocks.getIterator();
-                       i.atEnd() == false; i++)
-       {
-               v3s16 p = i.getNode()->getKey();
-
-               MapBlock *block = NULL;
-               try
-               {
-                       block = m_env.getMap().getBlockNoCreate(p);
-               }
-               catch(InvalidPositionException &e)
-               {
-                       continue;
-               }
-
-               // Calculate from_pos relative to block
-               v3s16 block_pos_i_on_map = block->getPosRelative();
-               v3f block_pos_f_on_map = intToFloat(block_pos_i_on_map, BS);
-               v3f from_pos_f_on_block = from_pos_f_on_map - block_pos_f_on_map;
-
-               block->getObjects(from_pos_f_on_block, max_d, objects);
-               //block->getPseudoObjects(from_pos_f_on_block, max_d, objects);
-       }
-
-       //dstream<<"Collected "<<objects.size()<<" nearby objects"<<std::endl;
-       
-       // Sort them.
-       // After this, the closest object is the first in the array.
-       objects.sort();
-
-       for(u32 i=0; i<objects.size(); i++)
-       {
-               MapBlockObject *obj = objects[i].obj;
-               MapBlock *block = obj->getBlock();
-
-               // Calculate shootline relative to block
-               v3s16 block_pos_i_on_map = block->getPosRelative();
-               v3f block_pos_f_on_map = intToFloat(block_pos_i_on_map, BS);
-               core::line3d<f32> shootline_on_block(
-                               shootline_on_map.start - block_pos_f_on_map,
-                               shootline_on_map.end - block_pos_f_on_map
-               );
-
-               if(obj->isSelected(shootline_on_block))
-               {
-                       //dstream<<"Returning selected object"<<std::endl;
-                       return obj;
-               }
-       }
-
-       //dstream<<"No object selected; returning NULL."<<std::endl;
-       return NULL;
-}
-
 ClientActiveObject * Client::getSelectedActiveObject(
                f32 max_d,
                v3f from_pos_f_on_map,