diff --git a/client/camera/Camera.gd b/client/camera/Camera.gd index faf2daf..5e611b7 100644 --- a/client/camera/Camera.gd +++ b/client/camera/Camera.gd @@ -22,7 +22,7 @@ var look_enabled: bool @export_group("Zoom") @export var zoom_speed := 0.5 -@export var zoom_interpolation := 10.0 +@export var zoom_interpolation := 7.5 @export var zoom_min := 2.5 @export var zoom_max := 8.0 var distance: float diff --git a/client/item/soul/Soul.gd b/client/item/soul/Soul.gd index 179a70f..cf78462 100644 --- a/client/item/soul/Soul.gd +++ b/client/item/soul/Soul.gd @@ -24,7 +24,7 @@ func _process(delta): if !collected_by: return - global_position = Math.damp(global_position, Global.player.global_position + Vector3.UP, 1.0 * delta) + global_position = Math.damp(global_position, Global.player.global_position + Vector3.UP, 0.75 * delta) func on_body_entered(body: Node3D): if not body is Player: diff --git a/client/math/Math.gd b/client/math/Math.gd index 63a9580..7d55539 100644 --- a/client/math/Math.gd +++ b/client/math/Math.gd @@ -1,16 +1,16 @@ class_name Math -static func damp(from: Variant, to: Variant, weight: float, smoothing: float = 0.75): - return lerp(from, to, 1 - exp(-smoothing * weight)) +static func damp(from: Variant, to: Variant, weight: float): + return lerp(from, to, 1 - exp(-weight)) -static func dampf(from: float, to: float, weight: float, smoothing: float = 0.75): - return lerpf(from, to, 1 - exp(-smoothing * weight)) +static func dampf(from: float, to: float, weight: float): + return lerpf(from, to, 1 - exp(-weight)) -static func damp_angle(from: float, to: float, weight: float, smoothing: float = 0.75): - return lerp_angle(from, to, 1 - exp(-smoothing * weight)) +static func damp_angle(from: float, to: float, weight: float): + return lerp_angle(from, to, 1 - exp(-weight)) -static func damp_spherical(from: Vector3, to: Vector3, weight: float, smoothing: float = 0.75): - return from.slerp(to, 1 - exp(-smoothing * weight)) +static func damp_spherical(from: Vector3, to: Vector3, weight: float): + return from.slerp(to, 1 - exp(-weight)) static func from_to_rotation(from: Vector3, to: Vector3) -> Quaternion: var axis := from.cross(to).normalized() diff --git a/client/network/PlayerAdd.gd b/client/network/PlayerAdd.gd index 274a0d7..7006a2b 100644 --- a/client/network/PlayerAdd.gd +++ b/client/network/PlayerAdd.gd @@ -21,11 +21,10 @@ func handle_packet(data: PackedByteArray): %Client.log("Add player: %s %s @ %v" % [player_id, player_name, server_position]) - var player := spawn_player(player_id) - player.position = server_position + var player := spawn_player(player_id, server_position) player.set_player_name(player_name) -func spawn_player(id: String) -> Player: +func spawn_player(id: String, position: Vector3) -> Player: var player: Player if Global.players.has(id): @@ -38,6 +37,7 @@ func spawn_player(id: String) -> Player: player = player_scene.instantiate() player.id = id + player.position = position if id == Global.account.id: player.controller = PlayerController.new(player) diff --git a/client/network/PlayerMove.gd b/client/network/PlayerMove.gd index d6f2c64..ba71462 100644 --- a/client/network/PlayerMove.gd +++ b/client/network/PlayerMove.gd @@ -1,9 +1,15 @@ +class_name PlayerMove extends PacketHandler -@export var delay := 50 +const updates_per_second := 20.0 -var last_sent := Time.get_ticks_msec() +var delay: float +var last_sent := Time.get_unix_time_from_system() var last_sent_position := Vector3.ZERO +var last_sent_direction := Vector3.ZERO + +func _ready(): + delay = 1.0 / updates_per_second func handle_packet(data: PackedByteArray): var buffer := StreamPeerBuffer.new() @@ -30,21 +36,22 @@ func handle_packet(data: PackedByteArray): controller.server_position.z = z controller.direction_changed.emit(Vector3(direction_x, 0, direction_z)) -func _physics_process(_delta): +func _process(_delta): if !Global.player: return - if Global.player.position == last_sent_position: + if Global.player.position == last_sent_position && Global.player.movement.direction == last_sent_direction: return - if Time.get_ticks_msec() < last_sent + delay: + if Time.get_unix_time_from_system() < last_sent + delay: return - send_position() - last_sent = Time.get_ticks_msec() + send_movement() + last_sent = Time.get_unix_time_from_system() last_sent_position = Global.player.position + last_sent_direction = Global.player.movement.direction -func send_position(): +func send_movement(): var buffer := StreamPeerBuffer.new() buffer.put_u8(PacketHandler.Packet.PLAYER_MOVE) buffer.put_float(Global.player.position.x) diff --git a/client/player/controller/BotController.gd b/client/player/controller/BotController.gd new file mode 100644 index 0000000..c059441 --- /dev/null +++ b/client/player/controller/BotController.gd @@ -0,0 +1,13 @@ +class_name BotController +extends Controller + +var turn: float +var turn_speed: float = 2.0 + +func _process(delta): + if (Time.get_ticks_msec() / 1000) % 2 == 0: + direction_changed.emit(Vector3.ZERO) + else: + turn += turn_speed * delta + var direction := Vector3.RIGHT.rotated(Vector3.UP, turn) + direction_changed.emit(direction) \ No newline at end of file diff --git a/client/player/controller/ProxyController.gd b/client/player/controller/ProxyController.gd index 27bb31f..4703fae 100644 --- a/client/player/controller/ProxyController.gd +++ b/client/player/controller/ProxyController.gd @@ -1,7 +1,7 @@ class_name ProxyController extends Controller -@export var interpolation_speed: float = 10.0 +@export var interpolation_speed := 5.0 var player: Player var server_position: Vector3 @@ -13,7 +13,7 @@ func _init(new_player: Player): func _ready(): server_position = player.position -func _process(delta: float): +func _physics_process(delta: float): var time := interpolation_speed * delta player.position.x = Math.dampf(player.position.x, server_position.x, time) player.position.z = Math.dampf(player.position.z, server_position.z, time) \ No newline at end of file diff --git a/client/player/movement/MovementComponent.gd b/client/player/movement/MovementComponent.gd index cef2295..c2cfd10 100644 --- a/client/player/movement/MovementComponent.gd +++ b/client/player/movement/MovementComponent.gd @@ -3,7 +3,7 @@ extends Node @export var move_speed := 4.5 @export var jump_velocity := 4.5 -@export var deceleration := 0.75 +@export var deceleration_speed := 20 var body: Character var direction: Vector3 @@ -20,8 +20,8 @@ func _physics_process(delta): body.velocity.x = direction.x * move_speed body.velocity.z = direction.z * move_speed else: - body.velocity.x *= deceleration - body.velocity.z *= deceleration + body.velocity.x = Math.dampf(body.velocity.x, 0, deceleration_speed * delta) + body.velocity.z = Math.dampf(body.velocity.z, 0, deceleration_speed * delta) if !body.is_on_floor(): body.velocity.y -= gravity * delta diff --git a/client/player/rotation/RotationComponent.gd b/client/player/rotation/RotationComponent.gd index 0ae2705..116d5a6 100644 --- a/client/player/rotation/RotationComponent.gd +++ b/client/player/rotation/RotationComponent.gd @@ -2,7 +2,7 @@ class_name RotationComponent extends Node @export var root: Node3D -@export var rotation_speed: float = 20.0 +@export var rotation_speed: float = 15.0 var direction: Vector3 var angle: float diff --git a/client/project.godot b/client/project.godot index bc1ddcb..92b4f10 100644 --- a/client/project.godot +++ b/client/project.godot @@ -37,10 +37,6 @@ window/stretch/mode="canvas_items" window/stretch/aspect="expand" window/vsync/vsync_mode=0 -[editor] - -run/main_run_args="--offline" - [editor_plugins] enabled=PackedStringArray("res://addons/terrain_3d/plugin.cfg") @@ -167,4 +163,5 @@ skill_4={ [physics] +common/physics_jitter_fix=0.0 3d/physics_engine="JoltPhysics3D"