diff --git a/src/economy.cpp b/src/economy.cpp index 926a95eebb..7030ab81ba 100644 --- a/src/economy.cpp +++ b/src/economy.cpp @@ -1684,6 +1684,7 @@ static void LoadUnloadVehicle(Vehicle *front) bool pull_through_mode = false; bool load_unload_not_yet_in_station = false; + bool unload_payment_not_yet_in_station = false; if (front->type == VEH_TRAIN && front->cur_real_order_index < front->GetNumOrders()) { Order *order = front->GetOrder(front->cur_real_order_index); if (order->IsType(OT_GOTO_STATION) && order->GetDestination() == last_visited && @@ -1768,10 +1769,13 @@ static void LoadUnloadVehicle(Vehicle *front) u = u->GetNextArticulatedPart(); length += Train::From(u)->gcache.cached_veh_length; } - if (v != front && !HasBit(Train::From(v->Previous())->flags, VRF_BEYOND_PLATFORM_END) && length > platform_length_left) { + if (v != station_vehicle && !HasBit(Train::From(v->Previous())->flags, VRF_BEYOND_PLATFORM_END) && length > platform_length_left) { for (Vehicle *skip = v; skip != NULL; skip = skip->Next()) { SetBit(Train::From(skip)->flags, VRF_NOT_YET_IN_PLATFORM); - if (skip->cargo.ReservedCount() || skip->cargo.UnloadCount() || (skip->cargo_cap != 0 && front->current_order.IsRefit())) { + if (HasBit(skip->vehicle_flags, VF_CARGO_UNLOADING)) { + unload_payment_not_yet_in_station = true; + load_unload_not_yet_in_station = true; + } else if (skip->cargo.ReservedCount() || skip->cargo.UnloadCount() || (skip->cargo_cap != 0 && front->current_order.IsRefit())) { load_unload_not_yet_in_station = true; } } @@ -1849,6 +1853,9 @@ static void LoadUnloadVehicle(Vehicle *front) } continue; + } else if (HasBit(v->vehicle_flags, VF_CARGO_UNLOADING) && payment == nullptr) { + /* Once the payment has been made, never attempt to unload again */ + ClrBit(v->vehicle_flags, VF_CARGO_UNLOADING); } /* Do not pick up goods when we have no-load set or loading is stopped. */ @@ -1952,7 +1959,7 @@ static void LoadUnloadVehicle(Vehicle *front) /* Only set completely_emptied, if we just unloaded all remaining cargo */ completely_emptied &= anything_unloaded; - if (!anything_unloaded && !load_unload_not_yet_in_station) delete payment; + if (!anything_unloaded && !unload_payment_not_yet_in_station) delete payment; ClrBit(front->vehicle_flags, VF_STOP_LOADING);