first iteration with authorative movement

This commit is contained in:
2025-02-01 19:41:38 +09:00
parent 3ef5254792
commit c8c5c08b4d
49 changed files with 1364 additions and 0 deletions
+97
View File
@@ -0,0 +1,97 @@
extends CharacterBody3D
const _gravity := -30.0
@export var player_id := 69:
set(id):
player_id = id
%RunnerInput.set_multiplayer_authority(id)
@export_group("Camera")
@export_range(0.0, 1.0) var mouse_sensitivity := 0.2
@export var camera_follow_speed := 10.0
@export var smooth_camera := false
@export_group("Movement")
@export var move_speed := 8.0
@export var acceleration := 30.0
@export var rotation_speed := 20.0
@export_group("Client Tweening")
@export var client_smoothing := false
@export var client_smoothing_speed := 5.0
@export var client_smoothing_rotation_speed := 10.0
@onready var _camera_pivot: Node3D = %CameraPivot
@onready var _camera_target: Node3D = %RunnerCameraTarget
@onready var _camera: Node3D = %RunnerCamera
@onready var _skin: Node3D = %RunnerSkin
var _camera_input_direction := Vector2.ZERO
var _last_direction := Vector3.FORWARD
var _on_ground := false
@export var server_position := Vector3.ZERO
@export var server_rotation := Vector3.ZERO
func _ready() -> void:
if multiplayer.is_server():
return
if multiplayer.get_unique_id() == player_id:
%RunnerCamera.make_current()
else:
%RunnerCamera.clear_current(false)
func _input(event: InputEvent) -> void:
if multiplayer.get_unique_id() != player_id:
return
if event.is_action_pressed("mouse_capture"):
Input.mouse_mode = Input.MOUSE_MODE_CAPTURED
elif event.is_action_pressed("mouse_release"):
Input.mouse_mode = Input.MOUSE_MODE_VISIBLE
if event is InputEventMouseMotion:
if Input.get_mouse_mode() == Input.MOUSE_MODE_CAPTURED:
_camera_input_direction += event.screen_relative * mouse_sensitivity
func _physics_process(delta: float) -> void:
if multiplayer.get_unique_id() == player_id:
_camera_pivot.rotation.x = clamp(
_camera_pivot.rotation.x - _camera_input_direction.y * delta,
-PI / 3.0,
PI / 6.0,
)
_camera_pivot.rotation.y -= _camera_input_direction.x * delta
_camera.global_rotation = _camera_pivot.global_rotation
if smooth_camera:
_camera.global_position = lerp(_camera.global_position, _camera_target.global_position, camera_follow_speed * delta)
else:
_camera.global_position = _camera_target.global_position
_camera_input_direction = Vector2.ZERO
if multiplayer.is_server():
var move_direction = Vector3(%RunnerInput.move_direction.x, 0, %RunnerInput.move_direction.y)
var y_velocity := velocity.y
velocity = velocity.move_toward(move_direction * move_speed, acceleration * delta)
velocity.y = y_velocity + (_gravity * delta)
move_and_slide()
if move_direction.length() >= 0.1:
_last_direction = move_direction
var target_angle := Vector3.FORWARD.signed_angle_to(_last_direction, Vector3.UP)
_skin.global_rotation.y = lerp_angle(_skin.rotation.y, target_angle, rotation_speed * delta)
server_position = position
server_rotation = _skin.global_rotation
else:
if client_smoothing:
position = lerp(position, server_position, client_smoothing_speed * delta)
_skin.global_rotation.y = lerp_angle(_skin.global_rotation.y, server_rotation.y, client_smoothing_rotation_speed * delta)
else:
position = server_position
_skin.global_rotation.y = server_rotation.y