A team game with an emphasis on movement (with no shooting), inspired by Overwatch and Zineth
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

59 lines
1.8 KiB

  1. extends "res://scripts/player.gd"
  2. const wallride_speed_necessary = 2
  3. const wallride_leap_height = 14
  4. const wallride_leap_side = 8
  5. var since_on_wall = 0
  6. var last_wall_normal = Vector3()
  7. var wallride_forgiveness = .150
  8. func _ready():
  9. ._ready()
  10. walk_speed *= 1
  11. air_accel *= 1.5
  12. walk_speed_build *= 2
  13. air_speed_build *= 3
  14. func control_player(state):
  15. .control_player(state)
  16. wallride(state)
  17. func wallride(state):
  18. var ray = get_node("Ray")
  19. var vel = state.get_linear_velocity()
  20. # If our feet aren't touching, but we are colliding, we are wall-riding
  21. if !ray.is_colliding() and get_colliding_bodies() and vel.length() > wallride_speed_necessary:
  22. last_wall_normal = state.get_contact_local_normal(0)
  23. # Make sure it isn't the floor
  24. if last_wall_normal.dot(Vector3(0,1,0)) < 0.95:
  25. since_on_wall = 0
  26. else:
  27. since_on_wall += state.get_step()
  28. debug_node.set_text(str(since_on_wall < wallride_forgiveness))
  29. if since_on_wall < wallride_forgiveness:
  30. # Add zero gravity
  31. set_gravity_scale(0)
  32. # Remove any momentum we may have
  33. state.set_linear_velocity(Vector3(vel.x, 0, vel.z))
  34. # Because 1/2 of our energy is wasted in the wall, get more forwards/backwards here:
  35. var aim = get_node("Yaw").get_global_transform().basis
  36. if Input.is_action_pressed("move_forwards"):
  37. apply_impulse(Vector3(), -air_accel * aim[2] * get_mass())
  38. if Input.is_action_pressed("move_backwards"):
  39. apply_impulse(Vector3(), air_accel * aim[2] * get_mass())
  40. # Allow jumping (for wall hopping!)
  41. if Input.is_action_just_pressed("jump"):
  42. var jump_impulse = wallride_leap_side * last_wall_normal
  43. jump_impulse.y += wallride_leap_height
  44. set_gravity_scale(1) # Jumping requires gravity
  45. state.apply_impulse(Vector3(), jump_impulse * get_mass())
  46. else:
  47. # We need to return to falling (we aren't riding anymore)
  48. set_gravity_scale(1)
  49. state.integrate_forces()