From 70f24ce4e722944129dc4ea6009b7b75cd9464ce Mon Sep 17 00:00:00 2001 From: unfa Date: Fri, 17 Sep 2021 01:32:00 +0200 Subject: [PATCH] Updated networking code to new Godot 4 version. Removed unused code in Player.gd and cleaned up commented garbage --- Game/Assets/Characters/Player.gd | 59 +++++---------------- Game/Assets/HUD/HUD.gd | 8 +-- Game/Assets/Weapons/Weapon.gd | 14 ++--- Game/Main.gd | 88 ++++++++++---------------------- 4 files changed, 50 insertions(+), 119 deletions(-) diff --git a/Game/Assets/Characters/Player.gd b/Game/Assets/Characters/Player.gd index d4b9568..f989bf0 100644 --- a/Game/Assets/Characters/Player.gd +++ b/Game/Assets/Characters/Player.gd @@ -88,7 +88,7 @@ var jetpack_was_active = false var velocity := Vector3.ZERO var gravity_vec := Vector3.ZERO -@rpc(nosync,unreliable) func update_movement(player_transform, head_rotation, lin_velocity, jetpack): +@rpc(auth, nosync,unreliable) func update_movement(player_transform, head_rotation, lin_velocity, jetpack): global_transform = player_transform head.set_rotation(head_rotation) jetpack_active = jetpack @@ -97,24 +97,8 @@ var gravity_vec := Vector3.ZERO func _ready() -> void: #Input.set_mouse_mode(Input.MOUSE_MODE_CAPTURED) view_zoom_target = 1.0 - -# generate_info() - - rpc_config(&'move_and_slide', MultiplayerAPI.RPC_MODE_ANY) - rpc_config(&"aim", MultiplayerAPI.RPC_MODE_ANY) - rpc_config(&"set_global_transform", MultiplayerAPI.RPC_MODE_ANY) - rpc_config(&"set_linear_velocity", MultiplayerAPI.RPC_MODE_ANY) - head.rpc_config(&"set_rotation", MultiplayerAPI.RPC_MODE_ANY) - rpc_config(&"set_info", MultiplayerAPI.RPC_MODE_ANY) - -# rpc_config(&'move_and_slide', MultiplayerAPI.RPC_MODE_PUPPETSYNC) -# rpc_config(&"aim", MultiplayerAPI.RPC_MODE_PUPPETSYNC) -# rpc_config(&"set_global_transform", MultiplayerAPI.RPC_MODE_PUPPET) -# rpc_config(&"set_linear_velocity", MultiplayerAPI.RPC_MODE_PUPPET) -# head.rpc_config(&"set_rotation", MultiplayerAPI.RPC_MODE_PUPPETSYNC) -# rpc_config(&"set_info", MultiplayerAPI.RPC_MODE_PUPPETSYNC) - if is_network_authority(): # prevent puppets from attempting to steer the authority - this just causes RPC errors + if is_multiplayer_authority(): # prevent puppets from attempting to steer the authority - this just causes RPC errors input_active = true $Head/Camera.current = true else: @@ -143,7 +127,7 @@ func _input(event) -> void: if not input_active: return - assert(is_network_authority() == true, "input_active is true, even though the node is not network_authority") + assert(is_multiplayer_authority() == true, "input_active is true, even though the node is not multiplayer_authority") if Input.is_action_just_pressed("view_zoom"): # tween.remove_all() @@ -183,7 +167,7 @@ func _process(delta): if not input_active: return - assert(is_network_authority() == true, "input_active is true, even though the node is not network_authority") + assert(is_multiplayer_authority() == true, "input_active is true, even though the node is not multiplayer_authority") if view_zoom_direction and view_zoom < view_zoom_target: view_zoom = min(view_zoom_target, view_zoom + delta * 4) @@ -192,41 +176,35 @@ func _process(delta): func damage(hp: int): - var target = main.player_list.players[self.get_network_authority()] + var target = main.player_list.players[self.get_multiplayer_authority()] target.health -= hp -# if target.health <= 0: # int(name) is the player instance node name signifying owner's PID -# die() func die(killer_pid: int): var gibs = gibs_vfx.instantiate() get_tree().root.add_child(gibs) gibs.global_transform = self.global_transform# - #if get_tree().get_rpc_sender_id() != get_network_authority(): + #if get_tree().get_rpc_sender_id() != get_multiplayer_authority(): # print ("Death requested by a non-master. Ignoring") # return - main.rpc(&'destroy_player', self.get_network_authority()) + main.rpc(&'destroy_player', self.get_multiplayer_authority()) - main.chat.rpc(&'chat_notification', "Player [/i][b][color=" + main.player_list.players[self.get_network_authority()].color.to_html() + "]" + main.player_list.players[self.get_network_authority()].name + "[/color][/b][i] was killed by " + main.player_list.players[killer_pid].name ) + main.chat.rpc(&'chat_notification', "Player [/i][b][color=" + main.player_list.players[self.get_multiplayer_authority()].color.to_html() + "]" + main.player_list.players[self.get_multiplayer_authority()].name + "[/color][/b][i] was killed by " + main.player_list.players[killer_pid].name ) #queue_free() func update_player(info) -> void: update_color(info.color) -func update_color(color) -> void: #change player's wolrdmodel color - #var pid = self.get_network_authority() +func update_color(color) -> void: #change player's wolrldmodel color + var player_material = mesh.mesh.surface_get_material(0).duplicate() player_material.albedo_color = color mesh.set_surface_override_material(0, player_material) func _physics_process(delta): -# rpc_unreliable(&'set_global_transform', global_transform) -# head.rpc_unreliable(&'set_rotation', head.get_rotation()) - #rpc(&'set_global_transform', global_transform) - #head.rpc(&'set_rotation', head.get_rotation()) - - if not is_network_authority(): + + if not is_multiplayer_authority(): move_and_slide() return @@ -269,7 +247,7 @@ func _physics_process(delta): jetpack_fuel = min(jetpack_tank, jetpack_fuel + jetpack_recharge * delta) #print("Jetpack fuel: ", jetpack_fuel, " active: ", jetpack_active, " delta: ", delta, " gravity vec: ", gravity_vec) - + if direction.length() > 0: # normalized() will return a null direction = direction.normalized() @@ -279,11 +257,6 @@ func _physics_process(delta): velocity = velocity.lerp(direction * speed, accel * delta) linear_velocity = velocity + gravity_vec - #slide = move_and_slide_with_snap(movement, snap, Vector3.UP) -# rpc_unreliable(&'set_linear_velocity', linear_velocity) -# rpc_unreliable(&"move_and_slide") -# rpc(&'set_linear_velocity', linear_velocity) -# rpc(&'move_and_slide') move_and_slide() if not is_on_floor() and not ground_check.is_colliding(): # while in mid-air collisions affect momentum @@ -291,12 +264,6 @@ func _physics_process(delta): velocity.z = linear_velocity.z gravity_vec.y = linear_velocity.y - # update puppets -# if get_tree().multiplayer.get_network_unique_id() == 1: -# rpc(&'update_movement', global_transform, head.get_rotation()) -# else: -# rpc_id(1, &'update_movement', global_transform, head.get_rotation()) -# rpc(&'update_movement', global_transform, head.get_rotation(), linear_velocity, jetpack_active) # (stair) climbing diff --git a/Game/Assets/HUD/HUD.gd b/Game/Assets/HUD/HUD.gd index a6e667d..21a0885 100644 --- a/Game/Assets/HUD/HUD.gd +++ b/Game/Assets/HUD/HUD.gd @@ -35,12 +35,12 @@ func scoretab(show := true): # Called every frame. 'delta' is the elapsed time since the previous frame. func _process(delta): # if main.local_player == null: # player is dead ATM -# print("local_player is null; PID is ", get_tree().multiplayer.get_network_unique_id(),"; respawn queue: ", main.respawn_queue) - if not get_tree().multiplayer.has_network_peer(): # don't do anything if we're offline +# print("local_player is null; PID is ", get_tree().multiplayer.get_multiplayer_unique_id(),"; respawn queue: ", main.respawn_queue) + if not get_tree().multiplayer.has_multiplayer_peer(): # don't do anything if we're offline return - if main.spawn_queue.has(get_tree().multiplayer.get_network_unique_id()): - var countdown = main.spawn_queue[get_tree().multiplayer.get_network_unique_id()] - main.uptime + if main.spawn_queue.has(get_tree().multiplayer.get_unique_id()): + var countdown = main.spawn_queue[get_tree().multiplayer.get_unique_id()] - main.uptime # countdown = round(countdown * 10) / 10 $RespawnCountdown.text = "RESPAWNING IN " + str("%1.2f" % countdown) + " SECONDS..." $RespawnCountdown.visible = true diff --git a/Game/Assets/Weapons/Weapon.gd b/Game/Assets/Weapons/Weapon.gd index 341af59..45ccda5 100644 --- a/Game/Assets/Weapons/Weapon.gd +++ b/Game/Assets/Weapons/Weapon.gd @@ -20,7 +20,7 @@ var impact_player = preload("res://Assets/Effects/ImpactBlood.tscn") #enum Trigger {TRIGGER_PRIMARY, TRIGGER_SECONDARY} @rpc(sync) func shoot(): - #print("SHOOT from PID ", get_tree().multiplayer.get_network_unique_id(), " controlled by ", player.get_network_authority()) + #print("SHOOT from PID ", get_tree().multiplayer.get_multiplayer_unique_id(), " controlled by ", player.get_multiplayer_authority()) var space_state = get_world_3d().direct_space_state var from = camera.get_global_transform().origin @@ -35,21 +35,21 @@ var impact_player = preload("res://Assets/Effects/ImpactBlood.tscn") if ray: # did we hit anything? if ray['collider'].has_method(&'damage'): - if is_network_authority(): #get_tree().multiplayer.get_network_unique_id() == 1: # make sure this can only run on the server + if is_multiplayer_authority(): #get_tree().multiplayer.get_multiplayer_unique_id() == 1: # make sure this can only run on the server #print("SHOT HIT ", ray['collider']) ray['collider'].damage(20) # apply damage - if main.player_list.get(ray['collider'].get_network_authority()).health <= 0: # if he ded - ray['collider'].die(self.get_network_authority()) + if main.player_list.get(ray['collider'].get_multiplayer_authority()).health <= 0: # if he ded + ray['collider'].die(self.get_multiplayer_authority()) - main.player_list.players[player.get_network_authority()].score += 1 # give the killer a point - main.rpc(&'player_list_update', main.player_list.get(player.get_network_authority()).serialize(), player.get_network_authority()) + main.player_list.players[player.get_multiplayer_authority()].score += 1 # give the killer a point + main.rpc(&'player_list_update', main.player_list.get(player.get_multiplayer_authority()).serialize(), player.get_multiplayer_authority()) hud.get_node("Crosshair").kill() # update local HUD else: hud.get_node("Crosshair").hit() # boardcast the new health value to all peers - main.rpc(&'player_list_update', main.player_list.get(ray['collider'].get_network_authority()).serialize(), ray['collider'].get_network_authority()) + main.rpc(&'player_list_update', main.player_list.get(ray['collider'].get_multiplayer_authority()).serialize(), ray['collider'].get_multiplayer_authority()) main.update_hud() impact_vfx = impact_player.instantiate() diff --git a/Game/Main.gd b/Game/Main.gd index 03ebaf9..a2e92bd 100644 --- a/Game/Main.gd +++ b/Game/Main.gd @@ -1,8 +1,7 @@ extends Node enum GameFocus {MENU, GAME, CHAT, AWAY} -enum NetworkRole {NONE, CLIENT, SERVER, DEDICATED_SERVER, RELAY_SERVER} - +enum MultiplayerRole {NONE, CLIENT, SERVER, DEDICATED_SERVER, RELAY_SERVER} const NET_PORT = 12597 @@ -11,10 +10,10 @@ const NET_SERVER = "localhost" var peer = ENetMultiplayerPeer.new() -var role = NetworkRole.NONE: +var role = MultiplayerRole.NONE: set(new_role): role = new_role - print("Network Role changed to ", NetworkRole.keys()[new_role]) + print("Multiplayer Role changed to ", MultiplayerRole.keys()[new_role]) var player_scene = preload("res://Assets/Characters/Player.tscn") @@ -41,11 +40,6 @@ class PlayerInfo: self.focus = 999 self.health = 100 self.score = 0 -# else: -# self.name = name -# self.team = team -# self.color = color -# self.focus = 0 func serialize(): return { @@ -96,15 +90,12 @@ func _process(delta): for i in spawn_queue.keys(): if spawn_queue[i] <= uptime: - var is_local = true if i == get_tree().multiplayer.get_network_unique_id() else false + var is_local = true if i == get_tree().multiplayer.get_unique_id() else false create_player(i, is_local, true) spawn_queue.erase(i) class PlayerList: var players = {} -# -# func store(pid, item): -# items[pid] = item func erase(pid): players.erase(pid) @@ -112,21 +103,10 @@ class PlayerList: func set(pid: int, info: PlayerInfo): # if info is PlayerInfo: players[pid] = info -# else: -# var new_info = PlayerInfo.deserialize(info) -# players[pid] = new_info func get(pid: int) -> PlayerInfo: return players[pid] -# func update(): -# if get_tree().multiplayer.get_network_unique_id() == 1: -# for i in players.keys: -# rpc(&'player_list_update', i, players[i].serialize()) -# else: -# rpc_id(1, &'player_list_update', players[get_tree().multiplayer.get_network_unique_id()].serialize()) - - @onready var player_list = PlayerList.new() var focus = GameFocus.MENU : @@ -153,16 +133,6 @@ var focus = GameFocus.MENU : focus = new_focus -#@remote set_info(info) -> void: -# player_info = PlayerInfo.new(info['name'], info['team'].to_int(), Color(info['color'])) -# print("set_info - rpc called from ", get_tree().get_rpc_sender_id()) - -#@master func update_info() -> void: -# rpc(&'set_info', player_info.serialize()) - -#@master func generate_info() -> void: - #rpc(&'set_info', PlayerInfo.new(player_name, 0, color).serialize() ) - func _input(_event) -> void: if Input.is_action_just_pressed("ui_cancel"): if focus == GameFocus.GAME: @@ -175,9 +145,6 @@ func _input(_event) -> void: elif Input.is_action_just_released("show_scoretab"): hud.scoretab(false) -#@remote func st(player_list): -# self.player_list = player_list - func game_over(): pass @@ -185,13 +152,12 @@ func check_game_win_condition(): for i in player_list.players.keys(): if player_list.players[i].score >= game_score_limit: chat.rpc(&'chat_notification', "Player " + player_list.players[i].name + " has won this round!") - #rpc(&'game_over', player_list.players[i].name) game_over() func update_hud(): - hud.get_node("ScoreRank").text = "SCORE: " + str(player_list.get( get_tree().multiplayer.get_network_unique_id() ).score) + hud.get_node("ScoreRank").text = "SCORE: " + str(player_list.get( get_tree().multiplayer.get_unique_id() ).score) - var score = player_list.get( get_tree().multiplayer.get_network_unique_id() ).score + var score = player_list.get( get_tree().multiplayer.get_unique_id() ).score var scores = [] for i in player_list.players.values(): @@ -206,9 +172,7 @@ func update_hud(): scores.reverse() var lead = score - scores[0] - - #var rank = - + hud.get_node("ScoreRank").text = "SCORE: " + str(score) + "\nRANK: " if lead > 0: @@ -235,9 +199,9 @@ func update_hud(): update_hud() func push_local_player_info(): # - var id = get_tree().multiplayer.get_network_unique_id() + var id = get_tree().multiplayer.get_unique_id() - rpc(&'player_list_update', player_list.get(id).serialize(), get_tree().multiplayer.get_network_unique_id()) + rpc(&'player_list_update', player_list.get(id).serialize(), get_tree().multiplayer.get_unique_id()) @rpc(sync,auth,reliable) func destroy_player(pid: int): @@ -262,7 +226,7 @@ func create_player(pid: int, is_local:= false, respawn:= false) -> void: var spawnpoint = $Map/SpawnPoints.get_children()[randi() % len($Map/SpawnPoints.get_children())] new_player.name = str(pid) new_player.global_transform = spawnpoint.global_transform - new_player.set_network_authority(pid) + new_player.set_multiplayer_authority(pid) $Players.add_child(new_player) var new_info: PlayerInfo @@ -277,7 +241,7 @@ func create_player(pid: int, is_local:= false, respawn:= false) -> void: player_list.set(pid, new_info) # superfluous and harmful code that messes up player data: -# if get_tree().multiplayer.get_network_unique_id() != 1: # if we're not the server - update the server +# if get_tree().multiplayer.get_multiplayer_unique_id() != 1: # if we're not the server - update the server # rpc_id(1, &'player_list_update', new_info.serialize(), pid) # send local player info to the server # else: # if we're the server, update the clients # rpc(&'player_list_update', new_info.serialize(), pid) @@ -294,18 +258,18 @@ func create_player(pid: int, is_local:= false, respawn:= false) -> void: #new_player.rpc(&'set_color', player_list.get(pid).color) func start_dedicated_server(): # start server without creating a local player - role = NetworkRole.DEDICATED_SERVER + role = MultiplayerRole.DEDICATED_SERVER peer.create_server(NET_PORT, 16) - get_tree().network_peer = peer + get_tree().multiplayer_peer = peer #create_player(1, true) func _on_Host_pressed(): # start server and create a local player - role = NetworkRole.SERVER + role = MultiplayerRole.SERVER $NetworkTesting/Host.disabled = true $NetworkTesting/Connect.disabled = true peer.create_server(NET_PORT, 16) - get_tree().multiplayer.network_peer = peer + get_tree().multiplayer.multiplayer_peer = peer create_player(1, true) focus = GameFocus.GAME chat.chat_notification("Started server") @@ -315,13 +279,13 @@ func _on_Connect_pressed(): $NetworkTesting/Connect.disabled = true peer.create_client(NET_SERVER, NET_PORT) - get_tree().multiplayer.network_peer = peer + get_tree().multiplayer.multiplayer_peer = peer func _player_connected(pid) -> void: print("player connected, id: ", pid) create_player(pid, false) - if get_tree().multiplayer.get_network_unique_id() == 1: # if we're the server + if get_tree().multiplayer.is_server(): # if we're the server for i in player_list.players.keys(): # send the player_list to the new client #pass rpc_id(pid, &'player_list_update', player_list.get(i).serialize(), i) # send local player info to the server @@ -329,22 +293,22 @@ func _player_connected(pid) -> void: # if local_player: # local_player.rpc(&"update_info") # -# if role in [NetworkRole.SERVER, NetworkRole.DEDICATED_SERVER]: +# if role in [MultiplayerRole.SERVER, MultiplayerRole.DEDICATED_SERVER]: # rpc_id(id, "player_list_update", player_list) func _player_disconnected(pid) -> void: print("player disconnected, id: ", pid) - if get_tree().multiplayer.get_network_unique_id() == 1: # if we're the server, broadcast that a player left + if get_tree().multiplayer.is_server(): # 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().multiplayer.get_network_unique_id() + var pid = get_tree().multiplayer.get_unique_id() create_player(pid, true) focus = GameFocus.GAME - role = NetworkRole.CLIENT + role = MultiplayerRole.CLIENT func _connected_fail() -> void: print("connection to server failed") @@ -352,7 +316,7 @@ func _connected_fail() -> void: func _server_disconnected() -> void: print("server disconnected") - role = NetworkRole.NONE + role = MultiplayerRole.NONE chat.chat_notification("Server disconnected") @@ -360,8 +324,8 @@ func _ready() -> void: #peer.compression_mode = NetworkedMultiplayerENet.COMPRESS_ZSTD print("Commandline arguments: ", OS.get_cmdline_args()) - get_tree().multiplayer.connect("network_peer_connected", self._player_connected) - get_tree().multiplayer.connect("network_peer_disconnected", self._player_disconnected) + get_tree().multiplayer.connect("peer_connected", self._player_connected) + get_tree().multiplayer.connect("peer_disconnected", self._player_disconnected) get_tree().multiplayer.connect("connected_to_server", self._connected_ok) get_tree().multiplayer.connect("connection_failed", self._connected_fail) get_tree().multiplayer.connect("server_disconnected", self._server_disconnected) @@ -370,12 +334,12 @@ func _ready() -> void: start_dedicated_server() func _on_TextEdit_text_submitted(new_text): - player_list.players[get_tree().multiplayer.get_network_unique_id()].name = new_text + player_list.players[get_tree().multiplayer.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().multiplayer.get_network_unique_id()].color = color + player_list.players[get_tree().multiplayer.get_unique_id()].color = color push_local_player_info() #local_player.rpc(&'set_color', color)