extends "res://scripts/player.gd" const wallride_speed = 0 const wallride_speed_necessary = 15 const wallride_leap_height = 20 const wallride_leap_side = 10 var since_on_wall = 0 var last_wall_normal = Vector3() var wallride_forgiveness = .150 func control_player(state): .control_player(state) wallride(state) func wallride(state): var ray = get_node("Ray") var vel = get_linear_velocity() # If our feet aren't touching, but we are colliding, we are wall-riding if !ray.is_colliding() and get_colliding_bodies() and vel.length() > wallride_speed_necessary: since_on_wall = 0 last_wall_normal = state.get_contact_local_normal() else: since_on_wall += delta if since_on_wall < wallride_forgiveness: var aim = get_node("Yaw").get_global_transform().basis # Add zero gravity set_gravity_scale(0) # Allow jumping (for wall hopping!) if Input.is_action_just_pressed("jump"): var jump_impulse = -wallride_leap_side * last_wall_normal jump_impulse.y += wallride_leap_height state.apply_impulse(Vector3(), jump_impulse) else: # We need to return to falling (we aren't riding anymore) set_gravity_scale(1)