add client prediction
This commit is contained in:
+26
-11
@@ -19,10 +19,16 @@ extends CharacterBody3D
|
||||
@export var air_deceleration := 5.0
|
||||
@export var rotation_speed := 20.0
|
||||
|
||||
@export_group("Client Tweening")
|
||||
@export_group("Client Smoothing")
|
||||
@export var client_smoothing := false
|
||||
@export var client_smoothing_speed := 10.0
|
||||
@export var client_smoothing_rotation_speed := 25.0
|
||||
@export var client_prediction := false
|
||||
@export var client_prediction_tolerance := 0.3
|
||||
|
||||
@export_group("Server variables")
|
||||
@export var server_position := Vector3.ZERO
|
||||
@export var server_rotation := Vector3.ZERO
|
||||
|
||||
@onready var _camera_pivot: Node3D = %CameraPivot
|
||||
@onready var _camera_platform: Node3D = %CameraPlatform
|
||||
@@ -32,9 +38,8 @@ extends CharacterBody3D
|
||||
var camera_input_direction := Vector2.ZERO
|
||||
var last_direction := Vector3.FORWARD
|
||||
|
||||
@export_group("Server variables")
|
||||
@export var server_position := Vector3.ZERO
|
||||
@export var server_rotation := Vector3.ZERO
|
||||
var predicted_position := Vector3.ZERO
|
||||
var predicted_rotation := Vector3.ZERO
|
||||
|
||||
func _ready() -> void:
|
||||
state_machine.set_subject(self)
|
||||
@@ -80,14 +85,24 @@ func _physics_process(delta: float) -> void:
|
||||
camera_input_direction = Vector2.ZERO
|
||||
|
||||
if not multiplayer.is_server():
|
||||
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
|
||||
if multiplayer.get_unique_id() == player_id and client_prediction:
|
||||
predicted_position = position
|
||||
predicted_rotation = skin.global_rotation
|
||||
|
||||
if multiplayer.get_unique_id() != player_id or not client_prediction:
|
||||
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
|
||||
|
||||
if multiplayer.is_server():
|
||||
server_position = position
|
||||
server_rotation = skin.global_rotation
|
||||
#print("Velocity: %s" % velocity)
|
||||
pass
|
||||
|
||||
func _on_sync_delta_synchronized() -> void:
|
||||
if client_prediction and server_position.distance_to(predicted_position) > client_prediction_tolerance:
|
||||
print("%v VS %v" % [server_position, predicted_position])
|
||||
position = server_position
|
||||
|
||||
Reference in New Issue
Block a user