From e01f08c65592e276096127ecf4cb097b24427aac Mon Sep 17 00:00:00 2001 From: Ayndpa Date: Wed, 19 Nov 2025 21:35:16 +0800 Subject: [PATCH] =?UTF-8?q?=E5=88=9D=E5=A7=8B=E5=8C=96Steam=20API=EF=BC=8C?= =?UTF-8?q?=E4=BC=98=E5=8C=96=E6=88=BF=E9=97=B4=E8=BF=9E=E6=8E=A5=E9=80=BB?= =?UTF-8?q?=E8=BE=91=EF=BC=8C=E7=A7=BB=E9=99=A4=E5=86=97=E4=BD=99=E7=9A=84?= =?UTF-8?q?Rich=20Presence=E5=A4=84=E7=90=86?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- online_game_tool.cpp | 43 ++++++-------- steam/steam_networking_manager.cpp | 9 +-- steam/steam_room_manager.cpp | 90 +++++------------------------- steam/steam_room_manager.h | 1 - 4 files changed, 37 insertions(+), 106 deletions(-) diff --git a/online_game_tool.cpp b/online_game_tool.cpp index dc4014d..34878e1 100644 --- a/online_game_tool.cpp +++ b/online_game_tool.cpp @@ -27,6 +27,13 @@ std::unique_ptr server; int main() { + // Initialize Steam API first + if (!SteamAPI_Init()) + { + std::cerr << "Failed to initialize Steam API" << std::endl; + return 1; + } + boost::asio::io_context io_context; // Initialize Steam Networking Manager @@ -34,6 +41,7 @@ int main() if (!steamManager.initialize()) { std::cerr << "Failed to initialize Steam Networking Manager" << std::endl; + SteamAPI_Shutdown(); return 1; } @@ -100,17 +108,15 @@ int main() ImGui::PushID(friendPair.first.ConvertToUint64()); if (ImGui::Button(("邀请 " + friendPair.second).c_str())) { - // Send invite via Steam with lobby ID as connect string - std::string connectStr = std::to_string(roomManager.getCurrentLobby().ConvertToUint64()); - // Safety check for SteamFriends - if (SteamFriends()) + // Send invite via Steam to lobby + if (SteamMatchmaking()) { - SteamFriends()->InviteUserToGame(friendPair.first, connectStr.c_str()); - std::cout << "Sent invite to " << friendPair.second << " with connect string: " << connectStr << std::endl; + SteamMatchmaking()->InviteUserToLobby(roomManager.getCurrentLobby(), friendPair.first); + std::cout << "Sent lobby invite to " << friendPair.second << std::endl; } else { - std::cerr << "SteamFriends() is null! Cannot send invite." << std::endl; + std::cerr << "SteamMatchmaking() is null! Cannot send invite." << std::endl; } } ImGui::PopID(); @@ -165,13 +171,9 @@ int main() } } } - if (steamManager.isHost()) + if (steamManager.isHost() || steamManager.isConnected()) { - ImGui::Text("正在主持游戏房间。邀请朋友!"); - ImGui::Separator(); - ImGui::InputInt("本地端口", &localPort); - ImGui::Separator(); - renderInviteFriends(); + ImGui::Text(steamManager.isHost() ? "正在主持游戏房间。邀请朋友!" : "已连接到游戏房间。邀请朋友!"); ImGui::Separator(); if (ImGui::Button("断开连接")) { @@ -183,20 +185,9 @@ int main() server.reset(); } } - } - if (steamManager.isConnected() && !steamManager.isHost()) - { - ImGui::Text("已连接到游戏房间。邀请朋友!"); - ImGui::Separator(); - if (ImGui::Button("断开连接")) + if (steamManager.isHost()) { - roomManager.leaveLobby(); - steamManager.disconnect(); - if (server) - { - server->stop(); - server.reset(); - } + ImGui::InputInt("本地端口", &localPort); } ImGui::Separator(); renderInviteFriends(); diff --git a/steam/steam_networking_manager.cpp b/steam/steam_networking_manager.cpp index fbd84cf..4aeff53 100644 --- a/steam/steam_networking_manager.cpp +++ b/steam/steam_networking_manager.cpp @@ -18,7 +18,6 @@ SteamNetworkingManager::SteamNetworkingManager() g_hConnection(k_HSteamNetConnection_Invalid), io_context_(nullptr), server_(nullptr), localPort_(nullptr), messageHandler_(nullptr), hostPing_(0) { - std::cout << "Initialized SteamNetworkingManager" << std::endl; } SteamNetworkingManager::~SteamNetworkingManager() @@ -31,9 +30,11 @@ SteamNetworkingManager::~SteamNetworkingManager() bool SteamNetworkingManager::initialize() { instance = this; - if (!SteamAPI_Init()) + + // Steam API should already be initialized before calling this + if (!SteamAPI_IsSteamRunning()) { - std::cerr << "Failed to initialize Steam API" << std::endl; + std::cerr << "Steam is not running" << std::endl; return false; } @@ -89,7 +90,7 @@ bool SteamNetworkingManager::initialize() m_pInterface = SteamNetworkingSockets(); // Check if callbacks are registered - std::cout << "Steam API initialized" << std::endl; + std::cout << "Steam Networking Manager initialized successfully" << std::endl; return true; } diff --git a/steam/steam_room_manager.cpp b/steam/steam_room_manager.cpp index 50e2b53..1c1bcbc 100644 --- a/steam/steam_room_manager.cpp +++ b/steam/steam_room_manager.cpp @@ -9,74 +9,6 @@ SteamFriendsCallbacks::SteamFriendsCallbacks(SteamNetworkingManager *manager, St std::cout << "SteamFriendsCallbacks constructor called" << std::endl; } -void SteamFriendsCallbacks::OnGameRichPresenceJoinRequested(GameRichPresenceJoinRequested_t *pCallback) -{ - std::cout << "GameRichPresenceJoinRequested received" << std::endl; - if (manager_) - { - const char *connectStr = pCallback->m_rgchConnect; - std::cout << "Connect string: '" << (connectStr ? connectStr : "null") << "'" << std::endl; - if (connectStr && connectStr[0] != '\0') - { - try - { - uint64 id = std::stoull(connectStr); - std::string str = connectStr; - std::cout << "Parsed ID: " << id << std::endl; - if (str.find("7656119") == 0) - { - // It's a Steam ID, join host directly - std::cout << "Parsed Steam ID: " << id << ", joining host" << std::endl; - if (!manager_->isHost() && !manager_->isConnected()) - { - manager_->joinHost(id); - // Start TCP Server if dependencies are set - if (manager_->getServer() && !(*manager_->getServer())) - { - *manager_->getServer() = std::make_unique(8888, manager_); - if (!(*manager_->getServer())->start()) - { - std::cerr << "Failed to start TCP server" << std::endl; - } - } - } - else - { - std::cout << "Already host or connected, ignoring join request" << std::endl; - } - } - else - { - // Assume it's a lobby ID - CSteamID lobbySteamID(id); - std::cout << "Parsed lobby ID: " << id << std::endl; - if (!manager_->isHost() && !manager_->isConnected()) - { - std::cout << "Joining lobby from invite: " << id << std::endl; - roomManager_->joinLobby(lobbySteamID); - } - else - { - std::cout << "Already host or connected, ignoring invite" << std::endl; - } - } - } - catch (const std::exception &e) - { - std::cerr << "Failed to parse connect string: " << connectStr << " error: " << e.what() << std::endl; - } - } - else - { - std::cerr << "Empty connect string in join request" << std::endl; - } - } - else - { - std::cout << "Manager is null" << std::endl; - } -} - void SteamFriendsCallbacks::OnGameLobbyJoinRequested(GameLobbyJoinRequested_t *pCallback) { std::cout << "GameLobbyJoinRequested received" << std::endl; @@ -115,12 +47,10 @@ void SteamMatchmakingCallbacks::OnLobbyCreated(LobbyCreated_t *pCallback, bool b { roomManager_->setCurrentLobby(pCallback->m_ulSteamIDLobby); std::cout << "Lobby created: " << roomManager_->getCurrentLobby().ConvertToUint64() << std::endl; - // Set Rich Presence with lobby ID - std::string lobbyStr = std::to_string(roomManager_->getCurrentLobby().ConvertToUint64()); - SteamFriends()->SetRichPresence("connect", lobbyStr.c_str()); - SteamFriends()->SetRichPresence("status", "主持游戏房间"); - SteamFriends()->SetRichPresence("steam_display", "#StatusWithConnectFormat"); - std::cout << "Set Rich Presence connect to: " << lobbyStr << std::endl; + + // Set Rich Presence to enable invite functionality + SteamFriends()->SetRichPresence("steam_display", "#Status_InLobby"); + SteamFriends()->SetRichPresence("connect", std::to_string(pCallback->m_ulSteamIDLobby).c_str()); } else { @@ -150,6 +80,11 @@ void SteamMatchmakingCallbacks::OnLobbyEntered(LobbyEnter_t *pCallback) { roomManager_->setCurrentLobby(pCallback->m_ulSteamIDLobby); std::cout << "Entered lobby: " << pCallback->m_ulSteamIDLobby << std::endl; + + // Set Rich Presence to enable invite functionality + SteamFriends()->SetRichPresence("steam_display", "#Status_InLobby"); + SteamFriends()->SetRichPresence("connect", std::to_string(pCallback->m_ulSteamIDLobby).c_str()); + // Only join host if not the host if (!manager_->isHost()) { @@ -180,6 +115,9 @@ SteamRoomManager::SteamRoomManager(SteamNetworkingManager *networkingManager) { steamFriendsCallbacks = new SteamFriendsCallbacks(networkingManager_, this); steamMatchmakingCallbacks = new SteamMatchmakingCallbacks(networkingManager_, this); + + // Clear Rich Presence on initialization to prevent "Invite to game" showing when not in a lobby + SteamFriends()->ClearRichPresence(); } SteamRoomManager::~SteamRoomManager() @@ -207,6 +145,9 @@ void SteamRoomManager::leaveLobby() { SteamMatchmaking()->LeaveLobby(currentLobby); currentLobby = k_steamIDNil; + + // Clear Rich Presence when leaving lobby + SteamFriends()->ClearRichPresence(); } } @@ -248,7 +189,6 @@ bool SteamRoomManager::startHosting() { networkingManager_->getIsHost() = true; std::cout << "Created listen socket for hosting game room" << std::endl; - // Rich Presence is set in OnLobbyCreated callback return true; } else diff --git a/steam/steam_room_manager.h b/steam/steam_room_manager.h index 441a88a..9f0035c 100644 --- a/steam/steam_room_manager.h +++ b/steam/steam_room_manager.h @@ -16,7 +16,6 @@ private: SteamNetworkingManager *manager_; SteamRoomManager *roomManager_; - STEAM_CALLBACK(SteamFriendsCallbacks, OnGameRichPresenceJoinRequested, GameRichPresenceJoinRequested_t); STEAM_CALLBACK(SteamFriendsCallbacks, OnGameLobbyJoinRequested, GameLobbyJoinRequested_t); };