Fix another 64-bit specific crash with ID_NO_OBJECT

This commit is contained in:
Lwmte 2023-07-09 19:38:31 +02:00
parent d41927c8fd
commit 7095c42875
6 changed files with 29 additions and 8 deletions

View file

@ -5,9 +5,7 @@ Version 1.1.0
* Fix skeletons and mummies not affected by explosive weapons.
* Fix crash on loading if static meshes with IDs above maximum are present.
* Fix random crashes when playing audio tracks with names longer than 15 symbols.
* Fix possible crashes when killing some enemies in 64-bit version.
* Fix possible crashes when loading savegame in 64-bit version.
* Fix electricity effect crashing in 64-bit version.
* Fix various crashes specific to 64-bit build.
* Fix crashes when trying to play .wav soundtracks on some Windows 11 systems.
* Fix sprint value going below zero.
* Fix fog bulb density formula.

View file

@ -750,6 +750,13 @@ namespace TEN::Collision::Floordata
void AddBridge(int itemNumber, int x, int z)
{
const auto& item = g_Level.Items[itemNumber];
if (item.ObjectNumber == ID_NO_OBJECT)
{
TENLog("Attempt to add item with nonexistent object ID as bridge", LogLevel::Error);
return;
}
x += item.Pose.Position.x;
z += item.Pose.Position.z;
@ -788,6 +795,13 @@ namespace TEN::Collision::Floordata
void RemoveBridge(int itemNumber, int x, int z)
{
const auto& item = g_Level.Items[itemNumber];
if (item.ObjectNumber == ID_NO_OBJECT)
{
TENLog("Attempt to remove item with nonexistent object ID as bridge", LogLevel::Error);
return;
}
x += item.Pose.Position.x;
z += item.Pose.Position.z;
@ -862,7 +876,15 @@ namespace TEN::Collision::Floordata
void UpdateBridgeItem(int itemNumber, bool forceRemoval)
{
auto item = &g_Level.Items[itemNumber];
if (!Objects[item->ObjectNumber].loaded) return;
if (item->ObjectNumber == ID_NO_OBJECT)
{
TENLog("Attempt to update item with nonexistent object ID as bridge", LogLevel::Error);
return;
}
if (!Objects[item->ObjectNumber].loaded)
return;
// Force removal if object was killed
if (item->Flags & IFLAG_KILLED)

View file

@ -241,7 +241,7 @@ void KillItem(short const itemNumber)
// AI target generation uses a hack with making a dummy item without ObjectNumber.
// Therefore, a check should be done here to prevent access violation.
if (item->ObjectNumber != NO_ITEM && Objects[item->ObjectNumber].floor != nullptr)
if (item->ObjectNumber != ID_NO_OBJECT && Objects[item->ObjectNumber].floor != nullptr)
UpdateBridgeItem(itemNumber, true);
GameScriptHandleKilled(itemNumber, true);

View file

@ -1510,7 +1510,7 @@ bool SaveGame::Load(int slot)
item->NextItem = savedItem->next_item();
item->NextActive = savedItem->next_item_active();
if (item->ObjectNumber == NO_ITEM)
if (item->ObjectNumber == ID_NO_OBJECT)
continue;
ObjectInfo* obj = &Objects[item->ObjectNumber];

View file

@ -120,7 +120,7 @@ namespace TEN::Entities::Creatures::TR3
float shortestDistance = INFINITY;
for (auto& targetItem : g_Level.Items)
{
if (targetItem.ObjectNumber == NO_ITEM || targetItem.Index == itemNumber || targetItem.RoomNumber == NO_ROOM)
if (targetItem.ObjectNumber == ID_NO_OBJECT || targetItem.Index == itemNumber || targetItem.RoomNumber == NO_ROOM)
continue;
if (SameZone(creature, &targetItem))

View file

@ -110,6 +110,8 @@ static std::unique_ptr<Moveable> Create(
{
auto* item = &g_Level.Items[num];
ptr->SetObjectID(objID);
if (std::holds_alternative<short>(room))
{
ptr->SetPos(pos, false);
@ -121,7 +123,6 @@ static std::unique_ptr<Moveable> Create(
}
ptr->SetRot(USE_IF_HAVE(Rotation, rot, Rotation{}));
ptr->SetObjectID(objID);
ptr->Init();
ptr->SetAnimNumber(USE_IF_HAVE(int, animNumber, 0));