Added thread safe packet handlers

This commit is contained in:
Eduard Urbach 2024-02-28 13:23:17 +01:00
parent cb4dd41358
commit db3ee3a685
Signed by: akyoto
GPG Key ID: C874F672B1AF20C0
11 changed files with 37 additions and 16 deletions

View File

@ -15,9 +15,13 @@ func handle_packet(data: PackedByteArray):
var player_id := buffer.get_string() var player_id := buffer.get_string()
var player := Global.players.get_player(player_id) var player := Global.players.get_player(player_id)
var message := buffer.get_utf8_string() var message := buffer.get_utf8_string()
message = escape_bbcode(message)
Log.info("%s: %s" % [player.name, message]) Log.info("%s: %s" % [player.name, message])
message_received.emit("[color=#e0e0e0]%s:[/color] %s" % [player.name, escape_bbcode(message)]) emit.call_deferred(player.name, message)
func emit(player_name: String, message: String):
message_received.emit("[color=#e0e0e0]%s:[/color] %s" % [player_name, message])
func escape_bbcode(text: String) -> String: func escape_bbcode(text: String) -> String:
return text.replace("[", "[lb]") return text.replace("[", "[lb]")

View File

@ -10,12 +10,18 @@ func handle_packet(data: PackedByteArray):
var error := buffer.get_8() var error := buffer.get_8()
if error != 0: if error != 0:
Log.info("[%s] Login failed." % Global.account.name) Log.info("[%s] Login failed." % Global.account.name)
failure.emit() emit_failure.call_deferred()
return return
Global.account.id = buffer.get_string() Global.account.id = buffer.get_string()
Global.account.auth_token = buffer.get_string() Global.account.auth_token = buffer.get_string()
emit_success.call_deferred()
func emit_failure():
failure.emit()
func emit_success():
success.emit() success.emit()
func send_login(): func send_login():

View File

@ -4,6 +4,9 @@ signal success
func handle_packet(_data: PackedByteArray): func handle_packet(_data: PackedByteArray):
logout() logout()
emit.call_deferred()
func emit():
success.emit() success.emit()
func logout(): func logout():

View File

@ -9,7 +9,6 @@ var history: Array[float] = []
func _init(): func _init():
history.resize(HISTORY_SIZE) history.resize(HISTORY_SIZE)
thread_safe = true
func handle_packet(data: PackedByteArray): func handle_packet(data: PackedByteArray):
var id := data[0] var id := data[0]

View File

@ -21,7 +21,7 @@ func handle_packet(data: PackedByteArray):
Log.info("Add player: %s %s @ %v" % [player_id, player_name, server_position]) Log.info("Add player: %s %s @ %v" % [player_id, player_name, server_position])
spawn_player(player_id, player_name, server_position) spawn_player.call_deferred(player_id, player_name, server_position)
func spawn_player(id: String, nick: String, position: Vector3) -> Player: func spawn_player(id: String, nick: String, position: Vector3) -> Player:
var player: Player var player: Player

View File

@ -18,7 +18,10 @@ func handle_packet(data: PackedByteArray):
var player_id := data.get_string_from_ascii() var player_id := data.get_string_from_ascii()
var player := Global.players.get_player(player_id) var player := Global.players.get_player(player_id)
if !player: if !player || !player.controller:
return return
player.controller.jumped.emit() emit.call_deferred(player.controller)
func emit(controller: Controller):
controller.jumped.emit()

View File

@ -34,7 +34,10 @@ func handle_packet(data: PackedByteArray):
controller.server_position.x = x controller.server_position.x = x
controller.server_position.z = z controller.server_position.z = z
controller.direction_changed.emit(Vector3(direction_x, 0, direction_z)) emit.call_deferred(controller, Vector3(direction_x, 0, direction_z))
func emit(controller: Controller, direction: Vector3):
controller.direction_changed.emit(direction)
func _process(_delta: float): func _process(_delta: float):
if !Global.player: if !Global.player:

View File

@ -22,6 +22,12 @@ func handle_packet(data: PackedByteArray):
var player_id_length := buffer.get_size() - 1 var player_id_length := buffer.get_size() - 1
var player_id := buffer.get_string(player_id_length) var player_id := buffer.get_string(player_id_length)
var slot := buffer.get_u8() var slot := buffer.get_u8()
var player := Global.players.get_player(player_id) var player := Global.players.get_player(player_id)
player.controller.used_skill.emit(slot)
if !player || !player.controller:
return
emit.call_deferred(player.controller, slot)
func emit(controller: Controller, slot: int):
controller.used_skill.emit(slot)

View File

@ -21,9 +21,5 @@ func handle_packet(packet: PackedByteArray):
push_warning("Unknown packet type %d" % type) push_warning("Unknown packet type %d" % type)
return return
if handler.thread_safe: handler.handle_packet(packet.slice(1))
handler.handle_packet(packet.slice(1))
else:
handler.handle_packet.call_deferred(packet.slice(1))
download += packet.size() download += packet.size()

View File

@ -16,7 +16,5 @@ enum Packet {
@export var packet_type: Packet @export var packet_type: Packet
var thread_safe: bool
func handle_packet(_data: PackedByteArray): func handle_packet(_data: PackedByteArray):
pass pass

View File

@ -26,5 +26,8 @@ func on_text_submitted(message: String):
text = "" text = ""
release_focus() release_focus()
if !message:
return
var chat := owner as Chat var chat := owner as Chat
chat.message_submitted.emit(message) chat.message_submitted.emit(message)