Selaa lähdekoodia

Add logging to trace crash

Ivan Savenko 1 vuosi sitten
vanhempi
sitoutus
6270c81c1a
2 muutettua tiedostoa jossa 17 lisäystä ja 8 poistoa
  1. 12 1
      CCallback.cpp
  2. 5 7
      client/Client.cpp

+ 12 - 1
CCallback.cpp

@@ -405,7 +405,10 @@ std::optional<BattleAction> CBattleCallback::makeSurrenderRetreatDecision(const
 
 std::shared_ptr<CPlayerBattleCallback> CBattleCallback::getBattle(const BattleID & battleID)
 {
-	return activeBattles.at(battleID);
+	if (activeBattles.count(battleID))
+		return activeBattles.at(battleID);
+
+	throw std::runtime_error("Failed to find battle " + std::to_string(battleID.getNum()) + " of player " + player->toString() + ". Number of ongoing battles: " + std::to_string(activeBattles.size()));
 }
 
 std::optional<PlayerColor> CBattleCallback::getPlayerID() const
@@ -415,10 +418,18 @@ std::optional<PlayerColor> CBattleCallback::getPlayerID() const
 
 void CBattleCallback::onBattleStarted(const IBattleInfo * info)
 {
+	if (activeBattles.count(info->getBattleID()) > 0)
+		throw std::runtime_error("Player " + player->toString() + " is already engaged in battle " + std::to_string(info->getBattleID().getNum()));
+
+	logGlobal->debug("Battle %d started for player %s", info->getBattleID(), player->toString());
 	activeBattles[info->getBattleID()] = std::make_shared<CPlayerBattleCallback>(info, *getPlayerID());
 }
 
 void CBattleCallback::onBattleEnded(const BattleID & battleID)
 {
+	if (activeBattles.count(battleID) == 0)
+		throw std::runtime_error("Player " + player->toString() + " is not engaged in battle " + std::to_string(battleID.getNum()));
+
+	logGlobal->debug("Battle %d ended for player %s", battleID, player->toString());
 	activeBattles.erase(battleID);
 }

+ 5 - 7
client/Client.cpp

@@ -560,18 +560,16 @@ int CClient::sendRequest(const CPackForServer * request, PlayerColor player)
 
 void CClient::battleStarted(const BattleInfo * info)
 {
+	std::shared_ptr<CPlayerInterface> att, def;
+	auto & leftSide = info->sides[0];
+	auto & rightSide = info->sides[1];
+
 	for(auto & battleCb : battleCallbacks)
 	{
-		if(vstd::contains_if(info->sides, [&](const SideInBattle& side) {return side.color == battleCb.first; })
-			|| !battleCb.first.isValidPlayer())
-		{
+		if(!battleCb.first.isValidPlayer() || battleCb.first == leftSide.color || battleCb.first == rightSide.color)
 			battleCb.second->onBattleStarted(info);
-		}
 	}
 
-	std::shared_ptr<CPlayerInterface> att, def;
-	auto & leftSide = info->sides[0], & rightSide = info->sides[1];
-
 	//If quick combat is not, do not prepare interfaces for battleint
 	auto callBattleStart = [&](PlayerColor color, ui8 side)
 	{