From 8d9489c368dd4b98c512547f38e206d92c2aa7f7 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Tomasz=20Zieli=C5=84ski?= Date: Tue, 9 Apr 2024 17:29:33 +0200 Subject: [PATCH] Fix conflicts with templates loaded from mods --- .../CObjectClassesHandler.cpp | 14 +++----- lib/mapObjects/ObstacleSetHandler.cpp | 36 +++++++++---------- 2 files changed, 23 insertions(+), 27 deletions(-) diff --git a/lib/mapObjectConstructors/CObjectClassesHandler.cpp b/lib/mapObjectConstructors/CObjectClassesHandler.cpp index 3f362923c..d8a11cde9 100644 --- a/lib/mapObjectConstructors/CObjectClassesHandler.cpp +++ b/lib/mapObjectConstructors/CObjectClassesHandler.cpp @@ -117,14 +117,6 @@ std::vector CObjectClassesHandler::loadLegacyData() std::pair key(tmpl->id, tmpl->subid); legacyTemplates.insert(std::make_pair(key, tmpl)); - - if (!tmpl->isVisitable()) - { - if (tmpl->id != Obj::RIVER_DELTA) - { - VLC->biomeHandler->addTemplate("core", tmpl->stringID, tmpl); - } - } } objects.resize(256); @@ -222,14 +214,18 @@ TObjectTypeHandler CObjectClassesHandler::loadSubObjectFromJson(const std::strin for (auto & templ : createdObject->getTemplates()) { - // Register templates for new objects + // Register templates for new objects from mods VLC->biomeHandler->addTemplate(scope, templ->stringID, templ); } auto range = legacyTemplates.equal_range(std::make_pair(obj->id, index)); for (auto & templ : boost::make_iterator_range(range.first, range.second)) { + // Register legacy templates as "core" + VLC->biomeHandler->addTemplate("core", templ.second->stringID, templ.second); + // FIXME: Why does it clear stringID? createdObject->addTemplate(templ.second); + } legacyTemplates.erase(range.first, range.second); diff --git a/lib/mapObjects/ObstacleSetHandler.cpp b/lib/mapObjects/ObstacleSetHandler.cpp index e7ac9f725..5f7dcc9b1 100644 --- a/lib/mapObjects/ObstacleSetHandler.cpp +++ b/lib/mapObjects/ObstacleSetHandler.cpp @@ -182,7 +182,6 @@ std::vector ObstacleSetFilter::getAllowedTypes() con std::vector ObstacleSetHandler::loadLegacyData() { - // TODO: Where to load objects.json? return {}; } @@ -212,7 +211,6 @@ void ObstacleSetHandler::loadObject(std::string scope, std::string name, const J { logMod->error("Failed to load obstacle set: %s", name); } - // TODO: VLC->identifiersHandler->registerObject(scope, "biome", name, biomes.at(index)->id); } @@ -235,17 +233,12 @@ std::shared_ptr ObstacleSetHandler::loadFromJson(const std::string auto templates = json["templates"].Vector(); for (const auto & node : templates) { - // TODO: We need to store all the templates by their name - // TODO: We need to store all the templates by their id + logGlobal->info("Registering obstacle template: %s in scope %s", node.String(), scope); - logGlobal->info("Registering obstacle template: %s", node.String()); - /* - FIXME: - Warning: identifier AVXplns0 is not in camelCase! - registered biome.templateSet1 as core:1701602145 - */ - - VLC->identifiers()->requestIdentifier(scope, "obstacleTemplate", node.String(), [this, os](si32 id) + auto identifier = boost::algorithm::to_lower_copy(node.String()); + + // FIXME: Identifier 'avlswn02' exists in mod 'hota.mapdecorations' but identifier was explicitly requested from mod 'hota.mapdecorations'! + VLC->identifiers()->requestIdentifier(scope, "obstacleTemplate", identifier, [this, os](si32 id) { logGlobal->info("Resolved obstacle id: %d", id); os->addObstacle(obstacleTemplates[id]); @@ -259,17 +252,24 @@ void ObstacleSetHandler::addTemplate(const std::string & scope, const std::strin { auto id = obstacleTemplates.size(); - auto strippedName = name; + auto strippedName = boost::algorithm::to_lower_copy(name); auto pos = strippedName.find(".def"); if(pos != std::string::npos) strippedName.erase(pos, 4); - // TODO: Consider converting to lowercase? - // Save by name - VLC->identifiersHandler->registerObject(scope, "obstacleTemplate", strippedName, id); + if (VLC->identifiersHandler->getIdentifier(scope, "obstacleTemplate", strippedName, true)) + { + logMod->warn("Duplicate obstacle template: %s", strippedName); + return; + } + else + { + // Save by name + VLC->identifiersHandler->registerObject(scope, "obstacleTemplate", strippedName, id); - // Index by id - obstacleTemplates[id] = tmpl; + // Index by id + obstacleTemplates[id] = tmpl; + } } void ObstacleSetHandler::addObstacleSet(std::shared_ptr os)