how can I call a function in only one script in two scripts?

:information_source: Attention Topic was automatically imported from the old Question2Answer platform.
:bust_in_silhouette: Asked By BOX_Milk

hi
I need to spawn only once when crafting an item,
but since I have two objects with the same script,
it will spawn 2 objects
and I only need one
here is the code of the item for crafting:

extends Area2D

# [ НАСТРОЙКА ]

# name
@export var key = ""
@export_multiline var decs = ""

@onready var player = get_parent().get_node("player/inventory") # ссылка на игрока
@onready var world = get_parent().get_parent().get_node("world") # ссылка на мир


# переменная
var enter = false # соприкосновение с игроком
var pickup = false # в инвентаре 
var craft_id = 0 # крафт ?

@export var kd = 1.5 # кд начало
var kd_ = 0 # кд использовние

var _area = null

func _ready():
    $name.text = key
    $name.hide()
    $anim.play("ilde")

func _process(_delta):
    # кд система
    kd_ -= 0.01

    # если мы вошли в колизию
    if enter == true:
        $name.show() # показ текста
        if Input.is_action_just_pressed("use") and player.get_child_count() < 1: # если мы нажали "E"
            pickup = true # включение для того что-бы добавить
            add() # подбор

    if Input.is_action_just_pressed("drop") and pickup == true:
        drop()

    # использование 
    if pickup == true:
        use() # использование

    # крафт
    if enter == true and player.get_child_count() == 0:
        # стена деревянная
        if craft_id == 1:
            if Input.is_action_just_pressed("craft"):
                _area.queue_free()
                var craft_1 = load("res://prefab/tree.tscn")
                var spawn = craft_1.instantiate()
                world.add_child(spawn)
                spawn.position = player.global_position
                queue_free( )
        # премитивынй инструмент
        elif craft_id == 2:
            if Input.is_action_just_pressed("craft"):
                _area.queue_free()
                var craft_1 = load("res://prefab/item/premitive_tool.tscn")
                var spawn = craft_1.instantiate()
                world.add_child(spawn)
                spawn.position = player.global_position
                queue_free( )

            $name.text = "Q"
            $body.shape.radius = 8
        else:
            $name.text = key
            $body.shape.radius = 5

# использование
func use():
    # default
    $name.hide() # скрытие надписи
    look_at(get_global_mouse_position()) # поворачиваеи на курсор
    # система поворота
    if get_global_mouse_position().x < global_position.x:
        self.scale.y = -1
    else:
        self.scale.y = 1

    if Input.is_action_pressed("LMB") and kd_ <= 0:
        $anim.play("use")
        kd_ = kd
    # custom


# подбор
func add():
    get_parent().remove_child(self) # удаления из прена нас
    player.add_child(self) # добовляем себя дочерний узел игроку
    self.position = Vector2.ZERO # устанавливаем позицию
    $art.offset.x = 4 # отдаляем от тела
    $name.hide() # скрытие надписи

# дроп 
func drop():
    $anim.stop()
    player.remove_child(self) # удаляем себя из игрока
    world.add_child(self) # миру добовляем себя
    rotation_degrees = 0 # поворот = 0
    self.position = player.global_position # выбрасываем под игрока
    self.scale.y = 1 # возращяем поворот
    $art.offset.x = 0 # стандарт
    pickup = false # выключаем
    $name.hide() # скрытие надписи

func _on_area_entered(area):
    if area.is_in_group("wood"):
        craft_id = 1
        _area = area
    elif area.is_in_group("stone"):
        craft_id = 2
        _area = area

func _on_area_exited(area):
    craft_id = 0
    $name.text = key


func _on_body_entered(body):
    if body.is_in_group("player"):
        enter = true

func _on_body_exited(body):
    if body.is_in_group("player"):
        enter = false
        $name.hide() # скрытие надписи
:bust_in_silhouette: Reply From: Drawsi

player.add_child(self)
and
world.add_child(self)

These two seem to add self which I’m assuming is the player in two different instances.
Does getting rid of one fix anything?