From 8f0f3d99989427ffa69de2d49cfcaf0b560f9690 Mon Sep 17 00:00:00 2001 From: Eduard Urbach Date: Tue, 16 Jan 2024 00:22:14 +0100 Subject: [PATCH] Improved network handling --- client/Client.gd | 27 ------------------ network/Login.gd | 26 ++++++++++++++++++ network/Network.gd | 33 ++++++++++++++++++++++ network/Ping.gd | 38 ++++++++++++++++++++++++++ project.godot | 4 --- server/login.go | 10 ++++++- server/ping.go | 3 +- ui/{FPS.gd => FPSLabel.gd} | 3 -- ui/Ping.gd | 37 ------------------------- ui/PingLabel.gd | 7 +++++ ui/UI.tscn | 41 ---------------------------- world/Environment.tres | 2 +- world/Game.gd | 17 +++++++----- world/Game.tscn | 56 ++++++++++++++++++++++++++++++++++++-- 14 files changed, 178 insertions(+), 126 deletions(-) delete mode 100644 client/Client.gd create mode 100644 network/Login.gd create mode 100644 network/Network.gd create mode 100644 network/Ping.gd rename ui/{FPS.gd => FPSLabel.gd} (53%) delete mode 100644 ui/Ping.gd create mode 100644 ui/PingLabel.gd delete mode 100644 ui/UI.tscn diff --git a/client/Client.gd b/client/Client.gd deleted file mode 100644 index f688038..0000000 --- a/client/Client.gd +++ /dev/null @@ -1,27 +0,0 @@ -extends Node - -const PLAYER = preload("res://player/Player.tscn") -var udp := PacketPeerUDP.new() - -func _ready(): - udp.connect_to_host("127.0.0.1", 4242) - send_login() - -func _process(_delta): - if Client.udp.get_available_packet_count() <= 0: - return - - var packet := Client.udp.get_packet() - var type := packet.decode_u8(0) - print("Packet type %d data size %d" % [type, packet.size()-1]) - -func send_login(): - var login_data = PackedByteArray() - login_data.push_back(2) - udp.put_packet(login_data) - print("Connecting...") - -func spawn_player(): - var player = PLAYER.instantiate() - add_child(player) - diff --git a/network/Login.gd b/network/Login.gd new file mode 100644 index 0000000..49b5fea --- /dev/null +++ b/network/Login.gd @@ -0,0 +1,26 @@ +extends Node + +const PLAYER = preload("res://player/Player.tscn") + +func _ready(): + %Network.add_handler(%Network.Packet.LOGIN, self) + send_login() + +func send_login(): + var buffer := StreamPeerBuffer.new() + buffer.put_8(%Network.Packet.LOGIN) + buffer.put_data("password".to_utf8_buffer()) + %Network.udp.put_packet(buffer.data_array) + print("Connecting...") + +func handle_packet(data: PackedByteArray): + if data[1] != 0: + print("Login failed.") + return + + print("Login succeeded.", data) + spawn_player() + +func spawn_player(): + var player = PLAYER.instantiate() + add_child(player) diff --git a/network/Network.gd b/network/Network.gd new file mode 100644 index 0000000..843a188 --- /dev/null +++ b/network/Network.gd @@ -0,0 +1,33 @@ +extends Node + +var udp := PacketPeerUDP.new() +var handlers: Array[Node] = [] + +enum Packet { + PING = 1, + LOGIN = 2, + LOGOUT = 3, + MOVE = 10, +} + +func _init(): + handlers.resize(256) + udp.connect_to_host("127.0.0.1", 4242) + +func _process(_delta): + if udp.get_available_packet_count() <= 0: + return + + var packet := udp.get_packet() + var type := packet.decode_u8(0) as Packet + var handler := handlers[type] + + if handler == null: + push_warning("Unknown packet type %d" % type) + return + + handler.handle_packet(packet) + +func add_handler(packet: Packet, node: Node): + assert(node.has_method("handle_packet")) + handlers[packet] = node diff --git a/network/Ping.gd b/network/Ping.gd new file mode 100644 index 0000000..e14ccca --- /dev/null +++ b/network/Ping.gd @@ -0,0 +1,38 @@ +extends Node + +signal changed(ping: float) + +const HISTORY_SIZE = 8 + +var count := 0 +var history: Array[float] = [] + +func _init(): + history.resize(HISTORY_SIZE) + +func _ready(): + %Network.add_handler(%Network.Packet.PING, self) + var timer := Timer.new() + add_child(timer) + timer.wait_time = 1 + timer.timeout.connect(_ping) + timer.start() + +func _ping(): + var buffer := StreamPeerBuffer.new() + buffer.put_8(%Network.Packet.PING) + buffer.put_8(count) + %Network.udp.put_packet(buffer.data_array) + + history[count] = Time.get_unix_time_from_system() + count += 1 + + if count >= HISTORY_SIZE: + count = 0 + +func handle_packet(data: PackedByteArray): + print("Handled ping!", data) + var id := data.decode_u8(1) + var ping := Time.get_unix_time_from_system() - history[id] + changed.emit(ping) + diff --git a/project.godot b/project.godot index 3c50ed4..343488a 100644 --- a/project.godot +++ b/project.godot @@ -15,10 +15,6 @@ run/main_scene="res://world/Game.tscn" config/features=PackedStringArray("4.2", "Forward Plus") config/icon="res://ui/icon.svg" -[autoload] - -Client="*res://client/Client.gd" - [display] window/vsync/vsync_mode=0 diff --git a/server/login.go b/server/login.go index 3b1fee5..247d551 100644 --- a/server/login.go +++ b/server/login.go @@ -1,6 +1,7 @@ package main import ( + "bytes" "fmt" "server/core" "server/packet" @@ -9,5 +10,12 @@ import ( // login checks the account credentials and gives a network peer access to an account. func login(data []byte, client *core.Client) { fmt.Println("2 - login!") - server.Send(packet.LOGIN, nil, client) + + if bytes.Equal(data, []byte("password")) { + fmt.Println("login success") + server.Send(packet.LOGIN, []byte{0}, client) + } else { + fmt.Println("login failure") + server.Send(packet.LOGIN, []byte{1}, client) + } } diff --git a/server/ping.go b/server/ping.go index abcf4e9..1f062e5 100644 --- a/server/ping.go +++ b/server/ping.go @@ -8,7 +8,6 @@ import ( // ping is used as a heartbeat and latency check. func ping(data []byte, client *core.Client) { - fmt.Println("1 - ping!") + fmt.Println("1 - ping") server.Send(packet.PING, data, client) - fmt.Println(server.Count(), "clients") } diff --git a/ui/FPS.gd b/ui/FPSLabel.gd similarity index 53% rename from ui/FPS.gd rename to ui/FPSLabel.gd index cc501b2..cec2818 100644 --- a/ui/FPS.gd +++ b/ui/FPSLabel.gd @@ -1,8 +1,5 @@ extends Label -func _ready(): - DisplayServer.window_set_vsync_mode(DisplayServer.VSYNC_DISABLED) - func _process(_delta): var fps = Engine.get_frames_per_second() text = str(fps) diff --git a/ui/Ping.gd b/ui/Ping.gd deleted file mode 100644 index 37065b6..0000000 --- a/ui/Ping.gd +++ /dev/null @@ -1,37 +0,0 @@ -extends Label - -const HISTORY_SIZE = 8 - -var pingCount := 0 -var pingSent: Array[float] = [] - -func _ready(): - var timer := Timer.new() - add_child(timer) - timer.wait_time = 1 - timer.connect("timeout", self._ping) - timer.start() - - pingSent.resize(HISTORY_SIZE) - -func _process(_delta): - pass - #if Client.udp.get_available_packet_count() > 0: - #var bytes := Client.udp.get_packet() - #var count := bytes.decode_u8(1) - #var timeSent := pingSent[count] - #var duration := Time.get_unix_time_from_system() - timeSent - #var ping := duration * 1000 - #text = str(snapped(ping, 0.01)) - -func _ping(): - var buffer := StreamPeerBuffer.new() - buffer.put_8(1) - buffer.put_8(pingCount) - Client.udp.put_packet(buffer.data_array) - - pingSent[pingCount] = Time.get_unix_time_from_system() - pingCount += 1 - - if pingCount >= HISTORY_SIZE: - pingCount = 0 diff --git a/ui/PingLabel.gd b/ui/PingLabel.gd new file mode 100644 index 0000000..bc05692 --- /dev/null +++ b/ui/PingLabel.gd @@ -0,0 +1,7 @@ +extends Label + +func _ready(): + %Ping.connect("changed", on_ping_changed) + +func on_ping_changed(ping): + text = str(snapped(ping * 1000, 0.01)) diff --git a/ui/UI.tscn b/ui/UI.tscn deleted file mode 100644 index b6d4220..0000000 --- a/ui/UI.tscn +++ /dev/null @@ -1,41 +0,0 @@ -[gd_scene load_steps=3 format=3 uid="uid://bxotvk73tbgw0"] - -[ext_resource type="Script" path="res://ui/FPS.gd" id="1_128dk"] -[ext_resource type="Script" path="res://ui/Ping.gd" id="2_m7fhx"] - -[node name="UI" type="Control"] -layout_mode = 3 -anchors_preset = 0 - -[node name="CanvasLayer" type="CanvasLayer" parent="."] - -[node name="MarginContainer" type="MarginContainer" parent="CanvasLayer"] -offset_right = 40.0 -offset_bottom = 50.0 - -[node name="VBoxContainer" type="VBoxContainer" parent="CanvasLayer/MarginContainer"] -layout_mode = 2 - -[node name="HBoxContainer" type="HBoxContainer" parent="CanvasLayer/MarginContainer/VBoxContainer"] -layout_mode = 2 - -[node name="FPSLabel" type="Label" parent="CanvasLayer/MarginContainer/VBoxContainer/HBoxContainer"] -layout_mode = 2 -text = "FPS:" - -[node name="FPS" type="Label" parent="CanvasLayer/MarginContainer/VBoxContainer/HBoxContainer"] -layout_mode = 2 -text = "0" -script = ExtResource("1_128dk") - -[node name="HBoxContainer2" type="HBoxContainer" parent="CanvasLayer/MarginContainer/VBoxContainer"] -layout_mode = 2 - -[node name="PingLabel" type="Label" parent="CanvasLayer/MarginContainer/VBoxContainer/HBoxContainer2"] -layout_mode = 2 -text = "Ping:" - -[node name="Ping" type="Label" parent="CanvasLayer/MarginContainer/VBoxContainer/HBoxContainer2"] -layout_mode = 2 -text = "0" -script = ExtResource("2_m7fhx") diff --git a/world/Environment.tres b/world/Environment.tres index 76f3fe8..081ea9c 100644 --- a/world/Environment.tres +++ b/world/Environment.tres @@ -7,4 +7,4 @@ ambient_light_source = 3 ambient_light_color = Color(0.607843, 0.756863, 0.92549, 1) ambient_light_sky_contribution = 0.17 tonemap_mode = 2 -adjustment_saturation = 0.01 +ssao_intensity = 16.0 diff --git a/world/Game.gd b/world/Game.gd index 32d0447..7a3a8bf 100644 --- a/world/Game.gd +++ b/world/Game.gd @@ -10,12 +10,15 @@ func _ready(): func _input(event): if event.is_action_pressed("toggle_fullscreen"): - var mode = DisplayServer.window_get_mode() + toggle_fullscreen() - match mode: - DisplayServer.WINDOW_MODE_FULLSCREEN: - DisplayServer.window_set_mode(DisplayServer.WINDOW_MODE_WINDOWED) - _: - DisplayServer.window_set_mode(DisplayServer.WINDOW_MODE_FULLSCREEN) +func toggle_fullscreen(): + var mode = DisplayServer.window_get_mode() - return + match mode: + DisplayServer.WINDOW_MODE_FULLSCREEN: + DisplayServer.window_set_mode(DisplayServer.WINDOW_MODE_WINDOWED) + _: + DisplayServer.window_set_mode(DisplayServer.WINDOW_MODE_FULLSCREEN) + + return diff --git a/world/Game.tscn b/world/Game.tscn index d2836ea..f5d211c 100644 --- a/world/Game.tscn +++ b/world/Game.tscn @@ -1,12 +1,16 @@ -[gd_scene load_steps=16 format=3 uid="uid://b40y7iuskv1ar"] +[gd_scene load_steps=20 format=3 uid="uid://b40y7iuskv1ar"] [ext_resource type="Script" path="res://world/Game.gd" id="1_xmqq4"] -[ext_resource type="PackedScene" uid="uid://bxotvk73tbgw0" path="res://ui/UI.tscn" id="2_x1l7l"] [ext_resource type="Script" path="res://world/RotateY.gd" id="3_4gn6n"] +[ext_resource type="Script" path="res://ui/FPSLabel.gd" id="3_k5d80"] +[ext_resource type="Script" path="res://ui/PingLabel.gd" id="4_1a3hc"] +[ext_resource type="Script" path="res://network/Network.gd" id="4_ao4cj"] [ext_resource type="Shader" path="res://world/shader/Outline.gdshader" id="4_gweie"] +[ext_resource type="Script" path="res://network/Ping.gd" id="4_vx388"] [ext_resource type="Environment" uid="uid://dixa0yso2s1u3" path="res://world/Environment.tres" id="5_bll74"] [ext_resource type="Script" path="res://world/Sun.gd" id="5_pf5uw"] [ext_resource type="CameraAttributesPractical" uid="uid://b835orxyqq6w5" path="res://world/CameraAttributes.tres" id="6_8wfwf"] +[ext_resource type="Script" path="res://network/Login.gd" id="6_augbg"] [sub_resource type="StandardMaterial3D" id="StandardMaterial3D_r8n03"] diffuse_mode = 3 @@ -67,7 +71,53 @@ mesh = SubResource("TorusMesh_mu45b") skeleton = NodePath("../../SubViewportContainer/SubViewport") script = ExtResource("3_4gn6n") -[node name="UI" parent="." instance=ExtResource("2_x1l7l")] +[node name="UI" type="Control" parent="."] +layout_mode = 3 +anchors_preset = 0 + +[node name="CanvasLayer" type="CanvasLayer" parent="UI"] + +[node name="MarginContainer" type="MarginContainer" parent="UI/CanvasLayer"] +offset_right = 40.0 +offset_bottom = 50.0 + +[node name="VBoxContainer" type="VBoxContainer" parent="UI/CanvasLayer/MarginContainer"] +layout_mode = 2 + +[node name="HBoxContainer" type="HBoxContainer" parent="UI/CanvasLayer/MarginContainer/VBoxContainer"] +layout_mode = 2 + +[node name="FPSLabel" type="Label" parent="UI/CanvasLayer/MarginContainer/VBoxContainer/HBoxContainer"] +layout_mode = 2 +text = "FPS:" + +[node name="FPS" type="Label" parent="UI/CanvasLayer/MarginContainer/VBoxContainer/HBoxContainer"] +layout_mode = 2 +text = "0" +script = ExtResource("3_k5d80") + +[node name="HBoxContainer2" type="HBoxContainer" parent="UI/CanvasLayer/MarginContainer/VBoxContainer"] +layout_mode = 2 + +[node name="PingLabel" type="Label" parent="UI/CanvasLayer/MarginContainer/VBoxContainer/HBoxContainer2"] +layout_mode = 2 +text = "Ping:" + +[node name="Ping" type="Label" parent="UI/CanvasLayer/MarginContainer/VBoxContainer/HBoxContainer2"] +layout_mode = 2 +text = "0" +script = ExtResource("4_1a3hc") + +[node name="Network" type="Node" parent="."] +unique_name_in_owner = true +script = ExtResource("4_ao4cj") + +[node name="Ping" type="Node" parent="Network"] +unique_name_in_owner = true +script = ExtResource("4_vx388") + +[node name="Login" type="Node" parent="Network"] +script = ExtResource("6_augbg") [node name="SubViewportContainer" type="SubViewportContainer" parent="."] texture_filter = 1