aboutsummaryrefslogtreecommitdiff
BranchCommit messageAuthorAge
atcjitAdd scheduling commandsywang3 years
docFix signal directionY. Wang21 months
l10nMinor: str:sub -> string.sub for consistency with the rest of the codeY. Wang5 months
luaatcdebugAdd commands for dangerous mode.Gabriel Pérez-Cerezo3 years
masterAvoid unnecessarily updating the driver HUDY. Wang11 days
new-ksSet Zs3v only if upcoming speed limit is stricterY. Wang5 months
new-ks-orwellFully implement and test new aspect support/distant signalling on ks and japa...orwell6 months
profilerMore profiling instructionsorwell965 years
route_prog_reworkWall signals: make them a bit bigger againorwell2 months
techageLiquid spigots: modify texture to appear blue (better optical distinction), a...orwell9614 months
tracyMore tracy wrappers for path/LZB-related functionsY. Wang9 days
trainhud-unifontAdd workarounds to not break MT 5.3.0 compatY. Wang3 years
 
TagDownloadAuthorAge
release-2.4.6advtrains-release-2.4.6.tar.gz  advtrains-release-2.4.6.tar.bz2  advtrains-release-2.4.6.zip  1F616EMO3 weeks
release-2.4.5advtrains-release-2.4.5.tar.gz  advtrains-release-2.4.5.tar.bz2  advtrains-release-2.4.5.zip  gpcf6 weeks
release-2.4.4advtrains-release-2.4.4.tar.gz  advtrains-release-2.4.4.tar.bz2  advtrains-release-2.4.4.zip  orwell8 weeks
release-2.4.3advtrains-release-2.4.3.tar.gz  advtrains-release-2.4.3.tar.bz2  advtrains-release-2.4.3.zip  orwell9614 months
release-2.4.2advtrains-release-2.4.2.tar.gz  advtrains-release-2.4.2.tar.bz2  advtrains-release-2.4.2.zip  Maverick279718 months
release-1.xadvtrains-release-1.x.tar.gz  advtrains-release-1.x.tar.bz2  advtrains-release-1.x.zip  orwell963 years
release-2.4.1advtrains-release-2.4.1.tar.gz  advtrains-release-2.4.1.tar.bz2  advtrains-release-2.4.1.zip  ywang3 years
release-2.4.0advtrains-release-2.4.0.tar.gz  advtrains-release-2.4.0.tar.bz2  advtrains-release-2.4.0.zip  orwell963 years
release-2.3.1advtrains-release-2.3.1.tar.gz  advtrains-release-2.3.1.tar.bz2  advtrains-release-2.3.1.zip  orwell963 years
release-2.3.0advtrains-release-2.3.0.tar.gz  advtrains-release-2.3.0.tar.bz2  advtrains-release-2.3.0.zip  orwell963 years
release-2.2.1advtrains-release-2.2.1.tar.gz  advtrains-release-2.2.1.tar.bz2  advtrains-release-2.2.1.zip  ywang4 years
release-2.2.0advtrains-release-2.2.0.tar.gz  advtrains-release-2.2.0.tar.bz2  advtrains-release-2.2.0.zip  orwell964 years
release-2.1.4advtrains-release-2.1.4.tar.gz  advtrains-release-2.1.4.tar.bz2  advtrains-release-2.1.4.zip  Blockhead4 years
release-2.1.3advtrains-release-2.1.3.tar.gz  advtrains-release-2.1.3.tar.bz2  advtrains-release-2.1.3.zip  orwell964 years
h137-rc2advtrains-h137-rc2.tar.gz  advtrains-h137-rc2.tar.bz2  advtrains-h137-rc2.zip  ywang4 years
release-2.1.2advtrains-release-2.1.2.tar.gz  advtrains-release-2.1.2.tar.bz2  advtrains-release-2.1.2.zip  Gabriel Pérez-Cerezo5 years
h137-rc1advtrains-h137-rc1.tar.gz  advtrains-h137-rc1.tar.bz2  advtrains-h137-rc1.zip  ywang5 years
MT0.4advtrains-MT0.4.tar.gz  advtrains-MT0.4.tar.bz2  advtrains-MT0.4.zip  Blockhead5 years
backAction::toString() const { std::ostringstream os(std::ios::binary); switch (type) { case TYPE_SET_NODE: os << "set_node " << PP(p); os << ": (" << serializeJsonString(n_old.name); os << ", " << itos(n_old.param1); os << ", " << itos(n_old.param2); os << ", " << serializeJsonString(n_old.meta); os << ") -> (" << serializeJsonString(n_new.name); os << ", " << itos(n_new.param1); os << ", " << itos(n_new.param2); os << ", " << serializeJsonString(n_new.meta); os << ')'; case TYPE_MODIFY_INVENTORY_STACK: os << "modify_inventory_stack ("; os << serializeJsonString(inventory_location); os << ", " << serializeJsonString(inventory_list); os << ", " << inventory_index; os << ", " << (inventory_add ? "add" : "remove"); os << ", " << serializeJsonString(inventory_stack.getItemString()); os << ')'; default: return "<unknown action>"; } return os.str(); } bool RollbackAction::isImportant(IGameDef *gamedef) const { if (type != TYPE_SET_NODE) return true; // If names differ, action is always important if(n_old.name != n_new.name) return true; // If metadata differs, action is always important if(n_old.meta != n_new.meta) return true; INodeDefManager *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 if (def.liquid_type == LIQUID_FLOWING) return false; // Otherwise action is important return true; } bool RollbackAction::getPosition(v3s16 *dst) const { switch (type) { case TYPE_SET_NODE: if (dst) *dst = p; return true; case TYPE_MODIFY_INVENTORY_STACK: { InventoryLocation loc; loc.deSerialize(inventory_location); if (loc.type != InventoryLocation::NODEMETA) { return false; } if (dst) *dst = loc.p; return true; } default: return false; } } bool RollbackAction::applyRevert(Map *map, InventoryManager *imgr, IGameDef *gamedef) const { try { switch (type) { case TYPE_NOTHING: return true; case TYPE_SET_NODE: { INodeDefManager *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); 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); // Set rollback node try { if (!map->addNodeWithEvent(p, n)) { infostream << "RollbackAction::applyRevert(): " << "AddNodeWithEvent failed at " << PP(p) << " for " << n_old.name << std::endl; return false; } if (n_old.meta.empty()) { map->removeNodeMetadata(p); } else { NodeMetadata *meta = map->getNodeMetadata(p); if (!meta) { meta = new NodeMetadata(gamedef->idef()); if (!map->setNodeMetadata(p, meta)) { delete meta; infostream << "RollbackAction::applyRevert(): " << "setNodeMetadata failed at " << PP(p) << " for " << n_old.name << std::endl; return false; } } std::istringstream is(n_old.meta, std::ios::binary); 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); } } catch (InvalidPositionException &e) { infostream << "RollbackAction::applyRevert(): " << "InvalidPositionException: " << e.what() << std::endl; return false; } // Success return true; } case TYPE_MODIFY_INVENTORY_STACK: { InventoryLocation loc; loc.deSerialize(inventory_location); Inventory *inv = imgr->getInventory(loc); if (!inv) { infostream << "RollbackAction::applyRevert(): Could not get " "inventory at " << inventory_location << std::endl; return false; } InventoryList *list = inv->getList(inventory_list); if (!list) { infostream << "RollbackAction::applyRevert(): Could not get " "inventory list \"" << inventory_list << "\" in " << inventory_location << std::endl; return false; } if (list->getSize() <= inventory_index) { infostream << "RollbackAction::applyRevert(): List index " << inventory_index << " too large in " << "inventory list \"" << inventory_list << "\" in " << 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 != gamedef->idef()->getAlias(inventory_stack.name)) return false; list->takeItem(inventory_index, inventory_stack.count); } else { list->addItem(inventory_index, inventory_stack); } // Inventory was modified; send to clients imgr->setInventoryModified(loc); return true; } default: errorstream << "RollbackAction::applyRevert(): type not handled" << std::endl; return false; } } catch(SerializationError &e) { errorstream << "RollbackAction::applyRevert(): n_old.name=" << n_old.name << ", SerializationError: " << e.what() << std::endl; } return false; }