75 lines
3 KiB
GDScript
75 lines
3 KiB
GDScript
extends State
|
|
|
|
class_name CrouchState
|
|
|
|
var state_name : String = "Crouch"
|
|
|
|
var play_char : CharacterBody3D
|
|
|
|
func enter(play_char_ref : CharacterBody3D) -> void:
|
|
play_char = play_char_ref
|
|
|
|
verifications()
|
|
|
|
func verifications() -> void:
|
|
#play_char.godot_plush_skin.set_state("crouch")
|
|
play_char.move_speed = play_char.crouch_speed
|
|
play_char.move_accel = play_char.crouch_accel
|
|
play_char.move_deccel = play_char.crouch_deccel
|
|
|
|
play_char.floor_snap_length = 1.0
|
|
if play_char.jump_cooldown > 0.0: play_char.jump_cooldown = -1.0
|
|
if play_char.nb_jumps_in_air_allowed < play_char.nb_jumps_in_air_allowed_ref: play_char.nb_jumps_in_air_allowed = play_char.nb_jumps_in_air_allowed_ref
|
|
if play_char.coyote_jump_cooldown < play_char.coyote_jump_cooldown_ref: play_char.coyote_jump_cooldown = play_char.coyote_jump_cooldown_ref
|
|
if play_char.has_cut_jump: play_char.has_cut_jump = false
|
|
|
|
play_char.is_crouching = true
|
|
|
|
func exit() -> void:
|
|
play_char.is_crouching = false
|
|
|
|
func physics_update(delta : float) -> void:
|
|
applies()
|
|
|
|
play_char.gravity_apply(delta)
|
|
|
|
input_management()
|
|
|
|
move(delta)
|
|
|
|
func applies() -> void:
|
|
#quitter le sol (ex: crouch au bord d'une plateforme) bascule vers InairState, comme IdleState
|
|
if !play_char.is_on_floor() and !play_char.is_on_wall():
|
|
transitioned.emit(self, "InairState")
|
|
#le saut est bloque en crouch : on ne consomme pas le jump buffer ici, il restera en attente
|
|
#et sera pris en compte des la sortie du crouch (Idle/Walk)
|
|
|
|
func input_management() -> void:
|
|
if Input.is_action_just_pressed(play_char.dodge_action) and play_char.dodge_cooldown <= 0.0:
|
|
transitioned.emit(self, "DodgeState")
|
|
|
|
#courir annule automatiquement le crouch
|
|
if play_char.walk_or_run == "RunState":
|
|
transitioned.emit(self, "RunState")
|
|
|
|
#bascule (toggle) : un nouvel appui ressort du crouch vers l'etat au sol approprie
|
|
if Input.is_action_just_pressed(play_char.crouch_action):
|
|
transitioned.emit(self, play_char.walk_or_run if play_char.move_dir else "IdleState")
|
|
|
|
if Input.is_action_just_pressed(play_char.aim_cam_action):
|
|
transitioned.emit(self, "AimState")
|
|
|
|
#pas de saut ici : le jump_action est volontairement ignore pendant le crouch
|
|
|
|
func move(delta : float) -> void:
|
|
play_char.move_dir = Input.get_vector(play_char.move_left_action, play_char.move_right_action, play_char.move_forward_action, play_char.move_backward_action).rotated(-play_char.cam_holder.global_rotation.y)
|
|
|
|
if play_char.move_dir and play_char.is_on_floor():
|
|
#deplacement accroupi, a vitesse reduite
|
|
play_char.velocity.x = lerp(play_char.velocity.x, play_char.move_dir.x * play_char.move_speed, play_char.move_accel * delta)
|
|
play_char.velocity.z = lerp(play_char.velocity.z, play_char.move_dir.y * play_char.move_speed, play_char.move_accel * delta)
|
|
else:
|
|
#pas de transition vers Idle ici : Crouch gere lui-meme l'immobilite, comme AimState
|
|
play_char.velocity.x = lerp(play_char.velocity.x, 0.0, play_char.move_deccel * delta)
|
|
play_char.velocity.z = lerp(play_char.velocity.z, 0.0, play_char.move_deccel * delta)
|