Index: src/engine.cpp =================================================================== --- src/engine.cpp (revision 27816) +++ src/engine.cpp (working copy) @@ -1113,7 +1113,10 @@ /* Are there suffixes? * Note: This does not mean the suffixes are actually available for every consist at any time. */ - if (HasBit(ei->callback_mask, CBM_VEHICLE_CARGO_SUFFIX)) return true; + if (HasBit(ei->callback_mask, CBM_VEHICLE_CARGO_SUFFIX)) { + uint16 cb = GetVehicleCallback(CBID_VEHICLE_CARGO_SUFFIX, 0, 0, engine, NULL); + return cb != CALLBACK_FAILED; + } /* Is there any cargo except the default cargo? */ CargoID default_cargo = e->GetDefaultCargoType(); Index: src/vehicle_gui.cpp =================================================================== --- src/vehicle_gui.cpp (revision 27816) +++ src/vehicle_gui.cpp (working copy) @@ -2404,6 +2404,26 @@ DoCommandP(v->tile, v->index, 0, _vehicle_command_translation_table[VCT_CMD_START_STOP][v->type], texteffect ? CcStartStopVehicle : NULL); } +static bool IsVehiclePartRefittable(const Vehicle *v) +{ + const Engine *e = Engine::GetIfValid(v->engine_type); + + if (e == NULL) return false; + + if (!e->CanCarryCargo()) return false; + + const EngineInfo *ei = &e->info; + if (ei->refit_mask == 0) return false; + + if (HasBit(ei->callback_mask, CBM_VEHICLE_CARGO_SUFFIX)) { + uint16 cb = GetVehicleCallback(CBID_VEHICLE_CARGO_SUFFIX, 0, 0, v->engine_type, v); + return cb != CALLBACK_FAILED; + } + + CargoID default_cargo = e->GetDefaultCargoType(); + return default_cargo != CT_INVALID && ei->refit_mask != 1U << default_cargo; +} + /** Checks whether the vehicle may be refitted at the moment.*/ static bool IsVehicleRefitable(const Vehicle *v) { @@ -2410,7 +2430,7 @@ if (!v->IsStoppedInDepot()) return false; do { - if (IsEngineRefittable(v->engine_type)) return true; + if (IsVehiclePartRefittable(v)) return true; } while (v->IsGroundVehicle() && (v = v->Next()) != NULL); return false;