diff --git a/src/tracerestrict.cpp b/src/tracerestrict.cpp index bbd7b0f2ec..259d599ac9 100644 --- a/src/tracerestrict.cpp +++ b/src/tracerestrict.cpp @@ -1497,8 +1497,11 @@ void TraceRestrictSlot::DeIndex(VehicleID id) auto range = slot_vehicle_index.equal_range(id); for (auto it = range.first; it != range.second; ++it) { if (it->second == this->index) { + bool is_first_in_range = (it == range.first); + auto next = slot_vehicle_index.erase(it); - if (it == range.first && next == range.second) { + + if (is_first_in_range && next == range.second) { /* Only one item, which we've just erased, clear the vehicle flag */ ClrBit(Train::Get(id)->flags, VRF_HAVE_SLOT); } diff --git a/src/tracerestrict_gui.cpp b/src/tracerestrict_gui.cpp index 6f2d322f23..fb4421edf3 100644 --- a/src/tracerestrict_gui.cpp +++ b/src/tracerestrict_gui.cpp @@ -2995,6 +2995,7 @@ public: case WID_TRSL_ALL_VEHICLES: // All vehicles button if (this->vli.index != ALL_TRAINS_TRACE_RESTRICT_SLOT_ID) { this->vli.index = ALL_TRAINS_TRACE_RESTRICT_SLOT_ID; + this->slot_sel = INVALID_TRACE_RESTRICT_SLOT_ID; this->vehicles.ForceRebuild(); this->SetDirty(); } @@ -3053,12 +3054,14 @@ public: { switch (widget) { case WID_TRSL_ALL_VEHICLES: // All vehicles - DoCommandP(0, this->slot_sel, this->vehicle_sel, CMD_REMOVE_VEHICLE_TRACERESTRICT_SLOT | CMD_MSG(STR_TRACE_RESTRICT_ERROR_SLOT_CAN_T_REMOVE_VEHICLE)); + if (this->slot_sel != INVALID_TRACE_RESTRICT_SLOT_ID) { + DoCommandP(0, this->slot_sel, this->vehicle_sel, CMD_REMOVE_VEHICLE_TRACERESTRICT_SLOT | CMD_MSG(STR_TRACE_RESTRICT_ERROR_SLOT_CAN_T_REMOVE_VEHICLE)); - this->vehicle_sel = INVALID_VEHICLE; - this->slot_over = INVALID_GROUP; + this->vehicle_sel = INVALID_VEHICLE; + this->slot_over = INVALID_GROUP; - this->SetDirty(); + this->SetDirty(); + } break; case WID_TRSL_LIST_SLOTS: { // Matrix slot