diff --git a/Game/Assets/HUD/Chat.gd b/Game/Assets/HUD/Chat.gd index 65e8105..4dc8846 100644 --- a/Game/Assets/HUD/Chat.gd +++ b/Game/Assets/HUD/Chat.gd @@ -56,6 +56,9 @@ func _unhandled_input(_event) -> void: var sender_info = main.player_list.get(sender_pid) chat_history.append_bbcode('\n' + '[b][color=' + sender_info.color.to_html() +']' + str(sender_info.name) + '[/color][/b] : [i]' + message + '[/i]') +@remotesync func chat_notification(message: String) -> void: + chat_history.append_bbcode('\n ยท ' + '[i]' + message + '[/i]') + func _on_Editor_text_submitted(new_text): # RPC is currently not implemented in the engine var sender_id = get_tree().get_network_unique_id() diff --git a/Game/Main.gd b/Game/Main.gd index ed16f59..6e42bc5 100644 --- a/Game/Main.gd +++ b/Game/Main.gd @@ -26,6 +26,7 @@ class PlayerInfo: var color: Color var focus: GameFocus var health: int + var score: int func _init():#name: String, team: int, color: Color): var player_name = "" @@ -36,6 +37,7 @@ class PlayerInfo: self.team = 0 self.focus = 999 self.health = 100 + self.score = 0 # else: # self.name = name # self.team = team @@ -48,14 +50,16 @@ class PlayerInfo: 'team': str(self.team), 'color': self.color.to_html(), 'focus': self.focus, - 'health': self.health + 'health': self.health, + 'score': self.score, } - func set(name: String, team: int, color: Color, focus: int, health: int): + func set(name: String, team: int, color: Color, focus: int, health: int, score: int): self.name = name self.team = team self.color = color self.focus = focus self.health = health + self.score = score func deserialize(info): self.name = info['name'] @@ -63,6 +67,7 @@ class PlayerInfo: self.color = Color.html(info['color']) self.focus = info['focus'] self.health = info['health'] + self.score = info['score'] #func generate(): func _process(delta): @@ -146,30 +151,32 @@ func _input(_event) -> void: # self.player_list = player_list @remote func player_list_update(info, pid = get_tree().get_rpc_sender_id()): + var new_info = PlayerInfo.new() + new_info.deserialize(info) + + if player_list.players.has(pid): + var old_name = player_list.get(pid).name + + if old_name != new_info.name: + chat.chat_notification("Player [b]" + old_name + "[/b] changed name to [b]" + new_info.name + "[/b]") + elif get_tree().network_peer.get_unique_id() == 1: + for i in player_list.players.keys(): #notify existing players the new one has joined +# if i != pid: + chat.rpc(i, &'chat_notification', "Player [b]" + new_info.name + "[/b] joined") + if get_tree().network_peer.get_unique_id() == 1: # if we're server, we should store this pid = get_tree().get_rpc_sender_id() #disallow clients setting player_info for other players than themselves - var new_info = PlayerInfo.new() - new_info.deserialize(info) player_list.set(pid, new_info) rpc(&'player_list_update', info, pid) # broadcast the new entry to clients else: #we are client, so we're getting data relayed from the server - var new_info = PlayerInfo.new() - new_info.deserialize(info) player_list.set(pid, new_info) # server relays other PID's data -# if not id: -# id = get_tree().get_rpc_sender_id() -# -# print_debug("player_list_update ", info) -# if info is PlayerInfo: -# player_list.set(id, info) -# else: -# var new_info = PlayerInfo.deserialize(info) -# player_list.set(id, new_info) -# print("Updating player_list wit hnew info: ", new_info) -# -# print("Player list: ", player_list) -# print("Player list item for id ", id, ": ", player_list[id]) +func push_local_player_info(): + var id = get_tree().network_peer.get_unique_id() + if id != 1: + rpc_id(1, &'player_list_update', player_list.get(id).serialize()) + else: + rpc(&'player_list_update', player_list.get(id).serialize(), 1) func create_player(pid: int, is_local: bool) -> void: var new_player @@ -212,6 +219,7 @@ func _on_Host_pressed(): # start server and create a local player get_tree().network_peer = peer create_player(1, true) focus = GameFocus.GAME + chat.chat_notification("Started server") func _on_Connect_pressed(): $NetworkTesting/Host.disabled = true @@ -225,7 +233,7 @@ func _player_connected(pid) -> void: create_player(pid, false) if get_tree().network_peer.get_unique_id() == 1: # if we're the server - for i in player_list.players.keys(): # send each player info entry to the newly connected client + for i in player_list.players.keys(): # send the player_list to the new client rpc_id(pid, &'player_list_update', player_list.get(i).serialize(), i) # send local player info to the server # if local_player: @@ -237,8 +245,12 @@ func _player_connected(pid) -> void: func _player_disconnected(pid) -> void: print("player disconnected, id: ", pid) + if get_tree().network_peer.get_unique_id() == 1: # if we're the server, broadcast that a player left + chat.rpc(&'chat_notification', "Player [b]" + player_list.get(pid).name + "[/b] left") + func _connected_ok() -> void: print("connected to server") + chat.chat_notification("Connected to server") var pid = get_tree().get_network_unique_id() create_player(pid, true) focus = GameFocus.GAME @@ -246,10 +258,13 @@ func _connected_ok() -> void: func _connected_fail() -> void: print("connection to server failed") + chat.chat_notification("Connection failed") func _server_disconnected() -> void: print("server disconnected") role = NetworkRole.NONE + chat.chat_notification("Server disconnected") + func _ready() -> void: print("Commandline arguments: ", OS.get_cmdline_args()) @@ -263,6 +278,9 @@ func _ready() -> void: func _on_TextEdit_text_submitted(new_text): player_list.players[get_tree().network_peer.get_unique_id()].name = new_text + push_local_player_info() + #chat_announcement("Player " + old_name + " is now known as " + new_name) func _on_ColorPickerButton_color_changed(color): player_list.players[get_tree().network_peer.get_unique_id()].color = color + push_local_player_info()