diff --git a/splunk/networking/networkmanager.gd b/splunk/networking/networkmanager.gd new file mode 100644 index 0000000..61510e1 --- /dev/null +++ b/splunk/networking/networkmanager.gd @@ -0,0 +1 @@ +extends Node diff --git a/splunk/networking/networkmanager.gd.uid b/splunk/networking/networkmanager.gd.uid new file mode 100644 index 0000000..4e34418 --- /dev/null +++ b/splunk/networking/networkmanager.gd.uid @@ -0,0 +1 @@ +uid://ckuxhcwgtsrsp diff --git a/splunk/networking/steam-manager.gd b/splunk/networking/steam-manager.gd index 3e980ce..a7ed60e 100644 --- a/splunk/networking/steam-manager.gd +++ b/splunk/networking/steam-manager.gd @@ -7,25 +7,57 @@ var steam_username: String = "" var lobby_id = 0 var lobby_max_members = 4 +var lobby_members: Array = [] + +var steam_initialized: bool = false + +var peer: SteamMultiplayerPeer -func _init() -> void: +func _ready() -> void: OS.set_environment("SteamAppId", str(steam_app_id)) OS.set_environment("SteamGameId", str(steam_app_id)) - int_steam() + steam_initialized = init_steam() + + # Connect Steam lobby signals + Steam.lobby_created.connect(_on_lobby_created) + Steam.lobby_joined.connect(_on_lobby_joined) + #Steam.lobby_match_list.connect(_on_lobby_match_list) + #Steam.lobby_chat_update.connect(_on_lobby_chat_update) + Steam.lobby_data_update.connect(_on_lobby_data_update) + #Steam.join_requested.connect(_on_lobby_join_requested) + Steam.persona_state_change.connect(_on_persona_change) + + # Setup multiplayer signals + multiplayer.peer_connected.connect(_on_peer_connected) + multiplayer.peer_disconnected.connect(_on_peer_disconnected) + multiplayer.connected_to_server.connect(_on_connected_to_server) + multiplayer.connection_failed.connect(_on_connection_failed) + multiplayer.server_disconnected.connect(_on_server_disconnected) + + create_lobby() func _process(delta): Steam.run_callbacks() -func int_steam(): +func check_command_line() -> void: + var args: Array = OS.get_cmdline_args() + if args.size() > 0: + if args[0] == "+connect_lobby": + if args.size() > 1 and int(args[1]) > 0: + print("Command line lobby ID: %s" % args[1]) + join_lobby(int(args[1])) + + +func init_steam() -> bool: var response: Dictionary = Steam.steamInitEx() print("Steam init response: %s " % response) if response['status'] > 0: - print("Failed to init steam! Shutting down... Code: %s " % response) - get_tree().quit() + print("Failed to init steam! Code: %s " % response) + return false is_owned = Steam.isSubscribed() steam_id = Steam.getSteamID() @@ -34,6 +66,138 @@ func int_steam(): print("Steam ID: %s " % steam_id) if !is_owned: - print("Yo, you don't own this on steam") - get_tree().quit() + print("Yo, you don't own this on steam, whats up with that?") + return false + return true + + +func setup_multiplayer_peer(is_host: bool = false) -> void: + peer = SteamMultiplayerPeer.new() + + if is_host: + var err = peer.create_host(0) + if err != OK: + print("Failed to create host: %s" % err) + return + print("Created host") + else: + pass + + multiplayer.multiplayer_peer = peer + + +func create_lobby(): + if lobby_id == 0: + print("Creating lobby...") + Steam.createLobby(Steam.LOBBY_TYPE_FRIENDS_ONLY, lobby_max_members) + + +func _on_lobby_created(connect: int, this_lobby_id: int): + if connect == 1: + lobby_id = this_lobby_id + print("Created lobby with id `%s`" % lobby_id) + + Steam.setLobbyJoinable(lobby_id, true) + Steam.setLobbyData(lobby_id, "name", "%'s Lobby" % steam_username) + Steam.setLobbyData(lobby_id, "mode", "Splunk") + + Steam.allowP2PPacketRelay(true) + setup_multiplayer_peer(true) + else : + print("Failed to create lobby...") + + +func join_lobby(this_lobby_id: int): + print("Attempting to join lobby: %s" % this_lobby_id) + lobby_members.clear() + Steam.joinLobby(this_lobby_id) + + +func _on_lobby_joined(this_lobby_id: int, permissions: int, locked: bool, response: int): + if response == Steam.CHAT_ROOM_ENTER_RESPONSE_SUCCESS: + lobby_id = this_lobby_id + print("Successfully joined lobby: %s" % lobby_id) + get_lobby_members() + setup_multiplayer_peer_client() + + +func setup_multiplayer_peer_client() -> void: + pass + + +func get_lobby_members() -> void: + lobby_members.clear() + var num_members = Steam.getNumLobbyMembers(lobby_id) + + for i in range(num_members): + var member_id = Steam.getLobbyMemberByIndex(lobby_id, i) + var member_name = Steam.getFriendPersonaName(member_id) + lobby_members.append({ + "steam_id": member_id, + "steam_name": member_name + }) + print("Lobby member: %s (%s)" % [member_name, member_id]) + + + +func _on_lobby_data_update(success: int) -> void: + pass + + +func _on_persona_change(steam_id_changed: int, flag: int) -> void: + pass + + +func leave_lobby() -> void: + pass + + +func _on_peer_connected(id: int) -> void: + print("Peer connected: %s" % id) + +func _on_peer_disconnected(id: int) -> void: + print("Peer disconnected: %s" % id) + +func _on_connected_to_server() -> void: + print("Connected to multiplayer host") + +func _on_connection_failed() -> void: + print("Failed to connect to multiplayer host") + +func _on_server_disconnected() -> void: + print("Disconnected from multiplayer host") + +func start_game(): + pass + + +@rpc("any_peer", "call_local", "reliable") +func start_game_rpc() -> void: + pass + + +func get_join_fail_reason(response: int) -> String: + match response: + Steam.CHAT_ROOM_ENTER_RESPONSE_DOESNT_EXIST: + return "Lobby no longer exists" + Steam.CHAT_ROOM_ENTER_RESPONSE_NOT_ALLOWED: + return "Not allowed to join" + Steam.CHAT_ROOM_ENTER_RESPONSE_FULL: + return "Lobby is full" + Steam.CHAT_ROOM_ENTER_RESPONSE_ERROR: + return "Unknown error" + Steam.CHAT_ROOM_ENTER_RESPONSE_BANNED: + return "You are banned" + Steam.CHAT_ROOM_ENTER_RESPONSE_LIMITED: + return "Limited account" + Steam.CHAT_ROOM_ENTER_RESPONSE_CLAN_DISABLED: + return "Lobby is locked" + Steam.CHAT_ROOM_ENTER_RESPONSE_COMMUNITY_BAN: + return "Community locked" + Steam.CHAT_ROOM_ENTER_RESPONSE_MEMBER_BLOCKED_YOU: + return "A member blocked you" + Steam.CHAT_ROOM_ENTER_RESPONSE_YOU_BLOCKED_MEMBER: + return "You blocked a member" + _: + return "Unknown reason"