mirror of
https://github.com/TombEngine/TombEngine.git
synced 2025-05-11 13:06:49 +03:00
Fix another 64-bit specific crash with ID_NO_OBJECT
This commit is contained in:
parent
d41927c8fd
commit
7095c42875
6 changed files with 29 additions and 8 deletions
|
@ -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.
|
||||
|
|
|
@ -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)
|
||||
|
|
|
@ -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);
|
||||
|
|
|
@ -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];
|
||||
|
|
|
@ -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))
|
||||
|
|
|
@ -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));
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue