ToolDefManager serialization
[oweals/minetest.git] / src / client.cpp
index 69c91bc30947d161bfc9cbcd7725cca52b203b29..d5abcd7debfd59ae5d11d69fd53110d7504322ca 100644 (file)
@@ -31,6 +31,9 @@ with this program; if not, write to the Free Software Foundation, Inc.,
 #include "settings.h"
 #include "profiler.h"
 #include "log.h"
+#include "nodemetadata.h"
+#include "nodedef.h"
+#include "tooldef.h"
 
 /*
        QueuedMeshUpdate
@@ -159,7 +162,7 @@ void * MeshUpdateThread::Thread()
                ScopeProfiler sp(g_profiler, "Client: Mesh making");
 
                scene::SMesh *mesh_new = NULL;
-               mesh_new = makeMapBlockMesh(q->data);
+               mesh_new = makeMapBlockMesh(q->data, m_gamedef);
 
                MeshUpdateResult r;
                r.p = q->p;
@@ -184,13 +187,21 @@ Client::Client(
                IrrlichtDevice *device,
                const char *playername,
                std::string password,
-               MapDrawControl &control):
-       m_mesh_update_thread(),
+               MapDrawControl &control,
+               IWritableTextureSource *tsrc,
+               IWritableToolDefManager *tooldef,
+               IWritableNodeDefManager *nodedef
+):
+       m_tsrc(tsrc),
+       m_tooldef(tooldef),
+       m_nodedef(nodedef),
+       m_mesh_update_thread(this),
        m_env(
-               new ClientMap(this, control,
+               new ClientMap(this, this, control,
                        device->getSceneManager()->getRootSceneNode(),
                        device->getSceneManager(), 666),
-               device->getSceneManager()
+               device->getSceneManager(),
+               tsrc, this
        ),
        m_con(PROTOCOL_ID, 512, CONNECTION_TIMEOUT, this),
        m_device(device),
@@ -208,18 +219,25 @@ Client::Client(
        m_playerpos_send_timer = 0.0;
        m_ignore_damage_timer = 0.0;
 
-       //m_env_mutex.Init();
-       //m_con_mutex.Init();
+       // Build main texture atlas, now that the GameDef exists (that is, us)
+       if(g_settings->getBool("enable_texture_atlas"))
+               tsrc->buildMainAtlas(this);
+       else
+               infostream<<"Not building texture atlas."<<std::endl;
+       
+       // Update textures
+       m_nodedef->updateTextures(tsrc);
 
+       // NOTE: This should be done only after getting possible dynamic
+       // game definitions from the server, or at least shut down and
+       // restarted when doing so
        m_mesh_update_thread.Start();
 
        /*
                Add local player
        */
        {
-               //JMutexAutoLock envlock(m_env_mutex); //bulk comment-out
-
-               Player *player = new LocalPlayer();
+               Player *player = new LocalPlayer(this);
 
                player->updateName(playername);
 
@@ -821,7 +839,7 @@ void Client::ProcessData(u8 *data, u32 datasize, u16 sender_peer_id)
                //TimeTaker t1("TOCLIENT_ADDNODE");
 
                MapNode n;
-               n.deSerialize(&data[8], ser_version);
+               n.deSerialize(&data[8], ser_version, m_nodedef);
                
                addNode(p, n);
        }
@@ -870,7 +888,7 @@ void Client::ProcessData(u8 *data, u32 datasize, u16 sender_peer_id)
                                Create a new block
                        */
                        //infostream<<"Creating new"<<std::endl;
-                       block = new MapBlock(&m_env.getMap(), p);
+                       block = new MapBlock(&m_env.getMap(), p, this);
                        block->deSerialize(istr, ser_version);
                        sector->insertBlock(block);
 
@@ -1035,7 +1053,7 @@ void Client::ProcessData(u8 *data, u32 datasize, u16 sender_peer_id)
                                // Create a player if it doesn't exist
                                if(player == NULL)
                                {
-                                       player = new RemotePlayer(
+                                       player = new RemotePlayer(this,
                                                        m_device->getSceneManager()->getRootSceneNode(),
                                                        m_device,
                                                        -1);
@@ -1156,7 +1174,7 @@ void Client::ProcessData(u8 *data, u32 datasize, u16 sender_peer_id)
                        //t4.stop();
 
                        //TimeTaker t1("inventory.deSerialize()", m_device);
-                       player->inventory.deSerialize(is);
+                       player->inventory.deSerialize(is, this);
                        //t1.stop();
 
                        m_inventory_updated = true;
@@ -1463,7 +1481,8 @@ void Client::ProcessData(u8 *data, u32 datasize, u16 sender_peer_id)
                                                << peer_id << std::endl;
                                } else {
                                        std::istringstream iss(itemstring);
-                                       delete inv->changeItem(0, InventoryItem::deSerialize(iss));
+                                       delete inv->changeItem(0,
+                                                       InventoryItem::deSerialize(iss, this));
                                        infostream<<"Client: player item for peer " << peer_id << ": ";
                                        player->getWieldItem()->serialize(infostream);
                                        infostream<<std::endl;
@@ -2166,3 +2185,18 @@ float Client::getRTT(void)
        }
 }
 
+// IGameDef interface
+// Under envlock
+IToolDefManager* Client::getToolDefManager()
+{
+       return m_tooldef;
+}
+INodeDefManager* Client::getNodeDefManager()
+{
+       return m_nodedef;
+}
+ITextureSource* Client::getTextureSource()
+{
+       return m_tsrc;
+}
+