Browse Source

NKAI: a few crash/hang fixes

Andrii Danylchenko 3 năm trước cách đây
mục cha
commit
233b850daf

+ 4 - 0
AI/Nullkiller/AIGateway.cpp

@@ -774,8 +774,10 @@ void AIGateway::makeTurn()
 		retrieveVisitableObjs();
 	}
 
+#if NKAI_TRACE_LEVEL == 0
 	try
 	{
+#endif
 		nullkiller->makeTurn();
 
 		//for debug purpose
@@ -784,6 +786,7 @@ void AIGateway::makeTurn()
 			if (h->movement)
 				logAi->warn("Hero %s has %d MP left", h->name, h->movement);
 		}
+#if NKAI_TRACE_LEVEL == 0
 	}
 	catch (boost::thread_interrupted & e)
 	{
@@ -795,6 +798,7 @@ void AIGateway::makeTurn()
 	{
 		logAi->debug("Making turn thread has caught an exception: %s", e.what());
 	}
+#endif
 
 	endTurn();
 }

+ 1 - 1
AI/Nullkiller/Engine/Nullkiller.cpp

@@ -307,7 +307,7 @@ void Nullkiller::executeTask(Goals::TTask task)
 	{
 		logAi->trace("Task %s completed", task->toString());
 	}
-	catch(std::exception & e)
+	catch(cannotFulfillGoalException & e)
 	{
 		logAi->debug("Failed to realize subgoal of type %s, I will stop.", taskDescr);
 		logAi->debug("The error message was: %s", e.what());

+ 1 - 1
AI/Nullkiller/Pathfinding/AINodeStorage.cpp

@@ -1086,7 +1086,7 @@ void AINodeStorage::calculateTownPortal(
 		for(const CGTownInstance * targetTown : towns)
 		{
 			// TODO: allow to hide visiting hero in garrison
-			if(targetTown->visitingHero)
+			if(targetTown->visitingHero && maskMap.find(targetTown->visitingHero.get()) != maskMap.end())
 			{
 				auto basicMask = maskMap.at(targetTown->visitingHero.get());
 				bool heroIsInChain = (actor->chainMask & basicMask) != 0;

+ 1 - 1
lib/CPathfinder.cpp

@@ -339,7 +339,7 @@ void CPathfinder::calculatePaths()
 		auto hlp = config->getOrCreatePathfinderHelper(source, gs);
 
 		if(hlp->isHeroPatrolLocked())
-			break;
+			continue;
 
 		pq.push(initialNode);
 	}