mirror of
https://github.com/OpenRCT2/OpenRCT2
synced 2026-01-15 11:03:00 +01:00
Prevent use of Context during ~Context
This commit is contained in:
@@ -48,7 +48,7 @@ public:
|
||||
_loadedObjects.resize(OBJECT_ENTRY_COUNT);
|
||||
|
||||
UpdateSceneryGroupIndexes();
|
||||
reset_type_to_ride_entry_index_map();
|
||||
ResetTypeToRideEntryIndexMap();
|
||||
}
|
||||
|
||||
~ObjectManager() override
|
||||
@@ -134,7 +134,7 @@ public:
|
||||
}
|
||||
_loadedObjects[slot] = loadedObject;
|
||||
UpdateSceneryGroupIndexes();
|
||||
reset_type_to_ride_entry_index_map();
|
||||
ResetTypeToRideEntryIndexMap();
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -165,7 +165,7 @@ public:
|
||||
{
|
||||
SetNewLoadedObjectList(std::get<1>(loadedObjects));
|
||||
UpdateSceneryGroupIndexes();
|
||||
reset_type_to_ride_entry_index_map();
|
||||
ResetTypeToRideEntryIndexMap();
|
||||
log_verbose("%u / %u new objects loaded", numNewLoadedObjects, requiredObjects.size());
|
||||
return true;
|
||||
}
|
||||
@@ -196,7 +196,7 @@ public:
|
||||
if (numObjectsUnloaded > 0)
|
||||
{
|
||||
UpdateSceneryGroupIndexes();
|
||||
reset_type_to_ride_entry_index_map();
|
||||
ResetTypeToRideEntryIndexMap();
|
||||
}
|
||||
}
|
||||
|
||||
@@ -207,7 +207,7 @@ public:
|
||||
UnloadObject(object);
|
||||
}
|
||||
UpdateSceneryGroupIndexes();
|
||||
reset_type_to_ride_entry_index_map();
|
||||
ResetTypeToRideEntryIndexMap();
|
||||
}
|
||||
|
||||
void ResetObjects() override
|
||||
@@ -221,7 +221,7 @@ public:
|
||||
}
|
||||
}
|
||||
UpdateSceneryGroupIndexes();
|
||||
reset_type_to_ride_entry_index_map();
|
||||
ResetTypeToRideEntryIndexMap();
|
||||
}
|
||||
|
||||
std::vector<const ObjectRepositoryItem *> GetPackableObjects() override
|
||||
@@ -546,6 +546,11 @@ private:
|
||||
return loadedObject;
|
||||
}
|
||||
|
||||
void ResetTypeToRideEntryIndexMap()
|
||||
{
|
||||
reset_type_to_ride_entry_index_map(*this);
|
||||
}
|
||||
|
||||
static void ReportMissingObject(const rct_object_entry * entry)
|
||||
{
|
||||
utf8 objName[DAT_NAME_LENGTH + 1] = { 0 };
|
||||
|
||||
@@ -283,23 +283,27 @@ rct_ride_entry * get_ride_entry_by_ride(Ride *ride)
|
||||
*
|
||||
* rct2: 0x006DED68
|
||||
*/
|
||||
void reset_type_to_ride_entry_index_map()
|
||||
void reset_type_to_ride_entry_index_map(IObjectManager& objectManager)
|
||||
{
|
||||
size_t stride = MAX_RIDE_OBJECTS + 1;
|
||||
uint8 * entryTypeTable = (uint8 *)malloc(RIDE_TYPE_COUNT * stride);
|
||||
memset(entryTypeTable, 0xFF, RIDE_TYPE_COUNT * stride);
|
||||
|
||||
for (uint8 i = 0; i < MAX_RIDE_OBJECTS; i++) {
|
||||
rct_ride_entry * rideEntry = get_ride_entry(i);
|
||||
if (rideEntry == nullptr) {
|
||||
continue;
|
||||
}
|
||||
for (uint8 j = 0; j < MAX_RIDE_TYPES_PER_RIDE_ENTRY; j++) {
|
||||
uint8 rideType = rideEntry->ride_type[j];
|
||||
if (rideType < RIDE_TYPE_COUNT) {
|
||||
uint8 * entryArray = &entryTypeTable[rideType * stride];
|
||||
uint8 * nextEntry = (uint8 *)memchr(entryArray, 0xFF, stride);
|
||||
*nextEntry = i;
|
||||
|
||||
auto obj = objectManager.GetLoadedObject(OBJECT_TYPE_RIDE, i);
|
||||
if (obj != nullptr)
|
||||
{
|
||||
for (uint8 j = 0; j < MAX_RIDE_TYPES_PER_RIDE_ENTRY; j++)
|
||||
{
|
||||
auto rideEntry = (rct_ride_entry *)obj->GetLegacyData();
|
||||
uint8 rideType = rideEntry->ride_type[j];
|
||||
if (rideType < RIDE_TYPE_COUNT)
|
||||
{
|
||||
uint8 * entryArray = &entryTypeTable[rideType * stride];
|
||||
uint8 * nextEntry = (uint8 *)memchr(entryArray, 0xFF, stride);
|
||||
*nextEntry = i;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -25,6 +25,8 @@
|
||||
#include "RideRatings.h"
|
||||
#include "Vehicle.h"
|
||||
|
||||
interface IObjectManager;
|
||||
|
||||
#define MAX_RIDE_TYPES_PER_RIDE_ENTRY 3
|
||||
// The max number of different types of vehicle.
|
||||
// Examples of vehicles here are the locomotive, tender and carriage of the Miniature Railway.
|
||||
@@ -1038,7 +1040,7 @@ sint32 ride_get_unused_preset_vehicle_colour(uint8 ride_sub_type);
|
||||
void ride_set_vehicle_colours_to_random_preset(Ride *ride, uint8 preset_index);
|
||||
rct_ride_entry *get_ride_entry_by_ride(Ride *ride);
|
||||
uint8 *get_ride_entry_indices_for_ride_type(uint8 rideType);
|
||||
void reset_type_to_ride_entry_index_map();
|
||||
void reset_type_to_ride_entry_index_map(IObjectManager& objectManager);
|
||||
void ride_measurement_clear(Ride *ride);
|
||||
void ride_measurements_update();
|
||||
rct_ride_measurement *ride_get_measurement(sint32 rideIndex, rct_string_id *message);
|
||||
|
||||
Reference in New Issue
Block a user