Untitled

 avatar
unknown
plain_text
6 months ago
1.7 kB
2
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