mirror of https://github.com/OpenTTD/OpenTTD
(svn r22534) -Fix [FS#4631] (r21250): doing rescan_ai in a game with running AIs caused a crash
parent
b1812c9b02
commit
cf11a1e98e
|
@ -75,9 +75,9 @@ AIInfo *AIConfig::GetInfo() const
|
||||||
return this->info;
|
return this->info;
|
||||||
}
|
}
|
||||||
|
|
||||||
bool AIConfig::ResetInfo()
|
bool AIConfig::ResetInfo(bool force_exact_match)
|
||||||
{
|
{
|
||||||
this->info = AI::FindInfo(this->name, -1, false);
|
this->info = AI::FindInfo(this->name, force_exact_match ? this->version : -1, force_exact_match);
|
||||||
return this->info != NULL;
|
return this->info != NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -57,10 +57,12 @@ public:
|
||||||
/**
|
/**
|
||||||
* When ever the AI Scanner is reloaded, all infos become invalid. This
|
* When ever the AI Scanner is reloaded, all infos become invalid. This
|
||||||
* function tells AIConfig about this.
|
* function tells AIConfig about this.
|
||||||
|
* @param force_exact_match If true try to find the exact same version
|
||||||
|
* as specified. If false any version is ok.
|
||||||
* @return \c true if the reset was successful, \c false if the AI was no longer
|
* @return \c true if the reset was successful, \c false if the AI was no longer
|
||||||
* found.
|
* found.
|
||||||
*/
|
*/
|
||||||
bool ResetInfo();
|
bool ResetInfo(bool force_exact_match);
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Get the AIInfo linked to this AIConfig.
|
* Get the AIInfo linked to this AIConfig.
|
||||||
|
|
|
@ -170,13 +170,24 @@
|
||||||
* a random new AI on reload). */
|
* a random new AI on reload). */
|
||||||
for (CompanyID c = COMPANY_FIRST; c < MAX_COMPANIES; c++) {
|
for (CompanyID c = COMPANY_FIRST; c < MAX_COMPANIES; c++) {
|
||||||
if (_settings_game.ai_config[c] != NULL && _settings_game.ai_config[c]->HasAI()) {
|
if (_settings_game.ai_config[c] != NULL && _settings_game.ai_config[c]->HasAI()) {
|
||||||
if (!_settings_game.ai_config[c]->ResetInfo()) {
|
if (!_settings_game.ai_config[c]->ResetInfo(true)) {
|
||||||
DEBUG(ai, 0, "After a reload, the AI by the name '%s' was no longer found, and removed from the list.", _settings_game.ai_config[c]->GetName());
|
DEBUG(ai, 0, "After a reload, the AI by the name '%s' was no longer found, and removed from the list.", _settings_game.ai_config[c]->GetName());
|
||||||
_settings_game.ai_config[c]->ChangeAI(NULL);
|
_settings_game.ai_config[c]->ChangeAI(NULL);
|
||||||
|
if (Company::IsValidAiID(c)) {
|
||||||
|
/* The code belonging to an already running AI was deleted. We can only do
|
||||||
|
* one thing here to keep everything sane and that is kill the AI. After
|
||||||
|
* killing the offending AI we start a random other one in it's place, just
|
||||||
|
* like what would happen if the AI was missing during loading. */
|
||||||
|
AI::Stop(c);
|
||||||
|
AI::StartNew(c, false);
|
||||||
|
}
|
||||||
|
} else if (Company::IsValidAiID(c)) {
|
||||||
|
/* Update the reference in the Company struct. */
|
||||||
|
Company::Get(c)->ai_info = _settings_game.ai_config[c]->GetInfo();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
if (_settings_newgame.ai_config[c] != NULL && _settings_newgame.ai_config[c]->HasAI()) {
|
if (_settings_newgame.ai_config[c] != NULL && _settings_newgame.ai_config[c]->HasAI()) {
|
||||||
if (!_settings_newgame.ai_config[c]->ResetInfo()) {
|
if (!_settings_newgame.ai_config[c]->ResetInfo(false)) {
|
||||||
DEBUG(ai, 0, "After a reload, the AI by the name '%s' was no longer found, and removed from the list.", _settings_newgame.ai_config[c]->GetName());
|
DEBUG(ai, 0, "After a reload, the AI by the name '%s' was no longer found, and removed from the list.", _settings_newgame.ai_config[c]->GetName());
|
||||||
_settings_newgame.ai_config[c]->ChangeAI(NULL);
|
_settings_newgame.ai_config[c]->ChangeAI(NULL);
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in New Issue