1
0
mirror of https://github.com/vcmi/vcmi.git synced 2025-03-21 21:17:49 +02:00

Fix crash on replaced hero placeholder mouseover

This commit is contained in:
Andrii Danylchenko 2023-02-21 18:42:31 +02:00 committed by Andrii Danylchenko
parent 8c52cbcd00
commit 37baec1d24

View File

@ -1090,19 +1090,6 @@ void CGameState::placeCampaignHeroes()
logGlobal->debug("\tReplace placeholders with heroes");
replaceHeroesPlaceholders(campaignHeroReplacements);
// remove hero placeholders on map
for(auto obj : map->objects)
{
if(obj && obj->ID == Obj::HERO_PLACEHOLDER)
{
auto heroPlaceholder = dynamic_cast<CGHeroPlaceholder *>(obj.get());
map->removeBlockVisTiles(heroPlaceholder, true);
map->instanceNames.erase(obj->instanceName);
map->objects[heroPlaceholder->id.getNum()] = nullptr;
delete heroPlaceholder;
}
}
// now add removed heroes again with unused type ID
for(auto hero : removedHeroes)
{
@ -1135,6 +1122,19 @@ void CGameState::placeCampaignHeroes()
}
}
}
// remove hero placeholders on map
for(auto obj : map->objects)
{
if(obj && obj->ID == Obj::HERO_PLACEHOLDER)
{
auto heroPlaceholder = dynamic_cast<CGHeroPlaceholder *>(obj.get());
map->removeBlockVisTiles(heroPlaceholder, true);
map->instanceNames.erase(obj->instanceName);
map->objects[heroPlaceholder->id.getNum()] = nullptr;
delete heroPlaceholder;
}
}
}
void CGameState::placeStartingHero(PlayerColor playerColor, HeroTypeID heroTypeId, int3 townPos)
@ -2905,9 +2905,16 @@ void CGameState::replaceHeroesPlaceholders(const std::vector<CGameState::Campaig
for(auto &&i : heroToPlace->artifactsInBackpack)
fixArtifact(i.artifact);
map->removeBlockVisTiles(heroPlaceholder, true);
map->objects[heroPlaceholder->id.getNum()] = nullptr;
map->instanceNames.erase(heroPlaceholder->instanceName);
map->heroesOnMap.push_back(heroToPlace);
map->objects[heroToPlace->id.getNum()] = heroToPlace;
map->addBlockVisTiles(heroToPlace);
map->instanceNames[heroToPlace->instanceName] = heroToPlace;
delete heroPlaceholder;
scenarioOps->campState->getCurrentScenario().placedCrossoverHeroes.push_back(CCampaignState::crossoverSerialize(heroToPlace));
}