/* (c) Shereef Marzouk. See "licence DDRace.txt" and the readme.txt in the root of the distribution for more information. */ #include "gamecontext.h" #include #include #include #include #include bool CheckClientID(int ClientID); void CGameContext::ConGoLeft(IConsole::IResult *pResult, void *pUserData) { CGameContext *pSelf = (CGameContext *)pUserData; if(!CheckClientID(pResult->m_ClientID)) return; pSelf->MoveCharacter(pResult->m_ClientID, -1, 0); } void CGameContext::ConGoRight(IConsole::IResult *pResult, void *pUserData) { CGameContext *pSelf = (CGameContext *)pUserData; if(!CheckClientID(pResult->m_ClientID)) return; pSelf->MoveCharacter(pResult->m_ClientID, 1, 0); } void CGameContext::ConGoDown(IConsole::IResult *pResult, void *pUserData) { CGameContext *pSelf = (CGameContext *)pUserData; if(!CheckClientID(pResult->m_ClientID)) return; pSelf->MoveCharacter(pResult->m_ClientID, 0, 1); } void CGameContext::ConGoUp(IConsole::IResult *pResult, void *pUserData) { CGameContext *pSelf = (CGameContext *)pUserData; if(!CheckClientID(pResult->m_ClientID)) return; pSelf->MoveCharacter(pResult->m_ClientID, 0, -1); } void CGameContext::ConMove(IConsole::IResult *pResult, void *pUserData) { CGameContext *pSelf = (CGameContext *)pUserData; if(!CheckClientID(pResult->m_ClientID)) return; pSelf->MoveCharacter(pResult->m_ClientID, pResult->GetInteger(0), pResult->GetInteger(1)); } void CGameContext::ConMoveRaw(IConsole::IResult *pResult, void *pUserData) { CGameContext *pSelf = (CGameContext *)pUserData; if(!CheckClientID(pResult->m_ClientID)) return; pSelf->MoveCharacter(pResult->m_ClientID, pResult->GetInteger(0), pResult->GetInteger(1), true); } void CGameContext::MoveCharacter(int ClientID, int X, int Y, bool Raw) { CCharacter *pChr = GetPlayerChar(ClientID); if(!pChr) return; pChr->Core()->m_Pos.x += ((Raw) ? 1 : 32) * X; pChr->Core()->m_Pos.y += ((Raw) ? 1 : 32) * Y; pChr->m_DDRaceState = DDRACE_CHEAT; } void CGameContext::ConKillPlayer(IConsole::IResult *pResult, void *pUserData) { CGameContext *pSelf = (CGameContext *)pUserData; if(!CheckClientID(pResult->m_ClientID)) return; int Victim = pResult->GetVictim(); if(pSelf->m_apPlayers[Victim]) { pSelf->m_apPlayers[Victim]->KillCharacter(WEAPON_GAME); char aBuf[512]; str_format(aBuf, sizeof(aBuf), "%s was killed by %s", pSelf->Server()->ClientName(Victim), pSelf->Server()->ClientName(pResult->m_ClientID)); pSelf->SendChat(-1, CGameContext::CHAT_ALL, aBuf); } } void CGameContext::ConNinja(IConsole::IResult *pResult, void *pUserData) { CGameContext *pSelf = (CGameContext *)pUserData; pSelf->ModifyWeapons(pResult, pUserData, WEAPON_NINJA, false); } void CGameContext::ConSuper(IConsole::IResult *pResult, void *pUserData) { CGameContext *pSelf = (CGameContext *)pUserData; if(!CheckClientID(pResult->m_ClientID)) return; CCharacter *pChr = pSelf->GetPlayerChar(pResult->m_ClientID); if(pChr && !pChr->m_Super) { pChr->m_Super = true; pChr->Core()->m_Super = true; pChr->UnFreeze(); pChr->m_TeamBeforeSuper = pChr->Team(); pChr->Teams()->SetCharacterTeam(pResult->m_ClientID, TEAM_SUPER); pChr->m_DDRaceState = DDRACE_CHEAT; } } void CGameContext::ConUnSuper(IConsole::IResult *pResult, void *pUserData) { CGameContext *pSelf = (CGameContext *)pUserData; if(!CheckClientID(pResult->m_ClientID)) return; CCharacter *pChr = pSelf->GetPlayerChar(pResult->m_ClientID); if(pChr && pChr->m_Super) { pChr->m_Super = false; pChr->Core()->m_Super = false; pChr->Teams()->SetForceCharacterTeam(pResult->m_ClientID, pChr->m_TeamBeforeSuper); } } 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); if(pChr) pChr->SetSolo(false); } 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); if(pChr) pChr->m_DeepFreeze = false; } void CGameContext::ConShotgun(IConsole::IResult *pResult, void *pUserData) { CGameContext *pSelf = (CGameContext *)pUserData; pSelf->ModifyWeapons(pResult, pUserData, WEAPON_SHOTGUN, false); } void CGameContext::ConGrenade(IConsole::IResult *pResult, void *pUserData) { CGameContext *pSelf = (CGameContext *)pUserData; pSelf->ModifyWeapons(pResult, pUserData, WEAPON_GRENADE, false); } void CGameContext::ConLaser(IConsole::IResult *pResult, void *pUserData) { CGameContext *pSelf = (CGameContext *)pUserData; pSelf->ModifyWeapons(pResult, pUserData, WEAPON_LASER, false); } 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) { CGameContext *pSelf = (CGameContext *)pUserData; pSelf->ModifyWeapons(pResult, pUserData, -1, false); } void CGameContext::ConUnShotgun(IConsole::IResult *pResult, void *pUserData) { CGameContext *pSelf = (CGameContext *)pUserData; pSelf->ModifyWeapons(pResult, pUserData, WEAPON_SHOTGUN, true); } void CGameContext::ConUnGrenade(IConsole::IResult *pResult, void *pUserData) { CGameContext *pSelf = (CGameContext *)pUserData; pSelf->ModifyWeapons(pResult, pUserData, WEAPON_GRENADE, true); } void CGameContext::ConUnLaser(IConsole::IResult *pResult, void *pUserData) { CGameContext *pSelf = (CGameContext *)pUserData; pSelf->ModifyWeapons(pResult, pUserData, WEAPON_LASER, true); } 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) { CGameContext *pSelf = (CGameContext *)pUserData; pSelf->ModifyWeapons(pResult, pUserData, -1, true); } void CGameContext::ConAddWeapon(IConsole::IResult *pResult, void *pUserData) { CGameContext *pSelf = (CGameContext *)pUserData; pSelf->ModifyWeapons(pResult, pUserData, pResult->GetInteger(0), false); } void CGameContext::ConRemoveWeapon(IConsole::IResult *pResult, void *pUserData) { CGameContext *pSelf = (CGameContext *)pUserData; pSelf->ModifyWeapons(pResult, pUserData, pResult->GetInteger(0), true); } void CGameContext::ModifyWeapons(IConsole::IResult *pResult, void *pUserData, int Weapon, bool Remove) { CGameContext *pSelf = (CGameContext *)pUserData; CCharacter *pChr = GetPlayerChar(pResult->m_ClientID); if(!pChr) return; if(clamp(Weapon, -1, NUM_WEAPONS - 1) != Weapon) { pSelf->Console()->Print(IConsole::OUTPUT_LEVEL_STANDARD, "info", "invalid weapon id"); return; } if(Weapon == -1) { pChr->GiveWeapon(WEAPON_SHOTGUN, Remove); pChr->GiveWeapon(WEAPON_GRENADE, Remove); pChr->GiveWeapon(WEAPON_LASER, Remove); } else { pChr->GiveWeapon(Weapon, Remove); } pChr->m_DDRaceState = DDRACE_CHEAT; } void CGameContext::ConToTeleporter(IConsole::IResult *pResult, void *pUserData) { CGameContext *pSelf = (CGameContext *)pUserData; unsigned int TeleTo = pResult->GetInteger(0); CGameControllerDDRace *pGameControllerDDRace = (CGameControllerDDRace *)pSelf->m_pController; if(pGameControllerDDRace->m_TeleOuts[TeleTo - 1].size()) { CCharacter *pChr = pSelf->GetPlayerChar(pResult->m_ClientID); if(pChr) { int TeleOut = pSelf->m_World.m_Core.RandomOr0(pGameControllerDDRace->m_TeleOuts[TeleTo - 1].size()); vec2 TelePos = pGameControllerDDRace->m_TeleOuts[TeleTo - 1][TeleOut]; pChr->Core()->m_Pos = TelePos; pChr->m_Pos = TelePos; pChr->m_PrevPos = TelePos; pChr->m_DDRaceState = DDRACE_CHEAT; } } } void CGameContext::ConToCheckTeleporter(IConsole::IResult *pResult, void *pUserData) { CGameContext *pSelf = (CGameContext *)pUserData; unsigned int TeleTo = pResult->GetInteger(0); CGameControllerDDRace *pGameControllerDDRace = (CGameControllerDDRace *)pSelf->m_pController; if(pGameControllerDDRace->m_TeleCheckOuts[TeleTo - 1].size()) { CCharacter *pChr = pSelf->GetPlayerChar(pResult->m_ClientID); if(pChr) { int TeleOut = pSelf->m_World.m_Core.RandomOr0(pGameControllerDDRace->m_TeleCheckOuts[TeleTo - 1].size()); vec2 TelePos = pGameControllerDDRace->m_TeleCheckOuts[TeleTo - 1][TeleOut]; pChr->Core()->m_Pos = TelePos; pChr->m_Pos = TelePos; pChr->m_PrevPos = TelePos; pChr->m_DDRaceState = DDRACE_CHEAT; pChr->m_TeleCheckpoint = TeleTo; } } } void CGameContext::ConTeleport(IConsole::IResult *pResult, void *pUserData) { 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; int AuthLevel = pSelf->Server()->GetAuthedState(pResult->m_ClientID); if(Tele != pResult->m_ClientID && AuthLevel < g_Config.m_SvTeleOthersAuthLevel) { pSelf->Console()->Print(IConsole::OUTPUT_LEVEL_STANDARD, "tele", "you aren't allowed to tele others"); return; } CCharacter *pChr = pSelf->GetPlayerChar(Tele); if(pChr && pSelf->GetPlayerChar(TeleTo)) { 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; } } void CGameContext::ConKill(IConsole::IResult *pResult, void *pUserData) { CGameContext *pSelf = (CGameContext *)pUserData; if(!CheckClientID(pResult->m_ClientID)) return; CPlayer *pPlayer = pSelf->m_apPlayers[pResult->m_ClientID]; if(!pPlayer || (pPlayer->m_LastKill && pPlayer->m_LastKill + pSelf->Server()->TickSpeed() * g_Config.m_SvKillDelay > pSelf->Server()->Tick())) return; pPlayer->m_LastKill = pSelf->Server()->Tick(); pPlayer->KillCharacter(WEAPON_SELF); //pPlayer->m_RespawnTick = pSelf->Server()->Tick() + pSelf->Server()->TickSpeed() * g_Config.m_SvSuicidePenalty; } void CGameContext::ConForcePause(IConsole::IResult *pResult, void *pUserData) { CGameContext *pSelf = (CGameContext *)pUserData; int Victim = pResult->GetVictim(); int Seconds = 0; if(pResult->NumArguments() > 1) Seconds = clamp(pResult->GetInteger(1), 0, 360); CPlayer *pPlayer = pSelf->m_apPlayers[Victim]; if(!pPlayer) return; pPlayer->ForcePause(Seconds); } bool CGameContext::TryVoteMute(const NETADDR *pAddr, int Secs) { // find a matching vote mute for this ip, update expiration time if found for(int i = 0; i < m_NumVoteMutes; i++) { if(net_addr_comp_noport(&m_aVoteMutes[i].m_Addr, pAddr) == 0) { m_aVoteMutes[i].m_Expire = Server()->Tick() + Secs * Server()->TickSpeed(); return true; } } // nothing to update create new one if(m_NumVoteMutes < MAX_VOTE_MUTES) { m_aVoteMutes[m_NumVoteMutes].m_Addr = *pAddr; m_aVoteMutes[m_NumVoteMutes].m_Expire = Server()->Tick() + Secs * Server()->TickSpeed(); m_NumVoteMutes++; return true; } // no free slot found Console()->Print(IConsole::OUTPUT_LEVEL_STANDARD, "votemute", "vote mute array is full"); return false; } bool CGameContext::VoteMute(const NETADDR *pAddr, int Secs, const char *pDisplayName, int AuthedID) { if(!TryVoteMute(pAddr, Secs)) return false; if(!pDisplayName) return true; char aBuf[128]; str_format(aBuf, sizeof aBuf, "'%s' banned '%s' for %d seconds from voting.", Server()->ClientName(AuthedID), pDisplayName, Secs); Console()->Print(IConsole::OUTPUT_LEVEL_STANDARD, "votemute", aBuf); return true; } bool CGameContext::VoteUnmute(const NETADDR *pAddr, const char *pDisplayName, int AuthedID) { 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; } bool CGameContext::TryMute(const NETADDR *pAddr, int Secs, const char *pReason) { // find a matching mute for this ip, update expiration time if found for(int i = 0; i < m_NumMutes; i++) { if(net_addr_comp_noport(&m_aMutes[i].m_Addr, pAddr) == 0) { m_aMutes[i].m_Expire = Server()->Tick() + Secs * Server()->TickSpeed(); str_copy(m_aMutes[i].m_aReason, pReason, sizeof(m_aMutes[i].m_aReason)); return true; } } // nothing to update create new one if(m_NumMutes < MAX_MUTES) { m_aMutes[m_NumMutes].m_Addr = *pAddr; m_aMutes[m_NumMutes].m_Expire = Server()->Tick() + Secs * Server()->TickSpeed(); str_copy(m_aMutes[m_NumMutes].m_aReason, pReason, sizeof(m_aMutes[m_NumMutes].m_aReason)); m_NumMutes++; return true; } // no free slot found Console()->Print(IConsole::OUTPUT_LEVEL_STANDARD, "mutes", "mute array is full"); return false; } void CGameContext::Mute(const NETADDR *pAddr, int Secs, const char *pDisplayName, const char *pReason) { if(!TryMute(pAddr, Secs, pReason)) return; if(!pDisplayName) return; char aBuf[128]; if(pReason[0]) str_format(aBuf, sizeof aBuf, "'%s' has been muted for %d seconds (%s)", pDisplayName, Secs, pReason); else str_format(aBuf, sizeof aBuf, "'%s' has been muted for %d seconds", pDisplayName, Secs); SendChat(-1, CHAT_ALL, aBuf); } void CGameContext::ConVoteMute(IConsole::IResult *pResult, void *pUserData) { 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, "votemute", "Client ID not found"); return; } NETADDR Addr; pSelf->Server()->GetClientAddr(Victim, &Addr); 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); } } void CGameContext::ConVoteUnmute(IConsole::IResult *pResult, void *pUserData) { 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); bool Found = pSelf->VoteUnmute(&Addr, pSelf->Server()->ClientName(Victim), pResult->m_ClientID); 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); } } void CGameContext::ConVoteMutes(IConsole::IResult *pResult, void *pUserData) { CGameContext *pSelf = (CGameContext *)pUserData; if(pSelf->m_NumVoteMutes <= 0) { // Just to make sure. pSelf->m_NumVoteMutes = 0; pSelf->Console()->Print(IConsole::OUTPUT_LEVEL_STANDARD, "votemutes", "There are no active vote mutes."); return; } char aIpBuf[64]; char aBuf[128]; pSelf->Console()->Print(IConsole::OUTPUT_LEVEL_STANDARD, "votemutes", "Active vote mutes:"); for(int i = 0; i < pSelf->m_NumVoteMutes; i++) { net_addr_str(&pSelf->m_aVoteMutes[i].m_Addr, aIpBuf, sizeof(aIpBuf), false); str_format(aBuf, sizeof aBuf, "%d: \"%s\", %d seconds left", i, aIpBuf, (pSelf->m_aVoteMutes[i].m_Expire - pSelf->Server()->Tick()) / pSelf->Server()->TickSpeed()); pSelf->Console()->Print(IConsole::OUTPUT_LEVEL_STANDARD, "votemutes", aBuf); } } void CGameContext::ConMute(IConsole::IResult *pResult, void *pUserData) { CGameContext *pSelf = (CGameContext *)pUserData; pSelf->Console()->Print( IConsole::OUTPUT_LEVEL_STANDARD, "mutes", "Use either 'muteid ' or 'muteip '"); } // mute through client id void CGameContext::ConMuteID(IConsole::IResult *pResult, void *pUserData) { 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, "muteid", "Client id not found."); return; } NETADDR Addr; pSelf->Server()->GetClientAddr(Victim, &Addr); const char *pReason = pResult->NumArguments() > 2 ? pResult->GetString(2) : ""; pSelf->Mute(&Addr, clamp(pResult->GetInteger(1), 1, 86400), pSelf->Server()->ClientName(Victim), pReason); } // mute through ip, arguments reversed to workaround parsing void CGameContext::ConMuteIP(IConsole::IResult *pResult, void *pUserData) { CGameContext *pSelf = (CGameContext *)pUserData; NETADDR Addr; if(net_addr_from_str(&Addr, pResult->GetString(0))) { pSelf->Console()->Print(IConsole::OUTPUT_LEVEL_STANDARD, "mutes", "Invalid network address to mute"); } const char *pReason = pResult->NumArguments() > 2 ? pResult->GetString(2) : ""; pSelf->Mute(&Addr, clamp(pResult->GetInteger(1), 1, 86400), NULL, pReason); } // unmute by mute list index void CGameContext::ConUnmute(IConsole::IResult *pResult, void *pUserData) { CGameContext *pSelf = (CGameContext *)pUserData; char aIpBuf[64]; char aBuf[64]; int Victim = pResult->GetVictim(); if(Victim < 0 || Victim >= pSelf->m_NumMutes) return; pSelf->m_NumMutes--; pSelf->m_aMutes[Victim] = pSelf->m_aMutes[pSelf->m_NumMutes]; 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); } // list mutes void CGameContext::ConMutes(IConsole::IResult *pResult, void *pUserData) { CGameContext *pSelf = (CGameContext *)pUserData; 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; } 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++) { net_addr_str(&pSelf->m_aMutes[i].m_Addr, aIpBuf, sizeof(aIpBuf), false); str_format(aBuf, sizeof aBuf, "%d: \"%s\", %d seconds left (%s)", i, aIpBuf, (pSelf->m_aMutes[i].m_Expire - pSelf->Server()->Tick()) / pSelf->Server()->TickSpeed(), pSelf->m_aMutes[i].m_aReason); pSelf->Console()->Print(IConsole::OUTPUT_LEVEL_STANDARD, "mutes", aBuf); } } void CGameContext::ConModerate(IConsole::IResult *pResult, void *pUserData) { CGameContext *pSelf = (CGameContext *)pUserData; if(!CheckClientID(pResult->m_ClientID)) return; bool HadModerator = pSelf->PlayerModerating(); CPlayer *pPlayer = pSelf->m_apPlayers[pResult->m_ClientID]; pPlayer->m_Moderating = !pPlayer->m_Moderating; char aBuf[256]; if(!HadModerator && pPlayer->m_Moderating) str_format(aBuf, sizeof(aBuf), "Server kick/spec votes will now be actively moderated."); if(!pSelf->PlayerModerating()) str_format(aBuf, sizeof(aBuf), "Server kick/spec votes are no longer actively moderated."); pSelf->SendChat(-1, CHAT_ALL, aBuf, 0); if(pPlayer->m_Moderating) pSelf->SendChatTarget(pResult->m_ClientID, "Active moderator mode enabled for you."); else pSelf->SendChatTarget(pResult->m_ClientID, "Active moderator mode disabled for you."); } void CGameContext::ConSetDDRTeam(IConsole::IResult *pResult, void *pUserData) { CGameContext *pSelf = (CGameContext *)pUserData; CGameControllerDDRace *pController = (CGameControllerDDRace *)pSelf->m_pController; if(g_Config.m_SvTeam == 0 || g_Config.m_SvTeam == 3) { pSelf->Console()->Print(IConsole::OUTPUT_LEVEL_STANDARD, "join", "Teams are disabled"); return; } int Target = pResult->GetVictim(); int Team = pResult->GetInteger(1); if(Team < TEAM_FLOCK || Team >= TEAM_SUPER) return; CCharacter *pChr = pSelf->GetPlayerChar(Target); if((pController->m_Teams.m_Core.Team(Target) && pController->m_Teams.GetDDRaceState(pSelf->m_apPlayers[Target]) == DDRACE_STARTED) || (pChr && pController->m_Teams.IsPractice(pChr->Team()))) 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; pSelf->ForceVote(pResult->m_ClientID, false); } void CGameContext::ConDrySave(IConsole::IResult *pResult, void *pUserData) { CGameContext *pSelf = (CGameContext *)pUserData; CPlayer *pPlayer = pSelf->m_apPlayers[pResult->m_ClientID]; if(!pPlayer || pSelf->Server()->GetAuthedState(pResult->m_ClientID) != AUTHED_ADMIN) return; CSaveTeam SavedTeam(pSelf->m_pController); int Result = SavedTeam.save(pPlayer->GetTeam()); if(CSaveTeam::HandleSaveError(Result, pResult->m_ClientID, pSelf)) return; char aTimestamp[32]; str_timestamp(aTimestamp, sizeof(aTimestamp)); char aBuf[64]; str_format(aBuf, sizeof(aBuf), "%s_%s_%s.save", pSelf->Server()->GetMapName(), aTimestamp, pSelf->Server()->GetAuthName(pResult->m_ClientID)); IOHANDLE File = pSelf->Storage()->OpenFile(aBuf, IOFLAG_WRITE, IStorage::TYPE_ALL); if(!File) return; int Len = str_length(SavedTeam.GetString()); io_write(File, SavedTeam.GetString(), Len); io_close(File); } void CGameContext::ConDumpAntibot(IConsole::IResult *pResult, void *pUserData) { CGameContext *pSelf = (CGameContext *)pUserData; pSelf->Antibot()->Dump(); }