From 7cfd1fe0ca84a8065c26052842b46b22f8f4d632 Mon Sep 17 00:00:00 2001 From: Dmitry Orlov Date: Wed, 27 Oct 2021 01:37:45 +0300 Subject: [PATCH] Fix: Captured town should not be duplicated on the UI --- client/CPlayerInterface.cpp | 1 + server/CGameHandler.cpp | 21 ++++++++++++++++----- 2 files changed, 17 insertions(+), 5 deletions(-) diff --git a/client/CPlayerInterface.cpp b/client/CPlayerInterface.cpp index e9b051177..5c8b24654 100644 --- a/client/CPlayerInterface.cpp +++ b/client/CPlayerInterface.cpp @@ -1505,6 +1505,7 @@ void CPlayerInterface::objectPropertyChanged(const SetObjectProperty * sop) towns -= obj; adventureInt->townList.update(); + adventureInt->minimap.update(); } assert(cb->getTownsInfo().size() == towns.size()); } diff --git a/server/CGameHandler.cpp b/server/CGameHandler.cpp index 6b16ed859..87e76831a 100644 --- a/server/CGameHandler.cpp +++ b/server/CGameHandler.cpp @@ -887,12 +887,8 @@ void CGameHandler::endBattle(int3 tile, const CGHeroInstance * heroAttacker, con if(battleResult.data->winner != BattleSide::DEFENDER && heroDefender) //remove beaten Defender { - auto town = heroDefender->visitedTown; RemoveObject ro(heroDefender->id); sendAndApply(&ro); - - if(town && !town->garrisonHero) // TODO: that must be called from CGHeroInstance or CGTownInstance - town->battleFinished(heroAttacker, *battleResult.get()); } if(battleResult.data->winner == BattleSide::DEFENDER @@ -5341,7 +5337,22 @@ void CGameHandler::objectVisited(const CGObjectInstance * obj, const CGHeroInsta auto startVisit = [&](ObjectVisitStarted & event) { - visitQuery = std::make_shared(this, obj, h, obj->visitablePos()); + auto visitedObject = obj; + + if(obj->ID == Obj::HERO) + { + auto visitedHero = static_cast(obj); + const auto visitedTown = visitedHero->visitedTown; + + if(visitedTown) + { + const bool isEnemy = visitedHero->getOwner() != h->getOwner(); + + if(isEnemy && !visitedTown->isBattleOutsideTown(visitedHero)) + visitedObject = visitedTown; + } + } + visitQuery = std::make_shared(this, visitedObject, h, visitedObject->visitablePos()); queries.addQuery(visitQuery); //TODO real visit pos HeroVisit hv;