Untitled
unknown
plain_text
a year ago
1.7 kB
5
Indexable
class_name Bull extends CharacterBody3D
@export var move_speed: float = 1.0
@export var m_max_stunned_time = 2
@export var m_max_target_time = 4
var m_current_stunned_time = m_max_stunned_time
var m_current_target_time = m_max_target_time
# Get the gravity from the project settings to be synced with RigidBody nodes.
var gravity: float = ProjectSettings.get_setting("physics/3d/default_gravity")
enum States {IDLE, TARGETING, CHARGING, STUNNED}
var m_state: States = States.IDLE
var m_charge_direction: Vector3 = Vector3.ZERO
func _ready():
add_to_group("bulls")
func _physics_process(delta: float) -> void:
match m_state:
States.IDLE:
m_current_target_time -= delta
if (m_current_target_time <= 0):
m_current_stunned_time = m_max_stunned_time
m_state = States.TARGETING
States.TARGETING:
var closest_monster = get_closest_monster_position()
m_charge_direction = (closest_monster - position).normalized()
m_state = States.CHARGING
States.CHARGING:
velocity.x = m_charge_direction.x * move_speed
velocity.z = m_charge_direction.z * move_speed
var collision = move_and_collide(velocity * delta)
if collision:
var collider = collision.get_collider()
if collider:
if (collider.is_in_group("walls")):
screen_shake()
m_state = States.STUNNED
elif (collider.is_in_group("players")):
m_state = States.STUNNED
States.STUNNED:
m_current_stunned_time -= delta
if (m_current_stunned_time <= 0):
m_current_stunned_time = m_max_stunned_time
m_state = States.IDLE
func get_closest_monster_position() -> Vector3:
return get_parent().get_node("Player").position
func screen_shake() -> void:
get_parent().get_node("Camera3D").init_shake()Editor is loading...
Leave a Comment