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:
@@ -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
|
||||
|
||||
@@ -7,6 +7,9 @@ var handle : String
|
||||
var id : int = 1
|
||||
var players : Dictionary = {}
|
||||
signal client_added(handle : String, id : int)
|
||||
signal all_ready()
|
||||
var player_readiness : Dictionary[int, bool] = {}
|
||||
var waiting : bool = false
|
||||
|
||||
func become_host() -> void:
|
||||
print("Starting host!")
|
||||
@@ -14,6 +17,7 @@ func become_host() -> void:
|
||||
var server_peer = ENetMultiplayerPeer.new()
|
||||
server_peer.create_server(SERVER_PORT)
|
||||
players[handle] = 1
|
||||
player_readiness[1] = false
|
||||
multiplayer.multiplayer_peer = server_peer
|
||||
id = multiplayer.get_unique_id()
|
||||
print("%s %d t" % [handle, multiplayer.get_unique_id()])
|
||||
@@ -29,13 +33,33 @@ func join_game(new_handle : String) -> Error:
|
||||
multiplayer.multiplayer_peer = client_peer
|
||||
handle = new_handle
|
||||
id = multiplayer.get_unique_id()
|
||||
players[handle] = id
|
||||
player_readiness[id] = false
|
||||
if !error:
|
||||
print("%s %d" % [handle, multiplayer.get_unique_id()])
|
||||
await get_tree().create_timer(0.5).timeout
|
||||
get_handle_from_peer(1)
|
||||
return !error
|
||||
|
||||
func is_server() -> bool:
|
||||
return multiplayer && multiplayer.is_server()
|
||||
|
||||
func is_host() -> bool:
|
||||
return id == 1
|
||||
|
||||
func _process(delta: float) -> void:
|
||||
if waiting:
|
||||
var ready : bool = true
|
||||
for pr in player_readiness.values():
|
||||
if !pr:
|
||||
ready = false
|
||||
break
|
||||
if ready:
|
||||
all_ready.emit()
|
||||
waiting = false
|
||||
for pr in player_readiness.keys():
|
||||
player_readiness[pr] = false
|
||||
|
||||
func _add_player_to_game(id : int) -> void:
|
||||
print("Player %s joined the game!" % id)
|
||||
await get_tree().create_timer(0.5).timeout
|
||||
@@ -47,10 +71,15 @@ func _remove_player_from_game(id : int) -> void:
|
||||
func get_handle_from_peer(peer_id) -> void:
|
||||
rpc_id(peer_id, "report_handle_to_peer", id)
|
||||
|
||||
@rpc("call_local", "any_peer", "reliable")
|
||||
func set_player_ready(peer_id : int) -> void:
|
||||
player_readiness[peer_id] = true
|
||||
|
||||
@rpc("any_peer", "call_remote")
|
||||
func receive_peer_handle(peer_id, peer_handle) -> void:
|
||||
print("Player %s identified as %s!" % [peer_id, peer_handle])
|
||||
players[peer_handle] = peer_id
|
||||
player_readiness[peer_id] = false
|
||||
client_added.emit(peer_handle, peer_id)
|
||||
|
||||
@rpc("any_peer", "call_remote")
|
||||
|
||||
Reference in New Issue
Block a user