- found a rare case where cancelling an upgrade with multiple upgrades happening and a unit dies causes a crash
This commit is contained in:
parent
762a612e33
commit
0a0ee9113c
|
@ -84,8 +84,24 @@ void UpgradeManager::startUpgrade(const UpgradeType *upgradeType, int factionInd
|
||||||
void UpgradeManager::cancelUpgrade(const UpgradeType *upgradeType) {
|
void UpgradeManager::cancelUpgrade(const UpgradeType *upgradeType) {
|
||||||
map<const UpgradeType *,int>::iterator iterFind = upgradesLookup.find(upgradeType);
|
map<const UpgradeType *,int>::iterator iterFind = upgradesLookup.find(upgradeType);
|
||||||
if(iterFind != upgradesLookup.end()) {
|
if(iterFind != upgradesLookup.end()) {
|
||||||
upgrades.erase(upgrades.begin() + iterFind->second);
|
if(iterFind->second >= upgrades.size()) {
|
||||||
|
char szBuf[1024]="";
|
||||||
|
sprintf(szBuf,"Error canceling upgrade, iterFind->second >= upgrades.size() - [%d] : [%d]",iterFind->second,(int)upgrades.size());
|
||||||
|
throw runtime_error("Error canceling upgrade, upgrade not found in upgrade manager");
|
||||||
|
}
|
||||||
|
int eraseIndex = iterFind->second;
|
||||||
|
upgrades.erase(upgrades.begin() + eraseIndex);
|
||||||
upgradesLookup.erase(upgradeType);
|
upgradesLookup.erase(upgradeType);
|
||||||
|
|
||||||
|
for(map<const UpgradeType *,int>::iterator iterMap = upgradesLookup.begin();
|
||||||
|
iterMap != upgradesLookup.end(); iterMap++) {
|
||||||
|
if(iterMap->second >= upgrades.size()) {
|
||||||
|
iterMap->second--;
|
||||||
|
}
|
||||||
|
if(iterMap->second < 0) {
|
||||||
|
upgradesLookup.erase(iterMap->first);
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
throw runtime_error("Error canceling upgrade, upgrade not found in upgrade manager");
|
throw runtime_error("Error canceling upgrade, upgrade not found in upgrade manager");
|
||||||
|
|
Loading…
Reference in New Issue
Block a user