diff --git a/scripts/hero_select.gd b/scripts/hero_select.gd index 5fd34df..eeb433a 100644 --- a/scripts/hero_select.gd +++ b/scripts/hero_select.gd @@ -22,3 +22,14 @@ func _ready(): for hero_index in range(hero_names.size()): add_item(hero_names[hero_index], hero_index) + connect("item_selected", self, "set_hero") + +func set_hero(hero): + networking.set_info("hero", hero) + +func random_hero(): + var hero = randi() % hero_names.size() + select(hero) + set_hero(hero) + return hero + diff --git a/scripts/lobby.gd b/scripts/lobby.gd index ec59d82..c3e7622 100644 --- a/scripts/lobby.gd +++ b/scripts/lobby.gd @@ -2,6 +2,8 @@ extends Control var port = null # Defined by command-line argument with default +onready var hero_select = get_node("HeroSelect/Hero") + func _ready(): if get_tree().is_network_server(): get_node("LevelSelect").show() @@ -15,23 +17,17 @@ func _ready(): get_node("Spectating").connect("toggled", networking, "set_spectating") # TODO # get_node("CustomGame/LevelSelect").connect("item_selected", self, "select_level") TODO # _send_name() + # hero_select.set_hero(0) -func _collect_info(): - var my_id = get_tree().get_network_unique_id() - var my_info = networking.players[my_id] - if not "username" in my_info: - my_info.username = get_node("Username").get_text() - if not "hero" in my_info: - my_info.hero = get_node("HeroSelect/Hero").get_selected_id() - if not "is_right_team" in my_info: - my_info.is_right_team = false # Server assigns team, wait for that + networking.connect("info_updated", self, "render_player_list") + get_tree().connect("connected_to_server", self, "_send_settings") + if get_tree().is_network_server(): + _send_settings() -func select_hero(hero): - var description = get_node("HeroSelect").hero_text[hero] - get_node("HeroDescription").set_text(description) - var my_id = get_tree().get_network_unique_id() - networking.players[my_id].hero = hero - rpc("set_hero", get_tree().get_network_unique_id(), hero) +func _send_settings(): + print("sending") + _send_name() + hero_select.random_hero() sync func set_hero(peer, hero): networking.players[peer].hero = hero @@ -39,34 +35,21 @@ sync func set_hero(peer, hero): func _send_name(): var name = get_node("Username").text - rpc("_set_name", get_tree().get_network_unique_id(), name) - -sync func _set_name(peer, name): - networking.players[peer].username = name - render_player_list() + networking.set_info("username", name) func render_player_list(): - if has_node("PlayerSettings"): - var list = "" - var hero_names = get_node("HeroSelect").hero_names - for p in networking.players: - list += "%-15s" % networking.players[p].username - list += "%-20s" % hero_names[networking.players[p].hero] - if networking.players[p].is_right_team: - list += "Right Team" - else: - list += "Left Team" - list += "\n" - get_node("JoinedGameLobby/PlayerList").set_text(list) - -sync func assign_team(peer, is_right_team): - networking.players[peer].is_right_team = is_right_team - if peer == get_tree().get_network_unique_id(): - if is_right_team: - get_node("Team").set_text("Right Team") + print(JSON.print(networking.players)) + var list = "" + var hero_names = hero_select.hero_names + for p in networking.players: + list += "%-15s" % networking.players[p].username + list += "%-20s" % hero_names[networking.players[p].hero] + if networking.players[p].is_right_team: + list += "Right Team" else: - get_node("Team").set_text("Left Team") - render_player_list() + list += "Left Team" + list += "\n" + get_node("PlayerList").set_text(list) func _start_game(): _collect_info() diff --git a/scripts/networking.gd b/scripts/networking.gd index 8cb125c..b49de6c 100644 --- a/scripts/networking.gd +++ b/scripts/networking.gd @@ -9,20 +9,18 @@ var is_connected = false # Technically this can be done with ENetcetera but it's var begun = false # TODO: This needs to go. It carries nothing of value # ALL server negotiation should happen before ANY data is investigated (in lobby) -var my_info = { - "hero": 0, - "username": "Nickname", -} var global_server_ip = "nv.cosinegaming.com" var matchmaker_tcp var right_team_next = false +signal info_updated + func _ready(): add_child(matchmaking) get_tree().connect("network_peer_disconnected", self, "unregister_player") get_tree().connect("network_peer_connected", self, "register_player") - # get_tree().connect("connected_to_server", self, "_on_connect") + get_tree().connect("connected_to_server", self, "_on_connect") # func connect_global_server(): TODO # ip = global_server_ip @@ -69,20 +67,27 @@ func start_server(port, server_playing=false): start_game() sync func start_game(level): - print(var2str(players)) rpc("_pre_configure_game", level) -func disconnect_player(id): - if get_tree().is_network_server(): - rpc("unregister_player", id) - # call_deferred("render_player_list") TODO - # func _on_connect(): # rpc("_register_player", get_tree().get_network_unique_id(), my_info) # if util.args.get_value("-start-game"): # rpc_id(1, "start_game") # is_connected = true TODO +# remote func _set_players(json): +# print(json) +# players = JSON.parse(json).result +# print("setted") +# print(JSON.print(players)) + +func send_all_info(new_peer): + for p in players: + if p != new_peer: + for key in players[p]: + var val = players[p][key] + set_info(key, val, p) + remote func register_player(new_peer): var info = {} info.is_right_team = right_team_next @@ -90,7 +95,9 @@ remote func register_player(new_peer): players[new_peer] = info if get_tree().is_network_server(): # I tell new player about all the existing people - rset_id(new_peer, "players", players) + send_all_info(new_peer) + # rset_id(new_peer, "players", players) + emit_signal("info_updated") # render_player_list() TODO # var right_team_count = 0 # Send current players' info to new player @@ -115,15 +122,32 @@ sync func unregister_player(peer): players.erase(peer) if begun: get_node("/root/Level/Players/%d" % peer).queue_free() + emit_signal("info_updated") func set_spectating(spectating): var id = get_tree().get_network_unique_id() if spectating: if players[id]: - unregister_player(id) + rpc("unregister_player", id) else: if not players[id]: - register_player(id) + rpc("register_player", id) + +sync func _set_info(key, value, peer=0): + if not peer: + peer = get_tree().get_rpc_sender_id() + if peer == 0: + # Was self. See https://github.com/godotengine/godot/issues/19026 + peer = get_tree().get_network_unique_id() + players[peer][key] = value + emit_signal("info_updated") + +func set_info(key, value, peer=0): + rpc("_set_info", str(key), value, peer) + +func _on_connect(): + emit_signal("info_updated") + register_player(get_tree().get_network_unique_id()) sync func _spawn_player(p): var hero = 0 @@ -138,7 +162,7 @@ sync func _spawn_player(p): sync func _pre_configure_game(level): level = 2 # TODO: Remove this!! begun = true - my_info.level = level # Remember the level for future player registration + # my_info.level = level # Remember the level for future player registration var self_peer_id = get_tree().get_network_unique_id()