X-Git-Url: https://git.lizzy.rs/?a=blobdiff_plain;ds=sidebyside;f=src%2Frollback_interface.cpp;h=c00206e984592a53f167ced313544b672dbbbcdc;hb=df74d369a395f0b99bd23fa3e7fb4c628c3df336;hp=7345c4a7dcecf50b2c4ded0e2204132872c527a6;hpb=4d4b8bb8a46b6472d86fa848954dbc26b4fadb50;p=minetest.git diff --git a/src/rollback_interface.cpp b/src/rollback_interface.cpp index 7345c4a7d..c00206e98 100644 --- a/src/rollback_interface.cpp +++ b/src/rollback_interface.cpp @@ -36,15 +36,15 @@ with this program; if not, write to the Free Software Foundation, Inc., RollbackNode::RollbackNode(Map *map, v3s16 p, IGameDef *gamedef) { - INodeDefManager *ndef = gamedef->ndef(); - MapNode n = map->getNodeNoEx(p); + const NodeDefManager *ndef = gamedef->ndef(); + MapNode n = map->getNode(p); name = ndef->get(n).name; param1 = n.param1; param2 = n.param2; NodeMetadata *metap = map->getNodeMetadata(p); if (metap) { std::ostringstream os(std::ios::binary); - metap->serialize(os); + metap->serialize(os, 1); // FIXME: version bump?? meta = os.str(); } } @@ -90,7 +90,7 @@ bool RollbackAction::isImportant(IGameDef *gamedef) const // If metadata differs, action is always important if(n_old.meta != n_new.meta) return true; - INodeDefManager *ndef = gamedef->ndef(); + const NodeDefManager *ndef = gamedef->ndef(); // Both are of the same name, so a single definition is needed const ContentFeatures &def = ndef->get(n_old.name); // If the type is flowing liquid, action is not important @@ -128,18 +128,23 @@ bool RollbackAction::applyRevert(Map *map, InventoryManager *imgr, IGameDef *gam case TYPE_NOTHING: return true; case TYPE_SET_NODE: { - INodeDefManager *ndef = gamedef->ndef(); + const NodeDefManager *ndef = gamedef->ndef(); // Make sure position is loaded from disk map->emergeBlock(getContainerPos(p, MAP_BLOCKSIZE), false); // Check current node - MapNode current_node = map->getNodeNoEx(p); + MapNode current_node = map->getNode(p); std::string current_name = ndef->get(current_node).name; // If current node not the new node, it's bad if (current_name != n_new.name) { return false; } // Create rollback node - MapNode n(ndef, n_old.name, n_old.param1, n_old.param2); + content_t id = CONTENT_IGNORE; + if (!ndef->getId(n_old.name, id)) { + // The old node is not registered + return false; + } + MapNode n(id, n_old.param1, n_old.param2); // Set rollback node try { if (!map->addNodeWithEvent(p, n)) { @@ -165,20 +170,13 @@ bool RollbackAction::applyRevert(Map *map, InventoryManager *imgr, IGameDef *gam } } std::istringstream is(n_old.meta, std::ios::binary); - meta->deSerialize(is); + meta->deSerialize(is, 1); // FIXME: version bump?? } // Inform other things that the meta data has changed - v3s16 blockpos = getContainerPos(p, MAP_BLOCKSIZE); MapEditEvent event; event.type = MEET_BLOCK_NODE_METADATA_CHANGED; - event.p = blockpos; - map->dispatchEvent(&event); - // Set the block to be saved - MapBlock *block = map->getBlockNoCreateNoEx(blockpos); - if (block) { - block->raiseModified(MOD_STATE_WRITE_NEEDED, - MOD_REASON_REPORT_META_CHANGE); - } + event.p = p; + map->dispatchEvent(event); } catch (InvalidPositionException &e) { infostream << "RollbackAction::applyRevert(): " << "InvalidPositionException: " << e.what() @@ -190,7 +188,6 @@ bool RollbackAction::applyRevert(Map *map, InventoryManager *imgr, IGameDef *gam case TYPE_MODIFY_INVENTORY_STACK: { InventoryLocation loc; loc.deSerialize(inventory_location); - std::string real_name = gamedef->idef()->getAlias(inventory_stack.name); Inventory *inv = imgr->getInventory(loc); if (!inv) { infostream << "RollbackAction::applyRevert(): Could not get " @@ -211,10 +208,12 @@ bool RollbackAction::applyRevert(Map *map, InventoryManager *imgr, IGameDef *gam << inventory_location << std::endl; return false; } + // If item was added, take away item, otherwise add removed item if (inventory_add) { // Silently ignore different current item - if (list->getItem(inventory_index).name != real_name) + if (list->getItem(inventory_index).name != + gamedef->idef()->getAlias(inventory_stack.name)) return false; list->takeItem(inventory_index, inventory_stack.count); } else {