|
@@ -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<CObjectVisitQuery>(this, obj, h, obj->visitablePos());
|
|
|
+ auto visitedObject = obj;
|
|
|
+
|
|
|
+ if(obj->ID == Obj::HERO)
|
|
|
+ {
|
|
|
+ auto visitedHero = static_cast<const CGHeroInstance *>(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<CObjectVisitQuery>(this, visitedObject, h, visitedObject->visitablePos());
|
|
|
queries.addQuery(visitQuery); //TODO real visit pos
|
|
|
|
|
|
HeroVisit hv;
|