extends Node3D class_name Move @onready var character = (get_owner() as Character) @onready var status = (%Status as Status) @onready var buff = (%Buff as Buff) var gravity = ProjectSettings.get_setting("physics/3d/default_gravity") func _process(delta): if Global.is_level_loading_contorl:return if status.is_pause:return var is_hit_floor = update_on_floor(delta) update_move(delta) update_speed_y(delta) character.move_and_slide() if character.velocity: SignalManager.character_pos_changed.emit(character.id(),character.pos()) SignalManager.character_ui_pos_changed.emit(character.id(),character.ui_pos()) SignalManager.character_status_changed.emit(status.id,"pos2d",character.pos2D()) if is_hit_floor: SignalManager.character_hit_floor.emit(character.id(),character.pos()) func update_on_floor(delta) -> bool: var is_on_floor = character.is_on_floor() var is_hit = not status.is_on_floor and is_on_floor status.is_on_floor = is_on_floor if status.is_on_floor and not status.is_jumping: status.is_jumped = false return is_hit func update_speed_y(delta): var has_y_speed = status.skill_float_speed != 0 or status.hit_up_speed != 0 var is_on_stair = character.is_on_stair() if has_y_speed: character.velocity.y = status.skill_float_speed + status.hit_up_speed else: if is_on_stair: character.velocity.y = status.cfg.move.speed * 0.75 else: if not status.is_on_floor: character.velocity.y -= gravity * delta * status.cfg.move.gravity_scale status.speed_y = character.velocity.y func update_move(delta): var move_velocity = status.move_dir.normalized() * (status.cfg.move.speed * (1 + status.speed_up_rate)) var skill_velocity = status.skill_dir * status.skill_move_speed var hit_back_velocity = status.hit_back_dir * status.hit_back_speed move_velocity += skill_velocity + hit_back_velocity if move_velocity.length() == 0: move_velocity = Vector2(character.velocity.x,character.velocity.z); if status.is_on_floor: move_velocity = Util.vector_reduce(move_velocity,Setting.drag_ground*delta) else: move_velocity = Util.vector_reduce(move_velocity,Setting.drag_air*delta) else: move_velocity.x = move_velocity.x move_velocity.y = move_velocity.y character.velocity.x = move_velocity.x character.velocity.z = move_velocity.y status.speed_xz = Vector2(character.velocity.x,character.velocity.z).length() if status.is_free_turn and status.move_dir.x != 0: status.is_right = status.move_dir.x > 0 func jump(): character.velocity.y = status.cfg.move.jump_velocity status.is_jumped = true status.trigger_jump = true buff.add_buff("jumping",0.1)