1.1 --- a/core/PlayerManager.cpp Sun Sep 21 14:20:01 2008 +1200
1.2 +++ b/core/PlayerManager.cpp Fri Sep 26 19:08:49 2008 +1200
1.3 @@ -68,6 +68,15 @@
1.4 SH_DECL_HOOK1_void(IServerGameClients, ClientSettingsChanged, SH_NOATTRIB, 0, edict_t *);
1.5 SH_DECL_HOOK3_void(IServerGameDLL, ServerActivate, SH_NOATTRIB, 0, edict_t *, int, int);
1.6
1.7 +#if defined ORANGEBOX_BUILD
1.8 +SH_DECL_EXTERN1_void(ConCommand, Dispatch, SH_NOATTRIB, false, const CCommand &);
1.9 +#else
1.10 +extern bool __SourceHook_FHAddConCommandDispatch(void *,bool,class fastdelegate::FastDelegate0<void>);
1.11 +extern bool __SourceHook_FHRemoveConCommandDispatch(void *,bool,class fastdelegate::FastDelegate0<void>);
1.12 +#endif
1.13 +
1.14 +ConCommand *maxplayersCmd = NULL;
1.15 +
1.16 class KickPlayerTimer : public ITimedEvent
1.17 {
1.18 public:
1.19 @@ -137,6 +146,32 @@
1.20
1.21 m_bIsListenServer = !engine->IsDedicatedServer();
1.22 m_ListenClient = 0;
1.23 +
1.24 + g_ConVarManager.AddConVarChangeListener("tv_enable", this);
1.25 +
1.26 + ConCommandBase *pBase = icvar->GetCommands();
1.27 + ConCommand *pCmd = NULL;
1.28 + while (pBase)
1.29 + {
1.30 + if (strcmp(pBase->GetName(), "maxplayers") == 0)
1.31 + {
1.32 + /* Don't want to return convar with same name */
1.33 + if (!pBase->IsCommand())
1.34 + {
1.35 + break;
1.36 + }
1.37 +
1.38 + pCmd = (ConCommand *)pBase;
1.39 + break;
1.40 + }
1.41 + pBase = const_cast<ConCommandBase *>(pBase->GetNext());
1.42 + }
1.43 +
1.44 + if (pCmd != NULL)
1.45 + {
1.46 + SH_ADD_HOOK_STATICFUNC(ConCommand, Dispatch, pCmd, CmdMaxplayersCallback, true);
1.47 + maxplayersCmd = pCmd;
1.48 + }
1.49 }
1.50
1.51 void PlayerManager::OnSourceModShutdown()
1.52 @@ -165,6 +200,13 @@
1.53 g_Forwards.ReleaseForward(PostAdminFilter);
1.54
1.55 delete [] m_Players;
1.56 +
1.57 + g_ConVarManager.RemoveConVarChangeListener("tv_enable", this);
1.58 +
1.59 + if (maxplayersCmd != NULL)
1.60 + {
1.61 + SH_REMOVE_HOOK_STATICFUNC(ConCommand, Dispatch, maxplayersCmd, CmdMaxplayersCallback, true);
1.62 + }
1.63 }
1.64
1.65 ConfigResult PlayerManager::OnSourceModConfigChanged(const char *key,
1.66 @@ -202,11 +244,11 @@
1.67 /* Initialize all players */
1.68 m_maxClients = clientMax;
1.69 m_PlayerCount = 0;
1.70 - m_Players = new CPlayer[m_maxClients + 1];
1.71 - m_AuthQueue = new unsigned int[m_maxClients + 1];
1.72 + m_Players = new CPlayer[ABSOLUTE_PLAYER_LIMIT + 1];
1.73 + m_AuthQueue = new unsigned int[ABSOLUTE_PLAYER_LIMIT + 1];
1.74 m_FirstPass = true;
1.75
1.76 - memset(m_AuthQueue, 0, sizeof(unsigned int) * (m_maxClients + 1));
1.77 + memset(m_AuthQueue, 0, sizeof(unsigned int) * (ABSOLUTE_PLAYER_LIMIT + 1));
1.78
1.79 g_NumPlayersToAuth = &m_AuthQueue[0];
1.80 }
1.81 @@ -1203,6 +1245,68 @@
1.82 }
1.83 }
1.84
1.85 +void PlayerManager::OnConVarChanged( ConVar *pConVar, const char *oldValue, float flOldValue )
1.86 +{
1.87 + if (pConVar->GetBool() && !atoi(oldValue))
1.88 + {
1.89 + MaxPlayersChanged(gpGlobals->maxClients + 1);
1.90 + }
1.91 + else
1.92 + {
1.93 + MaxPlayersChanged();
1.94 + }
1.95 +}
1.96 +
1.97 +void PlayerManager::OnSourceModMaxPlayersChanged( int newvalue )
1.98 +{
1.99 + m_maxClients = newvalue;
1.100 +}
1.101 +
1.102 +void PlayerManager::MaxPlayersChanged( int newvalue /*= -1*/ )
1.103 +{
1.104 + if (newvalue == -1)
1.105 + {
1.106 + newvalue = gpGlobals->maxClients;
1.107 + }
1.108 +
1.109 + if (newvalue == MaxClients())
1.110 + {
1.111 + return;
1.112 + }
1.113 +
1.114 + /* Notify the rest of core */
1.115 + SMGlobalClass *pBase = SMGlobalClass::head;
1.116 + while (pBase)
1.117 + {
1.118 + pBase->OnSourceModMaxPlayersChanged(newvalue);
1.119 + pBase = pBase->m_pGlobalClassNext;
1.120 + }
1.121 +
1.122 + /* Notify Extensions */
1.123 + List<IClientListener *>::iterator iter;
1.124 + IClientListener *pListener = NULL;
1.125 + for (iter=m_hooks.begin(); iter!=m_hooks.end(); iter++)
1.126 + {
1.127 + pListener = (*iter);
1.128 + if (pListener->GetClientListenerVersion() >= 8)
1.129 + {
1.130 + pListener->OnMaxPlayersChanged(newvalue);
1.131 + }
1.132 + }
1.133 +}
1.134 +
1.135 +#if defined ORANGEBOX_BUILD
1.136 +void CmdMaxplayersCallback(const CCommand &command)
1.137 +{
1.138 +#else
1.139 +void CmdMaxplayersCallback()
1.140 +{
1.141 +#endif
1.142 +
1.143 + g_Players.MaxPlayersChanged();
1.144 +}
1.145 +
1.146 +
1.147 /*******************
1.148 *** PLAYER CODE ***
1.149 *******************/