|
|
- 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)
-
|