From 37c61ca67348cd2378148e9b97ebf23cb56faa29 Mon Sep 17 00:00:00 2001 From: Michael Mainguy Date: Sat, 8 Nov 2025 04:43:02 -0600 Subject: [PATCH] Fix null reference error in weapon system collision observer MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Fixed TypeError when accessing collision observable on disposed physics bodies. The error occurred in two places: 1. Inside collision callback when trying to remove observer after hit 2. In timeout cleanup when projectile disposed before 2-second timer Added defensive null checks and try-catch blocks in both locations to handle race conditions where physics bodies are disposed during collision handling. 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude --- src/weaponSystem.ts | 28 +++++++++++++++++++++------- 1 file changed, 21 insertions(+), 7 deletions(-) diff --git a/src/weaponSystem.ts b/src/weaponSystem.ts index b451b4e..0853aaa 100644 --- a/src/weaponSystem.ts +++ b/src/weaponSystem.ts @@ -129,20 +129,34 @@ export class WeaponSystem { hitRecorded = true; // Remove collision observer after first hit - if (collisionObserver) { - ammoAggregate.body.getCollisionObservable().remove(collisionObserver); + if (collisionObserver && ammoAggregate.body) { + try { + ammoAggregate.body.getCollisionObservable().remove(collisionObserver); + } catch (e) { + // Body may have been disposed during collision handling, ignore + } } } }); // Auto-dispose after 2 seconds window.setTimeout(() => { - // Clean up collision observer - if (collisionObserver) { - ammoAggregate.body.getCollisionObservable().remove(collisionObserver); + // Clean up collision observer if body still exists + if (collisionObserver && ammoAggregate.body) { + try { + ammoAggregate.body.getCollisionObservable().remove(collisionObserver); + } catch (e) { + // Body may have already been disposed, ignore error + } + } + + // Dispose if not already disposed + try { + ammoAggregate.dispose(); + ammo.dispose(); + } catch (e) { + // Already disposed, ignore } - ammoAggregate.dispose(); - ammo.dispose(); }, 2000); }