Skip to content

Commit d34966c

Browse files
committed
Fix crash when NPC trying use destroyed object
1 parent 006eacc commit d34966c

File tree

3 files changed

+23
-9
lines changed

3 files changed

+23
-9
lines changed

src/xrGame/danger_manager.cpp

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -234,7 +234,7 @@ float CDangerManager::do_evaluate (const CDangerObject &object) const
234234

235235
void CDangerManager::add (const CVisibleObject &object)
236236
{
237-
if (!object.m_enabled)
237+
if (!object.m_enabled || object.m_object->getDestroy())
238238
return;
239239

240240
const CEntityAlive *obj = smart_cast<const CEntityAlive*>(object.m_object);
@@ -246,7 +246,7 @@ void CDangerManager::add (const CVisibleObject &object)
246246

247247
void CDangerManager::add (const CSoundObject &object)
248248
{
249-
if (!object.m_enabled)
249+
if (!object.m_enabled || object.m_object->getDestroy())
250250
return;
251251

252252
const CEntityAlive *obj = smart_cast<const CEntityAlive*>(object.m_object);
@@ -286,7 +286,7 @@ void CDangerManager::add (const CSoundObject &object)
286286

287287
void CDangerManager::add (const CHitObject &object)
288288
{
289-
if (!object.m_enabled)
289+
if (!object.m_enabled || object.m_object->getDestroy())
290290
return;
291291

292292
if (fis_zero(object.m_amount))

src/xrGame/item_manager.cpp

Lines changed: 15 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -35,18 +35,28 @@ bool CItemManager::is_useful (const CGameObject *object) const
3535

3636
bool CItemManager::useful (const CGameObject *object) const
3737
{
38+
if (object->getDestroy())
39+
return false;
40+
41+
if (!object->getEnabled())
42+
return false;
43+
44+
if (!&object->ai_location())
45+
return false;
46+
3847
if (!inherited::is_useful(object))
39-
return (false);
48+
return false;
4049

4150
if (m_object->getDestroy())
42-
return (false);
51+
return false;
4352

4453
// we do not want to keep in memory attached objects
4554
if (m_object->H_Parent())
46-
return (false);
55+
return false;
4756

48-
if (!const_cast<CGameObject*>(object)->UsedAI_Locations())
49-
return (false);
57+
auto gameObject = const_cast<CGameObject*>(object);
58+
if (gameObject == nullptr && gameObject->UsedAI_Locations())
59+
return false;
5060

5161
if (!m_object->movement().restrictions().accessible(object->Position()))
5262
return (false);

src/xrGame/memory_manager.cpp

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -170,10 +170,14 @@ void CMemoryManager::update (const xr_vector<T> &objects, bool add_enemies)
170170
if (m_stalker && !(*I).m_squad_mask.test(mask))
171171
continue;
172172

173+
if ((*I).m_object->getDestroy()) {
174+
continue;
175+
}
176+
173177
danger().add (*I);
174178

175179
if (add_enemies) {
176-
const CEntityAlive *entity_alive = smart_cast<const CEntityAlive*>((*I).m_object);
180+
const CEntityAlive *entity_alive = smart_cast<const CEntityAlive*>((*I).m_object);
177181
if (entity_alive && enemy().add(entity_alive))
178182
continue;
179183
}

0 commit comments

Comments
 (0)