From ca9a015984fa7c0c49ddb587635cd65b594c723a Mon Sep 17 00:00:00 2001 From: frosch Date: Fri, 23 Apr 2010 21:47:03 +0000 Subject: (svn r19701) -Fix [FS#3787]: Check for industry availability more thoroughly and cancel object placement when selecting not available industries. --- src/ai/api/ai_industrytype.cpp | 5 +++++ src/industry_cmd.cpp | 4 ++++ src/industry_gui.cpp | 6 ++++-- 3 files changed, 13 insertions(+), 2 deletions(-) diff --git a/src/ai/api/ai_industrytype.cpp b/src/ai/api/ai_industrytype.cpp index 993a88993..8973d7688 100644 --- a/src/ai/api/ai_industrytype.cpp +++ b/src/ai/api/ai_industrytype.cpp @@ -14,6 +14,7 @@ #include "../../command_type.h" #include "../../strings_func.h" #include "../../industry.h" +#include "../../newgrf_industries.h" #include "../../core/random_func.hpp" /* static */ bool AIIndustryType::IsValidIndustryType(IndustryType industry_type) @@ -88,6 +89,8 @@ /* static */ bool AIIndustryType::CanBuildIndustry(IndustryType industry_type) { if (!IsValidIndustryType(industry_type)) return false; + + if (!::CheckIfCallBackAllowsAvailability(industry_type, IACT_USERCREATION)) return false; if (!::GetIndustrySpec(industry_type)->IsRawIndustry()) return true; /* raw_industry_construction == 1 means "Build as other industries" */ @@ -97,7 +100,9 @@ /* static */ bool AIIndustryType::CanProspectIndustry(IndustryType industry_type) { if (!IsValidIndustryType(industry_type)) return false; + if (!::GetIndustrySpec(industry_type)->IsRawIndustry()) return false; + if (!::CheckIfCallBackAllowsAvailability(industry_type, IACT_USERCREATION)) return false; /* raw_industry_construction == 2 means "prospect" */ return _settings_game.construction.raw_industry_construction == 2; diff --git a/src/industry_cmd.cpp b/src/industry_cmd.cpp index 24d279170..35a5fe49c 100644 --- a/src/industry_cmd.cpp +++ b/src/industry_cmd.cpp @@ -1764,6 +1764,10 @@ CommandCost CmdBuildIndustry(TileIndex tile, DoCommandFlag flags, uint32 p1, uin return CMD_ERROR; } + if (_game_mode != GM_EDITOR && !CheckIfCallBackAllowsAvailability(it, IACT_USERCREATION)) { + return CMD_ERROR; + } + Industry *ind = NULL; if (_game_mode != GM_EDITOR && _settings_game.construction.raw_industry_construction == 2 && indspec->IsRawIndustry()) { if (flags & DC_EXEC) { diff --git a/src/industry_gui.cpp b/src/industry_gui.cpp index 9b8433059..d9fc30eb7 100644 --- a/src/industry_gui.cpp +++ b/src/industry_gui.cpp @@ -463,8 +463,10 @@ public: this->SetDirty(); - if ((_game_mode != GM_EDITOR && _settings_game.construction.raw_industry_construction == 2 && indsp != NULL && indsp->IsRawIndustry()) || - this->selected_type == INVALID_INDUSTRYTYPE) { + if (GetCallbackWnd() == this && + ((_game_mode != GM_EDITOR && _settings_game.construction.raw_industry_construction == 2 && indsp != NULL && indsp->IsRawIndustry()) || + this->selected_type == INVALID_INDUSTRYTYPE || + !this->enabled[this->selected_index])) { /* Reset the button state if going to prospecting or "build many industries" */ this->RaiseButtons(); ResetObjectToPlace(); -- cgit v1.2.3-54-g00ecf