seated_vehicle.gd 1.5 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758
  1. class_name SeatedVehicle
  2. extends VehicleBody3D
  3. const CRASH_EFFECT: Resource = preload("res://effect/crash/crash.tscn")
  4. var _current_commander: LocalInput = null
  5. var _has_collided: bool = false
  6. func _init() -> void:
  7. body_shape_entered.connect(_on_body_shape_entered)
  8. ## Make the vehicle responds to driver commands
  9. func drive_with(commander: LocalInput) -> void:
  10. commander.dir_changed.connect(_on_dir_changed)
  11. commander.main_action.connect(_on_main_action)
  12. _current_commander = commander
  13. func get_out() -> void:
  14. _current_commander.dir_changed.disconnect(_on_dir_changed)
  15. _current_commander.main_action.disconnect(_on_main_action)
  16. _current_commander = null
  17. func _integrate_forces(state: PhysicsDirectBodyState3D) -> void:
  18. if _has_collided and state.get_contact_count() > 0:
  19. _crash_on(state.get_contact_collider_position(0))
  20. _has_collided = false
  21. func _on_body_shape_entered(body_rid: RID, body: Node, body_shape_index: int, local_shape_index: int) -> void:
  22. if body is Walker:
  23. return
  24. _has_collided = true
  25. func _crash_on(pos: Vector3) -> void:
  26. var crash_effect: CrashEffect = CRASH_EFFECT.instantiate()
  27. crash_effect.position = pos
  28. get_parent_node_3d().add_child(crash_effect)
  29. ## Need to be overridden to return an available seat
  30. func get_free_seat() -> Node3D:
  31. return null
  32. ## Need to be overridden to react to direction changed
  33. func _on_dir_changed(dir: Vector2) -> void:
  34. pass
  35. ## Need to be overridden to react to main action
  36. func _on_main_action(pressed: bool) -> void:
  37. pass