From 0abec8156bd944aa883d544850ee1187219ba943 Mon Sep 17 00:00:00 2001 From: Lucas Fryzek Date: Tue, 17 Sep 2024 22:02:33 +0100 Subject: Initial commit --- scripts/enemy.gd | 87 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 87 insertions(+) create mode 100644 scripts/enemy.gd (limited to 'scripts/enemy.gd') diff --git a/scripts/enemy.gd b/scripts/enemy.gd new file mode 100644 index 0000000..569905f --- /dev/null +++ b/scripts/enemy.gd @@ -0,0 +1,87 @@ +extends CharacterBody3D + +## Speed of enemy +@export var speed: float = 2.0 +## Target for enemy to follow +@export var target: Node3D + +## Whether to use gravity on enemy +@export var gravity_enabled: bool = false + +var has_astar: bool = false +var astar: AStar3D +var tar_vec: Vector3 +var gravity : float = ProjectSettings.get_setting("physics/3d/default_gravity") + +var original_color: Color + +func _ready() -> void: + if gravity_enabled: + motion_mode = MotionMode.MOTION_MODE_GROUNDED + +func chase_target(delta: float) -> void: + var target_pos = target.position + var direction = (target_pos - position).normalized() + + if direction: + velocity.x = direction.x * speed + velocity.z = direction.z * speed + else: + velocity.x = move_toward(velocity.x, 0, speed) + velocity.z = move_toward(velocity.z, 0, speed) + + if not is_on_floor() and gravity_enabled: + velocity.y -= gravity * delta + + move_and_slide() + +func _physics_process(delta: float) -> void: + if target == null: + return + + if not has_astar: + # Just try to chase player directly + chase_target(delta) + return + + if Input.is_action_pressed("ui_right"): + return + + var target_pos = target.position + var closest_me = astar.get_closest_point(position) + var closest_target = astar.get_closest_point(target_pos) + + var direction: Vector3 + if closest_me == closest_target: + direction = (target_pos - position).normalized() + else: + var target_path = astar.get_point_path(closest_me, closest_target) + if len(target_path) >= 2: + direction = (target_path[1] - position).normalized() + + if direction: + #velocity.x = move_toward(velocity.x, direction.x * speed, 10.0 * delta) + #velocity.z = move_toward(velocity.z, direction.z * speed, 10.0 * delta) + velocity.x = direction.x * speed + velocity.z = direction.z * speed + else: + velocity.x = move_toward(velocity.x, 0, speed) + velocity.z = move_toward(velocity.z, 0, speed) + + move_and_slide() + +func on_hit(_hit_position: Vector3) -> void: + if $HitTimer.is_stopped(): + var material: StandardMaterial3D = $MeshInstance3D.get_active_material(0) + original_color = material.albedo_color + material.albedo_color = Color(1.0, 0.0, 0.0, 1.0) + $HitTimer.start() + +func _on_level_generator_astar_created(in_astar: AStar3D) -> void: + astar = in_astar + has_astar = true + +func _on_hit_timer_timeout() -> void: + var material: StandardMaterial3D = $MeshInstance3D.get_active_material(0) + material.albedo_color = original_color + $HitTimer.stop() -- cgit