I think your problem might be the special nature of KinematicBodies (not RigidBodies in kinematic mode):
- They don't do collision detection unless you call collision detecting motion functions like move_and_slide()
From the documentation:
Kinematic bodies are special types of bodies that are meant to be user-controlled. They are not affected by physics at all; to other types of bodies, such as a character or a rigid body, these are the same as a static body. However, they have two main uses:
...
Kinematic characters: KinematicBody also has an API for moving objects (the move_and_collide and move_and_slide methods) while performing collision tests. This makes them really useful to implement characters that collide against a world, but that don't require advanced physics.
https://docs.godotengine.org/en/stable/classes/class_kinematicbody.html
Areas will tell you if a body or other area intersects it, but it will not yield any information about the collision per se.
Bodies don't detect areas, areas detect bodies (default behavior) and other areas (when enabled)
Check your physics layers and masks. The area should be set up to detect the physics layer of the objects you want it to notify you of.
I know areas work on rigid-bodies in all modalities (kinematic, character, rigid-body and static), KinematicBody (2D) is a distinct subclass of PhysicsBody, so it may not be treated the same way as RigidBody.
If all else fails, as an experiment:
Try attaching an area to the thing you want to detect and see your WeaponStopper area sees that after enabling the WeaponStopper to detect areas.
Also you might want to add collision exceptions to your area for your weapon to ensure that it is not interfering with the area. Also if your weapon is already intersecting the area, you might miss the enter event if you are connecting to receive the signals after it's been emitted.