diff --git a/client/NetPacksClient.cpp b/client/NetPacksClient.cpp index 294b65dc6..1343ada13 100644 --- a/client/NetPacksClient.cpp +++ b/client/NetPacksClient.cpp @@ -229,21 +229,31 @@ void ApplyClientNetPackVisitor::visitSetStackType(SetStackType & pack) void ApplyClientNetPackVisitor::visitEraseStack(EraseStack & pack) { dispatchGarrisonChange(cl, pack.army, ObjectInstanceID()); + cl.invalidatePaths(); //it is possible to remove last non-native unit for current terrain and lose movement penalty } void ApplyClientNetPackVisitor::visitSwapStacks(SwapStacks & pack) { dispatchGarrisonChange(cl, pack.srcArmy, pack.dstArmy); + + if(pack.srcArmy != pack.dstArmy) + cl.invalidatePaths(); // adding/removing units may change terrain type penalty based on creature native terrains } void ApplyClientNetPackVisitor::visitInsertNewStack(InsertNewStack & pack) { dispatchGarrisonChange(cl, pack.army, ObjectInstanceID()); + + if(gs.getHero(pack.army)) + cl.invalidatePaths(); // adding/removing units may change terrain type penalty based on creature native terrains } void ApplyClientNetPackVisitor::visitRebalanceStacks(RebalanceStacks & pack) { dispatchGarrisonChange(cl, pack.srcArmy, pack.dstArmy); + + if(pack.srcArmy != pack.dstArmy) + cl.invalidatePaths(); // adding/removing units may change terrain type penalty based on creature native terrains } void ApplyClientNetPackVisitor::visitBulkRebalanceStacks(BulkRebalanceStacks & pack) @@ -254,6 +264,9 @@ void ApplyClientNetPackVisitor::visitBulkRebalanceStacks(BulkRebalanceStacks & p ? ObjectInstanceID() : pack.moves[0].dstArmy; dispatchGarrisonChange(cl, pack.moves[0].srcArmy, destArmy); + + if(pack.moves[0].srcArmy != destArmy) + cl.invalidatePaths(); // adding/removing units may change terrain type penalty based on creature native terrains } } diff --git a/lib/mapObjects/CGCreature.cpp b/lib/mapObjects/CGCreature.cpp index 40edde0ca..aaf0b3b8c 100644 --- a/lib/mapObjects/CGCreature.cpp +++ b/lib/mapObjects/CGCreature.cpp @@ -171,6 +171,7 @@ void CGCreature::onHeroVisit( const CGHeroInstance * h ) const //ask if player agrees to pay gold BlockingDialog ynd(true,false); ynd.player = h->tempOwner; + ynd.components.emplace_back(ComponentType::RESOURCE, GameResID(GameResID::GOLD), action); std::string tmp = VLC->generaltexth->advobtxt[90]; boost::algorithm::replace_first(tmp, "%d", std::to_string(getStackCount(SlotID(0)))); boost::algorithm::replace_first(tmp, "%d", std::to_string(action));