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 skeletons and mummies not affected by explosive weapons.
|
||||||
* Fix crash on loading if static meshes with IDs above maximum are present.
|
* 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 random crashes when playing audio tracks with names longer than 15 symbols.
|
||||||
* Fix possible crashes when killing some enemies in 64-bit version.
|
* Fix various crashes specific to 64-bit build.
|
||||||
* Fix possible crashes when loading savegame in 64-bit version.
|
|
||||||
* Fix electricity effect crashing in 64-bit version.
|
|
||||||
* Fix crashes when trying to play .wav soundtracks on some Windows 11 systems.
|
* Fix crashes when trying to play .wav soundtracks on some Windows 11 systems.
|
||||||
* Fix sprint value going below zero.
|
* Fix sprint value going below zero.
|
||||||
* Fix fog bulb density formula.
|
* Fix fog bulb density formula.
|
||||||
|
|
|
@ -750,6 +750,13 @@ namespace TEN::Collision::Floordata
|
||||||
void AddBridge(int itemNumber, int x, int z)
|
void AddBridge(int itemNumber, int x, int z)
|
||||||
{
|
{
|
||||||
const auto& item = g_Level.Items[itemNumber];
|
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;
|
x += item.Pose.Position.x;
|
||||||
z += item.Pose.Position.z;
|
z += item.Pose.Position.z;
|
||||||
|
|
||||||
|
@ -788,6 +795,13 @@ namespace TEN::Collision::Floordata
|
||||||
void RemoveBridge(int itemNumber, int x, int z)
|
void RemoveBridge(int itemNumber, int x, int z)
|
||||||
{
|
{
|
||||||
const auto& item = g_Level.Items[itemNumber];
|
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;
|
x += item.Pose.Position.x;
|
||||||
z += item.Pose.Position.z;
|
z += item.Pose.Position.z;
|
||||||
|
|
||||||
|
@ -862,7 +876,15 @@ namespace TEN::Collision::Floordata
|
||||||
void UpdateBridgeItem(int itemNumber, bool forceRemoval)
|
void UpdateBridgeItem(int itemNumber, bool forceRemoval)
|
||||||
{
|
{
|
||||||
auto item = &g_Level.Items[itemNumber];
|
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
|
// Force removal if object was killed
|
||||||
if (item->Flags & IFLAG_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.
|
// AI target generation uses a hack with making a dummy item without ObjectNumber.
|
||||||
// Therefore, a check should be done here to prevent access violation.
|
// 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);
|
UpdateBridgeItem(itemNumber, true);
|
||||||
|
|
||||||
GameScriptHandleKilled(itemNumber, true);
|
GameScriptHandleKilled(itemNumber, true);
|
||||||
|
|
|
@ -1510,7 +1510,7 @@ bool SaveGame::Load(int slot)
|
||||||
item->NextItem = savedItem->next_item();
|
item->NextItem = savedItem->next_item();
|
||||||
item->NextActive = savedItem->next_item_active();
|
item->NextActive = savedItem->next_item_active();
|
||||||
|
|
||||||
if (item->ObjectNumber == NO_ITEM)
|
if (item->ObjectNumber == ID_NO_OBJECT)
|
||||||
continue;
|
continue;
|
||||||
|
|
||||||
ObjectInfo* obj = &Objects[item->ObjectNumber];
|
ObjectInfo* obj = &Objects[item->ObjectNumber];
|
||||||
|
|
|
@ -120,7 +120,7 @@ namespace TEN::Entities::Creatures::TR3
|
||||||
float shortestDistance = INFINITY;
|
float shortestDistance = INFINITY;
|
||||||
for (auto& targetItem : g_Level.Items)
|
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;
|
continue;
|
||||||
|
|
||||||
if (SameZone(creature, &targetItem))
|
if (SameZone(creature, &targetItem))
|
||||||
|
|
|
@ -110,6 +110,8 @@ static std::unique_ptr<Moveable> Create(
|
||||||
{
|
{
|
||||||
auto* item = &g_Level.Items[num];
|
auto* item = &g_Level.Items[num];
|
||||||
|
|
||||||
|
ptr->SetObjectID(objID);
|
||||||
|
|
||||||
if (std::holds_alternative<short>(room))
|
if (std::holds_alternative<short>(room))
|
||||||
{
|
{
|
||||||
ptr->SetPos(pos, false);
|
ptr->SetPos(pos, false);
|
||||||
|
@ -121,7 +123,6 @@ static std::unique_ptr<Moveable> Create(
|
||||||
}
|
}
|
||||||
|
|
||||||
ptr->SetRot(USE_IF_HAVE(Rotation, rot, Rotation{}));
|
ptr->SetRot(USE_IF_HAVE(Rotation, rot, Rotation{}));
|
||||||
ptr->SetObjectID(objID);
|
|
||||||
ptr->Init();
|
ptr->Init();
|
||||||
|
|
||||||
ptr->SetAnimNumber(USE_IF_HAVE(int, animNumber, 0));
|
ptr->SetAnimNumber(USE_IF_HAVE(int, animNumber, 0));
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue