extends KinematicBody # stats var curHp : int = 3 var maxHp : int = 3 # attacking var damage : int = 1 var attackDist : float = 1.5 var attackRate : float = 1.0 # physics var moveSpeed : float = 2.5 var gravity : float = 15.0 # vectors var vel : Vector3 = Vector3() # components onready var timer = get_node("Timer") export var player_path : NodePath onready var player = get_node(player_path) onready var anim = get_node("Zombie_Male/AnimationPlayer") func _ready (): # set the timer wait time timer.wait_time = attackRate timer.start() # called every "attackRate" seconds func _on_Timer_timeout (): # if we're within the attack distance - attack the player if translation.distance_to(player.translation) <= attackDist: anim.play("Punch") player.take_damage(damage) # called 60 times a second func _physics_process (delta): # get the distance from us to the player var dist = translation.distance_to(player.translation) # if we're outside of the attack distance, chase after the player if dist > attackDist: # calculate the direction between us and the player var dir = (player.translation - translation).normalized() vel.x = dir.x vel.z = dir.z # gravity vel.y -= gravity * delta # TODO better look_at(player.translation, Vector3.UP) rotation_degrees.x = 0 rotation_degrees.y = rotation_degrees.y + 180 rotation_degrees.z = 0 # move towards the player vel = move_and_slide(vel, Vector3.UP) if is_on_floor(): if anim.current_animation != "Punch" and anim.current_animation != "RecieveHit": if vel.length_squared() > 0: anim.play("Walk") else: anim.play("Idle") else: anim.play("RecieveHit") # called when the player deals damage to us func take_damage (damageToTake): curHp -= damageToTake anim.play("RecieveHit") # if our health reaches 0 - die if curHp <= 0: die() # called when our health reaches 0 func die (): # destroy the node queue_free()