Untitled

 avatar
unknown
plain_text
12 days ago
2.1 kB
2
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 logic
Leave a Comment