Renamed a bunch of player stuff to pawn stuff and implemented extensive work on getting single-address 'netplay' code working. Not sure if I've created issues with single player but in theory it should all transfer across as if the player is simply always the host.

This commit is contained in:
2026-01-08 07:15:20 -05:00
parent 9fe376e27e
commit ec02685065
69 changed files with 1525 additions and 708 deletions

View File

@@ -4,16 +4,50 @@ extends Node
const blinder_template = preload("res://templates/blinder.tscn")
const one_shot_template = preload("res://templates/one_shot.tscn")
const vs_man_level = preload("res://scenes/multiplayer_test.tscn")
const vs_man_level = preload("res://scenes/test_level.tscn")
const pawn_select_scene = preload("res://scenes/character_select.tscn")
var player : Player
var player : PawnController
var hud : HUD
var level : Level
var multiplayer_game : bool = false
var num_players : int = 1
var pawns_selected : Dictionary[int, PawnBaseData] = {}
var level_synced : Dictionary[int, bool] = {}
var net_test : bool #TODO: Remove later
func setup_player(player : Player) -> void:
self.player = player
func _ready() -> void:
var args : Dictionary = {}
for arg in OS.get_cmdline_args():
if arg.begins_with("--"):
var flag = arg.lstrip("--")
args[flag]=true
if args.has("net_test"):
net_test = true
func setup_player(pc : PawnController) -> void:
var is_local = false
Game.level.pawns[pc.id] = pc
if pc.id == Multiplayer.id:
is_local = true
if is_local:
player = pc
if hud:
hud.register_player(player)
hud.register_pawn(pc,is_local)
func is_multiplayer() -> bool:
return multiplayer_game
func start_level(pawns : Dictionary[int, PawnBaseData]) -> void:
if !Multiplayer.is_host():
return
pawns_selected = pawns
for i in Multiplayer.players.values():
level_synced[i] = false
level_synced[1] = true
switch_scene(vs_man_level)
func switch_scene(packed_scene : PackedScene) -> void:
var blinder = blinder_template.instantiate() as TextureRect
@@ -21,21 +55,55 @@ func switch_scene(packed_scene : PackedScene) -> void:
blinder.self_modulate.a = 0
add_child(blinder)
tween.tween_property(blinder, "self_modulate:a", 1, .15)
tween.tween_callback(Callable(get_tree().change_scene_to_packed).bind(packed_scene))
var spawner = get_tree().get_first_node_in_group("level_spawner") as MultiplayerSpawner
tween.tween_callback(spawner.add_child.bind(packed_scene.instantiate(),true))
tween.tween_property(blinder, "self_modulate:a", 0, .15)
tween.tween_callback(blinder.queue_free)
pass
@rpc("call_local", "any_peer", "reliable")
func start_pawn_select(mplayer : bool) -> void:
var setup = get_tree().get_first_node_in_group("scenes")
multiplayer_game = mplayer
setup.queue_free()
num_players = Multiplayer.players.size()
var blinder = blinder_template.instantiate() as TextureRect
var tween = create_tween()
blinder.self_modulate.a = 0
add_child(blinder)
tween.tween_property(blinder, "self_modulate:a", 1, .15)
if Multiplayer.is_server():
var pawn_select = pawn_select_scene.instantiate()
var spawner = get_tree().get_first_node_in_group("level_spawner") as MultiplayerSpawner
tween.tween_callback(spawner.add_child.bind(pawn_select))
tween.tween_property(blinder, "self_modulate:a", 0, .15)
tween.tween_callback(blinder.queue_free)
@rpc("call_local", "any_peer", "reliable")
func start_vs_man() -> void:
var setup = get_tree().get_first_node_in_group("scenes")
setup.queue_free()
if Multiplayer.is_server():
var level = vs_man_level.instantiate()
var level_scene = vs_man_level.instantiate()
var spawner = get_tree().get_first_node_in_group("level_spawner") as MultiplayerSpawner
spawner.add_child(level)
spawner.add_child(level_scene)
@rpc("call_remote", "any_peer", "reliable")
func level_spawned(peer_id : int) -> void:
if !Multiplayer.is_host():
return
level_synced[peer_id] = true
check_level_ready()
func check_level_ready() -> void:
var ready : bool = true
for id in level_synced:
if level_synced[id] == false:
ready = false
if ready:
level.setup()
func oneshot(stream : AudioStream) -> void:
var shot = one_shot_template.instantiate()
shot.stream = stream