Untitled
extends CharacterBody2D @export var speed = 100 @export var detection_range = 200 @export var attack_range = 50 @export var attack_damage = 10 @export var attack_cooldown = 1.0 @export var max_health = 100 var player_target = null var last_attack_time = 0 var health = max_health func _physics_process(delta): player_target = find_closest_player() if player_target and is_instance_valid(player_target): # Check for valid target var distance_to_player = global_position.distance_to(player_target.global_position) if distance_to_player <= attack_range and Time.get_ticks_msec() - last_attack_time >= attack_cooldown * 1000: attack_player(player_target) last_attack_time = Time.get_ticks_msec() else: var direction = (player_target.global_position - global_position).normalized() velocity = direction * speed * delta move_and_slide() else: velocity = Vector2.ZERO #Stop moving if no player target move_and_slide() func find_closest_player(): var closest_player = null var closest_distance = INF for player in get_tree().get_nodes_in_group("players"): if player == self: continue if player and is_instance_valid(player) and player.has_method("global_position"): # Essential checks var distance = global_position.distance_to(player.global_position) if distance < closest_distance and distance <= detection_range: closest_distance = distance closest_player = player else: print("Invalid player in group:", player) # Debugging return closest_player func attack_player(player): if player and is_instance_valid(player) and player.has_method("take_damage"): #Check if the player can take damage rpc_id(player.get_network_master(), "take_damage", attack_damage) else: print("Tried to attack an invalid player", player) @rpc("call_local") func take_damage(amount): health -= amount print("Enemy took damage:", amount, "Health:", health) if health <= 0: die() func die(): print("Enemy died!") queue_free() # Or implement other death logic
Leave a Comment