ddnet/src/game/server/ddracecommands.cpp

696 lines
20 KiB
C++
Raw Normal View History

/* (c) Shereef Marzouk. See "licence DDRace.txt" and the readme.txt in the root of the distribution for more information. */
2010-11-13 15:31:13 +00:00
#include "gamecontext.h"
2010-11-13 15:41:43 +00:00
#include <engine/shared/config.h>
#include <game/server/teams.h>
#include <game/server/gamemodes/DDRace.h>
#include <game/version.h>
#if defined(CONF_SQL)
#include <game/server/score/sql_score.h>
#endif
2010-11-13 15:31:13 +00:00
2011-08-26 18:03:30 +00:00
bool CheckClientID(int ClientID);
void CGameContext::ConGoLeft(IConsole::IResult *pResult, void *pUserData)
2010-11-13 15:31:13 +00:00
{
CGameContext *pSelf = (CGameContext *) pUserData;
if (!CheckClientID(pResult->m_ClientID))
return;
2011-08-26 18:03:30 +00:00
pSelf->MoveCharacter(pResult->m_ClientID, -1, 0);
2010-11-13 15:31:13 +00:00
}
void CGameContext::ConGoRight(IConsole::IResult *pResult, void *pUserData)
2010-11-13 15:31:13 +00:00
{
CGameContext *pSelf = (CGameContext *) pUserData;
if (!CheckClientID(pResult->m_ClientID))
return;
2011-08-26 18:03:30 +00:00
pSelf->MoveCharacter(pResult->m_ClientID, 1, 0);
2010-11-13 15:31:13 +00:00
}
void CGameContext::ConGoDown(IConsole::IResult *pResult, void *pUserData)
2010-11-13 15:31:13 +00:00
{
CGameContext *pSelf = (CGameContext *) pUserData;
if (!CheckClientID(pResult->m_ClientID))
return;
2011-08-26 18:03:30 +00:00
pSelf->MoveCharacter(pResult->m_ClientID, 0, 1);
2010-11-13 15:31:13 +00:00
}
void CGameContext::ConGoUp(IConsole::IResult *pResult, void *pUserData)
2010-11-13 15:31:13 +00:00
{
CGameContext *pSelf = (CGameContext *) pUserData;
if (!CheckClientID(pResult->m_ClientID))
return;
2011-08-26 18:03:30 +00:00
pSelf->MoveCharacter(pResult->m_ClientID, 0, -1);
2010-11-13 15:31:13 +00:00
}
void CGameContext::ConMove(IConsole::IResult *pResult, void *pUserData)
2010-11-13 15:31:13 +00:00
{
CGameContext *pSelf = (CGameContext *) pUserData;
if (!CheckClientID(pResult->m_ClientID))
return;
pSelf->MoveCharacter(pResult->m_ClientID, pResult->GetInteger(0),
pResult->GetInteger(1));
2010-11-13 15:31:13 +00:00
}
void CGameContext::ConMoveRaw(IConsole::IResult *pResult, void *pUserData)
2010-11-13 15:31:13 +00:00
{
CGameContext *pSelf = (CGameContext *) pUserData;
if (!CheckClientID(pResult->m_ClientID))
return;
pSelf->MoveCharacter(pResult->m_ClientID, pResult->GetInteger(0),
pResult->GetInteger(1), true);
2010-11-13 15:31:13 +00:00
}
void CGameContext::MoveCharacter(int ClientID, int X, int Y, bool Raw)
2010-11-13 15:31:13 +00:00
{
CCharacter* pChr = GetPlayerChar(ClientID);
if (!pChr)
2010-11-13 15:31:13 +00:00
return;
2011-01-29 00:59:50 +00:00
pChr->Core()->m_Pos.x += ((Raw) ? 1 : 32) * X;
pChr->Core()->m_Pos.y += ((Raw) ? 1 : 32) * Y;
pChr->m_DDRaceState = DDRACE_CHEAT;
2010-11-13 15:31:13 +00:00
}
void CGameContext::ConKillPlayer(IConsole::IResult *pResult, void *pUserData)
2010-11-13 15:31:13 +00:00
{
CGameContext *pSelf = (CGameContext *) pUserData;
if (!CheckClientID(pResult->m_ClientID))
return;
2011-09-25 16:04:29 +00:00
int Victim = pResult->GetVictim();
2010-11-13 15:31:13 +00:00
if (pSelf->m_apPlayers[Victim])
2010-11-13 15:31:13 +00:00
{
pSelf->m_apPlayers[Victim]->KillCharacter(WEAPON_GAME);
2011-01-26 21:09:54 +00:00
char aBuf[512];
str_format(aBuf, sizeof(aBuf), "%s was killed by %s",
pSelf->Server()->ClientName(Victim),
pSelf->Server()->ClientName(pResult->m_ClientID));
2011-01-26 21:09:54 +00:00
pSelf->SendChat(-1, CGameContext::CHAT_ALL, aBuf);
2010-11-13 15:31:13 +00:00
}
}
void CGameContext::ConNinja(IConsole::IResult *pResult, void *pUserData)
2010-11-13 15:31:13 +00:00
{
CGameContext *pSelf = (CGameContext *) pUserData;
pSelf->ModifyWeapons(pResult, pUserData, WEAPON_NINJA, false);
2010-11-13 15:31:13 +00:00
}
void CGameContext::ConSuper(IConsole::IResult *pResult, void *pUserData)
2010-11-13 15:31:13 +00:00
{
CGameContext *pSelf = (CGameContext *) pUserData;
if (!CheckClientID(pResult->m_ClientID))
return;
2011-08-26 18:03:30 +00:00
CCharacter* pChr = pSelf->GetPlayerChar(pResult->m_ClientID);
if (pChr && !pChr->m_Super)
2011-01-26 21:09:54 +00:00
{
pChr->m_Super = true;
pChr->UnFreeze();
pChr->m_TeamBeforeSuper = pChr->Team();
2011-08-26 18:03:30 +00:00
pChr->Teams()->SetCharacterTeam(pResult->m_ClientID, TEAM_SUPER);
pChr->m_DDRaceState = DDRACE_CHEAT;
2010-11-13 15:31:13 +00:00
}
}
void CGameContext::ConUnSuper(IConsole::IResult *pResult, void *pUserData)
2010-11-13 15:31:13 +00:00
{
CGameContext *pSelf = (CGameContext *) pUserData;
if (!CheckClientID(pResult->m_ClientID))
return;
2011-08-26 18:03:30 +00:00
CCharacter* pChr = pSelf->GetPlayerChar(pResult->m_ClientID);
if (pChr && pChr->m_Super)
2010-11-13 15:31:13 +00:00
{
2011-01-26 21:09:54 +00:00
pChr->m_Super = false;
pChr->Teams()->SetForceCharacterTeam(pResult->m_ClientID,
pChr->m_TeamBeforeSuper);
2010-11-13 15:31:13 +00:00
}
}
2014-06-11 15:53:59 +00:00
void CGameContext::ConUnSolo(IConsole::IResult *pResult, void *pUserData)
{
CGameContext *pSelf = (CGameContext *) pUserData;
if (!CheckClientID(pResult->m_ClientID))
return;
CCharacter* pChr = pSelf->GetPlayerChar(pResult->m_ClientID);
2014-06-14 07:27:27 +00:00
if (pChr)
pChr->SetSolo(false);
2014-06-11 15:53:59 +00:00
}
2014-06-13 21:49:34 +00:00
void CGameContext::ConUnDeep(IConsole::IResult *pResult, void *pUserData)
{
CGameContext *pSelf = (CGameContext *) pUserData;
if (!CheckClientID(pResult->m_ClientID))
return;
CCharacter* pChr = pSelf->GetPlayerChar(pResult->m_ClientID);
2014-06-14 07:27:27 +00:00
if (pChr)
pChr->m_DeepFreeze = false;
2014-06-13 21:49:34 +00:00
}
void CGameContext::ConShotgun(IConsole::IResult *pResult, void *pUserData)
2010-11-13 15:31:13 +00:00
{
CGameContext *pSelf = (CGameContext *) pUserData;
pSelf->ModifyWeapons(pResult, pUserData, WEAPON_SHOTGUN, false);
2010-11-13 15:31:13 +00:00
}
void CGameContext::ConGrenade(IConsole::IResult *pResult, void *pUserData)
2010-11-13 15:31:13 +00:00
{
CGameContext *pSelf = (CGameContext *) pUserData;
pSelf->ModifyWeapons(pResult, pUserData, WEAPON_GRENADE, false);
2010-11-13 15:31:13 +00:00
}
void CGameContext::ConRifle(IConsole::IResult *pResult, void *pUserData)
2010-11-13 15:31:13 +00:00
{
CGameContext *pSelf = (CGameContext *) pUserData;
pSelf->ModifyWeapons(pResult, pUserData, WEAPON_RIFLE, false);
2010-11-13 15:31:13 +00:00
}
2016-10-08 17:42:42 +00:00
void CGameContext::ConJetpack(IConsole::IResult *pResult, void *pUserData)
{
CGameContext *pSelf = (CGameContext *)pUserData;
CCharacter* pChr = pSelf->GetPlayerChar(pResult->m_ClientID);
if (pChr)
pChr->m_Jetpack = true;
}
void CGameContext::ConWeapons(IConsole::IResult *pResult, void *pUserData)
2010-11-13 15:31:13 +00:00
{
CGameContext *pSelf = (CGameContext *) pUserData;
pSelf->ModifyWeapons(pResult, pUserData, -1, false);
2010-11-13 15:31:13 +00:00
}
void CGameContext::ConUnShotgun(IConsole::IResult *pResult, void *pUserData)
2010-11-13 15:31:13 +00:00
{
CGameContext *pSelf = (CGameContext *) pUserData;
pSelf->ModifyWeapons(pResult, pUserData, WEAPON_SHOTGUN, true);
2010-11-13 15:31:13 +00:00
}
void CGameContext::ConUnGrenade(IConsole::IResult *pResult, void *pUserData)
2010-11-13 15:31:13 +00:00
{
CGameContext *pSelf = (CGameContext *) pUserData;
pSelf->ModifyWeapons(pResult, pUserData, WEAPON_GRENADE, true);
2010-11-13 15:31:13 +00:00
}
void CGameContext::ConUnRifle(IConsole::IResult *pResult, void *pUserData)
2010-11-13 15:31:13 +00:00
{
CGameContext *pSelf = (CGameContext *) pUserData;
pSelf->ModifyWeapons(pResult, pUserData, WEAPON_RIFLE, true);
2010-11-13 15:31:13 +00:00
}
2016-10-08 17:42:42 +00:00
void CGameContext::ConUnJetpack(IConsole::IResult *pResult, void *pUserData)
{
CGameContext *pSelf = (CGameContext *)pUserData;
CCharacter* pChr = pSelf->GetPlayerChar(pResult->m_ClientID);
if (pChr)
pChr->m_Jetpack = false;
}
void CGameContext::ConUnWeapons(IConsole::IResult *pResult, void *pUserData)
2010-11-13 15:31:13 +00:00
{
CGameContext *pSelf = (CGameContext *) pUserData;
2017-05-18 18:04:29 +00:00
pSelf->ModifyWeapons(pResult, pUserData, -1, true);
2010-11-13 15:31:13 +00:00
}
void CGameContext::ConAddWeapon(IConsole::IResult *pResult, void *pUserData)
2010-11-13 15:31:13 +00:00
{
CGameContext *pSelf = (CGameContext *) pUserData;
pSelf->ModifyWeapons(pResult, pUserData, pResult->GetInteger(0), false);
2010-11-13 15:31:13 +00:00
}
void CGameContext::ConRemoveWeapon(IConsole::IResult *pResult, void *pUserData)
2010-11-13 15:31:13 +00:00
{
CGameContext *pSelf = (CGameContext *) pUserData;
pSelf->ModifyWeapons(pResult, pUserData, pResult->GetInteger(0), true);
2010-11-13 15:31:13 +00:00
}
void CGameContext::ModifyWeapons(IConsole::IResult *pResult, void *pUserData,
int Weapon, bool Remove)
2010-11-13 15:31:13 +00:00
{
2016-10-08 17:42:42 +00:00
CGameContext *pSelf = (CGameContext *)pUserData;
CCharacter* pChr = GetPlayerChar(pResult->m_ClientID);
if (!pChr)
return;
2016-10-08 17:42:42 +00:00
if (clamp(Weapon, -1, NUM_WEAPONS - 1) != Weapon)
2010-11-13 15:31:13 +00:00
{
pSelf->Console()->Print(IConsole::OUTPUT_LEVEL_STANDARD, "info",
"invalid weapon id");
2010-11-13 15:31:13 +00:00
return;
}
if (Weapon == -1)
2010-11-13 15:31:13 +00:00
{
2017-05-18 18:04:29 +00:00
pChr->GiveWeapon(WEAPON_SHOTGUN, Remove);
pChr->GiveWeapon(WEAPON_GRENADE, Remove);
pChr->GiveWeapon(WEAPON_RIFLE, Remove);
2010-11-13 15:31:13 +00:00
}
else
{
2016-10-08 17:42:42 +00:00
pChr->GiveWeapon(Weapon, Remove);
2010-11-13 15:31:13 +00:00
}
2011-09-25 16:04:29 +00:00
pChr->m_DDRaceState = DDRACE_CHEAT;
2010-11-13 15:31:13 +00:00
}
2013-07-23 21:37:00 +00:00
void CGameContext::ConToTeleporter(IConsole::IResult *pResult, void *pUserData)
{
CGameContext *pSelf = (CGameContext *) pUserData;
unsigned int TeleTo = pResult->GetInteger(0);
if (((CGameControllerDDRace*)pSelf->m_pController)->m_TeleOuts[TeleTo-1].size())
{
int Num = ((CGameControllerDDRace*)pSelf->m_pController)->m_TeleOuts[TeleTo-1].size();
vec2 TelePos = ((CGameControllerDDRace*)pSelf->m_pController)->m_TeleOuts[TeleTo-1][(!Num)?Num:rand() % Num];
CCharacter* pChr = pSelf->GetPlayerChar(pResult->m_ClientID);
if (pChr)
{
pChr->Core()->m_Pos = TelePos;
2014-05-07 17:22:57 +00:00
pChr->m_Pos = TelePos;
pChr->m_PrevPos = TelePos;
2013-07-23 21:37:00 +00:00
pChr->m_DDRaceState = DDRACE_CHEAT;
}
}
}
2014-02-11 21:36:55 +00:00
void CGameContext::ConToCheckTeleporter(IConsole::IResult *pResult, void *pUserData)
{
CGameContext *pSelf = (CGameContext *) pUserData;
unsigned int TeleTo = pResult->GetInteger(0);
if (((CGameControllerDDRace*)pSelf->m_pController)->m_TeleCheckOuts[TeleTo-1].size())
{
int Num = ((CGameControllerDDRace*)pSelf->m_pController)->m_TeleCheckOuts[TeleTo-1].size();
vec2 TelePos = ((CGameControllerDDRace*)pSelf->m_pController)->m_TeleCheckOuts[TeleTo-1][(!Num)?Num:rand() % Num];
CCharacter* pChr = pSelf->GetPlayerChar(pResult->m_ClientID);
if (pChr)
{
pChr->Core()->m_Pos = TelePos;
2014-05-07 17:22:57 +00:00
pChr->m_Pos = TelePos;
pChr->m_PrevPos = TelePos;
2014-02-11 21:36:55 +00:00
pChr->m_DDRaceState = DDRACE_CHEAT;
pChr->m_TeleCheckpoint = TeleTo;
2014-02-11 21:36:55 +00:00
}
}
}
void CGameContext::ConTeleport(IConsole::IResult *pResult, void *pUserData)
2010-11-13 15:31:13 +00:00
{
CGameContext *pSelf = (CGameContext *) pUserData;
int Tele = pResult->NumArguments() == 2 ? pResult->GetInteger(0) : pResult->m_ClientID;
int TeleTo = pResult->NumArguments() ? pResult->GetInteger(pResult->NumArguments() - 1) : pResult->m_ClientID;
CCharacter *pChr = pSelf->GetPlayerChar(Tele);
if(pChr && pSelf->GetPlayerChar(TeleTo))
2010-11-13 15:31:13 +00:00
{
2017-04-02 17:05:28 +00:00
pChr->Core()->m_Pos = pSelf->m_apPlayers[TeleTo]->m_ViewPos;
pChr->m_Pos = pSelf->m_apPlayers[TeleTo]->m_ViewPos;
pChr->m_PrevPos = pSelf->m_apPlayers[TeleTo]->m_ViewPos;
pChr->m_DDRaceState = DDRACE_CHEAT;
2010-11-13 15:31:13 +00:00
}
}
void CGameContext::ConKill(IConsole::IResult *pResult, void *pUserData)
2010-11-13 15:31:13 +00:00
{
CGameContext *pSelf = (CGameContext *) pUserData;
if (!CheckClientID(pResult->m_ClientID))
return;
2011-08-26 18:03:30 +00:00
CPlayer *pPlayer = pSelf->m_apPlayers[pResult->m_ClientID];
2010-11-13 15:31:13 +00:00
if (!pPlayer
|| (pPlayer->m_LastKill
&& pPlayer->m_LastKill
+ pSelf->Server()->TickSpeed()
* g_Config.m_SvKillDelay
> pSelf->Server()->Tick()))
2010-11-13 15:31:13 +00:00
return;
pPlayer->m_LastKill = pSelf->Server()->Tick();
2010-11-13 15:31:13 +00:00
pPlayer->KillCharacter(WEAPON_SELF);
//pPlayer->m_RespawnTick = pSelf->Server()->Tick() + pSelf->Server()->TickSpeed() * g_Config.m_SvSuicidePenalty;
2010-11-13 15:31:13 +00:00
}
void CGameContext::ConForcePause(IConsole::IResult *pResult, void *pUserData)
{
CGameContext *pSelf = (CGameContext *)pUserData;
int Victim = pResult->GetVictim();
int Seconds = 0;
2017-10-16 23:32:40 +00:00
if (pResult->NumArguments() > 1)
Seconds = clamp(pResult->GetInteger(1), 0, 360);
CPlayer *pPlayer = pSelf->m_apPlayers[Victim];
if (!pPlayer)
return;
2017-04-08 22:20:41 +00:00
pPlayer->ForcePause(Seconds);
}
2019-03-19 19:07:33 +00:00
bool CGameContext::VoteMute(const NETADDR *pAddr, int Secs, const char *pDisplayName, int AuthedID)
2018-04-18 17:26:49 +00:00
{
char aBuf[128];
2019-03-19 19:07:33 +00:00
bool Found = false;
2018-04-18 17:26:49 +00:00
2018-04-19 09:49:18 +00:00
// find a matching vote mute for this ip, update expiration time if found
for(int i = 0; i < m_NumVoteMutes; i++)
2018-04-18 17:26:49 +00:00
{
2018-10-08 18:04:04 +00:00
if(net_addr_comp_noport(&m_aVoteMutes[i].m_Addr, pAddr) == 0)
2018-04-18 17:26:49 +00:00
{
2018-04-19 09:49:18 +00:00
m_aVoteMutes[i].m_Expire = Server()->Tick()
2018-04-18 17:26:49 +00:00
+ Secs * Server()->TickSpeed();
2019-03-19 19:07:33 +00:00
Found = true;
2018-04-21 16:45:33 +00:00
break;
2018-04-18 17:26:49 +00:00
}
}
if(!Found) // nothing found so far, find a free slot..
2018-04-18 17:26:49 +00:00
{
2018-04-21 16:45:33 +00:00
if(m_NumVoteMutes < MAX_VOTE_BANS)
2018-04-18 17:26:49 +00:00
{
2018-04-19 09:51:10 +00:00
m_aVoteMutes[m_NumVoteMutes].m_Addr = *pAddr;
2018-04-19 09:49:18 +00:00
m_aVoteMutes[m_NumVoteMutes].m_Expire = Server()->Tick()
2018-04-18 17:26:49 +00:00
+ Secs * Server()->TickSpeed();
2018-04-19 09:49:18 +00:00
m_NumVoteMutes++;
2019-03-19 19:07:33 +00:00
Found = true;
2018-04-18 17:26:49 +00:00
}
}
if(Found)
2018-04-18 17:26:49 +00:00
{
if(pDisplayName)
2018-04-18 17:26:49 +00:00
{
str_format(aBuf, sizeof aBuf, "'%s' banned '%s' for %d seconds from voting.",
Server()->ClientName(AuthedID), pDisplayName, Secs);
2018-04-19 09:49:18 +00:00
Console()->Print(IConsole::OUTPUT_LEVEL_STANDARD, "votemute", aBuf);
2018-04-18 17:26:49 +00:00
}
}
else // no free slot found
2018-04-19 09:49:18 +00:00
Console()->Print(IConsole::OUTPUT_LEVEL_STANDARD, "votemute", "vote mute array is full");
2019-03-19 19:07:33 +00:00
return Found;
}
2019-03-19 19:18:11 +00:00
bool CGameContext::VoteUnmute(const NETADDR *pAddr, const char *pDisplayName, int AuthedID)
2019-03-19 19:07:33 +00:00
{
for(int i = 0; i < m_NumVoteMutes; i++)
{
if(net_addr_comp_noport(&m_aVoteMutes[i].m_Addr, pAddr) == 0)
{
m_NumVoteMutes--;
m_aVoteMutes[i] = m_aVoteMutes[m_NumVoteMutes];
if(pDisplayName)
{
char aBuf[128];
str_format(aBuf, sizeof aBuf, "'%s' unbanned '%s' from voting.",
Server()->ClientName(AuthedID), pDisplayName);
Console()->Print(IConsole::OUTPUT_LEVEL_STANDARD, "voteunmute", aBuf);
}
return true;
}
}
return false;
2018-04-18 17:26:49 +00:00
}
2018-10-08 18:29:33 +00:00
void CGameContext::Mute(const NETADDR *pAddr, int Secs, const char *pDisplayName)
2011-02-08 12:44:59 +00:00
{
char aBuf[128];
2011-02-23 21:39:53 +00:00
int Found = 0;
2011-02-08 12:44:59 +00:00
// find a matching mute for this ip, update expiration time if found
for (int i = 0; i < m_NumMutes; i++)
2011-02-23 21:39:53 +00:00
{
2018-10-08 18:04:04 +00:00
if (net_addr_comp_noport(&m_aMutes[i].m_Addr, pAddr) == 0)
2011-02-23 21:39:53 +00:00
{
m_aMutes[i].m_Expire = Server()->Tick()
+ Secs * Server()->TickSpeed();
2011-02-23 21:39:53 +00:00
Found = 1;
}
}
2011-02-08 12:44:59 +00:00
if (!Found) // nothing found so far, find a free slot..
2011-02-23 21:39:53 +00:00
{
if (m_NumMutes < MAX_MUTES)
2011-02-23 21:39:53 +00:00
{
2018-10-08 18:04:04 +00:00
m_aMutes[m_NumMutes].m_Addr = *pAddr;
m_aMutes[m_NumMutes].m_Expire = Server()->Tick()
+ Secs * Server()->TickSpeed();
2011-02-25 22:13:14 +00:00
m_NumMutes++;
2011-02-23 21:39:53 +00:00
Found = 1;
}
}
if (Found)
2011-02-08 12:44:59 +00:00
{
if (pDisplayName)
{
str_format(aBuf, sizeof aBuf, "'%s' has been muted for %d seconds.",
pDisplayName, Secs);
SendChat(-1, CHAT_ALL, aBuf);
}
2011-02-08 12:44:59 +00:00
}
2011-12-26 09:15:43 +00:00
else // no free slot found
Console()->Print(IConsole::OUTPUT_LEVEL_STANDARD, "mutes", "mute array is full");
2011-02-08 12:44:59 +00:00
}
2018-04-19 09:49:18 +00:00
void CGameContext::ConVoteMute(IConsole::IResult *pResult, void *pUserData)
2018-04-18 17:26:49 +00:00
{
CGameContext *pSelf = (CGameContext *)pUserData;
int Victim = pResult->GetVictim();
2018-04-21 16:45:33 +00:00
if(Victim < 0 || Victim > MAX_CLIENTS || !pSelf->m_apPlayers[Victim])
2018-04-18 17:26:49 +00:00
{
2018-04-21 16:45:33 +00:00
pSelf->Console()->Print(IConsole::OUTPUT_LEVEL_STANDARD, "votemute", "Client ID not found");
2018-04-18 17:26:49 +00:00
return;
}
NETADDR Addr;
pSelf->Server()->GetClientAddr(Victim, &Addr);
2019-03-19 19:07:33 +00:00
int Seconds = clamp(pResult->GetInteger(1), 1, 86400);
bool Found = pSelf->VoteMute(&Addr, Seconds, pSelf->Server()->ClientName(Victim), pResult->m_ClientID);
if(Found)
{
char aBuf[128];
str_format(aBuf, sizeof aBuf, "'%s' banned '%s' for %d seconds from voting.",
pSelf->Server()->ClientName(pResult->m_ClientID), pSelf->Server()->ClientName(Victim), Seconds);
pSelf->SendChat(-1, 0, aBuf);
}
}
2019-03-19 19:18:11 +00:00
void CGameContext::ConVoteUnmute(IConsole::IResult *pResult, void *pUserData)
2019-03-19 19:07:33 +00:00
{
CGameContext *pSelf = (CGameContext *)pUserData;
int Victim = pResult->GetVictim();
if(Victim < 0 || Victim > MAX_CLIENTS || !pSelf->m_apPlayers[Victim])
{
pSelf->Console()->Print(IConsole::OUTPUT_LEVEL_STANDARD, "voteunmute", "Client ID not found");
return;
}
NETADDR Addr;
pSelf->Server()->GetClientAddr(Victim, &Addr);
2019-03-19 19:18:11 +00:00
bool Found = pSelf->VoteUnmute(&Addr, pSelf->Server()->ClientName(Victim), pResult->m_ClientID);
2019-03-19 19:07:33 +00:00
if(Found)
{
char aBuf[128];
str_format(aBuf, sizeof aBuf, "'%s' unbanned '%s' from voting.",
pSelf->Server()->ClientName(pResult->m_ClientID), pSelf->Server()->ClientName(Victim));
pSelf->SendChat(-1, 0, aBuf);
}
2018-04-18 17:26:49 +00:00
}
void CGameContext::ConMute(IConsole::IResult *pResult, void *pUserData)
2011-02-08 12:44:59 +00:00
{
CGameContext *pSelf = (CGameContext *) pUserData;
pSelf->Console()->Print(
IConsole::OUTPUT_LEVEL_STANDARD,
"mutes",
"Use either 'muteid <client_id> <seconds>' or 'muteip <ip> <seconds>'");
2011-02-08 12:44:59 +00:00
}
// mute through client id
void CGameContext::ConMuteID(IConsole::IResult *pResult, void *pUserData)
2011-02-08 12:44:59 +00:00
{
CGameContext *pSelf = (CGameContext *) pUserData;
2011-09-25 16:04:29 +00:00
int Victim = pResult->GetVictim();
2018-10-08 18:04:04 +00:00
2018-01-15 18:31:14 +00:00
if (Victim < 0 || Victim > MAX_CLIENTS || !pSelf->m_apPlayers[Victim])
{
pSelf->Console()->Print(IConsole::OUTPUT_LEVEL_STANDARD, "muteid", "Client id not found.");
return;
}
2011-02-08 12:44:59 +00:00
2011-02-23 21:39:53 +00:00
NETADDR Addr;
pSelf->Server()->GetClientAddr(Victim, &Addr);
2011-02-08 12:44:59 +00:00
2018-10-08 18:29:33 +00:00
pSelf->Mute(&Addr, clamp(pResult->GetInteger(1), 1, 86400),
pSelf->Server()->ClientName(Victim));
2011-02-08 12:44:59 +00:00
}
// mute through ip, arguments reversed to workaround parsing
void CGameContext::ConMuteIP(IConsole::IResult *pResult, void *pUserData)
2011-02-08 12:44:59 +00:00
{
CGameContext *pSelf = (CGameContext *) pUserData;
2011-02-23 21:39:53 +00:00
NETADDR Addr;
if (net_addr_from_str(&Addr, pResult->GetString(0)))
2011-02-23 21:39:53 +00:00
{
pSelf->Console()->Print(IConsole::OUTPUT_LEVEL_STANDARD, "mutes",
"Invalid network address to mute");
2011-02-23 21:39:53 +00:00
}
2018-10-08 18:29:33 +00:00
pSelf->Mute(&Addr, clamp(pResult->GetInteger(1), 1, 86400), NULL);
2011-02-08 12:44:59 +00:00
}
// unmute by mute list index
void CGameContext::ConUnmute(IConsole::IResult *pResult, void *pUserData)
2011-02-08 12:44:59 +00:00
{
CGameContext *pSelf = (CGameContext *) pUserData;
2011-02-23 21:39:53 +00:00
char aIpBuf[64];
char aBuf[64];
2011-09-25 16:04:29 +00:00
int Victim = pResult->GetVictim();
2011-02-08 12:44:59 +00:00
if (Victim < 0 || Victim >= pSelf->m_NumMutes)
2011-02-08 12:44:59 +00:00
return;
2011-02-23 21:39:53 +00:00
pSelf->m_NumMutes--;
2011-04-14 02:38:03 +00:00
pSelf->m_aMutes[Victim] = pSelf->m_aMutes[pSelf->m_NumMutes];
2011-02-08 12:44:59 +00:00
net_addr_str(&pSelf->m_aMutes[Victim].m_Addr, aIpBuf, sizeof(aIpBuf), false);
str_format(aBuf, sizeof(aBuf), "Unmuted %s", aIpBuf);
pSelf->Console()->Print(IConsole::OUTPUT_LEVEL_STANDARD, "mutes", aBuf);
2011-02-08 12:44:59 +00:00
}
// list mutes
void CGameContext::ConMutes(IConsole::IResult *pResult, void *pUserData)
2011-02-08 12:44:59 +00:00
{
CGameContext *pSelf = (CGameContext *) pUserData;
2018-10-08 18:04:04 +00:00
2018-01-15 18:31:14 +00:00
if (pSelf->m_NumMutes <= 0)
{
// Just to make sure.
pSelf->m_NumMutes = 0;
pSelf->Console()->Print(IConsole::OUTPUT_LEVEL_STANDARD, "mutes",
"There are no active mutes.");
return;
}
2018-10-08 18:04:04 +00:00
2011-02-23 21:39:53 +00:00
char aIpBuf[64];
char aBuf[128];
pSelf->Console()->Print(IConsole::OUTPUT_LEVEL_STANDARD, "mutes",
"Active mutes:");
for (int i = 0; i < pSelf->m_NumMutes; i++)
2011-02-23 21:39:53 +00:00
{
net_addr_str(&pSelf->m_aMutes[i].m_Addr, aIpBuf, sizeof(aIpBuf), false);
str_format(
aBuf,
sizeof aBuf,
"%d: \"%s\", %d seconds left",
i,
aIpBuf,
(pSelf->m_aMutes[i].m_Expire - pSelf->Server()->Tick())
/ pSelf->Server()->TickSpeed());
pSelf->Console()->Print(IConsole::OUTPUT_LEVEL_STANDARD, "mutes", aBuf);
2011-02-23 21:39:53 +00:00
}
}
2013-12-31 05:13:57 +00:00
2018-01-05 11:04:06 +00:00
void CGameContext::ConModerate(IConsole::IResult *pResult, void *pUserData)
{
CGameContext *pSelf = (CGameContext *)pUserData;
if (!CheckClientID(pResult->m_ClientID))
return;
bool HadModerator = pSelf->PlayerModerating();
2018-06-24 07:57:30 +00:00
CPlayer *pPlayer = pSelf->m_apPlayers[pResult->m_ClientID];
pPlayer->m_Moderating = !pPlayer->m_Moderating;
2018-01-05 11:04:06 +00:00
char aBuf[256];
2018-06-24 07:57:30 +00:00
if(!HadModerator && pPlayer->m_Moderating)
2018-01-05 11:04:06 +00:00
str_format(aBuf, sizeof(aBuf), "Server kick/spec votes will now be actively moderated.");
2018-06-24 07:57:30 +00:00
if(!pSelf->PlayerModerating())
2018-01-05 11:04:06 +00:00
str_format(aBuf, sizeof(aBuf), "Server kick/spec votes are no longer actively moderated.");
pSelf->SendChat(-1, CHAT_ALL, aBuf, 0);
2018-10-08 18:04:04 +00:00
2018-06-24 07:57:30 +00:00
if(pPlayer->m_Moderating)
pSelf->SendChatTarget(pResult->m_ClientID, "Active moderator mode enabled for you.");
2018-01-05 11:04:06 +00:00
else
pSelf->SendChatTarget(pResult->m_ClientID, "Active moderator mode disabled for you.");
}
2013-12-31 05:13:57 +00:00
void CGameContext::ConList(IConsole::IResult *pResult, void *pUserData)
{
CGameContext *pSelf = (CGameContext *)pUserData;
int ClientID = pResult->m_ClientID;
if(!CheckClientID(ClientID)) return;
char zerochar = 0;
if(pResult->NumArguments() > 0)
pSelf->List(ClientID, pResult->GetString(0));
else
pSelf->List(ClientID, &zerochar);
}
void CGameContext::ConSetDDRTeam(IConsole::IResult *pResult, void *pUserData)
{
CGameContext *pSelf = (CGameContext *)pUserData;
CGameControllerDDRace *pController = (CGameControllerDDRace *)pSelf->m_pController;
2017-04-25 18:27:23 +00:00
int Target = pResult->GetVictim();
int Team = pResult->GetInteger(1);
2017-04-25 18:27:23 +00:00
if(pController->m_Teams.m_Core.Team(Target) && pController->m_Teams.GetDDRaceState(pSelf->m_apPlayers[Target]) == DDRACE_STARTED)
pSelf->m_apPlayers[Target]->KillCharacter(WEAPON_SELF);
pController->m_Teams.SetForceCharacterTeam(Target, Team);
}
void CGameContext::ConUninvite(IConsole::IResult *pResult, void *pUserData)
{
CGameContext *pSelf = (CGameContext *)pUserData;
CGameControllerDDRace *pController = (CGameControllerDDRace *)pSelf->m_pController;
pController->m_Teams.SetClientInvited(pResult->GetInteger(1), pResult->GetVictim(), false);
}
void CGameContext::ConFreezeHammer(IConsole::IResult *pResult, void *pUserData)
{
CGameContext *pSelf = (CGameContext *) pUserData;
int Victim = pResult->GetVictim();
CCharacter* pChr = pSelf->GetPlayerChar(Victim);
if (!pChr)
return;
char aBuf[128];
str_format(aBuf, sizeof aBuf, "'%s' got freeze hammer!",
pSelf->Server()->ClientName(Victim));
pSelf->SendChat(-1, CHAT_ALL, aBuf);
pChr->m_FreezeHammer = true;
}
void CGameContext::ConUnFreezeHammer(IConsole::IResult *pResult, void *pUserData)
{
CGameContext *pSelf = (CGameContext *) pUserData;
int Victim = pResult->GetVictim();
CCharacter* pChr = pSelf->GetPlayerChar(Victim);
if (!pChr)
return;
char aBuf[128];
str_format(aBuf, sizeof aBuf, "'%s' lost freeze hammer!",
pSelf->Server()->ClientName(Victim));
pSelf->SendChat(-1, CHAT_ALL, aBuf);
pChr->m_FreezeHammer = false;
}
void CGameContext::ConVoteNo(IConsole::IResult *pResult, void *pUserData)
{
CGameContext *pSelf = (CGameContext *)pUserData;
2018-10-08 18:04:04 +00:00
2018-01-18 15:17:23 +00:00
pSelf->ForceVote(pResult->m_ClientID, false);
2018-01-18 06:58:22 +00:00
}