Kaynağa Gözat

seperate path for ai vs human

Laserlicht 1 yıl önce
ebeveyn
işleme
119fa1e96c

+ 13 - 2
server/queries/BattleQueries.cpp

@@ -23,6 +23,14 @@
 #include "../../lib/networkPacks/PacksForServer.h"
 #include "../../lib/serializer/Cast.h"
 
+void CBattleQuery::notifyObjectAboutRemoval(const CObjectVisitQuery & objectVisit) const
+{
+	assert(result);
+
+	if(result && !isAiVsHuman)
+		objectVisit.visitedObject->battleFinished(objectVisit.visitingHero, *result);
+}
+
 CBattleQuery::CBattleQuery(CGameHandler * owner, const IBattleInfo * bi):
 	CQuery(owner),
 	battleID(bi->getBattleID())
@@ -30,6 +38,8 @@ CBattleQuery::CBattleQuery(CGameHandler * owner, const IBattleInfo * bi):
 	belligerents[0] = bi->getSideArmy(0);
 	belligerents[1] = bi->getSideArmy(1);
 
+	isAiVsHuman = bi->getSidePlayer(1).isValidPlayer() && gh->getPlayerState(bi->getSidePlayer(0))->isHuman() != gh->getPlayerState(bi->getSidePlayer(1))->isHuman();
+
 	addPlayer(bi->getSidePlayer(0));
 	addPlayer(bi->getSidePlayer(1));
 }
@@ -100,10 +110,11 @@ void CBattleDialogQuery::onRemoval(PlayerColor color)
 	{
 		auto hero = bi->getSideHero(BattleSide::ATTACKER);
 		auto visitingObj = bi->getDefendedTown() ? bi->getDefendedTown() : gh->getVisitingObject(hero);
+		bool isAiVsHuman = bi->getSidePlayer(1).isValidPlayer() && gh->getPlayerState(bi->getSidePlayer(0))->isHuman() != gh->getPlayerState(bi->getSidePlayer(1))->isHuman();
 		
 		gh->battles->endBattleConfirm(bi->getBattleID());
-		
-		if(visitingObj)
+
+		if(visitingObj && result && isAiVsHuman)
 			visitingObj->battleFinished(hero, *result);
 	}
 }

+ 2 - 0
server/queries/BattleQueries.h

@@ -23,11 +23,13 @@ public:
 	std::array<const CArmedInstance *,2> belligerents;
 	std::array<int, 2> initialHeroMana;
 
+	bool isAiVsHuman;
 	BattleID battleID;
 	std::optional<BattleResult> result;
 
 	CBattleQuery(CGameHandler * owner);
 	CBattleQuery(CGameHandler * owner, const IBattleInfo * Bi); //TODO
+	void notifyObjectAboutRemoval(const CObjectVisitQuery &objectVisit) const override;
 	bool blocksPack(const CPack *pack) const override;
 	void onRemoval(PlayerColor color) override;
 	void onExposure(QueryPtr topQuery) override;