Add direct-connect multiplayer foundation
This commit is contained in:
parent
9e9850dd20
commit
24f8263175
36 changed files with 2633 additions and 45 deletions
175
ui/network/join_game_page.gd
Normal file
175
ui/network/join_game_page.gd
Normal file
|
|
@ -0,0 +1,175 @@
|
|||
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(),
|
||||
]
|
||||
Loading…
Add table
Add a link
Reference in a new issue