175 lines
4.5 KiB
GDScript
175 lines
4.5 KiB
GDScript
class_name JoinGamePage
|
|
extends Control
|
|
|
|
signal join_requested(endpoint: String)
|
|
signal back_requested
|
|
|
|
@onready var _address: LineEdit = %Address
|
|
@onready var _join_button: BubbleButton = %JoinButton
|
|
@onready var _cancel_button: BubbleButton = %CancelButton
|
|
@onready var _back_button: BubbleButton = %BackButton
|
|
@onready var _open_close_button: BubbleButton = %OpenCloseButton
|
|
@onready var _status: Label = %Status
|
|
@onready var _session_summary: Label = %SessionSummary
|
|
|
|
var _network_session: NetworkSession
|
|
var _saved_servers: SavedServerStore
|
|
var _gameplay_context: bool = false
|
|
|
|
|
|
func _ready() -> void:
|
|
_join_button.pressed.connect(_on_join_pressed)
|
|
_cancel_button.pressed.connect(_on_cancel_pressed)
|
|
_back_button.pressed.connect(_on_back_pressed)
|
|
_open_close_button.pressed.connect(_on_open_close_pressed)
|
|
_address.text_submitted.connect(_on_address_submitted)
|
|
hide()
|
|
|
|
|
|
func setup(
|
|
network_session: NetworkSession,
|
|
saved_servers: SavedServerStore,
|
|
gameplay_context: bool,
|
|
) -> void:
|
|
_network_session = network_session
|
|
_saved_servers = saved_servers
|
|
_gameplay_context = gameplay_context
|
|
if not _network_session.state_changed.is_connected(_on_state_changed):
|
|
_network_session.state_changed.connect(_on_state_changed)
|
|
if not _network_session.status_message_changed.is_connected(
|
|
_on_status_message_changed
|
|
):
|
|
_network_session.status_message_changed.connect(
|
|
_on_status_message_changed
|
|
)
|
|
if not _network_session.connection_error.is_connected(
|
|
_on_connection_error
|
|
):
|
|
_network_session.connection_error.connect(_on_connection_error)
|
|
if not _network_session.peer_count_changed.is_connected(
|
|
_on_peer_count_changed
|
|
):
|
|
_network_session.peer_count_changed.connect(_on_peer_count_changed)
|
|
_refresh()
|
|
|
|
|
|
func open_page(preserved_endpoint: String = "") -> void:
|
|
if not preserved_endpoint.is_empty():
|
|
_address.text = preserved_endpoint
|
|
elif _address.text.is_empty():
|
|
_address.text = "127.0.0.1:7777"
|
|
show()
|
|
_refresh()
|
|
_address.grab_focus()
|
|
_address.select_all()
|
|
|
|
|
|
func close_page() -> void:
|
|
hide()
|
|
get_viewport().gui_release_focus()
|
|
|
|
|
|
func get_endpoint_text() -> String:
|
|
return _address.text
|
|
|
|
|
|
func set_status(message: String) -> void:
|
|
_status.text = message
|
|
|
|
|
|
func _on_join_pressed() -> void:
|
|
_request_join()
|
|
|
|
|
|
func _on_address_submitted(_value: String) -> void:
|
|
_request_join()
|
|
|
|
|
|
func _request_join() -> void:
|
|
if _network_session.state in [
|
|
NetworkSession.State.CONNECTION_FAILED,
|
|
NetworkSession.State.SERVER_LOST,
|
|
]:
|
|
_network_session.reset_failure()
|
|
var endpoint: ConnectionEndpoint = EndpointParser.parse(_address.text)
|
|
if not endpoint.is_valid():
|
|
_status.text = endpoint.error_message
|
|
return
|
|
_address.text = endpoint.normalized_display
|
|
join_requested.emit(endpoint.normalized_display)
|
|
|
|
|
|
func _on_cancel_pressed() -> void:
|
|
if _network_session != null:
|
|
_network_session.cancel_connection()
|
|
_refresh()
|
|
|
|
|
|
func _on_back_pressed() -> void:
|
|
if (
|
|
_network_session != null
|
|
and _network_session.state in [
|
|
NetworkSession.State.CONNECTING,
|
|
NetworkSession.State.AUTHENTICATING,
|
|
]
|
|
):
|
|
_network_session.cancel_connection()
|
|
back_requested.emit()
|
|
|
|
|
|
func _on_open_close_pressed() -> void:
|
|
if _network_session == null or not _network_session.is_host():
|
|
return
|
|
_network_session.set_host_open(not _network_session.is_open_host())
|
|
_refresh()
|
|
|
|
|
|
func _on_state_changed(_state: NetworkSession.State) -> void:
|
|
_refresh()
|
|
|
|
|
|
func _on_status_message_changed(message: String) -> void:
|
|
_status.text = message
|
|
_refresh()
|
|
|
|
|
|
func _on_connection_error(message: String) -> void:
|
|
_status.text = message
|
|
_refresh()
|
|
|
|
|
|
func _on_peer_count_changed(player_count: int, max_players: int) -> void:
|
|
_session_summary.text = "%d / %d players" % [
|
|
player_count,
|
|
max_players,
|
|
]
|
|
|
|
|
|
func _refresh() -> void:
|
|
if not is_node_ready() or _network_session == null:
|
|
return
|
|
var connecting: bool = _network_session.state in [
|
|
NetworkSession.State.CONNECTING,
|
|
NetworkSession.State.AUTHENTICATING,
|
|
]
|
|
_address.editable = not connecting
|
|
_join_button.disabled = connecting
|
|
_cancel_button.visible = connecting
|
|
_open_close_button.visible = (
|
|
_gameplay_context and _network_session.is_host()
|
|
)
|
|
if _open_close_button.visible:
|
|
_open_close_button.text = (
|
|
"close\ngame"
|
|
if _network_session.is_open_host()
|
|
else "open\ngame"
|
|
)
|
|
_session_summary.visible = (
|
|
_gameplay_context
|
|
and _network_session.state != NetworkSession.State.INACTIVE
|
|
)
|
|
if _session_summary.visible:
|
|
_session_summary.text = "%d / %d players" % [
|
|
_network_session.get_player_count(),
|
|
_network_session.get_session_max_players(),
|
|
]
|