extends Node class_name Players @export var player_scene: PackedScene = preload("res://objects/player.tscn") @export var bot_scene: PackedScene = preload("res://objects/bot.tscn") @export var bot_count: int = 7 @export var bot_test_mode = false @onready var game_state: GameState = get_parent() as GameState signal player_joined(player: Player) signal player_left(player: Player) static var instance: Players = null func _ready() -> void: connect("child_entered_tree", on_child_added) if instance == null: instance = self await get_tree().create_timer(0.5).timeout for i in range(bot_count): create_bot(i) #bot.player_name = "Bot %d" % i #bot.player_pronouns = "they/them" @rpc("any_peer", "call_remote", "reliable") func clear_all_players(): for child in get_children(): child.queue_free() @rpc("any_peer", "call_remote", "reliable") func create_player_for_session_id(session_id: int) -> Player: for child in get_children(): var player: Player = child as Player if player == null: continue if player.session_id == session_id: return player var player: Player = player_scene.instantiate() as Player player.name = "Player %d" % session_id player.session_id = session_id player.game_state = game_state print("Created player object for session ID %d" % session_id) add_child(player) return player @rpc("any_peer", "call_remote", "reliable") func create_bot(bot_id: int) -> Bot: var bot: Bot = bot_scene.instantiate() as Bot bot.session_id = bot_id bot.game_state = game_state bot.player_name = "Bot %d" % bot_id bot.test_mode = bot_test_mode add_child(bot) return bot func find_player_by_session_id(session_id: int) -> Player: for child in get_children(): var player: Player = child as Player if player == null: continue if player.session_id == session_id: return player create_player_for_session_id.rpc_id(1, session_id) for child in get_children(): var player: Player = child as Player if player == null: continue if player.session_id == session_id: return player return null func find_player_by_name(name: String) -> Player: for player in get_players(): if player.player_name == name: return player return null func get_players() -> Array[Player]: var ret: Array[Player] for child in get_children(): if child is Player: ret.append(child as Player) return ret func get_active_players() -> Array[Player]: return get_players().filter(func(player: Player): return player.playing) func on_child_added(node: Node) -> void: if node is Player: print("Player joined: %d" % node.session_id) player_joined.emit(node as Player) func call_on_active_players(method: StringName): for player in get_active_players(): player.call(method)