improved server
This commit is contained in:
@@ -5,6 +5,9 @@
|
||||
#include "server.h"
|
||||
#include "steam/isteamfriends.h"
|
||||
#include "steam/isteamnetworking.h"
|
||||
#include "steam/isteamnetworkingsockets.h"
|
||||
#include "steam/steam_api_common.h"
|
||||
#include "steam/steamnetworkingtypes.h"
|
||||
#include "tier0/platform.h"
|
||||
#include "tier0/lib.h"
|
||||
#include "tier1/commandline.h"
|
||||
@@ -12,7 +15,10 @@
|
||||
#include "tier1/utlvector.h"
|
||||
#include "baseplayer.h"
|
||||
|
||||
#include "steam/steam_api.h"
|
||||
#include "steam/steam_gameserver.h"
|
||||
#include "steam/steamnetworkingsockets.h"
|
||||
#include "steam/isteamgameserver.h"
|
||||
#include "steam/isteamnetworkingutils.h"
|
||||
#ifndef STEAMNETWORKINGSOCKETS_OPENSOURCE
|
||||
#include "steam/steam_api.h"
|
||||
@@ -23,40 +29,88 @@ HSteamNetConnection net_server = 0;
|
||||
HSteamListenSocket net_listenSocket = -1;
|
||||
CUtlVector<IIClient*> net_clients;
|
||||
|
||||
class CNetworkingCallbacks
|
||||
bool net_bIsServer = false;
|
||||
static int net_nMaxPlayers = 0;
|
||||
static uint64_t net_nLastSteamID = 90071992547409920;
|
||||
|
||||
class CClientNetworkingCallbacks
|
||||
{
|
||||
STEAM_CALLBACK(CClientNetworkingCallbacks, RelayNetworkStatusChanged, SteamRelayNetworkStatus_t);
|
||||
};
|
||||
void CClientNetworkingCallbacks::RelayNetworkStatusChanged( SteamRelayNetworkStatus_t *pCallback )
|
||||
{
|
||||
STEAM_CALLBACK(CNetworkingCallbacks, ClientConnectedCallback, SteamNetConnectionStatusChangedCallback_t);
|
||||
};
|
||||
|
||||
void CNetworkingCallbacks::ClientConnectedCallback( SteamNetConnectionStatusChangedCallback_t *pCallback )
|
||||
class CServerNetworkingCallbacks
|
||||
{
|
||||
STEAM_GAMESERVER_CALLBACK(CServerNetworkingCallbacks, ClientConnected, SteamNetConnectionStatusChangedCallback_t);
|
||||
STEAM_GAMESERVER_CALLBACK(CServerNetworkingCallbacks, SteamNetAuthenticated, SteamNetAuthenticationStatus_t);
|
||||
};
|
||||
|
||||
void CServerNetworkingCallbacks::ClientConnected( SteamNetConnectionStatusChangedCallback_t *pCallback )
|
||||
{
|
||||
INetworking::ClientConnectedCallback(pCallback);
|
||||
};
|
||||
void CServerNetworkingCallbacks::SteamNetAuthenticated( SteamNetAuthenticationStatus_t *pCallback )
|
||||
{
|
||||
if (net_nLastSteamID == SteamGameServer()->GetSteamID().ConvertToUint64())
|
||||
return;
|
||||
net_nLastSteamID = SteamGameServer()->GetSteamID().ConvertToUint64();
|
||||
V_printf("-------------- SERVER INFO ----------------\n");
|
||||
V_printf(" STEAMID64:\t%llu\n", net_nLastSteamID);
|
||||
V_printf(" MAX PLAYERS:\t%i\n", net_nMaxPlayers);
|
||||
V_printf("-------------- TIPS -----------------------\n");
|
||||
V_printf(" players can join by using connect <STEAMID64>\n");
|
||||
V_printf("-------------------------------------------\n");
|
||||
};
|
||||
|
||||
|
||||
bool net_bIsServer = false;
|
||||
static CNetworkingCallbacks *pCallbacks;
|
||||
static CServerNetworkingCallbacks *net_pServerCallbacks;
|
||||
static CClientNetworkingCallbacks *net_pClientCallbacks;
|
||||
|
||||
void INetworking::Init()
|
||||
{
|
||||
|
||||
Net_Init();
|
||||
|
||||
SteamDatagramErrMsg errMsg = {};
|
||||
#ifdef STEAMNETWORKINGSOCKETS_OPENSOURCE
|
||||
GameNetworkingSockets_Init(NULL, &errMsg)
|
||||
#endif
|
||||
SteamNetworkingUtils()->SetDebugOutputFunction(k_ESteamNetworkingSocketsDebugOutputType_Msg,
|
||||
[](ESteamNetworkingSocketsDebugOutputType severity, const char *szMessage) {
|
||||
V_printf("Steam: %s\n", szMessage);
|
||||
});
|
||||
if (ICommandLine::CheckParam("-steamdebug"))
|
||||
{
|
||||
SteamNetworkingUtils()->SetDebugOutputFunction(k_ESteamNetworkingSocketsDebugOutputType_Msg,
|
||||
[](ESteamNetworkingSocketsDebugOutputType severity, const char *szMessage) {
|
||||
V_printf("Steam: %s\n", szMessage);
|
||||
});
|
||||
}
|
||||
|
||||
if (ICommandLine::CheckParam("-dedicated"))
|
||||
{
|
||||
pCallbacks = new CNetworkingCallbacks;
|
||||
SteamNetworkingIPAddr localAddress = {};
|
||||
localAddress.Clear();
|
||||
localAddress.SetIPv4(0x7F000001, 27015);
|
||||
net_listenSocket = SteamNetworkingSockets()->CreateListenSocketIP(localAddress, 0, NULL);
|
||||
net_pServerCallbacks = new CServerNetworkingCallbacks;
|
||||
|
||||
// Run dedicated server with steam
|
||||
SteamGameServer_Init(0, 27015, 27016, eServerModeAuthentication, "0.0.0.0");
|
||||
SteamGameServer()->SetProduct("funnygame");
|
||||
SteamGameServer()->SetGameDescription("not that funny but ok");
|
||||
SteamGameServer()->SetModDir("funnygame");
|
||||
SteamGameServer()->SetDedicatedServer(true);
|
||||
|
||||
SteamGameServer()->LogOnAnonymous();
|
||||
|
||||
|
||||
net_nMaxPlayers = atoi(ICommandLine::ParamValue("-maxplayers", "128"));
|
||||
SteamGameServer()->SetMaxPlayerCount(net_nMaxPlayers);
|
||||
SteamGameServer()->SetAdvertiseServerActive(true);
|
||||
} else {
|
||||
net_pClientCallbacks = new CClientNetworkingCallbacks;
|
||||
}
|
||||
|
||||
SteamDatagramErrMsg errMsg = {};
|
||||
|
||||
SteamNetworkingUtils()->InitRelayNetworkAccess();
|
||||
|
||||
if (ICommandLine::CheckParam("-dedicated"))
|
||||
{
|
||||
net_listenSocket = SteamGameServerNetworkingSockets()->CreateListenSocketP2P(0, 0, NULL);
|
||||
net_bIsServer = true;
|
||||
}
|
||||
}
|
||||
@@ -65,7 +119,7 @@ void INetworking::Deinit()
|
||||
if (net_listenSocket == -1)
|
||||
return;
|
||||
if (ICommandLine::CheckParam("-dedicated"))
|
||||
SteamNetworkingSockets()->CloseListenSocket(net_listenSocket);
|
||||
SteamGameServerNetworkingSockets()->CloseListenSocket(net_listenSocket);
|
||||
else
|
||||
SteamNetworkingSockets()->CloseConnection(net_listenSocket, 0, NULL, false);
|
||||
}
|
||||
@@ -86,17 +140,16 @@ bool INetworking::IsConnected()
|
||||
}
|
||||
|
||||
void INetworking::Frame()
|
||||
{
|
||||
SteamNetworkingSockets()->RunCallbacks();
|
||||
|
||||
{
|
||||
if (IsServer())
|
||||
{
|
||||
SteamGameServer_RunCallbacks();
|
||||
for (auto &client: g_clients)
|
||||
{
|
||||
SteamNetworkingMessage_t *pMessages[64];
|
||||
while (true)
|
||||
{
|
||||
int nMessages = SteamNetworkingSockets()->ReceiveMessagesOnConnection(client->playerHandle, pMessages, 64);
|
||||
int nMessages = SteamGameServerNetworkingSockets()->ReceiveMessagesOnConnection(client->playerHandle, pMessages, 64);
|
||||
if ( nMessages <= 0 )
|
||||
break;
|
||||
for ( int i = 0; i < nMessages; i++ )
|
||||
@@ -106,6 +159,7 @@ void INetworking::Frame()
|
||||
}
|
||||
}
|
||||
} else {
|
||||
SteamNetworkingSockets()->RunCallbacks();
|
||||
SteamNetworkingMessage_t *pMessages[64];
|
||||
while (true)
|
||||
{
|
||||
@@ -140,7 +194,7 @@ void INetworking::SendData( void *pData, uint32_t nSize, IIClient *pClient, EMes
|
||||
if (pClient == NULL)
|
||||
r = SteamNetworkingSockets()->SendMessageToConnection(net_server, pData, nSize, nSendFlags, NULL);
|
||||
else
|
||||
r = SteamNetworkingSockets()->SendMessageToConnection(pClient->playerHandle, pData, nSize, nSendFlags, NULL);
|
||||
r = SteamGameServerNetworkingSockets()->SendMessageToConnection(pClient->playerHandle, pData, nSize, nSendFlags, NULL);
|
||||
}
|
||||
void INetworking::SendDataEverybody( void *pData, uint32_t nSize, EMessageMode messageMode )
|
||||
{
|
||||
@@ -211,6 +265,7 @@ void INetworking::ProcessPacket( void *pData, uint32_t nSize, IIClient *pClient
|
||||
.playerID = pPlayerPacket->playerID,
|
||||
.playerHandle = pPlayerPacket->playerHandle,
|
||||
};
|
||||
V_printf("%i\n",g_clients.GetSize());
|
||||
IIEngine::ConnectClient(pNewClient);
|
||||
|
||||
for (auto &client: g_clients)
|
||||
@@ -258,9 +313,9 @@ uint32_t INetworking_IPv4ToUint(const char *szIP) {
|
||||
|
||||
void INetworking::JoinServer( const char *szIP )
|
||||
{
|
||||
g_clients = {};
|
||||
if (net_connection)
|
||||
{
|
||||
g_clients = {};
|
||||
SteamNetworkingSockets()->CloseConnection(net_connection, 0, NULL, false);
|
||||
}
|
||||
SteamNetworkingIPAddr localAddress = {};
|
||||
@@ -270,6 +325,21 @@ void INetworking::JoinServer( const char *szIP )
|
||||
net_server = net_connection;
|
||||
}
|
||||
|
||||
void INetworking::JoinServer( uint64_t nSteamID )
|
||||
{
|
||||
g_clients = {};
|
||||
if (net_connection)
|
||||
{
|
||||
SteamNetworkingSockets()->CloseConnection(net_connection, 0, NULL, false);
|
||||
}
|
||||
SteamNetworkingIdentity remoteIdentity = {};
|
||||
remoteIdentity.Clear();
|
||||
remoteIdentity.SetSteamID64(nSteamID);
|
||||
|
||||
net_connection = SteamNetworkingSockets()->ConnectP2P(remoteIdentity, 0, 0, 0);
|
||||
net_server = net_connection;
|
||||
}
|
||||
|
||||
void INetworking::ClientConnectedCallback( SteamNetConnectionStatusChangedCallback_t *pCallback )
|
||||
{
|
||||
IIClient *pClient = new IIClient;
|
||||
@@ -353,4 +423,20 @@ void INetworking_Connect( int argc, char **argv )
|
||||
INetworking::JoinServer(argv[1]);
|
||||
};
|
||||
|
||||
ConCommand ConnectCmd("connect", INetworking_Connect);
|
||||
void INetworking_ConnectFriend( int argc, char **argv )
|
||||
{
|
||||
if (ICommandLine::CheckParam("-dedicated"))
|
||||
return;
|
||||
if (argc != 2)
|
||||
{
|
||||
V_printf("connect_friend <steamid>\n");
|
||||
return;
|
||||
}
|
||||
uint64_t nFriendID = 0;
|
||||
V_sscanf(argv[1], "%llu\n", &nFriendID);
|
||||
V_printf("Connecting to %llu\n",nFriendID);
|
||||
|
||||
INetworking::JoinServer(nFriendID);
|
||||
};
|
||||
|
||||
ConCommand ConnectCmd("connect", INetworking_ConnectFriend);
|
||||
|
||||
Reference in New Issue
Block a user