there are many ways to do so, depending on your implementation. For example, in my game, i create fireballs in the player's script. So i instance a firebal, and connect it right away, and then i add it to the level. Something like this in the player's script, when you shoot the fireball:
# FireBall was preloaded before
fireball = FireBall.instance()
# on_fireball_finished is a method defined in players script
firefall.connect("finished", self, "on_fireball_finished")
# add fireball where it belongs
get_tree().get_root().add_child(fireball)
# change fireball's position if needed after this
However, you could also have a Global script attached as an autoload, and have a reference to the player there. Anytime you instance a fireball, you could connect to the player on the fireball's ready:
# Fireball's ready
func _ready():
connect("finished", Global.player, "on_fireball_finished")
or something like that. If you provide a test project, i can help you further.