فهرست منبع

Merge pull request #6148 from MichalZr6/fix_remove_artifacts

Minor fixes for artifact removal during map load and handling null map objects
Ivan Savenko 2 هفته پیش
والد
کامیت
85a9a62cd4
5فایلهای تغییر یافته به همراه13 افزوده شده و 4 حذف شده
  1. 1 2
      lib/mapping/MapFormatH3M.cpp
  2. 3 0
      mapeditor/mainwindow.cpp
  3. 2 0
      mapeditor/mapcontroller.cpp
  4. 5 2
      mapeditor/mapsettings/translations.cpp
  5. 2 0
      mapeditor/validator.cpp

+ 1 - 2
lib/mapping/MapFormatH3M.cpp

@@ -925,8 +925,7 @@ void CMapLoaderH3M::loadArtifactsOfHero(CGHeroInstance * hero)
 		logGlobal->debug("Hero %d at %s has set artifacts twice (in map properties and on adventure map instance). Using the latter set...", hero->getHeroTypeID().getNum(), hero->anchorPos().toString());
 
 		hero->artifactsInBackpack.clear();
-		while(!hero->artifactsWorn.empty())
-			hero->removeArtifact(hero->artifactsWorn.begin()->first);
+		hero->artifactsWorn.clear();
 	}
 
 	for(int i = 0; i < features.artifactSlotsCount; i++)

+ 3 - 0
mapeditor/mainwindow.cpp

@@ -618,6 +618,9 @@ void MainWindow::saveMap()
 
 	for(auto obj : controller.map()->objects)
 	{
+		if(!obj)
+			continue;
+
 		if(obj->ID == Obj::HERO_PLACEHOLDER)
 		{
 			auto hero = dynamic_cast<CGHeroPlaceholder *>(obj.get());

+ 2 - 0
mapeditor/mapcontroller.cpp

@@ -746,6 +746,8 @@ ModCompatibilityInfo MapController::modAssessmentMap(const CMap & map)
 
 	for(auto obj : map.objects)
 	{
+		if(!obj)
+			continue;
 		modAssessmentObject(obj.get(), result);
 	}
 	return result;

+ 5 - 2
mapeditor/mapsettings/translations.cpp

@@ -20,8 +20,11 @@ void Translations::cleanupRemovedItems(CMap & map)
 {
 	std::set<std::string> existingObjects{"map", "header"};
 	for(auto object : map.objects)
-		existingObjects.insert(object->instanceName);
-	
+	{
+		if(object)
+			existingObjects.insert(object->instanceName);
+	}
+
 	for(auto & translations : map.translations.Struct())
 	{
 		JsonNode updateTranslations;

+ 2 - 0
mapeditor/validator.cpp

@@ -79,6 +79,8 @@ std::set<Validator::Issue> Validator::validate(const CMap * map)
 		//checking all objects in the map
 		for(auto o : map->objects)
 		{
+			if(!o)
+				continue;
 			//owners for objects
 			if(o->getOwner() == PlayerColor::UNFLAGGABLE)
 			{