166 lines
4.2 KiB
C++
166 lines
4.2 KiB
C++
#include "gamemode.h"
|
|
#include "engine.h"
|
|
#include "interface.h"
|
|
#include "playerstart.h"
|
|
#include "networking.h"
|
|
|
|
#include "tier1/utlvector.h"
|
|
#include "tier1/utlstring.h"
|
|
|
|
CGameMode *pCurrentMode = NULL;
|
|
CUtlString szCurrentModeName;
|
|
|
|
//-----------------------------------------------------------------------------
|
|
// Round begin handler
|
|
//-----------------------------------------------------------------------------
|
|
void CGameMode::RoundBegin( void )
|
|
{
|
|
size_t i = 0;
|
|
for (auto &start: g_PlayerStarts)
|
|
{
|
|
start->RoundEnd();
|
|
}
|
|
for (auto &player: g_clients)
|
|
{
|
|
CPlayerStart *pSelectedStart = NULL;
|
|
for (auto &start: g_PlayerStarts)
|
|
{
|
|
if (start->m_bIsRunning == false)
|
|
pSelectedStart = start;
|
|
};
|
|
if (pSelectedStart)
|
|
pSelectedStart->RoundStart(player);
|
|
i++;
|
|
}
|
|
|
|
for (auto &client: g_clients)
|
|
{
|
|
CSteamID steamID = CSteamID();
|
|
if ( client->playerID == 0)
|
|
V_printf("%s\t", SteamFriends()->GetPlayerNickname((uint64)client->playerID));
|
|
else
|
|
V_printf("%s\t", SteamFriends()->GetPersonaName());
|
|
V_printf("%llu\t", client->playerID);
|
|
V_printf("%u\n", client->playerHandle);
|
|
}
|
|
}
|
|
|
|
//-----------------------------------------------------------------------------
|
|
// Round end handler
|
|
//-----------------------------------------------------------------------------
|
|
void CGameMode::RoundEnd( void )
|
|
{
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
class CGameModeManager: public IGameModeManager
|
|
{
|
|
public:
|
|
virtual void Init( void ) override;
|
|
virtual void Frame( void ) override;
|
|
virtual void Deinit( void ) override;
|
|
|
|
virtual void StartGameMode( const char *szName ) override;
|
|
virtual const char *GetCurrentGameMode( void ) override;
|
|
virtual CGameMode *GetCurrentGameModeClass( void ) override;
|
|
virtual void RestartCurrentGameMode( void ) override;
|
|
};
|
|
|
|
DECLARE_ENGINE_INTERFACE(GameModeManager, CGameModeManager);
|
|
|
|
//-----------------------------------------------------------------------------
|
|
//
|
|
//-----------------------------------------------------------------------------
|
|
void CGameModeManager::Init( void )
|
|
{
|
|
|
|
}
|
|
|
|
//-----------------------------------------------------------------------------
|
|
//
|
|
//-----------------------------------------------------------------------------
|
|
void CGameModeManager::Frame( void )
|
|
{
|
|
}
|
|
|
|
//-----------------------------------------------------------------------------
|
|
//
|
|
//-----------------------------------------------------------------------------
|
|
void CGameModeManager::Deinit( void )
|
|
{
|
|
|
|
}
|
|
|
|
//-----------------------------------------------------------------------------
|
|
// Sets gamemode
|
|
//-----------------------------------------------------------------------------
|
|
void CGameModeManager::StartGameMode( const char *szName )
|
|
{
|
|
if (pCurrentMode)
|
|
{
|
|
pCurrentMode->RoundEnd();
|
|
delete pCurrentMode;
|
|
}
|
|
for (auto &mode: m_RegisteredGameModes)
|
|
{
|
|
if (!V_strcmp(mode->m_szName, szName))
|
|
{
|
|
pCurrentMode = mode->m_pfn();
|
|
pCurrentMode->RoundBegin();
|
|
szCurrentModeName = szName;
|
|
return;
|
|
}
|
|
}
|
|
}
|
|
|
|
//-----------------------------------------------------------------------------
|
|
//
|
|
//-----------------------------------------------------------------------------
|
|
const char *CGameModeManager::GetCurrentGameMode( void )
|
|
{
|
|
return szCurrentModeName;
|
|
}
|
|
|
|
//-----------------------------------------------------------------------------
|
|
//
|
|
//-----------------------------------------------------------------------------
|
|
CGameMode *CGameModeManager::GetCurrentGameModeClass( void )
|
|
{
|
|
return pCurrentMode;
|
|
}
|
|
|
|
//-----------------------------------------------------------------------------
|
|
// Restarts the gamemode
|
|
//-----------------------------------------------------------------------------
|
|
void CGameModeManager::RestartCurrentGameMode( void )
|
|
{
|
|
if (!pCurrentMode)
|
|
return;
|
|
|
|
if (INetworking::IsServer())
|
|
{
|
|
PacketGameMode_t mode = {};
|
|
mode.type = PACKET_TYPE_GAMEMODE_START;
|
|
V_memcpy(mode.szName,szCurrentModeName, min(szCurrentModeName.GetLenght(), 255));
|
|
for (auto &client: g_clients)
|
|
{
|
|
INetworking::SendData(&mode, sizeof(mode), client, MESSAGE_MODE_RELIABLE);
|
|
};
|
|
};
|
|
pCurrentMode->RoundEnd();
|
|
pCurrentMode->RoundBegin();
|
|
}
|
|
|
|
|
|
CGameModeRegistry::CGameModeRegistry(const char *szName, GameModeRegistryFn pfn) :
|
|
m_szName(szName), m_pfn(pfn)
|
|
{
|
|
GameModeManager()->m_RegisteredGameModes.AppendTail(this);
|
|
};
|
|
|
|
|