初始化Steam API,优化房间连接逻辑,移除冗余的Rich Presence处理
This commit is contained in:
@@ -27,6 +27,13 @@ std::unique_ptr<TCPServer> server;
|
|||||||
|
|
||||||
int main()
|
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;
|
boost::asio::io_context io_context;
|
||||||
|
|
||||||
// Initialize Steam Networking Manager
|
// Initialize Steam Networking Manager
|
||||||
@@ -34,6 +41,7 @@ int main()
|
|||||||
if (!steamManager.initialize())
|
if (!steamManager.initialize())
|
||||||
{
|
{
|
||||||
std::cerr << "Failed to initialize Steam Networking Manager" << std::endl;
|
std::cerr << "Failed to initialize Steam Networking Manager" << std::endl;
|
||||||
|
SteamAPI_Shutdown();
|
||||||
return 1;
|
return 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -100,17 +108,15 @@ int main()
|
|||||||
ImGui::PushID(friendPair.first.ConvertToUint64());
|
ImGui::PushID(friendPair.first.ConvertToUint64());
|
||||||
if (ImGui::Button(("邀请 " + friendPair.second).c_str()))
|
if (ImGui::Button(("邀请 " + friendPair.second).c_str()))
|
||||||
{
|
{
|
||||||
// Send invite via Steam with lobby ID as connect string
|
// Send invite via Steam to lobby
|
||||||
std::string connectStr = std::to_string(roomManager.getCurrentLobby().ConvertToUint64());
|
if (SteamMatchmaking())
|
||||||
// Safety check for SteamFriends
|
|
||||||
if (SteamFriends())
|
|
||||||
{
|
{
|
||||||
SteamFriends()->InviteUserToGame(friendPair.first, connectStr.c_str());
|
SteamMatchmaking()->InviteUserToLobby(roomManager.getCurrentLobby(), friendPair.first);
|
||||||
std::cout << "Sent invite to " << friendPair.second << " with connect string: " << connectStr << std::endl;
|
std::cout << "Sent lobby invite to " << friendPair.second << std::endl;
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
std::cerr << "SteamFriends() is null! Cannot send invite." << std::endl;
|
std::cerr << "SteamMatchmaking() is null! Cannot send invite." << std::endl;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
ImGui::PopID();
|
ImGui::PopID();
|
||||||
@@ -165,38 +171,23 @@ int main()
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
if (steamManager.isHost() || steamManager.isConnected())
|
||||||
|
{
|
||||||
|
ImGui::Text(steamManager.isHost() ? "正在主持游戏房间。邀请朋友!" : "已连接到游戏房间。邀请朋友!");
|
||||||
|
ImGui::Separator();
|
||||||
|
if (ImGui::Button("断开连接"))
|
||||||
|
{
|
||||||
|
roomManager.leaveLobby();
|
||||||
|
steamManager.disconnect();
|
||||||
|
if (server)
|
||||||
|
{
|
||||||
|
server->stop();
|
||||||
|
server.reset();
|
||||||
|
}
|
||||||
|
}
|
||||||
if (steamManager.isHost())
|
if (steamManager.isHost())
|
||||||
{
|
{
|
||||||
ImGui::Text("正在主持游戏房间。邀请朋友!");
|
|
||||||
ImGui::Separator();
|
|
||||||
ImGui::InputInt("本地端口", &localPort);
|
ImGui::InputInt("本地端口", &localPort);
|
||||||
ImGui::Separator();
|
|
||||||
renderInviteFriends();
|
|
||||||
ImGui::Separator();
|
|
||||||
if (ImGui::Button("断开连接"))
|
|
||||||
{
|
|
||||||
roomManager.leaveLobby();
|
|
||||||
steamManager.disconnect();
|
|
||||||
if (server)
|
|
||||||
{
|
|
||||||
server->stop();
|
|
||||||
server.reset();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
if (steamManager.isConnected() && !steamManager.isHost())
|
|
||||||
{
|
|
||||||
ImGui::Text("已连接到游戏房间。邀请朋友!");
|
|
||||||
ImGui::Separator();
|
|
||||||
if (ImGui::Button("断开连接"))
|
|
||||||
{
|
|
||||||
roomManager.leaveLobby();
|
|
||||||
steamManager.disconnect();
|
|
||||||
if (server)
|
|
||||||
{
|
|
||||||
server->stop();
|
|
||||||
server.reset();
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
ImGui::Separator();
|
ImGui::Separator();
|
||||||
renderInviteFriends();
|
renderInviteFriends();
|
||||||
|
|||||||
@@ -18,7 +18,6 @@ SteamNetworkingManager::SteamNetworkingManager()
|
|||||||
g_hConnection(k_HSteamNetConnection_Invalid),
|
g_hConnection(k_HSteamNetConnection_Invalid),
|
||||||
io_context_(nullptr), server_(nullptr), localPort_(nullptr), messageHandler_(nullptr), hostPing_(0)
|
io_context_(nullptr), server_(nullptr), localPort_(nullptr), messageHandler_(nullptr), hostPing_(0)
|
||||||
{
|
{
|
||||||
std::cout << "Initialized SteamNetworkingManager" << std::endl;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
SteamNetworkingManager::~SteamNetworkingManager()
|
SteamNetworkingManager::~SteamNetworkingManager()
|
||||||
@@ -31,9 +30,11 @@ SteamNetworkingManager::~SteamNetworkingManager()
|
|||||||
bool SteamNetworkingManager::initialize()
|
bool SteamNetworkingManager::initialize()
|
||||||
{
|
{
|
||||||
instance = this;
|
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;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -89,7 +90,7 @@ bool SteamNetworkingManager::initialize()
|
|||||||
m_pInterface = SteamNetworkingSockets();
|
m_pInterface = SteamNetworkingSockets();
|
||||||
|
|
||||||
// Check if callbacks are registered
|
// Check if callbacks are registered
|
||||||
std::cout << "Steam API initialized" << std::endl;
|
std::cout << "Steam Networking Manager initialized successfully" << std::endl;
|
||||||
|
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -9,74 +9,6 @@ SteamFriendsCallbacks::SteamFriendsCallbacks(SteamNetworkingManager *manager, St
|
|||||||
std::cout << "SteamFriendsCallbacks constructor called" << std::endl;
|
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<TCPServer>(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)
|
void SteamFriendsCallbacks::OnGameLobbyJoinRequested(GameLobbyJoinRequested_t *pCallback)
|
||||||
{
|
{
|
||||||
std::cout << "GameLobbyJoinRequested received" << std::endl;
|
std::cout << "GameLobbyJoinRequested received" << std::endl;
|
||||||
@@ -115,12 +47,10 @@ void SteamMatchmakingCallbacks::OnLobbyCreated(LobbyCreated_t *pCallback, bool b
|
|||||||
{
|
{
|
||||||
roomManager_->setCurrentLobby(pCallback->m_ulSteamIDLobby);
|
roomManager_->setCurrentLobby(pCallback->m_ulSteamIDLobby);
|
||||||
std::cout << "Lobby created: " << roomManager_->getCurrentLobby().ConvertToUint64() << std::endl;
|
std::cout << "Lobby created: " << roomManager_->getCurrentLobby().ConvertToUint64() << std::endl;
|
||||||
// Set Rich Presence with lobby ID
|
|
||||||
std::string lobbyStr = std::to_string(roomManager_->getCurrentLobby().ConvertToUint64());
|
// Set Rich Presence to enable invite functionality
|
||||||
SteamFriends()->SetRichPresence("connect", lobbyStr.c_str());
|
SteamFriends()->SetRichPresence("steam_display", "#Status_InLobby");
|
||||||
SteamFriends()->SetRichPresence("status", "主持游戏房间");
|
SteamFriends()->SetRichPresence("connect", std::to_string(pCallback->m_ulSteamIDLobby).c_str());
|
||||||
SteamFriends()->SetRichPresence("steam_display", "#StatusWithConnectFormat");
|
|
||||||
std::cout << "Set Rich Presence connect to: " << lobbyStr << std::endl;
|
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
@@ -150,6 +80,11 @@ void SteamMatchmakingCallbacks::OnLobbyEntered(LobbyEnter_t *pCallback)
|
|||||||
{
|
{
|
||||||
roomManager_->setCurrentLobby(pCallback->m_ulSteamIDLobby);
|
roomManager_->setCurrentLobby(pCallback->m_ulSteamIDLobby);
|
||||||
std::cout << "Entered lobby: " << pCallback->m_ulSteamIDLobby << std::endl;
|
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
|
// Only join host if not the host
|
||||||
if (!manager_->isHost())
|
if (!manager_->isHost())
|
||||||
{
|
{
|
||||||
@@ -180,6 +115,9 @@ SteamRoomManager::SteamRoomManager(SteamNetworkingManager *networkingManager)
|
|||||||
{
|
{
|
||||||
steamFriendsCallbacks = new SteamFriendsCallbacks(networkingManager_, this);
|
steamFriendsCallbacks = new SteamFriendsCallbacks(networkingManager_, this);
|
||||||
steamMatchmakingCallbacks = new SteamMatchmakingCallbacks(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()
|
SteamRoomManager::~SteamRoomManager()
|
||||||
@@ -207,6 +145,9 @@ void SteamRoomManager::leaveLobby()
|
|||||||
{
|
{
|
||||||
SteamMatchmaking()->LeaveLobby(currentLobby);
|
SteamMatchmaking()->LeaveLobby(currentLobby);
|
||||||
currentLobby = k_steamIDNil;
|
currentLobby = k_steamIDNil;
|
||||||
|
|
||||||
|
// Clear Rich Presence when leaving lobby
|
||||||
|
SteamFriends()->ClearRichPresence();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -248,7 +189,6 @@ bool SteamRoomManager::startHosting()
|
|||||||
{
|
{
|
||||||
networkingManager_->getIsHost() = true;
|
networkingManager_->getIsHost() = true;
|
||||||
std::cout << "Created listen socket for hosting game room" << std::endl;
|
std::cout << "Created listen socket for hosting game room" << std::endl;
|
||||||
// Rich Presence is set in OnLobbyCreated callback
|
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
|
|||||||
@@ -16,7 +16,6 @@ private:
|
|||||||
SteamNetworkingManager *manager_;
|
SteamNetworkingManager *manager_;
|
||||||
SteamRoomManager *roomManager_;
|
SteamRoomManager *roomManager_;
|
||||||
|
|
||||||
STEAM_CALLBACK(SteamFriendsCallbacks, OnGameRichPresenceJoinRequested, GameRichPresenceJoinRequested_t);
|
|
||||||
STEAM_CALLBACK(SteamFriendsCallbacks, OnGameLobbyJoinRequested, GameLobbyJoinRequested_t);
|
STEAM_CALLBACK(SteamFriendsCallbacks, OnGameLobbyJoinRequested, GameLobbyJoinRequested_t);
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user