Late connection

This commit is contained in:
Rendo 2025-12-07 18:13:21 +05:00
commit 63209ccc1e
9 changed files with 73 additions and 23 deletions

View file

@ -5,6 +5,7 @@ extends Label
# Called when the node enters the scene tree for the first time.
func _ready() -> void:
Session.round_started.connect(update)
Session.session_started.connect(update)
func update():
if our_side:

View file

@ -3,13 +3,5 @@ extends Node
func _ready() -> void:
Lobby.lobby_joined.connect(on_lobby_joined)
func _on_leave_button_pressed() -> void:
Lobby.leave()
$"../..".hide()
$"../../../MainMenu".show()
func _on_start_button_pressed() -> void:
Lobby.start_game.rpc()
func on_lobby_joined() -> void:
$StartButton.hide()

View file

@ -1,8 +1,9 @@
extends Node
extends Control
func _ready() -> void:
Lobby.lobby_joined.connect(hide_host_buttons)
Session.session_started.connect(hide)
Lobby.lobby_created.connect(show_host_buttons)
Lobby.lobby_closed.connect(cleanup_lobby)
Lobby.update_teams_state.connect(on_player_switched_team)
@ -20,7 +21,7 @@ func cleanup_lobby() -> void:
func _on_start_button_pressed() -> void:
Lobby.start_game.rpc()
Lobby.start_game()
func hide_host_buttons() -> void:
%StartButton.hide()

View file

@ -145,12 +145,12 @@ func server_team_switch(id: int, team: int) -> void:
defence_team.erase(id)
specators_team.append(id)
@rpc("authority","call_local","reliable")
func start_game() -> void:
get_tree().change_scene_to_file("res://levels/prototype_scene.tscn")
if multiplayer.is_server():
await get_tree().scene_changed
Session.start_session()
if not multiplayer.is_server():
return
get_tree().current_scene.get_node("%MainMenu").visible = false
get_tree().current_scene.get_node("%LevelContainer").add_child(preload("res://levels/prototype_scene.tscn").instantiate())
Session.start_session()
func get_team() -> Session.TEAMS:
var id = multiplayer.get_unique_id()

View file

@ -19,7 +19,10 @@ enum ROUND_STATES {
const ATTACK_LAYER: int = 0b10000
const DEFENCE_LAYER: int = 0b100000
signal session_started
signal session_ended
signal round_started
signal late_player_connected(id: int)
signal round_state_changed(state: int)
signal player_stopped_interacting(id: int)
@ -41,7 +44,7 @@ var round_timer: Timer
var buy_timer: Timer
var round_state: ROUND_STATES
var session_started: bool = false
var session_started_flag: bool = false
var reference_round_time: float
@ -67,6 +70,38 @@ func _ready() -> void:
add_child(bomb_timer)
add_child(round_timer)
add_child(buy_timer)
multiplayer.peer_connected.connect(sync_session_server)
func sync_session_server(id: int):
if multiplayer.is_server() == false or session_started_flag == false:
return
var data: PackedByteArray
data.resize(6)
data.encode_u8(0,current_round)
data.encode_u8(1,attacker_score)
data.encode_u8(2,defender_score)
data.encode_u8(3,attackers_alive)
data.encode_u8(4,defenders_alive)
data.encode_u8(5,round_state)
sync_session_client.rpc_id(id,data)
late_player_connected.emit(id)
@rpc("authority","call_remote","reliable")
func sync_session_client(data: PackedByteArray):
if not is_server_request():
return
current_round = data.decode_u8(0)
attacker_score = data.decode_u8(1)
defender_score = data.decode_u8(2)
attackers_alive = data.decode_u8(3)
defenders_alive = data.decode_u8(4)
round_state = data.decode_u8(5) as ROUND_STATES
session_started.emit()
func _process(_delta: float) -> void:
if multiplayer.is_server() == false or not session_started:
@ -96,7 +131,8 @@ func start_session() -> void:
current_round = 0
attacker_score = 0
defender_score = 0
session_started = true
session_started_flag = true
session_started.emit()
start_round()
@ -111,8 +147,9 @@ func end_session() -> void:
round_timer.stop()
buy_timer.stop()
object_containers.clear()
session_ended.emit()
session_started = false
session_started_flag = false
@rpc("authority","call_remote","reliable")
func start_round() -> void:

View file

@ -8,6 +8,9 @@ func _ready() -> void:
queue_free()
return
Session.round_started.connect(spawn)
if team == Session.TEAMS.SPECTATE:
Session.late_player_connected.connect(spawn_spectator)
func _exit_tree() -> void:
if not multiplayer.is_server():