Untitled
unknown
plain_text
a year ago
2.1 kB
9
Indexable
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 logicEditor is loading...
Leave a Comment