Improved reconnect flow
This commit is contained in:
@ -1,26 +1,40 @@
|
||||
extends Node
|
||||
|
||||
func _ready():
|
||||
pause(true)
|
||||
|
||||
Global.instance_id = OS.get_process_id() % 4
|
||||
Global.username = "user%d" % Global.instance_id
|
||||
|
||||
%Login.success.connect(on_login)
|
||||
%Logout.success.connect(on_logout)
|
||||
%Login.send_login()
|
||||
|
||||
mute_audio()
|
||||
|
||||
func _input(event):
|
||||
if event.is_action_pressed("toggle_fullscreen"):
|
||||
toggle_fullscreen()
|
||||
get_viewport().set_input_as_handled()
|
||||
|
||||
func mute_audio():
|
||||
var master_sound = AudioServer.get_bus_index("Master")
|
||||
AudioServer.set_bus_mute(master_sound, true)
|
||||
|
||||
func on_login():
|
||||
print("[%s] Login succeeded." % Global.username)
|
||||
print("[%s] ID: %s" % [Global.username, Global.account_id])
|
||||
print("[%s] Auth token: %s" % [Global.username, Global.auth_token])
|
||||
|
||||
DisplayServer.window_set_title("%s - %s" % [Global.username, Global.account_id])
|
||||
DisplayServer.window_set_position(Vector2((Global.instance_id % 2) * 960, (Global.instance_id / 2 % 2) * 540))
|
||||
pause(false)
|
||||
|
||||
func on_logout():
|
||||
print("[%s] Logout." % Global.username)
|
||||
pause(true)
|
||||
|
||||
func pause(enabled: bool):
|
||||
get_tree().paused = enabled
|
||||
mute_audio(enabled)
|
||||
|
||||
func mute_audio(enabled: bool):
|
||||
var master_sound = AudioServer.get_bus_index("Master")
|
||||
AudioServer.set_bus_mute(master_sound, enabled)
|
||||
|
||||
func toggle_fullscreen():
|
||||
var mode = DisplayServer.window_get_mode()
|
||||
|
@ -1,10 +1,11 @@
|
||||
[gd_scene load_steps=24 format=3 uid="uid://b40y7iuskv1ar"]
|
||||
[gd_scene load_steps=25 format=3 uid="uid://b40y7iuskv1ar"]
|
||||
|
||||
[ext_resource type="Script" path="res://Main.gd" id="1_cw3ws"]
|
||||
[ext_resource type="Script" path="res://network/Client.gd" id="2_8hxcx"]
|
||||
[ext_resource type="Script" path="res://network/Ping.gd" id="3_d6qf1"]
|
||||
[ext_resource type="Script" path="res://network/Login.gd" id="4_fsx7a"]
|
||||
[ext_resource type="Script" path="res://network/PlayerAdd.gd" id="5_376ik"]
|
||||
[ext_resource type="Script" path="res://network/Logout.gd" id="5_au5w3"]
|
||||
[ext_resource type="PackedScene" uid="uid://2lcnu3dy54lx" path="res://player/Player.tscn" id="6_cdj8w"]
|
||||
[ext_resource type="Script" path="res://network/PlayerRemove.gd" id="7_2r42o"]
|
||||
[ext_resource type="Script" path="res://network/PlayerMove.gd" id="8_ke1yy"]
|
||||
@ -40,6 +41,7 @@ script = ExtResource("1_cw3ws")
|
||||
|
||||
[node name="Client" type="Node" parent="."]
|
||||
unique_name_in_owner = true
|
||||
process_mode = 3
|
||||
script = ExtResource("2_8hxcx")
|
||||
|
||||
[node name="Ping" type="Node" parent="Client"]
|
||||
@ -59,6 +61,11 @@ packet_type = 2
|
||||
wait_time = 5.0
|
||||
autostart = true
|
||||
|
||||
[node name="Logout" type="Node" parent="Client"]
|
||||
unique_name_in_owner = true
|
||||
script = ExtResource("5_au5w3")
|
||||
packet_type = 3
|
||||
|
||||
[node name="PlayerAdd" type="Node" parent="Client"]
|
||||
unique_name_in_owner = true
|
||||
script = ExtResource("5_376ik")
|
||||
@ -71,7 +78,6 @@ packet_type = 11
|
||||
|
||||
[node name="PlayerMove" type="Node" parent="Client"]
|
||||
script = ExtResource("8_ke1yy")
|
||||
delay = null
|
||||
packet_type = 12
|
||||
|
||||
[node name="PlayerJump" type="Node" parent="Client"]
|
||||
@ -131,6 +137,7 @@ unique_name_in_owner = true
|
||||
script = ExtResource("16_dp6bj")
|
||||
|
||||
[node name="UI" parent="." instance=ExtResource("17_43qhq")]
|
||||
process_mode = 3
|
||||
|
||||
[node name="Viewport" type="SubViewportContainer" parent="."]
|
||||
texture_filter = 1
|
||||
|
@ -8,7 +8,7 @@ func send_message(message: String):
|
||||
buffer.put_data(message.to_utf8_buffer())
|
||||
%Client.send(buffer.data_array)
|
||||
|
||||
func handle_packet(data: PackedByteArray, _peer: PacketPeer):
|
||||
func handle_packet(data: PackedByteArray):
|
||||
var buffer := StreamPeerBuffer.new()
|
||||
buffer.data_array = data
|
||||
|
||||
|
@ -21,7 +21,7 @@ func _enter_tree():
|
||||
func _process(_delta):
|
||||
while socket.get_available_packet_count() > 0:
|
||||
var packet := socket.get_packet()
|
||||
handle_packet(packet, socket)
|
||||
handle_packet(packet)
|
||||
|
||||
func update_statistics():
|
||||
download_changed.emit(download)
|
||||
@ -31,4 +31,4 @@ func update_statistics():
|
||||
|
||||
func send(data: PackedByteArray):
|
||||
socket.put_packet(data)
|
||||
upload += data.size()
|
||||
upload += data.size()
|
||||
|
@ -3,7 +3,7 @@ extends PacketHandler
|
||||
signal success
|
||||
signal failure
|
||||
|
||||
func handle_packet(data: PackedByteArray, _peer: PacketPeer):
|
||||
func handle_packet(data: PackedByteArray):
|
||||
var buffer := StreamPeerBuffer.new()
|
||||
buffer.data_array = data
|
||||
|
||||
@ -15,10 +15,6 @@ func handle_packet(data: PackedByteArray, _peer: PacketPeer):
|
||||
|
||||
Global.account_id = buffer.get_string()
|
||||
Global.auth_token = buffer.get_string()
|
||||
|
||||
print("[%s] Login succeeded." % Global.username)
|
||||
print("[%s] ID: %s" % [Global.username, Global.account_id])
|
||||
print("[%s] Auth token: %s" % [Global.username, Global.auth_token])
|
||||
|
||||
success.emit()
|
||||
|
||||
|
12
client/network/Logout.gd
Normal file
12
client/network/Logout.gd
Normal file
@ -0,0 +1,12 @@
|
||||
extends PacketHandler
|
||||
|
||||
signal success
|
||||
|
||||
func handle_packet(_data: PackedByteArray):
|
||||
logout()
|
||||
success.emit()
|
||||
|
||||
func logout():
|
||||
Global.auth_token = ""
|
||||
Global.account_id = ""
|
||||
Global.player = null
|
@ -10,7 +10,7 @@ var history: Array[float] = []
|
||||
func _init():
|
||||
history.resize(HISTORY_SIZE)
|
||||
|
||||
func handle_packet(data: PackedByteArray, _peer: PacketPeer):
|
||||
func handle_packet(data: PackedByteArray):
|
||||
var id := data[0]
|
||||
var ping := get_time() - history[id]
|
||||
changed.emit(ping)
|
||||
|
@ -7,7 +7,7 @@ signal main_player_spawned(player: Player)
|
||||
func _ready():
|
||||
assert(player_scene)
|
||||
|
||||
func handle_packet(data: PackedByteArray, _peer: PacketPeer):
|
||||
func handle_packet(data: PackedByteArray):
|
||||
var buffer := StreamPeerBuffer.new()
|
||||
buffer.data_array = data
|
||||
|
||||
@ -24,19 +24,29 @@ func handle_packet(data: PackedByteArray, _peer: PacketPeer):
|
||||
var player := spawn_player(player_id)
|
||||
player.position = server_position
|
||||
player.set_character_name(player_name)
|
||||
Global.players.add(player)
|
||||
|
||||
func spawn_player(id: String) -> Player:
|
||||
var player = player_scene.instantiate()
|
||||
var player: Player
|
||||
|
||||
if Global.players.has(id):
|
||||
player = Global.players.get_player(id)
|
||||
|
||||
if id == Global.account_id:
|
||||
Global.player = player
|
||||
|
||||
return player
|
||||
|
||||
player = player_scene.instantiate()
|
||||
player.id = id
|
||||
|
||||
if id == Global.account_id:
|
||||
Global.player = player
|
||||
player.controller = PlayerController.new()
|
||||
Global.player = player
|
||||
main_player_spawned.emit(player)
|
||||
else:
|
||||
player.controller = ProxyController.new()
|
||||
|
||||
player.controller.character = player
|
||||
player.add_child(player.controller)
|
||||
%Players.add(player)
|
||||
return player
|
||||
|
@ -11,7 +11,7 @@ func on_jump():
|
||||
buffer.put_8(PacketHandler.Packet.PLAYER_JUMP)
|
||||
%Client.send(buffer.data_array)
|
||||
|
||||
func handle_packet(data: PackedByteArray, _peer: PacketPeer):
|
||||
func handle_packet(data: PackedByteArray):
|
||||
var player_id := data.get_string_from_ascii()
|
||||
var player := Global.players.get_player(player_id)
|
||||
player.jump()
|
||||
|
@ -5,7 +5,7 @@ extends PacketHandler
|
||||
var last_sent := Time.get_ticks_msec()
|
||||
var last_sent_position := Vector3.ZERO
|
||||
|
||||
func handle_packet(data: PackedByteArray, _peer: PacketPeer):
|
||||
func handle_packet(data: PackedByteArray):
|
||||
var buffer := StreamPeerBuffer.new()
|
||||
buffer.data_array = data
|
||||
|
||||
|
@ -1,6 +1,6 @@
|
||||
extends PacketHandler
|
||||
|
||||
func handle_packet(data: PackedByteArray, _peer: PacketPeer):
|
||||
func handle_packet(data: PackedByteArray):
|
||||
var player_id := data.get_string_from_ascii()
|
||||
print("[%s] Remove player: %s" % [Global.username, player_id])
|
||||
%Players.remove(player_id)
|
||||
Global.players.remove(player_id)
|
@ -13,7 +13,7 @@ func get_handler(index: int) -> PacketHandler:
|
||||
func set_handler(index: int, node: PacketHandler):
|
||||
handlers[index] = node
|
||||
|
||||
func handle_packet(packet: PackedByteArray, peer: PacketPeer):
|
||||
func handle_packet(packet: PackedByteArray):
|
||||
var type := packet.decode_u8(0)
|
||||
var handler := get_handler(type)
|
||||
|
||||
@ -21,5 +21,5 @@ func handle_packet(packet: PackedByteArray, peer: PacketPeer):
|
||||
push_warning("Unknown packet type %d" % type)
|
||||
return
|
||||
|
||||
handler.handle_packet(packet.slice(1), peer)
|
||||
handler.handle_packet(packet.slice(1))
|
||||
download += packet.size()
|
||||
|
@ -16,5 +16,5 @@ enum Packet {
|
||||
|
||||
@export var packet_type: Packet
|
||||
|
||||
func handle_packet(_data: PackedByteArray, _peer: PacketPeer):
|
||||
func handle_packet(_data: PackedByteArray):
|
||||
pass
|
5
client/player/controller/Controller.gd
Normal file
5
client/player/controller/Controller.gd
Normal file
@ -0,0 +1,5 @@
|
||||
class_name Controller
|
||||
extends Node
|
||||
|
||||
## The character that we're controlling.
|
||||
@export var character: Character
|
@ -1,8 +1,5 @@
|
||||
class_name PlayerController
|
||||
extends Node
|
||||
|
||||
## The character that we're controlling.
|
||||
@export var character: Character
|
||||
extends Controller
|
||||
|
||||
var move: Vector2
|
||||
|
||||
|
@ -1,20 +1,19 @@
|
||||
class_name ProxyController
|
||||
extends Node
|
||||
|
||||
## The character that we're controlling.
|
||||
@export var character: Character
|
||||
extends Controller
|
||||
|
||||
## The authoritative position on the server.
|
||||
var server_position: Vector3
|
||||
|
||||
func _ready():
|
||||
print(character.name, ".old: ", server_position)
|
||||
server_position = character.position
|
||||
print(character.name, ".new: ", server_position)
|
||||
|
||||
func _process(_delta):
|
||||
var move := server_position - character.position
|
||||
move.y = 0.0
|
||||
|
||||
if move.length_squared() < 0.01:
|
||||
# character.position = server_position
|
||||
character.direction = Vector3.ZERO
|
||||
return
|
||||
|
||||
|
@ -7,9 +7,13 @@ var ping_changed: Signal
|
||||
var download_changed: Signal
|
||||
var upload_changed: Signal
|
||||
var message_received: Signal
|
||||
var login: Signal
|
||||
var logout: Signal
|
||||
|
||||
func _enter_tree():
|
||||
ping_changed = %Ping.changed
|
||||
download_changed = %Client.download_changed
|
||||
upload_changed = %Client.upload_changed
|
||||
message_received = %Chat.message_received
|
||||
login = %Login.success
|
||||
logout = %Logout.success
|
||||
|
@ -1,4 +1,4 @@
|
||||
[gd_scene load_steps=11 format=3 uid="uid://dagn5bf7ou3sd"]
|
||||
[gd_scene load_steps=12 format=3 uid="uid://dagn5bf7ou3sd"]
|
||||
|
||||
[ext_resource type="PackedScene" uid="uid://cch67vqpsmtej" path="res://ui/debug/DebugLabel.tscn" id="1_7s8uu"]
|
||||
[ext_resource type="Script" path="res://ui/UI.gd" id="1_l5b6o"]
|
||||
@ -10,6 +10,7 @@
|
||||
[ext_resource type="Script" path="res://ui/chat/ChatInput.gd" id="6_cg2h5"]
|
||||
[ext_resource type="Script" path="res://ui/debug/UploadLabel.gd" id="7_cfnpx"]
|
||||
[ext_resource type="Script" path="res://ui/debug/DownloadLabel.gd" id="8_ogt38"]
|
||||
[ext_resource type="Script" path="res://ui/connect/ConnectPanel.gd" id="11_cwl0t"]
|
||||
|
||||
[node name="UI" type="Control"]
|
||||
layout_mode = 3
|
||||
@ -102,6 +103,29 @@ layout_mode = 2
|
||||
alignment = 2
|
||||
script = ExtResource("5_8lm6a")
|
||||
|
||||
[node name="ConnectPanel" type="Panel" parent="CanvasLayer"]
|
||||
anchors_preset = 15
|
||||
anchor_right = 1.0
|
||||
anchor_bottom = 1.0
|
||||
grow_horizontal = 2
|
||||
grow_vertical = 2
|
||||
script = ExtResource("11_cwl0t")
|
||||
|
||||
[node name="ConnectLabel" type="Label" parent="CanvasLayer/ConnectPanel"]
|
||||
layout_mode = 1
|
||||
anchors_preset = 8
|
||||
anchor_left = 0.5
|
||||
anchor_top = 0.5
|
||||
anchor_right = 0.5
|
||||
anchor_bottom = 0.5
|
||||
offset_left = -47.5
|
||||
offset_top = -10.0
|
||||
offset_right = 47.5
|
||||
offset_bottom = 10.0
|
||||
grow_horizontal = 2
|
||||
grow_vertical = 2
|
||||
text = "Connecting..."
|
||||
|
||||
[connection signal="focus_entered" from="CanvasLayer/BottomLeft/Chat/ChatInput" to="CanvasLayer/BottomLeft/Chat/ChatInput" method="_on_focus_entered"]
|
||||
[connection signal="focus_exited" from="CanvasLayer/BottomLeft/Chat/ChatInput" to="CanvasLayer/BottomLeft/Chat/ChatInput" method="_on_focus_exited"]
|
||||
[connection signal="text_submitted" from="CanvasLayer/BottomLeft/Chat/ChatInput" to="CanvasLayer/BottomLeft/Chat/ChatInput" method="_on_text_submitted"]
|
||||
|
11
client/ui/connect/ConnectPanel.gd
Normal file
11
client/ui/connect/ConnectPanel.gd
Normal file
@ -0,0 +1,11 @@
|
||||
extends Panel
|
||||
|
||||
func _ready():
|
||||
owner.login.connect(on_login)
|
||||
owner.logout.connect(on_logout)
|
||||
|
||||
func on_login():
|
||||
hide()
|
||||
|
||||
func on_logout():
|
||||
show()
|
@ -7,12 +7,18 @@ func _ready():
|
||||
Global.players = self
|
||||
|
||||
func add(player: Player):
|
||||
if has(player.id):
|
||||
return
|
||||
|
||||
add_child(player)
|
||||
players[player.id] = player
|
||||
|
||||
func get_player(id: String) -> Player:
|
||||
return players[id] as Player
|
||||
|
||||
func has(id: String) -> bool:
|
||||
return players.has(id)
|
||||
|
||||
func remove(id: String):
|
||||
if !players.has(id):
|
||||
return
|
||||
|
Reference in New Issue
Block a user