mj177/scripts/enemies/enemy.gd
2025-02-02 02:23:55 +01:00

70 lines
2.4 KiB
GDScript

extends CharacterBody3D
class_name Enemy
const MOVEMENT_SPEED = 1
@onready var animationtree: AnimationTree = $enemies/AnimationPlayer/AnimationTree
@onready var agent:NavigationAgent3D = $NavigationAgent
@onready var enemyAi: EnemyAI = $BTPlayer
@onready var health: Health = $Health
@onready var origin: Node3D = $"enemies/Vert/Shoot Marker"
const SPEED = 5.0
const JUMP_VELOCITY = 4.5
var movementBlend = 0;
func _ready() -> void:
health.death.connect(died)
func died() -> void:
queue_free()
func updateMovementBlend(delta: float, to: float) -> void:
movementBlend = move_toward(movementBlend, to, delta * 2);
func rotateTo(delta: float, targetDirection: Vector3) -> void:
self.global_basis.z = lerp(self.global_basis.z, targetDirection, delta * 10);
func _physics_process(delta: float) -> void:
if agent.is_navigation_finished():
if enemyAi.aggressive:
rotateTo(delta, (Player.Instance.global_position - self.global_position).normalized())
updateMovementBlend(delta, 0);
self.animationtree['parameters/Movement/blend_position'] = movementBlend
return
var current_agent_position: Vector3 = global_position
var next_path_position: Vector3 = agent.get_next_path_position()
velocity = current_agent_position.direction_to(next_path_position) * MOVEMENT_SPEED
move_and_slide()
if enemyAi.aggressive:
rotateTo(delta, (Player.Instance.global_position - self.global_position).normalized())
else:
rotateTo(delta, velocity.normalized())
updateMovementBlend(delta, velocity.length())
self.animationtree['parameters/Movement/blend_position'] = movementBlend
func fireWeapon() -> void:
var fireDirection = (Player.Instance.enemyTarget.global_position - origin.global_position).normalized()
fireDirection = fireDirection.rotated(Vector3.UP, randf_range(-.3, .3))
DebugDraw3D.draw_arrow(origin.global_position, origin.global_position + Vector3.UP * 1, Color.RED, 0.5, true, 10)
DebugDraw3D.draw_arrow(origin.global_position, origin.global_position + fireDirection * 10, Color.WHITE, 0.5, true, 10)
var query = PhysicsRayQueryParameters3D.create(origin.global_position, origin.global_position + fireDirection * 200)
var result = get_world_3d().direct_space_state.intersect_ray(query)
if not result:
return
var health = result.collider.get_node_or_null('Health')
print(health)
if not health:
return
result.collider.health.take_damage(1, Vector2(0,0))