浏览代码

Fix broken bonuses due to calling PutArtifact before NewArtifact

Ivan Savenko 2 年之前
父节点
当前提交
79982c4ad4
共有 2 个文件被更改,包括 22 次插入9 次删除
  1. 3 0
      lib/NetPacksLib.cpp
  2. 19 9
      server/CGameHandler.cpp

+ 3 - 0
lib/NetPacksLib.cpp

@@ -1793,6 +1793,9 @@ void BulkSmartRebalanceStacks::applyGs(CGameState * gs)
 void PutArtifact::applyGs(CGameState *gs)
 {
 	assert(art->canBePutAt(al));
+	// Ensure that artifact has been correctly added via NewArtifact pack
+	assert(vstd::contains(gs->map->artInstances, art));
+	assert(!art->getParentNodes().empty());
 	art->putAt(al);
 	//al.hero->putArtifact(al.slot, art);
 }

+ 19 - 9
server/CGameHandler.cpp

@@ -6793,8 +6793,21 @@ void CGameHandler::putArtifact(const ArtifactLocation &al, const CArtifactInstan
 bool CGameHandler::giveHeroNewArtifact(const CGHeroInstance * h, const CArtifact * artType, ArtifactPosition pos)
 {
 	assert(artType);
-	if(pos != ArtifactPosition::FIRST_AVAILABLE && !ArtifactUtils::isSlotBackpack(pos))
+
+	if(pos == ArtifactPosition::FIRST_AVAILABLE)
+	{
+		if(!artType->canBePutAt(h, ArtifactUtils::getArtAnyPosition(h, artType->getId())))
+			COMPLAIN_RET("Cannot put artifact in that slot!");
+	}
+	else if(ArtifactUtils::isSlotBackpack(pos))
+	{
+		if(!artType->canBePutAt(h, ArtifactUtils::getArtBackpackPosition(h, artType->getId())))
+			COMPLAIN_RET("Cannot put artifact in that slot!");
+	}
+	else
+	{
 		COMPLAIN_RET_FALSE_IF(!artType->canBePutAt(h, pos, false), "Cannot put artifact in that slot!");
+	}
 
 	CArtifactInstance * newArtInst = nullptr;
 	if(artType->canBeDisassembled())
@@ -6803,18 +6816,15 @@ bool CGameHandler::giveHeroNewArtifact(const CGHeroInstance * h, const CArtifact
 		newArtInst = new CArtifactInstance();
 
 	newArtInst->artType = artType; // *NOT* via settype -> all bonus-related stuff must be done by NewArtifact apply
+
+	NewArtifact na;
+	na.art = newArtInst;
+	sendAndApply(&na); // -> updates a!!!, will create a on other machines
+
 	if(giveHeroArtifact(h, newArtInst, pos))
-	{
-		NewArtifact na;
-		na.art = newArtInst;
-		sendAndApply(&na); // -> updates a!!!, will create a on other machines
 		return true;
-	}
 	else
-	{
-		delete newArtInst;
 		return false;
-	}
 }
 
 void CGameHandler::setBattleResult(BattleResult::EResult resultType, int victoriusSide)