mirror of
https://github.com/luanti-org/luanti.git
synced 2025-06-27 16:36:03 +00:00
The huge item definition and item namespace unification patch (itemdef), see http://c55.me/minetest/wiki/doku.php?id=changes:itemdef
This commit is contained in:
parent
569156b013
commit
6a76c226e1
65 changed files with 7232 additions and 7282 deletions
261
src/client.cpp
261
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 <IFileSystem.h>
|
||||
#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."<<std::endl;
|
||||
|
||||
// Update node textures
|
||||
m_nodedef->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<<std::endl;
|
||||
ItemStack item;
|
||||
item.deSerialize(itemstring, m_itemdef);
|
||||
inv->changeItem(0, item);
|
||||
if(itemstring.empty())
|
||||
{
|
||||
infostream<<"Client: empty player item for peer "
|
||||
<<peer_id<<std::endl;
|
||||
}
|
||||
else
|
||||
{
|
||||
infostream<<"Client: player item for peer "
|
||||
<<peer_id<<": "<<itemstring<<std::endl;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
@ -1256,14 +1243,9 @@ 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());
|
||||
|
||||
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: "
|
||||
<<datasize<<std::endl;
|
||||
|
||||
std::string datastring((char*)&data[2], datasize-2);
|
||||
std::istringstream is(datastring, std::ios_base::binary);
|
||||
|
||||
m_tooldef_received = true;
|
||||
|
||||
// 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();
|
||||
}
|
||||
|
||||
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"<<std::endl;
|
||||
}
|
||||
else if(command == TOCLIENT_NODEDEF)
|
||||
{
|
||||
infostream<<"Client: Received node definitions: packet size: "
|
||||
<<datasize<<std::endl;
|
||||
|
||||
// Mesh update thread must be stopped while
|
||||
// updating content definitions
|
||||
assert(!m_mesh_update_thread.IsRunning());
|
||||
|
||||
// Decompress node definitions
|
||||
std::string datastring((char*)&data[2], datasize-2);
|
||||
std::istringstream is(datastring, std::ios_base::binary);
|
||||
|
||||
m_nodedef_received = true;
|
||||
|
||||
// Stop threads while updating content definitions
|
||||
m_mesh_update_thread.stop();
|
||||
|
||||
std::istringstream tmp_is(deSerializeLongString(is), std::ios::binary);
|
||||
m_nodedef->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"<<std::endl;
|
||||
}
|
||||
else if(command == TOCLIENT_ITEMDEF)
|
||||
{
|
||||
infostream<<"Client: Received item definitions: packet size: "
|
||||
<<datasize<<std::endl;
|
||||
|
||||
// Mesh update thread must be stopped while
|
||||
// updating content definitions
|
||||
assert(!m_mesh_update_thread.IsRunning());
|
||||
|
||||
// Decompress item definitions
|
||||
std::string datastring((char*)&data[2], datasize-2);
|
||||
std::istringstream is(datastring, std::ios_base::binary);
|
||||
|
||||
m_craftitemdef_received = true;
|
||||
|
||||
// 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();
|
||||
}
|
||||
|
||||
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 ("<<p.X<<","<<p.Y<<","<<p.Z<<"): "
|
||||
<<"no metadata found"<<std::endl;
|
||||
return NULL;
|
||||
}
|
||||
|
||||
infostream<<__FUNCTION_NAME<<": unknown id "<<id<<std::endl;
|
||||
return NULL;
|
||||
}
|
||||
#endif
|
||||
void Client::inventoryAction(InventoryAction *a)
|
||||
{
|
||||
sendInventoryAction(a);
|
||||
|
@ -2234,6 +2131,32 @@ ClientEvent Client::getClientEvent()
|
|||
return m_client_event_queue.pop_front();
|
||||
}
|
||||
|
||||
void Client::afterContentReceived()
|
||||
{
|
||||
assert(m_itemdef_received);
|
||||
assert(m_nodedef_received);
|
||||
assert(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 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;
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue