1
0
mirror of https://github.com/OpenRCT2/OpenRCT2 synced 2026-01-16 03:23:15 +01:00

Fix #25639: Scenery window crashes when a no longer present object is still selected

This commit is contained in:
Gymnasiast
2025-12-21 00:08:05 +01:00
parent 06874982c9
commit 7bdd1a4823
2 changed files with 59 additions and 24 deletions

View File

@@ -22,7 +22,8 @@
- Fix: [#25571] Potential crash due to drawing a Crooked House ride.
- Fix: [#25588] When the master server becomes unreachable the server would not register again until a restart.
- Fix: [#25592] Log flume, river rapids, & splash boats can get control failure breakdown instead of brakes failure.
- Fix: [#25628] Availability of AVX2 and SSE4.1 is not detected correctly.
- Fix: [#25628] Availability of AVX2 and SSE4.1 is not detected correctly.
- Fix: [#25639] Scenery window crashes when a no longer present object is still selected.
- Fix: [#25642] The selection marker for purchasing land rights is not drawn with the correct colours.
- Fix: [#25646] It is possible to remove scenery and paths when setting staff patrol areas and purchasing land.

View File

@@ -590,23 +590,39 @@ namespace OpenRCT2::Ui::Windows
}
else if (tabSelectedScenery.SceneryType == SCENERY_TYPE_LARGE)
{
gCurrentToolId = static_cast<Tool>(
ObjectManager::GetObjectEntry<LargeSceneryEntry>(tabSelectedScenery.EntryIndex)->tool_id);
const auto* sceneryEntry = ObjectManager::GetObjectEntry<LargeSceneryEntry>(
tabSelectedScenery.EntryIndex);
if (sceneryEntry != nullptr)
{
gCurrentToolId = static_cast<Tool>(sceneryEntry->tool_id);
}
}
else if (tabSelectedScenery.SceneryType == SCENERY_TYPE_WALL)
{
gCurrentToolId = static_cast<Tool>(
ObjectManager::GetObjectEntry<WallSceneryEntry>(tabSelectedScenery.EntryIndex)->tool_id);
const auto* sceneryEntry = ObjectManager::GetObjectEntry<WallSceneryEntry>(
tabSelectedScenery.EntryIndex);
if (sceneryEntry != nullptr)
{
gCurrentToolId = static_cast<Tool>(sceneryEntry->tool_id);
}
}
else if (tabSelectedScenery.SceneryType == SCENERY_TYPE_PATH_ITEM)
{
gCurrentToolId = static_cast<Tool>(
ObjectManager::GetObjectEntry<PathAdditionEntry>(tabSelectedScenery.EntryIndex)->tool_id);
const auto* sceneryEntry = ObjectManager::GetObjectEntry<PathAdditionEntry>(
tabSelectedScenery.EntryIndex);
if (sceneryEntry != nullptr)
{
gCurrentToolId = static_cast<Tool>(sceneryEntry->tool_id);
}
}
else
{ // small scenery
gCurrentToolId = static_cast<Tool>(
ObjectManager::GetObjectEntry<SmallSceneryEntry>(tabSelectedScenery.EntryIndex)->tool_id);
else if (tabSelectedScenery.SceneryType == SCENERY_TYPE_SMALL)
{
const auto* sceneryEntry = ObjectManager::GetObjectEntry<SmallSceneryEntry>(
tabSelectedScenery.EntryIndex);
if (sceneryEntry != nullptr)
{
gCurrentToolId = static_cast<Tool>(sceneryEntry->tool_id);
}
}
}
else
@@ -712,7 +728,7 @@ namespace OpenRCT2::Ui::Windows
widgets[WIDX_SCENERY_BUILD_CLUSTER_BUTTON].type = WidgetType::flatBtn;
auto* sceneryEntry = ObjectManager::GetObjectEntry<SmallSceneryEntry>(tabSelectedScenery.EntryIndex);
if (sceneryEntry->HasFlag(SMALL_SCENERY_FLAG_ROTATABLE))
if (sceneryEntry != nullptr && sceneryEntry->HasFlag(SMALL_SCENERY_FLAG_ROTATABLE))
{
widgets[WIDX_SCENERY_ROTATE_OBJECTS_BUTTON].type = WidgetType::flatBtn;
}
@@ -751,7 +767,7 @@ namespace OpenRCT2::Ui::Windows
if (tabSelectedScenery.SceneryType == SCENERY_TYPE_BANNER)
{
auto* bannerEntry = ObjectManager::GetObjectEntry<BannerSceneryEntry>(tabSelectedScenery.EntryIndex);
if (bannerEntry->flags & BANNER_ENTRY_FLAG_HAS_PRIMARY_COLOUR)
if (bannerEntry != nullptr && bannerEntry->flags & BANNER_ENTRY_FLAG_HAS_PRIMARY_COLOUR)
{
widgets[WIDX_SCENERY_PRIMARY_COLOUR_BUTTON].type = WidgetType::colourBtn;
}
@@ -759,20 +775,22 @@ namespace OpenRCT2::Ui::Windows
else if (tabSelectedScenery.SceneryType == SCENERY_TYPE_LARGE)
{
auto* sceneryEntry = ObjectManager::GetObjectEntry<LargeSceneryEntry>(tabSelectedScenery.EntryIndex);
if (sceneryEntry->flags & LARGE_SCENERY_FLAG_HAS_PRIMARY_COLOUR
&& !(sceneryEntry->flags & LARGE_SCENERY_FLAG_HIDE_PRIMARY_REMAP_BUTTON))
widgets[WIDX_SCENERY_PRIMARY_COLOUR_BUTTON].type = WidgetType::colourBtn;
if (sceneryEntry->flags & LARGE_SCENERY_FLAG_HAS_SECONDARY_COLOUR
&& !(sceneryEntry->flags & LARGE_SCENERY_FLAG_HIDE_SECONDARY_REMAP_BUTTON))
widgets[WIDX_SCENERY_SECONDARY_COLOUR_BUTTON].type = WidgetType::colourBtn;
if (sceneryEntry->flags & LARGE_SCENERY_FLAG_HAS_TERTIARY_COLOUR)
widgets[WIDX_SCENERY_TERTIARY_COLOUR_BUTTON].type = WidgetType::colourBtn;
if (sceneryEntry != nullptr)
{
if (sceneryEntry->flags & LARGE_SCENERY_FLAG_HAS_PRIMARY_COLOUR
&& !(sceneryEntry->flags & LARGE_SCENERY_FLAG_HIDE_PRIMARY_REMAP_BUTTON))
widgets[WIDX_SCENERY_PRIMARY_COLOUR_BUTTON].type = WidgetType::colourBtn;
if (sceneryEntry->flags & LARGE_SCENERY_FLAG_HAS_SECONDARY_COLOUR
&& !(sceneryEntry->flags & LARGE_SCENERY_FLAG_HIDE_SECONDARY_REMAP_BUTTON))
widgets[WIDX_SCENERY_SECONDARY_COLOUR_BUTTON].type = WidgetType::colourBtn;
if (sceneryEntry->flags & LARGE_SCENERY_FLAG_HAS_TERTIARY_COLOUR)
widgets[WIDX_SCENERY_TERTIARY_COLOUR_BUTTON].type = WidgetType::colourBtn;
}
}
else if (tabSelectedScenery.SceneryType == SCENERY_TYPE_WALL)
{
auto* wallEntry = ObjectManager::GetObjectEntry<WallSceneryEntry>(tabSelectedScenery.EntryIndex);
if (wallEntry->flags & (WALL_SCENERY_HAS_PRIMARY_COLOUR | WALL_SCENERY_HAS_GLASS))
if (wallEntry != nullptr && wallEntry->flags & (WALL_SCENERY_HAS_PRIMARY_COLOUR | WALL_SCENERY_HAS_GLASS))
{
widgets[WIDX_SCENERY_PRIMARY_COLOUR_BUTTON].type = WidgetType::colourBtn;
@@ -791,7 +809,8 @@ namespace OpenRCT2::Ui::Windows
{
auto* sceneryEntry = ObjectManager::GetObjectEntry<SmallSceneryEntry>(tabSelectedScenery.EntryIndex);
if (sceneryEntry->HasFlag(SMALL_SCENERY_FLAG_HAS_PRIMARY_COLOUR | SMALL_SCENERY_FLAG_HAS_GLASS))
if (sceneryEntry != nullptr
&& sceneryEntry->HasFlag(SMALL_SCENERY_FLAG_HAS_PRIMARY_COLOUR | SMALL_SCENERY_FLAG_HAS_GLASS))
{
widgets[WIDX_SCENERY_PRIMARY_COLOUR_BUTTON].type = WidgetType::colourBtn;
@@ -1573,6 +1592,9 @@ namespace OpenRCT2::Ui::Windows
if (scenerySelection.SceneryType == SCENERY_TYPE_BANNER)
{
auto bannerEntry = ObjectManager::GetObjectEntry<BannerSceneryEntry>(scenerySelection.EntryIndex);
if (bannerEntry == nullptr)
return;
auto imageId = ImageId(bannerEntry->image + gWindowSceneryRotation * 2, _sceneryPrimaryColour);
GfxDrawSprite(rt, imageId, { 33, 40 });
GfxDrawSprite(rt, imageId.WithIndexOffset(1), { 33, 40 });
@@ -1580,6 +1602,9 @@ namespace OpenRCT2::Ui::Windows
else if (scenerySelection.SceneryType == SCENERY_TYPE_LARGE)
{
auto sceneryEntry = ObjectManager::GetObjectEntry<LargeSceneryEntry>(scenerySelection.EntryIndex);
if (sceneryEntry == nullptr)
return;
auto imageId = ImageId(sceneryEntry->image + gWindowSceneryRotation);
if (sceneryEntry->flags & LARGE_SCENERY_FLAG_HAS_PRIMARY_COLOUR)
imageId = imageId.WithPrimary(_sceneryPrimaryColour);
@@ -1592,6 +1617,9 @@ namespace OpenRCT2::Ui::Windows
else if (scenerySelection.SceneryType == SCENERY_TYPE_WALL)
{
auto wallEntry = ObjectManager::GetObjectEntry<WallSceneryEntry>(scenerySelection.EntryIndex);
if (wallEntry == nullptr)
return;
auto imageId = ImageId(wallEntry->image);
auto spriteTop = (wallEntry->height * 2) + 0x32;
if (wallEntry->flags & WALL_SCENERY_HAS_GLASS)
@@ -1628,12 +1656,18 @@ namespace OpenRCT2::Ui::Windows
else if (scenerySelection.SceneryType == SCENERY_TYPE_PATH_ITEM)
{
auto* pathAdditionEntry = ObjectManager::GetObjectEntry<PathAdditionEntry>(scenerySelection.EntryIndex);
if (pathAdditionEntry == nullptr)
return;
auto imageId = ImageId(pathAdditionEntry->image);
GfxDrawSprite(rt, imageId, { 11, 16 });
}
else
{
auto sceneryEntry = ObjectManager::GetObjectEntry<SmallSceneryEntry>(scenerySelection.EntryIndex);
if (sceneryEntry == nullptr)
return;
auto imageId = ImageId(sceneryEntry->image + gWindowSceneryRotation);
if (sceneryEntry->HasFlag(SMALL_SCENERY_FLAG_HAS_PRIMARY_COLOUR))
{