extends VehicleBody const max_rpm: float = 2500.0 const max_torque: float = 2800.0 var n_jumps: int onready var wheels = [$front_left_wheel, $front_right_wheel, $back_left_wheel, $back_right_wheel] var slip export(NodePath) var target = null func car_can_jump() -> bool: for w in wheels: if not w.is_in_contact(): return false return true func is_car_flying() -> bool: for w in wheels: if w.is_in_contact(): return false return true func _physics_process(delta): var can_jump = car_can_jump() var is_flying = is_car_flying() if can_jump: n_jumps = 0 var new_steering = (Input.get_action_strength("left") - Input.get_action_strength("right")) * 0.6 var acceleration = (Input.get_action_strength("forward") - Input.get_action_strength("back")) var transform = get_transform().basis if Input.is_action_just_pressed("reset"): rotation = Vector3(0, 0, 0) angular_velocity = Vector3(0, 0, 0) linear_velocity = Vector3(0, 0, 0) get_global_transform().origin = Vector3(0, 0, 0) if can_jump: if new_steering != 0: steering = lerp(steering, new_steering, 2 * delta) else: steering = lerp(steering, 0, 8 * delta) var rpm = $back_left_wheel.get_rpm() if (acceleration < 0 and rpm > 0) or (acceleration > 0 and rpm < 0): for w in wheels: w.brake = 25 else: for w in wheels: w.brake = 0 $back_left_wheel.engine_force = acceleration * max_torque * (1 - rpm / max_rpm) rpm = $back_right_wheel.get_rpm() $back_right_wheel.engine_force = acceleration * max_torque * (1 - rpm / max_rpm) if Input.is_action_pressed("toggle"): # handbrake $back_left_wheel.wheel_friction_slip = 1 $back_right_wheel.wheel_friction_slip = 1 for w in wheels: w.brake = 10 else: $back_left_wheel.wheel_friction_slip = slip $back_right_wheel.wheel_friction_slip = slip for w in wheels: w.brake = 0 elif is_flying: apply_torque_impulse(50.0 * acceleration * transform.x) if Input.is_action_pressed("toggle"): apply_torque_impulse(-100.0 * new_steering * transform.z) else: apply_torque_impulse(50.0 * new_steering * transform.y) if n_jumps < 2 and Input.is_action_just_pressed("jump"): apply_impulse(Vector3(0, 0, 0), Vector3(0, 2000, 0)) n_jumps += 1 if Input.is_action_pressed("turbo"): add_central_force(4000 * transform.x) func _ready(): for w in wheels: add_collision_exception_with(w) slip = $back_left_wheel.wheel_friction_slip