Pawn bodies split out, character select redesigned, and started the dreaded process of correcting the netcode. Players can connect to a shared room, character select, and start a match. They appear correctly differentiated with cameras and map icons that follow them independently. Jankiness with trap ownership is present as is stuff connected to animation. Unit tests for all network functionality required.

This commit is contained in:
2026-03-10 01:41:15 -04:00
parent 984567cf96
commit d128501f7c
52 changed files with 1179 additions and 929 deletions

View File

@@ -0,0 +1,62 @@
class_name MultiplayerLevelSetup extends Node
var players_ready : Dictionary[int, bool] = {}
var pawns_expected : int = 1
var cameras_expected : int = 1
signal all_pawns_spawned()
signal all_cameras_spawned()
signal all_players_ready()
@rpc("authority", "reliable")
func set_pawns_expected(num : int) -> void:
all_pawns_spawned.connect(_on_all_pawns_spawned, CONNECT_ONE_SHOT)
print("(Instance %s) Expecting %d Pawns" % [Game.cmd_args.instance_id, num])
pawns_expected = num
func set_players_unready(list : Array) -> void:
players_ready = {}
for id in list:
players_ready[id] = false
players_ready[1] = true
func check_all_ready() -> bool:
for id in players_ready:
if !players_ready[id]:
return false
return true
func _on_all_pawns_spawned() -> void:
player_ready.rpc_id(1,Multiplayer.id)
func _on_all_cameras_spawned() -> void:
player_ready.rpc_id(1,Multiplayer.id)
@rpc("any_peer", "reliable")
func player_ready(id : int) -> void:
print("(Instance %s) Player %d notified ready" % [Game.cmd_args.instance_id, id])
players_ready[id] = true
if(check_all_ready()):
print("(Instance %s) ALL PLAYERS READY!!" % [Game.cmd_args.instance_id])
all_players_ready.emit()
@rpc("authority", "reliable")
func set_cameras_expected(num : int) -> void:
all_cameras_spawned.connect(_on_all_cameras_spawned, CONNECT_ONE_SHOT)
cameras_expected = num
func _on_pawn_spawner_spawned(node: Node) -> void:
print("(Instance %s) Spawned %d Pawn" % [Game.cmd_args.instance_id, node.id])
pawns_expected -= 1
if pawns_expected == 0:
print("(Instance %s) ALL PAWNS SPAWNED!" % [Game.cmd_args.instance_id])
all_pawns_spawned.emit()
func _on_camera_spawner_spawned(node: Node) -> void:
cameras_expected -= 1
if cameras_expected == 0:
all_cameras_spawned.emit()