diff --git a/src/openrct2-ui/input/Input.cpp b/src/openrct2-ui/input/Input.cpp index 4073dc056c..2445ebd27a 100644 --- a/src/openrct2-ui/input/Input.cpp +++ b/src/openrct2-ui/input/Input.cpp @@ -169,7 +169,11 @@ void input_handle_keyboard(bool isTitle) } } - if (!(gInputPlaceObjectModifier & (PLACE_OBJECT_MODIFIER_COPY_Z | PLACE_OBJECT_MODIFIER_SHIFT_Z))) + if (gInputPlaceObjectModifier & (PLACE_OBJECT_MODIFIER_COPY_Z | PLACE_OBJECT_MODIFIER_SHIFT_Z)) + { + map_enable_virtual_floor(); + } + else { map_remove_virtual_floor(); } diff --git a/src/openrct2/world/Map.cpp b/src/openrct2/world/Map.cpp index c21d4a9432..409319c8ae 100644 --- a/src/openrct2/world/Map.cpp +++ b/src/openrct2/world/Map.cpp @@ -88,6 +88,7 @@ uint8 gMapSelectArrowDirection; uint16 gMapVirtualFloorBaseSize = 5*32; uint16 gMapVirtualFloorHeight; +bool gMapVirtualFloorVisible = false; uint8 gMapGroundFlags; @@ -4737,7 +4738,7 @@ uint8 tile_element_get_ride_index(const rct_tile_element * tileElement) void map_set_virtual_floor_height(sint16 height) { - if (!input_test_place_object_modifier(PLACE_OBJECT_MODIFIER_COPY_Z | PLACE_OBJECT_MODIFIER_SHIFT_Z)) + if (!gMapVirtualFloorVisible) { // If the modifiers are not set we do not actually care as the floor is invisible. return; @@ -4750,19 +4751,29 @@ void map_set_virtual_floor_height(sint16 height) } } +void map_enable_virtual_floor() +{ + gMapVirtualFloorVisible = true; +} + void map_remove_virtual_floor() { - if (gMapVirtualFloorHeight != 0) + if (!gMapVirtualFloorVisible) { - gVirtualFloorLastLocation.z = -1; - map_invalidate_virtual_floor_tiles(); - gMapVirtualFloorHeight = 0; + return; } + + // Force invalidation, even if the position hasn't changed. + gVirtualFloorLastLocation.z = -1; + map_invalidate_virtual_floor_tiles(); + + gMapVirtualFloorHeight = 0; + gMapVirtualFloorVisible = false; } void map_invalidate_virtual_floor_tiles() { - if (gMapVirtualFloorHeight == 0) + if (!gMapVirtualFloorVisible) { return; } @@ -4811,7 +4822,7 @@ void map_invalidate_virtual_floor_tiles() bool map_tile_is_part_of_virtual_floor(sint16 x, sint16 y) { - if (gMapVirtualFloorHeight == 0) + if (!gMapVirtualFloorVisible) { return false; } diff --git a/src/openrct2/world/Map.h b/src/openrct2/world/Map.h index 7c156e903e..7869383c2b 100644 --- a/src/openrct2/world/Map.h +++ b/src/openrct2/world/Map.h @@ -385,6 +385,7 @@ extern uint8 gMapSelectArrowDirection; extern uint16 gMapVirtualFloorHeight; extern uint16 gMapVirtualFloorBaseSize; +extern bool gMapVirtualFloorVisible; extern uint8 gMapGroundFlags; @@ -460,6 +461,7 @@ bool map_check_free_elements_and_reorganise(sint32 num_elements); rct_tile_element *tile_element_insert(sint32 x, sint32 y, sint32 z, sint32 flags); bool tile_element_check_address(const rct_tile_element * const element); void map_set_virtual_floor_height(sint16 height); +void map_enable_virtual_floor(); void map_remove_virtual_floor(); void map_invalidate_virtual_floor_tiles(); bool map_tile_is_part_of_virtual_floor(sint16 x, sint16 y);