forked from Nekojimi/JackIt
101 lines
2.8 KiB
GDScript3
101 lines
2.8 KiB
GDScript3
|
extends Control
|
||
|
|
||
|
@export var multiplayer_port: int = 2481
|
||
|
@export var reconnection_delay: float = 5
|
||
|
|
||
|
var server_ip: String = "127.0.0.1"
|
||
|
|
||
|
var error_code: Error = OK
|
||
|
|
||
|
var connecting: bool = false
|
||
|
var connected: bool = false
|
||
|
var reconnection_timer: float = 0
|
||
|
|
||
|
var session_id: int = -1
|
||
|
|
||
|
var searching_for_player: bool = false
|
||
|
|
||
|
# Called when the node enters the scene tree for the first time.
|
||
|
func _ready() -> void:
|
||
|
server_ip = get_server_ip()
|
||
|
|
||
|
get_parent().multiplayer.connected_to_server.connect(on_connected_ok)
|
||
|
get_parent().multiplayer.connection_failed.connect(on_connection_failed)
|
||
|
get_parent().multiplayer.server_disconnected.connect(on_server_disconnected)
|
||
|
|
||
|
reconnect()
|
||
|
|
||
|
$"../Players".connect("player_joined", on_player_joined)
|
||
|
|
||
|
func _process(delta: float) -> void:
|
||
|
if !connected and !connecting:
|
||
|
reconnection_timer += delta
|
||
|
if reconnection_timer >= reconnection_delay:
|
||
|
reconnection_timer = 0
|
||
|
reconnect()
|
||
|
if searching_for_player:
|
||
|
for player in $"../Players".get_children():
|
||
|
if player.session_id == session_id:
|
||
|
searching_for_player = false
|
||
|
$PromptManager.player = player
|
||
|
|
||
|
func reconnect() -> void:
|
||
|
var peer: MultiplayerPeer = WebSocketMultiplayerPeer.new()
|
||
|
var server_address: String = "ws://%s:%d" % [server_ip, multiplayer_port]
|
||
|
$ServerIPLabel.text = "Address:" + server_address
|
||
|
$Label2.text = "Connecting..."
|
||
|
connecting = true
|
||
|
error_code = peer.create_client(server_address)
|
||
|
if error_code:
|
||
|
$Label2.text = "Failed to connect! Error code %d" %error_code
|
||
|
return
|
||
|
get_parent().multiplayer.multiplayer_peer = peer
|
||
|
|
||
|
|
||
|
func on_connected_ok() -> void:
|
||
|
session_id = get_session_id()
|
||
|
$Label2.text = "Connected OK! Session ID: %d" % session_id
|
||
|
connected = true
|
||
|
connecting = false
|
||
|
|
||
|
join_game(session_id)
|
||
|
|
||
|
func on_connection_failed() -> void:
|
||
|
$Label2.text = "Connection failed D:"
|
||
|
connected = false
|
||
|
connecting = false
|
||
|
|
||
|
func on_server_disconnected() -> void:
|
||
|
$Label2.text = "Server disconnected!"
|
||
|
connected = false
|
||
|
connecting = false
|
||
|
|
||
|
func get_server_ip() -> String:
|
||
|
if OS.has_feature('web'):
|
||
|
return JavaScriptBridge.eval("window.location.hostname")
|
||
|
return "127.0.0.1"
|
||
|
|
||
|
func get_session_id() -> int:
|
||
|
if session_id != -1:
|
||
|
return session_id
|
||
|
var session_file: FileAccess = FileAccess.open("user://session-id", FileAccess.READ)
|
||
|
#if session_file != null:
|
||
|
#var contents: String = session_file.get_as_text()
|
||
|
#var id: int
|
||
|
#if !contents.is_empty() and contents.is_valid_int():
|
||
|
#id = contents.to_int()
|
||
|
#return id
|
||
|
var id: int = randi()
|
||
|
session_file = FileAccess.open("user://session-id", FileAccess.WRITE)
|
||
|
session_file.store_string("%d" % id )
|
||
|
return id
|
||
|
|
||
|
func join_game(session_id: int):
|
||
|
searching_for_player = true
|
||
|
var player : Player = $"../Players".find_player_by_session_id(session_id)
|
||
|
#player.claim_authority(session_id)
|
||
|
|
||
|
func on_player_joined(player: Player):
|
||
|
pass
|
||
|
|