diff --git a/src/assets/autoload/network.gd b/src/assets/autoload/network.gd index 12f3f77f..06f85e44 100644 --- a/src/assets/autoload/network.gd +++ b/src/assets/autoload/network.gd @@ -11,9 +11,11 @@ var server: WebSocketServer setget toss, deny var client: WebSocketClient setget toss, deny var player_name: String setget toss, get_player_name puppet var peers: Array = [] -puppet var myID: int = 1 +puppet var names: Dictionary = {} +var myID: int = 1 signal server_started +signal connection_handled func ready() -> void: # give the server access to puppet functions and variables @@ -21,9 +23,12 @@ func ready() -> void: GameManager.connect('state_changed', self, '_on_state_changed') func client_server(port: int, playerName: String) -> void: - print("Starting server on port ", port, " with host player name ", player_name) + print("Starting server on port ", port, " with host player name ", playerName) connection = Connection.CLIENT_SERVER player_name = playerName + myID = 1 + names[1] = player_name + print(names) server = WebSocketServer.new() server.listen(port, PoolStringArray(), true) #3rd input must be true to use Godot's high level networking API get_tree().set_network_peer(server) @@ -31,9 +36,10 @@ func client_server(port: int, playerName: String) -> void: emit_signal("server_started") func client(hostName: String, port: int, playerName: String) -> void: - print("Connecting to server ", hostName, " on port ", port, " with host player name ", player_name) + print("Connecting to server ", hostName, " on port ", port, " with host player name ", playerName) connection = Connection.CLIENT player_name = playerName + names[1] = playerName client = WebSocketClient.new() #use "ws://" at the beginning of address for websocket connections var url: String = "ws://" + hostName + ":" + str(port) @@ -47,11 +53,22 @@ func client(hostName: String, port: int, playerName: String) -> void: connect_signals() #do not switch to main scene here, wait until the connection was successful +remote func receiveName(newName): + var sender = get_tree().get_rpc_sender_id() + if not get_tree().is_network_server(): + return + if names.keys().has(sender): + return + names[sender] = newName + print("names: ", names) + print(get_tree().is_network_server()) + rset("names", names) + emit_signal("connection_handled", sender, newName) + func _player_connected(id) -> void: peers.append(id) if get_tree().is_network_server(): # remotely set myID var of new player to their network id - rset_id(id, "myID", str(id)) # sync peer list of all players rset("peers", peers) @@ -61,6 +78,9 @@ func _player_disconnected(id) -> void: func _connected_to_server() -> void: print("Connection to server succeeded") + myID = get_tree().get_network_unique_id() + print("sending name") + rpc_id(1, "receiveName", player_name) pass #here is where you would put stuff that happens when you connect, such as switching to a lobby scene func _connection_failed() -> void: @@ -95,8 +115,11 @@ func connect_signals() -> void: get_tree().connect("connection_failed", self, "_connection_failed") get_tree().connect("server_disconnected", self, "_server_disconnected") -func get_player_name() -> String: - return player_name +func get_player_name(id: int = myID) -> String: + if names.keys().has(id): + return names[id] + else: + return player_name func on_state_changed(old_state, new_state) -> void: match new_state: diff --git a/src/assets/main/main.gd b/src/assets/main/main.gd index 503bf385..4afbc97c 100644 --- a/src/assets/main/main.gd +++ b/src/assets/main/main.gd @@ -15,6 +15,7 @@ var errdc = false onready var config = ConfigFile.new() func _ready(): + set_network_master(1) var err = config.load("user://settings.cfg") if err == OK: $players/Player/Camera2D/CanvasLayer/ColorRect.material.set_shader_param("mode", int(config.get_value("general", "colorblind_mode"))) @@ -30,6 +31,8 @@ func _enter_tree(): #get_tree().network_peer = peer get_tree().connect("network_peer_connected", self, "_player_connected") get_tree().connect("network_peer_disconnected", self, "_player_disconnected") + Network.connect("connection_handled", self, "connection_handled") + players[1] = $players/Player PlayerManager.ournumber = 0 elif Network.connection == Network.Connection.CLIENT: get_tree().connect("network_peer_disconnected", self, "_player_disconnected") @@ -38,52 +41,55 @@ func _enter_tree(): #peer.create_client(Network.host, Network.port) #get_tree().network_peer = peer -# Called on the server when a new client connects -func _player_connected(id): +func connection_handled(id, playerName): + print("connection handled, id: ", id, " name: ", playerName) + if not get_tree().is_network_server(): + return + rpc("checkVersion", version) newnumber = Network.peers.size() - rpc_id(id,"getname",id, version, newnumber) - rpc_id(id,"serverinfo",Network.get_player_name(), version) -remote func serverinfo(sname,sversion): - player_join(1,sname) -remote func getname(id,sversion,assignednumber): - rpc_id(1,"playerjoin_proper",Network.get_player_name(),id) - PlayerManager.ournumber = assignednumber - if not version == sversion: + rpc_id(id, "receiveNumber", newnumber) + createPlayer(id, playerName) + #tell all existing players to create this player + for i in players.keys(): + if i != id: + print("telling ", i, " to create player ", id) + rpc_id(i, "createPlayer", id, playerName) + #tell new player to create existing players + for i in players.keys(): + if i != id: + print("telling ", id, " to create player ", i) + rpc_id(id, "createPlayer", i, Network.names[i]) + +puppet func checkVersion(sversion): + if version != sversion: print("HEY! YOU! YOU FORGOT TO UPDATE YOUR CLIENT. RE EXPORT AND TRY AGAIN!") -remote func playerjoin_proper(thename,id): - var new_player = player_scene.instance() - id = get_tree().get_rpc_sender_id() - new_player.id = id - new_player.ourname = thename - new_player.main_player = false - #print(thename) - for id in players: - # Sends an add_player rpc to the player that just joined - print("Sending add player to new player ", new_player) - rpc_id(new_player.id, "player_join", id, thename) - # Sends the add_player rpc to all other clients - print("Sending add player to other player ", players[id]) - rpc_id(id, "player_join", new_player.id, thename) - players[id] = new_player - $players.add_child(new_player) - print("Got connection: ", id) - print(Network.peers.size()) + +puppet func receiveNumber(number): + if get_tree().get_rpc_sender_id() != 1: + return + PlayerManager.ournumber = number + +# Called on the server when a new client connects +func _player_connected(id): + return + func _player_disconnected(id): players[id].queue_free() #deletes player node when a player disconnects players.erase(id) -# Called from server when another client connects -remote func player_join(other_id, pname): - # Should only be run on the client - if get_tree().is_network_server(): +puppet func createPlayer(id, playerName): + print("creating player ", id) + if players.keys().has(id): + print("not creating player, already exists") return - var new_player = player_scene.instance() - new_player.id = other_id - new_player.ourname = pname - new_player.main_player = false - add_child(new_player) - players[other_id] = new_player - print("New player: ", other_id) + var newPlayer = player_scene.instance() + newPlayer.id = id + newPlayer.ourname = playerName + newPlayer.main_player = false + players[id] = newPlayer + $players.add_child(newPlayer) + newPlayer.setName(playerName) + print("New player: ", id) # Called from client sides when a player moves remote func player_moved(new_pos, new_movement): @@ -111,7 +117,8 @@ remote func other_player_moved(id, new_pos, new_movement): if get_tree().is_network_server(): return #print("Moving ", id, " to ", new_pos.x, ", ", new_pos.y) #no reason to spam console so much - players[id].move_to(new_pos, new_movement) + if players.keys().has(id): + players[id].move_to(new_pos, new_movement) func _on_main_player_moved(position : Vector2, movement : Vector2): #In the beginning Godot created the heaven and the earth @@ -145,6 +152,7 @@ remote func startgame(intrudernumber): else: print("we are not the intruder") emit_signal("clientstartgame") + func serverassign(): var rng = RandomNumberGenerator.new() var isintruder = false diff --git a/src/assets/main/main.tscn b/src/assets/main/main.tscn index 5747a143..9119161d 100644 --- a/src/assets/main/main.tscn +++ b/src/assets/main/main.tscn @@ -20,6 +20,7 @@ script = ExtResource( 3 ) [node name="Player" parent="players" instance=ExtResource( 1 )] position = Vector2( -100.995, -9.43875 ) +main_player = true [node name="Camera2D" type="Camera2D" parent="players/Player"] current = true diff --git a/src/assets/main/maps.gd b/src/assets/main/maps.gd index f1ed1f79..ff5a353d 100644 --- a/src/assets/main/maps.gd +++ b/src/assets/main/maps.gd @@ -14,19 +14,10 @@ func _on_state_change(old_state, new_state) -> void: GameManager.State.Normal: switchMap('test') -puppet func switchMap(newMap: String) -> void: +func switchMap(newMap: String) -> void: print('switchMap called for ', newMap) - #if the func is not remotely called rpc sender id will be 0, if server sent it will be 1, negative should be impossible - if not get_tree().get_rpc_sender_id() < 2: - return - if GameManager.ingame(): - return if not maps.keys().has(newMap): return - if get_tree().is_network_server(): - print("telling clients to switch map to ", newMap) - rpc("switchMap", newMap) - print("loading map: ", newMap) for i in get_children(): i.queue_free() diff --git a/src/assets/player/player.gd b/src/assets/player/player.gd index f48f801c..56e7b5ab 100644 --- a/src/assets/player/player.gd +++ b/src/assets/player/player.gd @@ -5,13 +5,13 @@ signal main_player_moved(position) export (int) var speed = 150 # Set by main.gd. Is the client's unique id for this player -var id -var ourname +var id: int +var ourname: String var velocity = Vector2(0,0) # Contains the current intended movement direction and magnitude in range 0 to 1 var movement = Vector2(0,0) # Only true when this is the player being controlled -var main_player = true +export var main_player = false #anim margin controls how big the player movement must be before animations are played var x_anim_margin = 0.1 var y_anim_margin = 0.1 @@ -22,9 +22,12 @@ func _ready(): if main_player: $VisibleArea.enabled = true $Dark.enabled = true - ourname = Network.get_player_name() - print("ourname: ", ourname) + setName(Network.get_player_name()) + +func setName(newName): + ourname = newName $Label.text = ourname + # Only called when main_player is true func get_input(): var prev_velocity = velocity diff --git a/src/assets/player/player.tscn b/src/assets/player/player.tscn index b4dbbe36..24a826ac 100644 --- a/src/assets/player/player.tscn +++ b/src/assets/player/player.tscn @@ -55,7 +55,6 @@ shape = SubResource( 1 ) [node name="Sprite" type="AnimatedSprite" parent="."] frames = SubResource( 2 ) animation = "walk-h" -frame = 2 playing = true [node name="Label" type="Label" parent="."] diff --git a/src/export_presets.cfg b/src/export_presets.cfg index 6640704f..e70a1bb1 100644 --- a/src/export_presets.cfg +++ b/src/export_presets.cfg @@ -76,6 +76,7 @@ binary_format/embed_pck=true custom_template/release="" custom_template/debug="" codesign/enable=false +codesign/identity_type=0 codesign/identity="" codesign/password="" codesign/timestamp=true