From 6a76c226e10e92c3e3339096f07f8ab065e2098b Mon Sep 17 00:00:00 2001 From: Kahrl Date: Thu, 12 Jan 2012 06:10:39 +0100 Subject: The huge item definition and item namespace unification patch (itemdef), see http://c55.me/minetest/wiki/doku.php?id=changes:itemdef --- src/client.cpp | 261 ++++++++++++++++++++------------------------------------- 1 file changed, 90 insertions(+), 171 deletions(-) (limited to 'src/client.cpp') diff --git a/src/client.cpp b/src/client.cpp index 38ed14978..feb8a3a1e 100644 --- a/src/client.cpp +++ b/src/client.cpp @@ -33,8 +33,7 @@ with this program; if not, write to the Free Software Foundation, Inc., #include "log.h" #include "nodemetadata.h" #include "nodedef.h" -#include "tooldef.h" -#include "craftitemdef.h" +#include "itemdef.h" #include #include "sha1.h" #include "base64.h" @@ -207,14 +206,12 @@ Client::Client( std::string password, MapDrawControl &control, IWritableTextureSource *tsrc, - IWritableToolDefManager *tooldef, - IWritableNodeDefManager *nodedef, - IWritableCraftItemDefManager *craftitemdef + IWritableItemDefManager *itemdef, + IWritableNodeDefManager *nodedef ): m_tsrc(tsrc), - m_tooldef(tooldef), + m_itemdef(itemdef), m_nodedef(nodedef), - m_craftitemdef(craftitemdef), m_mesh_update_thread(this), m_env( new ClientMap(this, this, control, @@ -234,9 +231,8 @@ Client::Client( m_access_denied(false), m_texture_receive_progress(0), m_textures_received(false), - m_tooldef_received(false), - m_nodedef_received(false), - m_craftitemdef_received(false) + m_itemdef_received(false), + m_nodedef_received(false) { m_packetcounter_timer = 0.0; //m_delete_unused_sectors_timer = 0.0; @@ -251,12 +247,6 @@ Client::Client( else infostream<<"Not building texture atlas."<updateTextures(m_tsrc); - - // Start threads after setting up content definitions - m_mesh_update_thread.Start(); - /* Add local player */ @@ -266,9 +256,6 @@ Client::Client( player->updateName(playername); m_env.addPlayer(player); - - // Initialize player in the inventory context - m_inventory_context.current_player = player; } } @@ -983,7 +970,7 @@ void Client::ProcessData(u8 *data, u32 datasize, u16 sender_peer_id) //t4.stop(); //TimeTaker t1("inventory.deSerialize()", m_device); - player->inventory.deSerialize(is, this); + player->inventory.deSerialize(is); //t1.stop(); m_inventory_updated = true; @@ -1216,18 +1203,18 @@ void Client::ProcessData(u8 *data, u32 datasize, u16 sender_peer_id) } else { InventoryList *inv = player->inventory.getList("main"); std::string itemstring(deSerializeString(is)); - if (itemstring.empty()) { - inv->deleteItem(0); - infostream - <<"Client: empty player item for peer " - << peer_id << std::endl; - } else { - std::istringstream iss(itemstring); - delete inv->changeItem(0, - InventoryItem::deSerialize(iss, this)); - infostream<<"Client: player item for peer " << peer_id << ": "; - player->getWieldItem()->serialize(infostream); - infostream<changeItem(0, item); + if(itemstring.empty()) + { + infostream<<"Client: empty player item for peer " + <processQueue(); - } + // Mesh update thread must be stopped while + // updating content definitions + assert(!m_mesh_update_thread.IsRunning()); int num_textures = readU16(is); @@ -1362,9 +1344,6 @@ void Client::ProcessData(u8 *data, u32 datasize, u16 sender_peer_id) } } - // Resume threads - m_mesh_update_thread.setRun(true); - m_mesh_update_thread.Start(); ClientEvent event; event.type = CE_TEXTURES_UPDATED; @@ -1412,14 +1391,10 @@ void Client::ProcessData(u8 *data, u32 datasize, u16 sender_peer_id) std::string datastring((char*)&data[2], datasize-2); std::istringstream is(datastring, std::ios_base::binary); - // Stop threads while updating content definitions - m_mesh_update_thread.setRun(false); - // Process the remaining TextureSource queue to let MeshUpdateThread - // get it's remaining textures and thus let it stop - while(m_mesh_update_thread.IsRunning()){ - m_tsrc->processQueue(); - } - + // Mesh update thread must be stopped while + // updating content definitions + assert(!m_mesh_update_thread.IsRunning()); + /* u16 command u16 total number of texture bunches @@ -1484,22 +1459,6 @@ void Client::ProcessData(u8 *data, u32 datasize, u16 sender_peer_id) img->drop(); rfile->drop(); } - - if(m_nodedef_received && m_textures_received){ - // Rebuild inherited images and recreate textures - m_tsrc->rebuildImagesAndTextures(); - - // Update texture atlas - if(g_settings->getBool("enable_texture_atlas")) - m_tsrc->buildMainAtlas(this); - - // Update node textures - m_nodedef->updateTextures(m_tsrc); - } - - // Resume threads - m_mesh_update_thread.setRun(true); - m_mesh_update_thread.Start(); ClientEvent event; event.type = CE_TEXTURES_UPDATED; @@ -1507,82 +1466,53 @@ void Client::ProcessData(u8 *data, u32 datasize, u16 sender_peer_id) } else if(command == TOCLIENT_TOOLDEF) { - infostream<<"Client: Received tool definitions: packet size: " - <processQueue(); - } - - std::istringstream tmp_is(deSerializeLongString(is), std::ios::binary); - m_tooldef->deSerialize(tmp_is); - - // Resume threads - m_mesh_update_thread.setRun(true); - m_mesh_update_thread.Start(); + infostream<<"Client: WARNING: Ignoring TOCLIENT_TOOLDEF"<deSerialize(tmp_is, this); - - if(m_textures_received){ - // Update texture atlas - if(g_settings->getBool("enable_texture_atlas")) - m_tsrc->buildMainAtlas(this); - - // Update node textures - m_nodedef->updateTextures(m_tsrc); - } + std::ostringstream tmp_os; + decompressZlib(tmp_is, tmp_os); - // Resume threads - m_mesh_update_thread.setRun(true); - m_mesh_update_thread.Start(); + // Deserialize node definitions + std::istringstream tmp_is2(tmp_os.str()); + m_nodedef->deSerialize(tmp_is2); + m_nodedef_received = true; } else if(command == TOCLIENT_CRAFTITEMDEF) { - infostream<<"Client: Received CraftItem definitions: packet size: " + infostream<<"Client: WARNING: Ignoring TOCLIENT_CRAFTITEMDEF"<processQueue(); - } - std::istringstream tmp_is(deSerializeLongString(is), std::ios::binary); - m_craftitemdef->deSerialize(tmp_is); - - // Resume threads - m_mesh_update_thread.setRun(true); - m_mesh_update_thread.Start(); + std::ostringstream tmp_os; + decompressZlib(tmp_is, tmp_os); + + // Deserialize node definitions + std::istringstream tmp_is2(tmp_os.str()); + m_itemdef->deSerialize(tmp_is2); + m_itemdef_received = true; } else { @@ -1943,11 +1873,6 @@ void Client::selectPlayerItem(u16 item) //JMutexAutoLock envlock(m_env_mutex); //bulk comment-out m_playeritem = item; m_inventory_updated = true; - - LocalPlayer *player = m_env.getLocalPlayer(); - assert(player != NULL); - player->wieldItem(item); - sendPlayerItem(item); } @@ -1971,17 +1896,19 @@ void Client::getLocalInventory(Inventory &dst) dst = player->inventory; } -InventoryContext *Client::getInventoryContext() -{ - return &m_inventory_context; -} - Inventory* Client::getInventory(const InventoryLocation &loc) { switch(loc.type){ case InventoryLocation::UNDEFINED: {} break; + case InventoryLocation::CURRENT_PLAYER: + { + Player *player = m_env.getLocalPlayer(); + assert(player != NULL); + return &player->inventory; + } + break; case InventoryLocation::PLAYER: { Player *player = m_env.getPlayer(loc.name.c_str()); @@ -2003,36 +1930,6 @@ Inventory* Client::getInventory(const InventoryLocation &loc) } return NULL; } -#if 0 -Inventory* Client::getInventory(InventoryContext *c, std::string id) -{ - if(id == "current_player") - { - assert(c->current_player); - return &(c->current_player->inventory); - } - - Strfnd fn(id); - std::string id0 = fn.next(":"); - - if(id0 == "nodemeta") - { - v3s16 p; - p.X = stoi(fn.next(",")); - p.Y = stoi(fn.next(",")); - p.Z = stoi(fn.next(",")); - NodeMetadata* meta = getNodeMetadata(p); - if(meta) - return meta->getInventory(); - infostream<<"nodemeta at ("<rebuildImagesAndTextures(); + + // Update texture atlas + if(g_settings->getBool("enable_texture_atlas")) + m_tsrc->buildMainAtlas(this); + + // Update node aliases + m_nodedef->updateAliases(m_itemdef); + + // Update node textures + m_nodedef->updateTextures(m_tsrc); + + // Update item textures and meshes + m_itemdef->updateTexturesAndMeshes(this); + + // Start mesh update thread after setting up content definitions + m_mesh_update_thread.Start(); +} + float Client::getRTT(void) { try{ @@ -2245,9 +2168,9 @@ float Client::getRTT(void) // IGameDef interface // Under envlock -IToolDefManager* Client::getToolDefManager() +IItemDefManager* Client::getItemDefManager() { - return m_tooldef; + return m_itemdef; } INodeDefManager* Client::getNodeDefManager() { @@ -2258,10 +2181,6 @@ ICraftDefManager* Client::getCraftDefManager() return NULL; //return m_craftdef; } -ICraftItemDefManager* Client::getCraftItemDefManager() -{ - return m_craftitemdef; -} ITextureSource* Client::getTextureSource() { return m_tsrc; -- cgit v1.2.3