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: Moreus

you remove input from script.
you call target object (public method) from your “input/controller” script.