Can you verify that the Area2D.disable_mode is set to DISABLE_MODE_REMOVE? Otherwise, it will still be processed while the node is disabled. It’s set by default, but makes the most sense. (link)
Another thing to check is that you’re getting the expected behavior from the for i in get_overlapping_areas():
loop in Move(). From the docs: “For performance reasons (collisions are all processed at the same time) this list is modified once during the physics step, not immediately after objects are moved.”
So multiple collisions may be detected across multiple frames, and I’m wondering if the tween for the death is getting created multiple times. It doesn’t look like that would be preventing the DisableObject() callback, but I dunno. That’s another reason you might want a separate ‘dead’ flag beyond the node being disabled: you could prevent doing things like creating duplicate tweens. You could also ignore collisions with already dead enemies if you check the ‘dead’ flag in the overlapping area.
If you’re desperate, you can also update the location once the enemy is disabled to put it outside of game bounds until you re-use the node. But that might be hiding an issue that could bite you later.
Hope that helps… I’m still trying to learn this monster