mirror of
https://github.com/ddnet/ddnet.git
synced 2024-09-20 01:24:18 +00:00
GameContext: Extract OnSetTeamNetMessage()
This commit is contained in:
parent
a1ec904596
commit
ce5371b038
|
@ -1937,56 +1937,7 @@ void CGameContext::OnMessage(int MsgID, CUnpacker *pUnpacker, int ClientID)
|
|||
else if(MsgID == NETMSGTYPE_CL_VOTE)
|
||||
OnVoteNetMessage(static_cast<CNetMsg_Cl_Vote *>(pRawMsg), ClientID);
|
||||
else if(MsgID == NETMSGTYPE_CL_SETTEAM && !m_World.m_Paused)
|
||||
{
|
||||
CNetMsg_Cl_SetTeam *pMsg = (CNetMsg_Cl_SetTeam *)pRawMsg;
|
||||
|
||||
if(pPlayer->GetTeam() == pMsg->m_Team || (g_Config.m_SvSpamprotection && pPlayer->m_LastSetTeam && pPlayer->m_LastSetTeam + Server()->TickSpeed() * g_Config.m_SvTeamChangeDelay > Server()->Tick()))
|
||||
return;
|
||||
|
||||
//Kill Protection
|
||||
CCharacter *pChr = pPlayer->GetCharacter();
|
||||
if(pChr)
|
||||
{
|
||||
int CurrTime = (Server()->Tick() - pChr->m_StartTime) / Server()->TickSpeed();
|
||||
if(g_Config.m_SvKillProtection != 0 && CurrTime >= (60 * g_Config.m_SvKillProtection) && pChr->m_DDRaceState == DDRACE_STARTED)
|
||||
{
|
||||
SendChatTarget(ClientID, "Kill Protection enabled. If you really want to join the spectators, first type /kill");
|
||||
return;
|
||||
}
|
||||
}
|
||||
|
||||
if(pPlayer->m_TeamChangeTick > Server()->Tick())
|
||||
{
|
||||
pPlayer->m_LastSetTeam = Server()->Tick();
|
||||
int TimeLeft = (pPlayer->m_TeamChangeTick - Server()->Tick()) / Server()->TickSpeed();
|
||||
char aTime[32];
|
||||
str_time((int64_t)TimeLeft * 100, TIME_HOURS, aTime, sizeof(aTime));
|
||||
char aBuf[128];
|
||||
str_format(aBuf, sizeof(aBuf), "Time to wait before changing team: %s", aTime);
|
||||
SendBroadcast(aBuf, ClientID);
|
||||
return;
|
||||
}
|
||||
|
||||
// Switch team on given client and kill/respawn them
|
||||
if(m_pController->CanJoinTeam(pMsg->m_Team, ClientID))
|
||||
{
|
||||
if(pPlayer->IsPaused())
|
||||
SendChatTarget(ClientID, "Use /pause first then you can kill");
|
||||
else
|
||||
{
|
||||
if(pPlayer->GetTeam() == TEAM_SPECTATORS || pMsg->m_Team == TEAM_SPECTATORS)
|
||||
m_VoteUpdate = true;
|
||||
m_pController->DoTeamChange(pPlayer, pMsg->m_Team);
|
||||
pPlayer->m_TeamChangeTick = Server()->Tick();
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
char aBuf[128];
|
||||
str_format(aBuf, sizeof(aBuf), "Only %d active players are allowed", Server()->MaxClients() - g_Config.m_SvSpectatorSlots);
|
||||
SendBroadcast(aBuf, ClientID);
|
||||
}
|
||||
}
|
||||
OnSetTeamNetMessage(static_cast<CNetMsg_Cl_SetTeam *>(pRawMsg), ClientID);
|
||||
else if(MsgID == NETMSGTYPE_CL_ISDDNETLEGACY)
|
||||
{
|
||||
IServer::CClientInfo Info;
|
||||
|
@ -2703,6 +2654,58 @@ void CGameContext::OnVoteNetMessage(const CNetMsg_Cl_Vote *pMsg, int ClientID)
|
|||
m_VoteUpdate = true;
|
||||
}
|
||||
|
||||
void CGameContext::OnSetTeamNetMessage(const CNetMsg_Cl_SetTeam *pMsg, int ClientID)
|
||||
{
|
||||
CPlayer *pPlayer = m_apPlayers[ClientID];
|
||||
|
||||
if(pPlayer->GetTeam() == pMsg->m_Team || (g_Config.m_SvSpamprotection && pPlayer->m_LastSetTeam && pPlayer->m_LastSetTeam + Server()->TickSpeed() * g_Config.m_SvTeamChangeDelay > Server()->Tick()))
|
||||
return;
|
||||
|
||||
// Kill Protection
|
||||
CCharacter *pChr = pPlayer->GetCharacter();
|
||||
if(pChr)
|
||||
{
|
||||
int CurrTime = (Server()->Tick() - pChr->m_StartTime) / Server()->TickSpeed();
|
||||
if(g_Config.m_SvKillProtection != 0 && CurrTime >= (60 * g_Config.m_SvKillProtection) && pChr->m_DDRaceState == DDRACE_STARTED)
|
||||
{
|
||||
SendChatTarget(ClientID, "Kill Protection enabled. If you really want to join the spectators, first type /kill");
|
||||
return;
|
||||
}
|
||||
}
|
||||
|
||||
if(pPlayer->m_TeamChangeTick > Server()->Tick())
|
||||
{
|
||||
pPlayer->m_LastSetTeam = Server()->Tick();
|
||||
int TimeLeft = (pPlayer->m_TeamChangeTick - Server()->Tick()) / Server()->TickSpeed();
|
||||
char aTime[32];
|
||||
str_time((int64_t)TimeLeft * 100, TIME_HOURS, aTime, sizeof(aTime));
|
||||
char aBuf[128];
|
||||
str_format(aBuf, sizeof(aBuf), "Time to wait before changing team: %s", aTime);
|
||||
SendBroadcast(aBuf, ClientID);
|
||||
return;
|
||||
}
|
||||
|
||||
// Switch team on given client and kill/respawn them
|
||||
if(m_pController->CanJoinTeam(pMsg->m_Team, ClientID))
|
||||
{
|
||||
if(pPlayer->IsPaused())
|
||||
SendChatTarget(ClientID, "Use /pause first then you can kill");
|
||||
else
|
||||
{
|
||||
if(pPlayer->GetTeam() == TEAM_SPECTATORS || pMsg->m_Team == TEAM_SPECTATORS)
|
||||
m_VoteUpdate = true;
|
||||
m_pController->DoTeamChange(pPlayer, pMsg->m_Team);
|
||||
pPlayer->m_TeamChangeTick = Server()->Tick();
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
char aBuf[128];
|
||||
str_format(aBuf, sizeof(aBuf), "Only %d active players are allowed", Server()->MaxClients() - g_Config.m_SvSpectatorSlots);
|
||||
SendBroadcast(aBuf, ClientID);
|
||||
}
|
||||
}
|
||||
|
||||
void CGameContext::ConTuneParam(IConsole::IResult *pResult, void *pUserData)
|
||||
{
|
||||
CGameContext *pSelf = (CGameContext *)pUserData;
|
||||
|
|
|
@ -291,6 +291,7 @@ public:
|
|||
void OnSayNetMessage(const CNetMsg_Cl_Say *pMsg, int ClientID, const CUnpacker *pUnpacker);
|
||||
void OnCallVoteNetMessage(const CNetMsg_Cl_CallVote *pMsg, int ClientID);
|
||||
void OnVoteNetMessage(const CNetMsg_Cl_Vote *pMsg, int ClientID);
|
||||
void OnSetTeamNetMessage(const CNetMsg_Cl_SetTeam *pMsg, int ClientID);
|
||||
|
||||
bool OnClientDataPersist(int ClientID, void *pData) override;
|
||||
void OnClientConnected(int ClientID, void *pData) override;
|
||||
|
|
Loading…
Reference in a new issue