From e4e7a0f2f28348fa256d040381c8dc502ce48439 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Manuel=20V=C3=B6gele?= Date: Mon, 26 Oct 2020 21:36:09 +0100 Subject: [PATCH] Fix desync caused due to ghost tiles changing the ride mode --- src/openrct2/actions/TrackPlaceAction.hpp | 69 +++++++++++----------- src/openrct2/actions/TrackRemoveAction.hpp | 67 +++++++++++---------- 2 files changed, 71 insertions(+), 65 deletions(-) diff --git a/src/openrct2/actions/TrackPlaceAction.hpp b/src/openrct2/actions/TrackPlaceAction.hpp index 45be985524..ade152146d 100644 --- a/src/openrct2/actions/TrackPlaceAction.hpp +++ b/src/openrct2/actions/TrackPlaceAction.hpp @@ -546,43 +546,46 @@ public: cost += ((supportHeight / (2 * COORDS_Z_STEP)) * RideTypeDescriptors[ride->type].BuildCosts.SupportPrice) * 5; - invalidate_test_results(ride); - switch (_trackType) - { - case TrackElemType::OnRidePhoto: - ride->lifecycle_flags |= RIDE_LIFECYCLE_ON_RIDE_PHOTO; - break; - case TrackElemType::CableLiftHill: - if (trackBlock->index != 0) - break; - ride->lifecycle_flags |= RIDE_LIFECYCLE_CABLE_LIFT_HILL_COMPONENT_USED; - ride->CableLiftLoc = mapLoc; - break; - case TrackElemType::BlockBrakes: - ride->num_block_brakes++; - ride->window_invalidate_flags |= RIDE_INVALIDATE_RIDE_OPERATING; - - ride->mode = RideMode::ContinuousCircuitBlockSectioned; - if (ride->type == RIDE_TYPE_LIM_LAUNCHED_ROLLER_COASTER) - ride->mode = RideMode::PoweredLaunchBlockSectioned; - - break; - } - - if (trackBlock->index == 0) + if (!(GetFlags() & GAME_COMMAND_FLAG_GHOST)) { + invalidate_test_results(ride); switch (_trackType) { - case TrackElemType::Up25ToFlat: - case TrackElemType::Up60ToFlat: - case TrackElemType::DiagUp25ToFlat: - case TrackElemType::DiagUp60ToFlat: - if (!(_trackPlaceFlags & CONSTRUCTION_LIFT_HILL_SELECTED)) - break; - [[fallthrough]]; - case TrackElemType::CableLiftHill: - ride->num_block_brakes++; + case TrackElemType::OnRidePhoto: + ride->lifecycle_flags |= RIDE_LIFECYCLE_ON_RIDE_PHOTO; break; + case TrackElemType::CableLiftHill: + if (trackBlock->index != 0) + break; + ride->lifecycle_flags |= RIDE_LIFECYCLE_CABLE_LIFT_HILL_COMPONENT_USED; + ride->CableLiftLoc = mapLoc; + break; + case TrackElemType::BlockBrakes: + ride->num_block_brakes++; + ride->window_invalidate_flags |= RIDE_INVALIDATE_RIDE_OPERATING; + + ride->mode = RideMode::ContinuousCircuitBlockSectioned; + if (ride->type == RIDE_TYPE_LIM_LAUNCHED_ROLLER_COASTER) + ride->mode = RideMode::PoweredLaunchBlockSectioned; + + break; + } + + if (trackBlock->index == 0) + { + switch (_trackType) + { + case TrackElemType::Up25ToFlat: + case TrackElemType::Up60ToFlat: + case TrackElemType::DiagUp25ToFlat: + case TrackElemType::DiagUp60ToFlat: + if (!(_trackPlaceFlags & CONSTRUCTION_LIFT_HILL_SELECTED)) + break; + [[fallthrough]]; + case TrackElemType::CableLiftHill: + ride->num_block_brakes++; + break; + } } } diff --git a/src/openrct2/actions/TrackRemoveAction.hpp b/src/openrct2/actions/TrackRemoveAction.hpp index 859fd9ea8e..0c5eddf949 100644 --- a/src/openrct2/actions/TrackRemoveAction.hpp +++ b/src/openrct2/actions/TrackRemoveAction.hpp @@ -457,40 +457,43 @@ public: } } - switch (trackType) + if (!(GetFlags() & GAME_COMMAND_FLAG_GHOST)) { - case TrackElemType::OnRidePhoto: - ride->lifecycle_flags &= ~RIDE_LIFECYCLE_ON_RIDE_PHOTO; - break; - case TrackElemType::CableLiftHill: - ride->lifecycle_flags &= ~RIDE_LIFECYCLE_CABLE_LIFT_HILL_COMPONENT_USED; - break; - case TrackElemType::BlockBrakes: - ride->num_block_brakes--; - if (ride->num_block_brakes == 0) - { - ride->window_invalidate_flags |= RIDE_INVALIDATE_RIDE_OPERATING; - ride->mode = RideMode::ContinuousCircuit; - if (ride->type == RIDE_TYPE_LIM_LAUNCHED_ROLLER_COASTER) - { - ride->mode = RideMode::PoweredLaunch; - } - } - break; - } - - switch (trackType) - { - case TrackElemType::Up25ToFlat: - case TrackElemType::Up60ToFlat: - case TrackElemType::DiagUp25ToFlat: - case TrackElemType::DiagUp60ToFlat: - if (!isLiftHill) + switch (trackType) + { + case TrackElemType::OnRidePhoto: + ride->lifecycle_flags &= ~RIDE_LIFECYCLE_ON_RIDE_PHOTO; break; - [[fallthrough]]; - case TrackElemType::CableLiftHill: - ride->num_block_brakes--; - break; + case TrackElemType::CableLiftHill: + ride->lifecycle_flags &= ~RIDE_LIFECYCLE_CABLE_LIFT_HILL_COMPONENT_USED; + break; + case TrackElemType::BlockBrakes: + ride->num_block_brakes--; + if (ride->num_block_brakes == 0) + { + ride->window_invalidate_flags |= RIDE_INVALIDATE_RIDE_OPERATING; + ride->mode = RideMode::ContinuousCircuit; + if (ride->type == RIDE_TYPE_LIM_LAUNCHED_ROLLER_COASTER) + { + ride->mode = RideMode::PoweredLaunch; + } + } + break; + } + + switch (trackType) + { + case TrackElemType::Up25ToFlat: + case TrackElemType::Up60ToFlat: + case TrackElemType::DiagUp25ToFlat: + case TrackElemType::DiagUp60ToFlat: + if (!isLiftHill) + break; + [[fallthrough]]; + case TrackElemType::CableLiftHill: + ride->num_block_brakes--; + break; + } } money32 price = RideTypeDescriptors[ride->type].BuildCosts.TrackPrice;