extends MarginContainer onready var peers = $v/body/peers/peers onready var lobby_info_label = $v/head/lobby_info onready var peers_list_label = $v/body/peers/label onready var cursors = {} onready var chat = $v/body/v/messages onready var chat_edit = $v/body/v/h/chat onready var auto_scroll_chk = $v/body/v/chat_head/auto_scroll func _ready(): Global.client.signaller.connect("peer_joined", self, "_peer_joined") Global.client.signaller.connect("peer_left", self, "_peer_left") # Global.client.connect("peer_disconnected", self, "_peer_left") Global.client.signaller.connect("lobby_left", self, "_lobby_left") lobby_info_label.text = "%s%s" % [Global.client.signaller.lobby_name, _host_suffix(get_tree().get_network_unique_id())] Global.client.signaller.connect("websocket_disconnected", self, "_signaller_disconnected") Global.client.signaller.request_peer_list() call_deferred("add_chat", "# Connected to %s" % Global.client.signaller.lobby_name) func _host_suffix(id): if id == 1: return " (Host)" else: return "" func _signaller_disconnected(): Global.main_menu() func _peer_joined(joined_peers): call_deferred("update_player_count") print("Joined Peers: %s" % [joined_peers]) for i in range(len(joined_peers)): var id = joined_peers[i]["id"] var exists = false for j in range(peers.get_item_count()): var md = peers.get_item_metadata(j) if md and md.has("id") and md["id"] == id: print("Already have this one") exists = true break if not exists: var peerId = joined_peers[i]["peerId"] var name = joined_peers[i]["name"] print("New Lobby Peer ID: %s, Name: %s, PeerID: %s" % [id, name, peerId]) call_deferred("add_chat", "> %s joined the lobby" % name) peers.add_item("%s%s" % [name, _host_suffix(peerId)]) peers.set_item_metadata(peers.get_item_count() - 1, { "id": id, "peerId": peerId, "name": name }) func _peer_left(ids): call_deferred("update_player_count") print("Peer(s) Leaving: %s" % ids) for data in ids: print(data) var id = data["id"] for i in range(peers.get_item_count()): var md = peers.get_item_metadata(i) if md and md.has("id") and md["id"] == id: peers.remove_item(i) call_deferred("add_chat", "< %s left the lobby" % md["name"]) return func update_player_count(): peers_list_label.text = "Players: %d" % peers.get_item_count() func _on_Button_pressed(): send_chat_message() remotesync func add_chat(message): if auto_scroll_chk.pressed: call_deferred("scroll_chat_to_bottom") else: call_deferred("preserve_chat_scroll", chat.cursor_get_line(), chat.get_selection_to_line(), chat.get_selection_from_line(), chat.get_selection_to_column(), chat.get_selection_from_column()) chat.text += "\n" + message func scroll_chat_to_bottom(): chat.cursor_set_line(chat.get_line_count() + 1) chat.scroll_vertical = 1000000000 func preserve_chat_scroll(n, tl, fl, tc, fc): chat.cursor_set_line(n) chat.select(fl, fc, tl, tc) chat.center_viewport_to_cursor() func _lobby_left(_id): Global.lobby_browser() func _on_leave_button_pressed(): Global.lobby_browser() func _on_TextEdit_text_entered(_new_text): send_chat_message() func send_chat_message(): var message = chat_edit.text if message != "": rpc("add_chat", "%s: %s" % [Global.client.signaller.display_name, message]) chat_edit.text = ""