#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; CUtlVector g_RegisteredGameModes; //----------------------------------------------------------------------------- // 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_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: g_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) { g_RegisteredGameModes.AppendTail(this); };