Updated networking code to new Godot 4 version. Removed unused code in Player.gd and cleaned up commented garbage

remotes/1709858346833250237/update-godot-to-1852afb6b
unfa 2021-09-17 01:32:00 +02:00
parent b11b83f918
commit 70f24ce4e7
4 changed files with 50 additions and 119 deletions

View File

@ -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

View File

@ -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

View File

@ -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()

View File

@ -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)