diff options
Diffstat (limited to 'Game/Network.gd')
-rw-r--r-- | Game/Network.gd | 46 |
1 files changed, 35 insertions, 11 deletions
diff --git a/Game/Network.gd b/Game/Network.gd index 5f8be5c..1fabeaf 100644 --- a/Game/Network.gd +++ b/Game/Network.gd @@ -3,11 +3,12 @@ extends Node signal players_changed -var players = {} - func _ready(): + reset_players() + multiplayer.connected_to_server.connect(_on_connected_to_server) + multiplayer.server_disconnected.connect(_on_disconneted_from_server) multiplayer.peer_connected.connect(_on_peer_connected) multiplayer.peer_disconnected.connect(_on_peer_disconnected) @@ -21,7 +22,6 @@ func host_game(port): multiplayer.multiplayer_peer = peer Client.player.id = multiplayer.get_unique_id() - %Players.add_child(Client.player) func join_game(ip, port): var peer = ENetMultiplayerPeer.new() @@ -35,32 +35,45 @@ func join_game(ip, port): func _on_connected_to_server(): print(multiplayer.get_unique_id(), ": connected to server") +func _on_disconneted_from_server(): + print("disconnected from server") + + multiplayer.multiplayer_peer = OfflineMultiplayerPeer.new() + reset_players() + func _on_peer_connected(id): print(multiplayer.get_unique_id(), ": peer connected: ", id) - if id == 1: # tell host to add player - add_to_players.rpc_id(1, inst_to_dict(Client.player)) - Client._player = null + add_to_players.rpc_id(id, inst_to_dict(Client.player)) # TODO: add existing towers to new peers func _on_peer_disconnected(id): print(multiplayer.get_unique_id(), ": peer disconnected: ", id) + + %Players.remove_child(get_player(id)) + # TODO: move towers owned by peer to host if id == 1: # if host disconnected go back to Lobby - get_tree().change_scene_to_file("res://UI/Lobby.tscn") + get_tree().change_scene_to_file("res://UI/Start.tscn") + +func reset_players(): + for node in %Players.get_children(): + %Players.remove_child(node) + + %Players.add_child(preload("res://Game/Player.tscn").instantiate()) func get_player(id: int) -> Player: + if %Players.get_child_count() == 1: + return %Players.get_child(0) + return %Players.get_node(str(id)) -func get_ordered_player_ids(): # TODO: return type needed for players_list.gd "find" method? +func get_ordered_player_ids() -> Array: var keys = %Players.get_children().map(func(item: Player): return item.id ) - keys = keys.filter(func(item: int): # workaround for MultiplayerSpawner + Synchronizer - return item != 0 - ) keys.sort_custom(func(a: int, b: int): return int(str(a).substr(0, 8)) < int(str(b).substr(0, 8)) ) @@ -82,8 +95,19 @@ func add_to_players(remote_data: Dictionary): @rpc("any_peer") +func update_player(remote_data: Dictionary): + var id = multiplayer.get_remote_sender_id() + var player = get_player(id) + + player.score = remote_data.score + + players_changed.emit() + + +@rpc("any_peer") #func place_tower(remote_tower: Dictionary, position: Vector2): func place_tower(remote_data: Dictionary): + print(remote_data) var data: Tower.NetworkData = dict_to_inst(remote_data) var remote_player_id = multiplayer.get_remote_sender_id() |