etqw-sdk/source/game/rules/AdminSystem.cpp

1926 lines
61 KiB
C++

// Copyright (C) 2007 Id Software, Inc.
//
#include "../precompiled.h"
#pragma hdrstop
#if defined( _DEBUG ) && !defined( ID_REDIRECT_NEWDELETE )
#define new DEBUG_NEW
#undef THIS_FILE
static char THIS_FILE[] = __FILE__;
#endif
#include "AdminSystem.h"
#include "../Player.h"
#include "../../idlib/PropertiesImpl.h"
#include "../guis/UIList.h"
#include "GameRules.h"
#include "GameRules_Campaign.h"
#include "GameRules_Objective.h"
#include "GameRules_StopWatch.h"
#include "../proficiency/StatsTracker.h"
#include "../botai/Bot.h"
#include "../botai/BotThreadData.h"
/*
===============================================================================
sdAdminSystemCommand
===============================================================================
*/
/*
============
sdAdminSystemCommand::CommandCompletion
============
*/
void sdAdminSystemCommand::CommandCompletion( const idCmdArgs& args, argCompletionCallback_t callback ) const {
}
/*
============
sdAdminSystemCommand::Print
============
*/
void sdAdminSystemCommand::Print( idPlayer* player, const char* locStr, const idWStrList& list ) const {
if ( player != NULL ) {
player->SendLocalisedMessage( declHolder.declLocStrType[ locStr ], list );
} else {
gameLocal.Printf( va( "%ls\n", common->LocalizeText( locStr, list ).c_str() ) );
}
}
/*
===============================================================================
sdAdminSystemCommand_Kick
===============================================================================
*/
/*
============
sdAdminSystemCommand_Kick::PerformCommand
============
*/
bool sdAdminSystemCommand_Kick::PerformCommand( const idCmdArgs& cmd, const sdUserGroup& userGroup, idPlayer* player ) const {
if ( !userGroup.HasPermission( PF_ADMIN_KICK ) ) {
Print( player, "guis/admin/system/nopermkickplayer" );
return false;
}
const char* clientName = cmd.Argv( 2 );
idPlayer* kickPlayer = gameLocal.GetClientByName( clientName );
if ( !kickPlayer ) {
gameLocal.Printf( "Client '%s' not found\n", clientName );
return false;
}
const sdUserGroup& kickGroup = sdUserGroupManager::GetInstance().GetGroup( kickPlayer->GetUserGroup() );
if ( kickGroup.HasPermission( PF_NO_BAN ) || gameLocal.IsLocalPlayer( kickPlayer ) ) {
Print( player, "guis/admin/system/cannotkickplayer" );
return false;
}
clientNetworkAddress_t netAddr;
networkSystem->ServerGetClientNetworkInfo( kickPlayer->entityNumber, netAddr );
clientGUIDLookup_t lookup;
lookup.ip = *( ( int* )netAddr.ip );
lookup.pbid = 0;
lookup.name = kickPlayer->userInfo.rawName;
if ( networkService->GetDedicatedServerState() == sdNetService::DS_ONLINE ) {
networkSystem->ServerGetClientNetId( kickPlayer->entityNumber, lookup.clientId );
}
sdPlayerStatEntry* stat = sdGlobalStatsTracker::GetInstance().GetStat( sdGlobalStatsTracker::GetInstance().AllocStat( "times_kicked", sdNetStatKeyValue::SVT_INT ) );
stat->IncreaseValue( kickPlayer->entityNumber, 1 );
gameLocal.guidFile.BanUser( lookup, ( g_kickBanLength.GetFloat() * 60 ) );
networkSystem->ServerKickClient( kickPlayer->entityNumber, "engine/disconnect/kicked", true );
return true;
}
/*
============
sdAdminSystemCommand_Kick::CommandCompletion
============
*/
void sdAdminSystemCommand_Kick::CommandCompletion( const idCmdArgs& args, argCompletionCallback_t callback ) const {
for ( int i = 0; i < MAX_CLIENTS; i++ ) {
idPlayer* player = gameLocal.GetClient( i );
if ( !player ) {
continue;
}
callback( va( "%s %s \"%s\"", args.Argv( 0 ), args.Argv( 1 ), player->userInfo.cleanName.c_str() ) );
}
}
/*
===============================================================================
sdAdminSystemCommand_KickAllBots
===============================================================================
*/
/*
============
sdAdminSystemCommand_KickAllBots::PerformCommand
============
*/
bool sdAdminSystemCommand_KickAllBots::PerformCommand( const idCmdArgs& cmd, const sdUserGroup& userGroup, idPlayer* player ) const {
if ( !userGroup.HasPermission( PF_ADMIN_KICK ) ) {
Print( player, "guis/admin/system/nopermkickplayer" );
return false;
}
int count = DoKick();
if ( count > 0 ) {
gameLocal.Printf( "Server kicked %i bot(s)\n", count );
return true;
}
gameLocal.Printf( "There are no bots on the server to kick!\n" );
return false;
}
/*
============
sdAdminSystemCommand_KickAllBots::DoKick
============
*/
int sdAdminSystemCommand_KickAllBots::DoKick( void ) {
int count = 0;
for ( int i = 0; i < MAX_CLIENTS; i++ ) {
idPlayer* player = gameLocal.GetClient ( i );
if ( player == NULL ) {
continue;
}
if ( player->IsType( idBot::Type ) ) {
networkSystem->ServerKickClient( i, "engine/disconnect/kicked", true );
count++;
}
}
return count;
}
/*
===============================================================================
sdAdminSystemOnOffCommand
===============================================================================
*/
/*
============
sdAdminSystemOnOffCommand::PerformCommand
============
*/
bool sdAdminSystemOnOffCommand::PerformCommand( const idCmdArgs& cmd, const sdUserGroup& userGroup, idPlayer* player ) const {
if ( !userGroup.HasPermission( GetRequiredPersmission() ) ) {
Print( player, GetPermissionFailedMessage() );
return false;
}
const char* value = cmd.Argv( 2 );
if ( !*value ) {
Print( player, "guis/admin/system/specifyonoff" );
return false;
}
if ( !idStr::Icmp( value, "on" ) ) {
OnCompleted( player, true );
return true;
}
if ( !idStr::Icmp( value, "off" ) ) {
OnCompleted( player, false );
return true;
}
Print( player, "guis/admin/system/specifyonoff" );
return false;
}
/*
===============================================================================
sdAdminSystemCommand_SetTimeLimit
===============================================================================
*/
/*
============
sdAdminSystemCommand_SetTimeLimit::PerformCommand
============
*/
bool sdAdminSystemCommand_SetTimeLimit::PerformCommand( const idCmdArgs& cmd, const sdUserGroup& userGroup, idPlayer* player ) const {
if ( !userGroup.HasPermission( PF_ADMIN_SET_TIMELIMIT ) ) {
Print( player, "guis/admin/system/nopermsettimelimit" );
return false;
}
int time;
if ( !sdProperties::sdFromString( time, cmd.Argv( 2 ) ) ) {
Print( player, "guis/admin/system/specifytime" );
return false;
}
if ( time < 0 ) {
time = 0;
}
si_timeLimit.SetInteger( time );
return true;
}
/*
============
sdAdminSystemCommand_SetTimeLimit::CommandCompletion
============
*/
void sdAdminSystemCommand_SetTimeLimit::CommandCompletion( const idCmdArgs& args, argCompletionCallback_t callback ) const {
int values[] = { 5, 10, 15, 20, 25, 30 };
int count = _arraycount( values );
for ( int i = 0; i < count; i++ ) {
callback( va( "%s %s %d", args.Argv( 0 ), args.Argv( 1 ), values[ i ] ) );
}
}
/*
===============================================================================
sdAdminSystemCommand_Login
===============================================================================
*/
/*
============
sdAdminSystemCommand_Login::PerformCommand
============
*/
bool sdAdminSystemCommand_Login::PerformCommand( const idCmdArgs& cmd, const sdUserGroup& userGroup, idPlayer* player ) const {
if ( player == NULL ) {
player = gameLocal.GetLocalPlayer();
}
if ( player == NULL ) {
gameLocal.Printf( "Server Cannot Log In\n" );
return false;
}
return sdUserGroupManager::GetInstance().Login( player, cmd.Argv( 2 ) );
}
/*
===============================================================================
sdAdminSystemCommand_Ban
===============================================================================
*/
/*
============
sdAdminSystemCommand_Ban::PerformCommand
============
*/
bool sdAdminSystemCommand_Ban::PerformCommand( const idCmdArgs& cmd, const sdUserGroup& userGroup, idPlayer* player ) const {
if ( !userGroup.HasPermission( PF_ADMIN_BAN ) ) {
Print( player, "guis/admin/system/cannotban" );
return false;
}
const char* playerName = cmd.Argv( 2 );
idPlayer* banPlayer = gameLocal.GetClientByName( playerName );
if ( !banPlayer ) {
idWStrList list( 1 );
list.Append( va( L"%hs", playerName ) );
Print( player, "guis/admin/system/cannotfindplayer", list );
return false;
}
if( banPlayer->IsType( idBot::Type ) ) {
Print( player, "guis/admin/system/cannotbanplayer" );
return false;
}
const sdUserGroup& banGroup = sdUserGroupManager::GetInstance().GetGroup( banPlayer->GetUserGroup() );
if ( banGroup.HasPermission( PF_NO_BAN ) || gameLocal.IsLocalPlayer( banPlayer ) ) {
Print( player, "guis/admin/system/cannotbanplayer" );
return false;
}
int length;
if ( cmd.Argc() >= 4 ) {
sdProperties::sdFromString( length, cmd.Argv( 3 ) );
length *= 60;
} else {
length = -1;
}
clientNetworkAddress_t netAddr;
networkSystem->ServerGetClientNetworkInfo( banPlayer->entityNumber, netAddr );
clientGUIDLookup_t lookup;
lookup.ip = *( ( int* )netAddr.ip );
lookup.pbid = 0;
lookup.name = banPlayer->userInfo.rawName;
if ( networkService->GetDedicatedServerState() == sdNetService::DS_ONLINE ) {
networkSystem->ServerGetClientNetId( banPlayer->entityNumber, lookup.clientId );
}
sdPlayerStatEntry* stat = sdGlobalStatsTracker::GetInstance().GetStat( sdGlobalStatsTracker::GetInstance().AllocStat( "times_banned", sdNetStatKeyValue::SVT_INT ) );
stat->IncreaseValue( banPlayer->entityNumber, 1 );
gameLocal.guidFile.BanUser( lookup, length );
networkSystem->ServerKickClient( banPlayer->entityNumber, "engine/disconnect/banned", true );
return true;
}
/*
============
sdAdminSystemCommand_Ban::CommandCompletion
============
*/
void sdAdminSystemCommand_Ban::CommandCompletion( const idCmdArgs& args, argCompletionCallback_t callback ) const {
const char* clientName = args.Argv( 2 );
int len = idStr::Length( clientName );
for ( int i = 0; i < MAX_CLIENTS; i++ ) {
idPlayer* player = gameLocal.GetClient( i );
if ( !player ) {
continue;
}
callback( va( "%s %s \"%s\"", args.Argv( 0 ), args.Argv( 1 ), player->userInfo.cleanName.c_str() ) );
}
}
/*
===============================================================================
sdAdminSystemCommand_ListBans
===============================================================================
*/
/*
============
sdAdminSystemCommand_ListBans::PerformCommand
============
*/
bool sdAdminSystemCommand_ListBans::PerformCommand( const idCmdArgs& cmd, const sdUserGroup& userGroup, idPlayer* player ) const {
if ( !userGroup.HasPermission( PF_ADMIN_BAN ) ) {
Print( player, "guis/admin/system/cannotban" );
return false;
}
gameLocal.StartSendingBanList( player );
return true;
}
/*
===============================================================================
sdAdminSystemCommand_UnBan
===============================================================================
*/
/*
============
sdAdminSystemCommand_UnBan::PerformCommand
============
*/
bool sdAdminSystemCommand_UnBan::PerformCommand( const idCmdArgs& cmd, const sdUserGroup& userGroup, idPlayer* player ) const {
if ( !userGroup.HasPermission( PF_ADMIN_BAN ) ) {
Print( player, "guis/admin/system/cannotban" );
return false;
}
int banIndex = atoi( cmd.Argv( 2 ) );
gameLocal.guidFile.UnBan( banIndex );
return true;
}
/*
===============================================================================
sdAdminSystemCommand_SetTeam
===============================================================================
*/
/*
============
sdAdminSystemCommand_SetTeam::PerformCommand
============
*/
bool sdAdminSystemCommand_SetTeam::PerformCommand( const idCmdArgs& cmd, const sdUserGroup& userGroup, idPlayer* player ) const {
if ( !userGroup.HasPermission( PF_ADMIN_SETTEAM ) ) {
Print( player, "guis/admin/system/nopermsetnumteamplayers" );
return false;
}
const char* playerName = cmd.Argv( 2 );
idPlayer* otherPlayer = gameLocal.GetClientByName( playerName );
if ( !otherPlayer ) {
idWStrList list( 1 );
list.Append( va( L"%hs", playerName ) );
Print( player, "guis/admin/system/cannotfindplayer", list );
return false;
}
int teamIndex = sdGameRules::TeamIndexForName( cmd.Argv( 3 ) );
if ( teamIndex == -1 ) {
idWStrList list( 1 );
list.Append( va( L"%hs", cmd.Argv( 3 ) ) );
Print( player, "guis/admin/system/cannotfindteam", list );
return false;
}
idWStrList list( 1 );
list.Append( va( L"%hs", player ? player->userInfo.cleanName.c_str() : "the server" ) );
Print( otherPlayer, "guis/admin/system/forcedchangeteam", list );
gameLocal.rules->SetClientTeam( otherPlayer, teamIndex, true, "" );
return true;
}
/*
============
sdAdminSystemCommand_SetTeam::CommandCompletion
============
*/
void sdAdminSystemCommand_SetTeam::CommandCompletion( const idCmdArgs& args, argCompletionCallback_t callback ) const {
const char* clientName = args.Argv( 2 );
sdTeamManagerLocal& teamManager = sdTeamManager::GetInstance();
int len = idStr::Length( clientName );
for ( int i = 0; i < MAX_CLIENTS; i++ ) {
idPlayer* player = gameLocal.GetClient( i );
if ( !player ) {
continue;
}
if ( idStr::Icmp( player->userInfo.cleanName, clientName ) ) {
callback( va( "%s %s \"%s\" \"%s\"", args.Argv( 0 ), args.Argv( 1 ), player->userInfo.cleanName.c_str(), "spectator" ) );
for ( int j = 0; j < teamManager.GetNumTeams(); j++ ) {
sdTeamInfo& team = teamManager.GetTeamByIndex( j );
callback( va( "%s %s \"%s\" \"%s\"", args.Argv( 0 ), args.Argv( 1 ), player->userInfo.cleanName.c_str(), team.GetLookupName() ) );
}
}
callback( va( "%s %s \"%s\"", args.Argv( 0 ), args.Argv( 1 ), player->userInfo.cleanName.c_str() ) );
}
}
/*
===============================================================================
sdAdminSystemCommand_SetCampaign
===============================================================================
*/
/*
============
sdAdminSystemCommand_SetCampaign::PerformCommand
============
*/
bool sdAdminSystemCommand_SetCampaign::PerformCommand( const idCmdArgs& cmd, const sdUserGroup& userGroup, idPlayer* player ) const {
if ( !userGroup.HasPermission( PF_ADMIN_CHANGE_CAMPAIGN ) ) {
Print( player, "guis/admin/system/nopermchangecampaign" );
return false;
}
const char* campaignName = cmd.Argv( 2 );
const metaDataContext_t* metaData = gameLocal.campaignMetaDataList->FindMetaDataContext( campaignName );
if ( metaData == NULL || !gameLocal.IsMetaDataValidForPlay( *metaData, false ) ) {
idWStrList list( 1 );
list.Append( va( L"%hs", campaignName ) );
Print( player, "guis/admin/system/notfoundcampaign", list );
return false;
}
sdAdminSystemCommand_KickAllBots::DoKick();
cmdSystem->BufferCommandText( CMD_EXEC_APPEND, "set si_rules sdGameRulesCampaign\n" );
cmdSystem->BufferCommandText( CMD_EXEC_APPEND, va( "spawnServer %s\n", campaignName ) );
return true;
}
/*
============
sdAdminSystemCommand_SetCampaign::CommandCompletion
============
*/
void sdAdminSystemCommand_SetCampaign::CommandCompletion( const idCmdArgs& args, argCompletionCallback_t callback ) const {
const char* cmd = args.Argv( 2 );
int len = idStr::Length( cmd );
int num = gameLocal.campaignMetaDataList->GetNumMetaData();
for ( int i = 0; i < num; i++ ) {
const metaDataContext_t& metaData = gameLocal.campaignMetaDataList->GetMetaDataContext( i );
if ( !gameLocal.IsMetaDataValidForPlay( metaData, false ) ) {
continue;
}
const idDict& meta = *metaData.meta;
const char* metaName = meta.GetString( "metadata_name" );
if ( idStr::Icmpn( metaName, cmd, len ) ) {
continue;
}
callback( va( "%s %s %s", args.Argv( 0 ), args.Argv( 1 ), metaName ) );
}
}
/*
===============================================================================
sdAdminSystemCommand_SetObjectiveMap
===============================================================================
*/
/*
============
sdAdminSystemCommand_SetObjectiveMap::PerformCommand
============
*/
bool sdAdminSystemCommand_SetObjectiveMap::PerformCommand( const idCmdArgs& cmd, const sdUserGroup& userGroup, idPlayer* player ) const {
if ( !userGroup.HasPermission( PF_ADMIN_CHANGE_MAP ) ) {
Print( player, "guis/admin/system/nopermchangemap" );
return false;
}
sdAdminSystemCommand_KickAllBots::DoKick();
idStr mapName = cmd.Argv( 2 );
sdGameRules_SingleMapHelper::SanitizeMapName( mapName, false );
#if defined( SD_PUBLIC_BUILD )
const metaDataContext_t* metaData = gameLocal.mapMetaDataList->FindMetaDataContext( mapName.c_str() );
if ( metaData == NULL || !gameLocal.IsMetaDataValidForPlay( *metaData, false ) ) {
Print( player, "guis/admin/system/cannotchangethatmap" );
return false;
}
#endif // SD_PUBLIC_BUILD
cmdSystem->BufferCommandText( CMD_EXEC_APPEND, "set si_rules sdGameRulesObjective\n" );
cmdSystem->BufferCommandText( CMD_EXEC_APPEND, va( "spawnServer %s\n", mapName.c_str() ) );
return true;
}
/*
============
sdAdminSystemCommand_SetObjectiveMap::CommandCompletion
============
*/
void sdAdminSystemCommand_SetObjectiveMap::CommandCompletion( const idCmdArgs& args, argCompletionCallback_t callback ) const {
}
/*
===============================================================================
sdAdminSystemCommand_SetStopWatchMap
===============================================================================
*/
/*
============
sdAdminSystemCommand_SetStopWatchMap::PerformCommand
============
*/
bool sdAdminSystemCommand_SetStopWatchMap::PerformCommand( const idCmdArgs& cmd, const sdUserGroup& userGroup, idPlayer* player ) const {
if ( !userGroup.HasPermission( PF_ADMIN_CHANGE_MAP ) ) {
Print( player, "guis/admin/system/nopermchangemap" );
return false;
}
sdAdminSystemCommand_KickAllBots::DoKick();
idStr mapName = cmd.Argv( 2 );
sdGameRules_SingleMapHelper::SanitizeMapName( mapName, false );
#if defined( SD_PUBLIC_BUILD )
const metaDataContext_t* metaData = gameLocal.mapMetaDataList->FindMetaDataContext( mapName.c_str() );
if ( metaData == NULL || !gameLocal.IsMetaDataValidForPlay( *metaData, false ) ) {
Print( player, "guis/admin/system/cannotchangethatmap" );
return false;
}
#endif // SD_PUBLIC_BUILD
cmdSystem->BufferCommandText( CMD_EXEC_APPEND, "set si_rules sdGameRulesStopWatch\n" );
cmdSystem->BufferCommandText( CMD_EXEC_APPEND, va( "spawnServer %s\n", mapName.c_str() ) );
return true;
}
/*
============
sdAdminSystemCommand_SetStopWatchMap::CommandCompletion
============
*/
void sdAdminSystemCommand_SetStopWatchMap::CommandCompletion( const idCmdArgs& args, argCompletionCallback_t callback ) const {
}
/*
===============================================================================
sdAdminSystemCommand_GlobalMute
===============================================================================
*/
/*
============
sdAdminSystemCommand_GlobalMute::PerformCommand
============
*/
bool sdAdminSystemCommand_GlobalMute::PerformCommand( const idCmdArgs& cmd, const sdUserGroup& userGroup, idPlayer* player ) const {
if ( !userGroup.HasPermission( PF_ADMIN_GLOBAL_MUTE ) ) {
Print( player, "guis/admin/system/nopermglobalchatmute" );
return false;
}
const char* value = cmd.Argv( 2 );
if ( !*value ) {
Print( player, "guis/admin/system/specifyonoff" );
return false;
}
if ( !idStr::Icmp( value, "on" ) ) {
si_disableGlobalChat.SetBool( true );
return true;
}
if ( !idStr::Icmp( value, "off" ) ) {
si_disableGlobalChat.SetBool( false );
return true;
}
idWStrList list( 1 ); list.Append( va( L"%hs", value ) );
Print( player, "guis/admin/system/unknownmutemode" );
return false;
}
/*
============
sdAdminSystemCommand_GlobalMute::CommandCompletion
============
*/
void sdAdminSystemCommand_GlobalMute::CommandCompletion( const idCmdArgs& args, argCompletionCallback_t callback ) const {
callback( va( "%s %s on", args.Argv( 0 ), args.Argv( 1 ) ) );
callback( va( "%s %s off", args.Argv( 0 ), args.Argv( 1 ) ) );
}
/*
===============================================================================
sdAdminSystemCommand_GlobalVOIPMute
===============================================================================
*/
/*
============
sdAdminSystemCommand_GlobalVOIPMute::PerformCommand
============
*/
bool sdAdminSystemCommand_GlobalVOIPMute::PerformCommand( const idCmdArgs& cmd, const sdUserGroup& userGroup, idPlayer* player ) const {
if ( !userGroup.HasPermission( PF_ADMIN_GLOBAL_MUTE_VOIP ) ) {
Print( player, "guis/admin/system/nopermchangeglobalvoipmute" );
return false;
}
const char* value = cmd.Argv( 2 );
if ( !*value ) {
Print( player, "guis/admin/system/specifyonoff" );
return false;
}
if ( !idStr::Icmp( value, "on" ) ) {
g_disableGlobalAudio.SetBool( true );
return true;
}
if ( !idStr::Icmp( value, "off" ) ) {
g_disableGlobalAudio.SetBool( false );
return true;
}
idWStrList list( 1 );
list.Append( va( L"%hs", value ) );
Print( player, "guis/admin/system/unknownmutemode", list );
return false;
}
/*
============
sdAdminSystemCommand_GlobalVOIPMute::CommandCompletion
============
*/
void sdAdminSystemCommand_GlobalVOIPMute::CommandCompletion( const idCmdArgs& args, argCompletionCallback_t callback ) const {
callback( va( "%s %s on", args.Argv( 0 ), args.Argv( 1 ) ) );
callback( va( "%s %s off", args.Argv( 0 ), args.Argv( 1 ) ) );
}
/*
===============================================================================
sdAdminSystemCommand_PlayerMute
===============================================================================
*/
/*
============
sdAdminSystemCommand_PlayerMute::PerformCommand
============
*/
bool sdAdminSystemCommand_PlayerMute::PerformCommand( const idCmdArgs& cmd, const sdUserGroup& userGroup, idPlayer* player ) const {
if ( !userGroup.HasPermission( PF_ADMIN_PLAYER_MUTE ) ) {
Print( player, "guis/admin/system/nopermchangeplayermute" );
return false;
}
const char* playerName = cmd.Argv( 2 );
idPlayer* mutePlayer = gameLocal.GetClientByName( playerName );
if ( !mutePlayer ) {
idWStrList list( 1 );
list.Append( va( L"%hs", playerName ) );
Print( player, "guis/admin/system/cannotfindplayer", list );
return false;
}
const char* value = cmd.Argv( 3 );
if ( !*value ) {
Print( player, "guis/admin/system/specifyonoff" );
return false;
}
if ( !idStr::Icmp( value, "on" ) ) {
const sdUserGroup& muteGroup = sdUserGroupManager::GetInstance().GetGroup( mutePlayer->GetUserGroup() );
if ( muteGroup.HasPermission( PF_NO_MUTE ) || gameLocal.IsLocalPlayer( mutePlayer ) ) {
Print( player, "guis/admin/system/cannotmuteplayer" );
return false;
}
Print( mutePlayer, "rules/messages/textmuted", idWStrList() );
gameLocal.rules->Mute( mutePlayer, MF_CHAT );
return true;
}
if ( !idStr::Icmp( value, "off" ) ) {
Print( mutePlayer, "rules/messages/textunmuted", idWStrList() );
gameLocal.rules->UnMute( mutePlayer, MF_CHAT );
return true;
}
idWStrList list( 1 );
list.Append( va( L"%hs", value ) );
Print( player, "guis/admin/system/unknownmutemode", list );
return false;
}
/*
============
sdAdminSystemCommand_PlayerMute::CommandCompletion
============
*/
void sdAdminSystemCommand_PlayerMute::CommandCompletion( const idCmdArgs& args, argCompletionCallback_t callback ) const {
const char* name = args.Argv( 2 );
for ( int i = 0; i < MAX_CLIENTS; i++ ) {
idPlayer* player = gameLocal.GetClient( i );
if ( !player ) {
continue;
}
callback( va( "%s %s \"%s\"", args.Argv( 0 ), args.Argv( 1 ), player->userInfo.cleanName.c_str() ) );
if ( idStr::Icmp( name, player->userInfo.cleanName ) ) {
continue;
}
callback( va( "%s %s \"%s\" on", args.Argv( 0 ), args.Argv( 1 ), player->userInfo.cleanName.c_str() ) );
callback( va( "%s %s \"%s\" off", args.Argv( 0 ), args.Argv( 1 ), player->userInfo.cleanName.c_str() ) );
}
}
/*
===============================================================================
sdAdminSystemCommand_PlayerVOIPMute
===============================================================================
*/
/*
============
sdAdminSystemCommand_PlayerVOIPMute::PerformCommand
============
*/
bool sdAdminSystemCommand_PlayerVOIPMute::PerformCommand( const idCmdArgs& cmd, const sdUserGroup& userGroup, idPlayer* player ) const {
if ( !userGroup.HasPermission( PF_ADMIN_PLAYER_MUTE_VOIP ) ) {
Print( player, "guis/admin/system/nopermchangeplayervoip" );
return false;
}
const char* playerName = cmd.Argv( 2 );
idPlayer* mutePlayer = gameLocal.GetClientByName( playerName );
if ( !mutePlayer ) {
idWStrList list( 1 ); list.Append( va( L"%hs", playerName ) );
Print( player, "guis/admin/system/cannotfindplayer", list );
return false;
}
const char* value = cmd.Argv( 3 );
if ( !*value ) {
Print( player, "guis/admin/system/specifyonoff" );
return false;
}
if ( !idStr::Icmp( value, "on" ) ) {
const sdUserGroup& muteGroup = sdUserGroupManager::GetInstance().GetGroup( mutePlayer->GetUserGroup() );
if ( muteGroup.HasPermission( PF_NO_MUTE_VOIP ) || gameLocal.IsLocalPlayer( mutePlayer ) ) {
Print( player, "guis/admin/system/cannotmuteplayer" );
return false;
}
Print( mutePlayer, "rules/messages/voipmuted", idWStrList() );
gameLocal.rules->Mute( mutePlayer, MF_AUDIO );
return true;
}
if ( !idStr::Icmp( value, "off" ) ) {
Print( mutePlayer, "rules/messages/voipunmuted", idWStrList() );
gameLocal.rules->UnMute( mutePlayer, MF_AUDIO );
return true;
}
idWStrList list( 1 );
list.Append( va( L"%hs", value ) );
Print( player, "guis/admin/system/unknownmutemode", list );
return false;
}
/*
============
sdAdminSystemCommand_PlayerMute::CommandCompletion
============
*/
void sdAdminSystemCommand_PlayerVOIPMute::CommandCompletion( const idCmdArgs& args, argCompletionCallback_t callback ) const {
const char* name = args.Argv( 2 );
for ( int i = 0; i < MAX_CLIENTS; i++ ) {
idPlayer* player = gameLocal.GetClient( i );
if ( !player ) {
continue;
}
callback( va( "%s %s \"%s\"", args.Argv( 0 ), args.Argv( 1 ), player->userInfo.cleanName.c_str() ) );
if ( idStr::Icmp( name, player->userInfo.cleanName ) != 0 ) {
continue;
}
callback( va( "%s %s \"%s\" on", args.Argv( 0 ), args.Argv( 1 ), player->userInfo.cleanName.c_str() ) );
callback( va( "%s %s \"%s\" off", args.Argv( 0 ), args.Argv( 1 ), player->userInfo.cleanName.c_str() ) );
}
}
/*
===============================================================================
sdAdminSystemCommand_Warn
===============================================================================
*/
/*
============
sdAdminSystemCommand_Warn::PerformCommand
============
*/
bool sdAdminSystemCommand_Warn::PerformCommand( const idCmdArgs& cmd, const sdUserGroup& userGroup, idPlayer* player ) const {
if ( !userGroup.HasPermission( PF_ADMIN_WARN ) ) {
Print( player, "guis/admin/system/nopermwarn" );
return false;
}
const char* playerName = cmd.Argv( 2 );
idPlayer* warnPlayer = gameLocal.GetClientByName( playerName );
if ( !warnPlayer ) {
idWStrList list( 1 );
list.Append( va( L"%hs", playerName ) );
Print( player, "guis/admin/system/cannotfindplayer", list );
return false;
}
const sdUserGroup& warnUserGroup = sdUserGroupManager::GetInstance().GetGroup( warnPlayer->GetUserGroup() );
if ( warnUserGroup.HasPermission( PF_NO_WARN ) || gameLocal.IsLocalPlayer( warnPlayer ) ) {
Print( player, "guis/admin/system/cannotwarnplayer" );
return false;
}
gameLocal.rules->Warn( warnPlayer );
return true;
}
/*
============
sdAdminSystemCommand_Warn::CommandCompletion
============
*/
void sdAdminSystemCommand_Warn::CommandCompletion( const idCmdArgs& args, argCompletionCallback_t callback ) const {
for ( int i = 0; i < MAX_CLIENTS; i++ ) {
idPlayer* player = gameLocal.GetClient( i );
if ( !player ) {
continue;
}
callback( va( "%s %s \"%s\"", args.Argv( 0 ), args.Argv( 1 ), player->userInfo.cleanName.c_str() ) );
}
}
/*
===============================================================================
sdAdminSystemCommand_RestartMap
===============================================================================
*/
/*
============
sdAdminSystemCommand_RestartMap::PerformCommand
============
*/
bool sdAdminSystemCommand_RestartMap::PerformCommand( const idCmdArgs& cmd, const sdUserGroup& userGroup, idPlayer* player ) const {
if ( !userGroup.HasPermission( PF_ADMIN_RESTART_MAP ) ) {
Print( player, "guis/admin/system/nopermrestartmap" );
return false;
}
if ( gameLocal.GameState() != GAMESTATE_ACTIVE ) {
return false;
}
sdProficiencyManager::GetInstance().ResetToBasePoints();
gameLocal.LocalMapRestart();
gameLocal.rules->MapRestart();
return true;
}
/*
============
sdAdminSystemCommand_RestartMap::CommandCompletion
============
*/
void sdAdminSystemCommand_RestartMap::CommandCompletion( const idCmdArgs& args, argCompletionCallback_t callback ) const {
}
/*
===============================================================================
sdAdminSystemCommand_RestartCampaign
===============================================================================
*/
/*
============
sdAdminSystemCommand_RestartCampaign::PerformCommand
============
*/
bool sdAdminSystemCommand_RestartCampaign::PerformCommand( const idCmdArgs& cmd, const sdUserGroup& userGroup, idPlayer* player ) const {
if ( !userGroup.HasPermission( PF_ADMIN_RESTART_CAMPAIGN ) ) {
Print( player, "guis/admin/system/nopermrestartcampaign" );
return false;
}
sdGameRulesCampaign* campaignRules = gameLocal.rules->Cast< sdGameRulesCampaign >();
if ( !campaignRules ) {
Print( player, "guis/admin/system/servernocampaign" );
return false;
}
const sdDeclCampaign* campaignDecl = campaignRules->GetCampaign();
if ( !campaignDecl ) {
Print( player, "guis/admin/system/nocampaignrunning" );
return false;
}
campaignRules->SetCampaign( campaignDecl );
campaignRules->StartMap();
return true;
}
/*
============
sdAdminSystemCommand_RestartCampaign::CommandCompletion
============
*/
void sdAdminSystemCommand_RestartCampaign::CommandCompletion( const idCmdArgs& args, argCompletionCallback_t callback ) const {
}
/*
===============================================================================
sdAdminSystemCommand_ChangeUserGroup
===============================================================================
*/
/*
============
sdAdminSystemCommand_ChangeUserGroup::PerformCommand
============
*/
bool sdAdminSystemCommand_ChangeUserGroup::PerformCommand( const idCmdArgs& cmd, const sdUserGroup& userGroup, idPlayer* player ) const {
const char* playerName = cmd.Argv( 2 );
idPlayer* changePlayer = gameLocal.GetClientByName( playerName );
if ( !changePlayer ) {
idWStrList list( 1 );
list.Append( va( L"%hs", playerName ) );
Print( player, "guis/admin/system/cannotfindplayer", list );
return false;
}
const sdUserGroup& oldGroup = sdUserGroupManager::GetInstance().GetGroup( changePlayer->GetUserGroup() );
if ( !userGroup.CanControl( oldGroup ) ) {
Print( player, "guis/admin/system/cannotchangeplayergroup" );
return false;
}
const char* groupName = cmd.Argv( 3 );
int index = sdUserGroupManager::GetInstance().FindGroup( groupName );
if ( index == -1 ) {
idWStrList list( 1 ); list.Append( va( L"%hs", groupName ) );
Print( player, "guis/admin/system/cannotfindgroup", list );
return false;
}
const sdUserGroup& group = sdUserGroupManager::GetInstance().GetGroup( index );
if ( !userGroup.CanControl( group ) ) {
Print( player, "guis/admin/system/cannotplaceplayergroup" );
return false;
}
changePlayer->SetUserGroup( index );
return true;
}
/*
============
sdAdminSystemCommand_ChangeUserGroup::CommandCompletion
============
*/
void sdAdminSystemCommand_ChangeUserGroup::CommandCompletion( const idCmdArgs& args, argCompletionCallback_t callback ) const {
const char* clientName = args.Argv( 2 );
sdUserGroupManagerLocal& groupManager = sdUserGroupManager::GetInstance();
for ( int i = 0; i < MAX_CLIENTS; i++ ) {
idPlayer* player = gameLocal.GetClient( i );
if ( !player ) {
continue;
}
if ( !idStr::Icmp( clientName, player->userInfo.cleanName ) ) {
for ( int j = 1; j < groupManager.NumGroups(); j++ ) {
callback( va( "%s %s \"%s\" \"%s\"", args.Argv( 0 ), args.Argv( 1 ), player->userInfo.cleanName.c_str(), groupManager.GetGroup( j ).GetName() ) );
}
}
callback( va( "%s %s \"%s\"", args.Argv( 0 ), args.Argv( 1 ), player->userInfo.cleanName.c_str() ) );
}
}
/*
===============================================================================
sdAdminSystemCommand_StartMatch
===============================================================================
*/
/*
============
sdAdminSystemCommand_StartMatch::PerformCommand
============
*/
bool sdAdminSystemCommand_StartMatch::PerformCommand( const idCmdArgs& cmd, const sdUserGroup& userGroup, idPlayer* player ) const {
if ( !userGroup.HasPermission( PF_ADMIN_START_MATCH ) ) {
Print( player, "guis/admin/system/nopermstartmatch" );
return false;
}
gameLocal.rules->AdminStart();
return true;
}
/*
============
sdAdminSystemCommand_StartMatch::CommandCompletion
============
*/
void sdAdminSystemCommand_StartMatch::CommandCompletion( const idCmdArgs& args, argCompletionCallback_t callback ) const {
}
/*
===============================================================================
sdAdminSystemCommand_ExecConfig
===============================================================================
*/
/*
============
sdAdminSystemCommand_ExecConfig::PerformCommand
============
*/
bool sdAdminSystemCommand_ExecConfig::PerformCommand( const idCmdArgs& cmd, const sdUserGroup& userGroup, idPlayer* player ) const {
if ( !userGroup.HasPermission( PF_ADMIN_EXEC_CONFIG ) ) {
Print( player, "guis/admin/system/nopermexecconfig" );
return false;
}
sdUserGroupManagerLocal& groupManager = sdUserGroupManager::GetInstance();
const idDict& configs = groupManager.GetConfigs();
const char* configName = cmd.Argv( 2 );
const idKeyValue* kv = configs.FindKey( configName );
if ( !kv ) {
idWStrList list( 1 ); list.Append( va( L"%hs", configName ) );
Print( player, "guis/admin/system/cannotfindconfig", list );
return false;
}
cmdSystem->BufferCommandText( CMD_EXEC_APPEND, va( "exec %s", kv->GetValue().c_str() ) );
return true;
}
/*
============
sdAdminSystemCommand_ExecConfig::CommandCompletion
============
*/
void sdAdminSystemCommand_ExecConfig::CommandCompletion( const idCmdArgs& args, argCompletionCallback_t callback ) const {
sdUserGroupManagerLocal& groupManager = sdUserGroupManager::GetInstance();
const idDict& configs = groupManager.GetConfigs();
int count = configs.GetNumKeyVals();
for ( int i = 0; i < count; i++ ) {
const idKeyValue* kv = configs.GetKeyVal( i );
callback( va( "%s %s %s", args.Argv( 0 ), args.Argv( 1 ), kv->GetKey().c_str() ) );
}
}
/*
===============================================================================
sdAdminSystemCommand_ShuffleTeams
===============================================================================
*/
/*
============
sdAdminSystemCommand_ShuffleTeams::PerformCommand
============
*/
bool sdAdminSystemCommand_ShuffleTeams::PerformCommand( const idCmdArgs& cmd, const sdUserGroup& userGroup, idPlayer* player ) const {
if ( !userGroup.HasPermission( PF_ADMIN_SHUFFLE_TEAMS ) ) {
Print( player, "guis/admin/system/nopermshuffleteams" );
return false;
}
const char* shuffleModeName = cmd.Args( 2 );
if ( !idStr::Icmp( shuffleModeName, "xp" ) ) {
botThreadData.teamsSwapedRecently = true;
gameLocal.rules->ShuffleTeams( sdGameRules::SM_XP );
return true;
} else if ( !idStr::Icmp( shuffleModeName, "random" ) ) {
botThreadData.teamsSwapedRecently = true;
gameLocal.rules->ShuffleTeams( sdGameRules::SM_RANDOM );
return true;
} else if ( !networkSystem->IsRankedServer() && !idStr::Icmp( shuffleModeName, "swap" ) ) {
botThreadData.teamsSwapedRecently = true;
gameLocal.rules->ShuffleTeams( sdGameRules::SM_SWAP );
return true;
}
idWStrList list( 1 );
list.Append( va( L"%hs", shuffleModeName ) );
Print( player, "guis/admin/system/unknownshufflemode", list );
return false;
}
/*
============
sdAdminSystemCommand_ShuffleTeams::CommandCompletion
============
*/
void sdAdminSystemCommand_ShuffleTeams::CommandCompletion( const idCmdArgs& args, argCompletionCallback_t callback ) const {
callback( va( "%s %s xp", args.Argv( 0 ), args.Argv( 1 ) ) );
callback( va( "%s %s random", args.Argv( 0 ), args.Argv( 1 ) ) );
if ( !networkSystem->IsRankedServer() ) {
callback( va( "%s %s swap", args.Argv( 0 ), args.Argv( 1 ) ) );
}
}
/*
============
sdAdminSystemCommand_AddBot::PerformCommand
============
*/
bool sdAdminSystemCommand_AddBot::PerformCommand( const idCmdArgs& cmd, const sdUserGroup& userGroup, idPlayer* player ) const {
if ( !userGroup.HasPermission( PF_ADMIN_ADD_BOT ) ) {
Print( player, "guis/admin/system/nopermaddbot" );
return false;
}
int clientNum;
int botTeam = NOTEAM;
int botClass = MEDIC;
int botGun = -1; // random weapon layout
if ( !bot_enable.GetBool() ) {
gameLocal.Warning( "Can't add bot because bots are disabled on this server!\nSet \"bot_enable\" to 1 to enable them and try again." );
return false;
}
if ( cmd.Argc() > 2 ) {
if ( idStr::Icmp( cmd.Argv( 2 ), "strogg" ) == 0 || idStr::Icmp( cmd.Argv( 2 ), "s" ) == 0 ) {
botTeam = STROGG;
} else if ( idStr::Icmp( cmd.Argv( 2 ), "gdf" ) == 0 || idStr::Icmp( cmd.Argv( 2 ), "g" ) == 0 ) {
botTeam = GDF;
} else {
gameLocal.Warning( "Invalid team value passed to Addbot! ^1Valid values are: gdf, strogg" );
return false;
}
} else {
int numGDF = botThreadData.GetNumClientsOnTeam( GDF );
int numStrogg = botThreadData.GetNumClientsOnTeam( STROGG );
int limitStrogg = bot_uiNumStrogg.GetInteger();
int limitGDF = bot_uiNumGDF.GetInteger();
if ( numGDF > numStrogg && ( limitStrogg == -1 || numStrogg < limitStrogg ) ) {
botTeam = STROGG;
} else if ( numStrogg > numGDF && ( limitGDF == -1 || numGDF < limitGDF ) ) {
botTeam = GDF;
} else {
if( ( limitStrogg == -1 || numStrogg < limitStrogg ) && ( limitGDF == -1 || numGDF < limitGDF ) ) {
botTeam = gameLocal.random.RandomInt( 2 );
} else if( numStrogg < limitStrogg || limitStrogg == -1 ) {
botTeam = STROGG;
} else if( numGDF < limitGDF || limitGDF == -1 ) {
botTeam = GDF;
}
}
}
if( botTeam == NOTEAM ) {
return false;
}
int maxPlayers = si_maxPlayers.GetInteger();
int maxPrivatePlayers = gameLocal.GetMaxPrivateClients();
if ( maxPrivatePlayers > maxPlayers ) {
maxPrivatePlayers = maxPlayers;
}
int maxRegularPlayers = maxPlayers - maxPrivatePlayers;
clientNum = networkSystem->AllocateClientSlotForBot( maxRegularPlayers );
if ( clientNum == -1 ) {
gameLocal.DWarning( "Can't find open client slot for bot - start server with more client slots!\nCheck the value of \"si_maxPlayers\"" );
return false;
}
playerTeamTypes_t team = ( botTeam == 0 ) ? GDF : STROGG;
if ( cmd.Argc() > 3 ) {
const char* className = cmd.Argv( 3 );
if ( idStr::Icmp( className, "medic" ) == 0 || idStr::Icmp( className, "technician" ) == 0 || idStr::Icmp( className, "med" ) == 0 || idStr::Icmp( className, "tech" ) == 0 ) {
botClass = MEDIC;
} else if ( idStr::Icmp( className, "soldier" ) == 0 || idStr::Icmp( className, "aggressor" ) == 0 || idStr::Icmp( className, "sol" ) == 0 || idStr::Icmp( className, "agg" ) == 0 ) {
botClass = SOLDIER;
} else if ( idStr::Icmp( className, "engineer" ) == 0 || idStr::Icmp( className, "constructor" ) == 0 || idStr::Icmp( className, "eng" ) == 0 || idStr::Icmp( className, "con" ) == 0 ) {
botClass = ENGINEER;
} else if ( idStr::Icmp( className, "fieldops" ) == 0 || idStr::Icmp( className, "oppressor" ) == 0 || idStr::Icmp( className, "fop" ) == 0 || idStr::Icmp( className, "opp" ) == 0 ) {
botClass = FIELDOPS;
} else if ( idStr::Icmp( className, "covertops" ) == 0 || idStr::Icmp( className, "infiltrator" ) == 0 || idStr::Icmp( className, "covert" ) == 0 || idStr::Icmp( className, "cov" ) == 0 || idStr::Icmp( className, "inf" ) == 0 ) {
botClass = COVERTOPS;
} else {
gameLocal.Warning( "Invalid class value passed to Addbot! ^1Valid values are: medic, soldier, engineer, fieldops, covertops, technician, aggressor, constructor, oppressor, infiltrator" );
}
} else {
playerClassTypes_t criticalClass;
int numDesiredCriticalClass;
int numDesiredMedicClass;
if ( botTeam == GDF ) {
criticalClass = botThreadData.GetGameWorldState()->botGoalInfo.team_GDF_criticalClass;
numDesiredCriticalClass = ( botThreadData.GetNumClientsOnTeam( GDF ) >= 6 ) ? 3 : 2;
numDesiredMedicClass = ( botThreadData.GetNumClientsOnTeam( GDF ) >= 7 ) ? 2 : 1;
} else {
criticalClass = botThreadData.GetGameWorldState()->botGoalInfo.team_STROGG_criticalClass;
numDesiredCriticalClass = ( botThreadData.GetNumClientsOnTeam( STROGG ) >= 6 ) ? 3 : 2;
numDesiredMedicClass = ( botThreadData.GetNumClientsOnTeam( STROGG ) >= 7 ) ? 2 : 1;
}
int numMedic = botThreadData.GetNumClassOnTeam( team, MEDIC );
int numEng = botThreadData.GetNumClassOnTeam( team, ENGINEER );
int numFOps = botThreadData.GetNumClassOnTeam( team, FIELDOPS );
int numCovert = botThreadData.GetNumClassOnTeam( team, COVERTOPS );
int numSoldier = botThreadData.GetNumClassOnTeam( team, SOLDIER );
int numCritical;
if ( criticalClass != NOCLASS && bot_doObjectives.GetBool() ) {
numCritical = botThreadData.GetNumClassOnTeam( team, criticalClass );
} else {
numCritical = -1;
}
//mal: make sure we always have a couple bots of the critical class first, unless the human wants to do the obj.
if ( numCritical < numDesiredCriticalClass && numCritical != -1 ) {
botClass = criticalClass;
} else if ( numMedic < numDesiredMedicClass ) {
botClass = MEDIC;
} else if ( numSoldier == 0 ) {
botClass = SOLDIER;
} else if ( numEng == 0 ) {
botClass = ENGINEER;
} else if ( numCovert == 0 ) {
botClass = COVERTOPS;
} else if ( numFOps == 0 ) {
botClass = FIELDOPS;
} else {
botClass = gameLocal.random.RandomInt( 5 );
}
}
int maxGuns = 1;
if ( bot_useShotguns.GetBool() ) { //mal: this is mainly for debugging, but may be a popular choice since the shotgun is so range limited.
maxGuns = 2;
if ( botClass == SOLDIER ) {
maxGuns = 4;
} else if ( botClass == FIELDOPS ) {
maxGuns = 1;
}
} else {
if ( botClass == SOLDIER ) {
maxGuns = 3;
} else if ( botClass == COVERTOPS ) {
maxGuns = 2;
}
}
if ( !bot_useSniperWeapons.GetBool() ) {
if ( botClass == COVERTOPS ) {
maxGuns = 1;
}
}
if ( cmd.Argc() > 4 ) {
if ( idStr::Icmp( cmd.Argv( 4 ), "random" ) == 0 ) {
botGun = -1;
} else {
botGun = atoi( cmd.Argv( 4 ) );
if ( botGun < 0 || botGun >= maxGuns ) {
common->Warning( "Weapon value is out of range. Valid values are 'random' or 0-%d", maxGuns-1 );
botGun = -1;
}
}
}
if ( botClass == SOLDIER && botThreadData.GetNumClassOnTeam( team, SOLDIER ) == 0 ) { //mal: if haven't spawned a RL soldier yet, do so now.
botGun = 1;
}
if ( botGun < 0 ) {
botGun = gameLocal.random.RandomInt( maxGuns );
}
idPlayer* newPlayer = gameLocal.GetClient( clientNum );
idStr playerName = newPlayer->userInfo.baseName;
if ( playerName.IsEmpty() ) { //mal: this shouldn't ever happen, but just in case...
const char * basePlayerName = "Bot";
if ( botTeam == GDF ) {
basePlayerName = "GDF Bot";
} else {
basePlayerName = "Strogg Bot";
}
sprintf( playerName, "%s %d", basePlayerName, clientNum );
networkSystem->ServerSetBotUserName( clientNum, playerName );
}
gameLocal.rules->SetClientTeam( newPlayer, botTeam + 1, true, "" );
idBot::Bot_SetClassType( newPlayer, botClass, botGun );
return true;
}
/*
============
sdAdminSystemCommand_AddBot::CommandCompletion
============
*/
void sdAdminSystemCommand_AddBot::CommandCompletion( const idCmdArgs& args, argCompletionCallback_t callback ) const {
if( args.Argc() < 3 ) {
callback( va( "%s %s gdf", args.Argv( 0 ), args.Argv( 1 ) ) );
callback( va( "%s %s strogg", args.Argv( 0 ), args.Argv( 1 ) ) );
return;
}
if( args.Argc() < 4 ) {
if( !idStr::Icmp( args.Argv( 2 ), "gdf" ) ) {
callback( va( "%s %s %s soldier", args.Argv( 0 ), args.Argv( 1 ), args.Argv( 2 ) ) );
callback( va( "%s %s %s medic", args.Argv( 0 ), args.Argv( 1 ), args.Argv( 2 ) ) );
callback( va( "%s %s %s engineer", args.Argv( 0 ), args.Argv( 1 ), args.Argv( 2 ) ) );
callback( va( "%s %s %s fieldops", args.Argv( 0 ), args.Argv( 1 ), args.Argv( 2 ) ) );
callback( va( "%s %s %s covertops", args.Argv( 0 ), args.Argv( 1 ), args.Argv( 2 ) ) );
return;
}
if( !idStr::Icmp( args.Argv( 2 ), "strogg" ) ) {
callback( va( "%s %s %s aggressor", args.Argv( 0 ), args.Argv( 1 ), args.Argv( 2 ) ) );
callback( va( "%s %s %s technician", args.Argv( 0 ), args.Argv( 1 ), args.Argv( 2 ) ) );
callback( va( "%s %s %s constructor", args.Argv( 0 ), args.Argv( 1 ), args.Argv( 2 ) ) );
callback( va( "%s %s %s oppressor", args.Argv( 0 ), args.Argv( 1 ), args.Argv( 2 ) ) );
callback( va( "%s %s %s infiltrator", args.Argv( 0 ), args.Argv( 1 ), args.Argv( 2 ) ) );
return;
}
return;
}
}
/*
============
sdAdminSystemCommand_AdjustBots::PerformCommand
============
*/
bool sdAdminSystemCommand_AdjustBots::PerformCommand( const idCmdArgs& cmd, const sdUserGroup& userGroup, idPlayer* player ) const {
if ( !userGroup.HasPermission( PF_ADMIN_ADJUST_BOTS ) ) {
Print( player, "guis/admin/system/nopermadjustbots" );
return false;
}
if( cmd.Argc() < 4 ) {
return false;
}
if( idStr::Icmp( cmd.Argv( 2 ), "minClients" ) == 0 ) {
int num = atoi( cmd.Argv( 3 ) );
num = Max( -1, num );
num = Min( num, MAX_CLIENTS );
bot_minClients.SetInteger( num );
} else if( idStr::Icmp( cmd.Argv( 2 ), "numStrogg" ) == 0 ) {
int num = atoi( cmd.Argv( 3 ) );
num = Max( -1, num );
num = Min( num, MAX_CLIENTS );
bot_uiNumStrogg.SetInteger( num );
} else if( idStr::Icmp( cmd.Argv( 2 ), "numGDF" ) == 0 ) {
int num = atoi( cmd.Argv( 3 ) );
num = Max( -1, num );
num = Min( num, MAX_CLIENTS );
bot_uiNumGDF.SetInteger( num );
} else if( idStr::Icmp( cmd.Argv( 2 ), "aimSkill" ) == 0 ) {
int num = atoi( cmd.Argv( 3 ) );
num = Max( 0, num );
num = Min( num, 3 );
bot_aimSkill.SetInteger( num );
} else if( idStr::Icmp( cmd.Argv( 2 ), "skill" ) == 0 ) {
int num = atoi( cmd.Argv( 3 ) );
num = Max( 0, num );
num = Min( num, 3 );
bot_skill.SetInteger( num );
} else if( idStr::Icmp( cmd.Argv( 2 ), "uiSkill" ) == 0 ) {
int num = atoi( cmd.Argv( 3 ) );
num = Max( 0, num );
num = Min( num, 4 );
bot_uiSkill.SetInteger( num );
} else if( idStr::Icmp( cmd.Argv( 2 ), "doObjectives" ) == 0 ) {
int value = atoi( cmd.Argv( 3 ) );
bot_doObjectives.SetBool( value != 0 );
}
return true;
}
/*
============
sdAdminSystemCommand_AdjustBots::CommandCompletion
============
*/
void sdAdminSystemCommand_AdjustBots::CommandCompletion( const idCmdArgs& args, argCompletionCallback_t callback ) const {
if( args.Argc() < 3 ) {
callback( va( "%s %s minClients", args.Argv( 0 ), args.Argv( 1 ) ) );
callback( va( "%s %s numStrogg", args.Argv( 0 ), args.Argv( 1 ) ) );
callback( va( "%s %s numGDF", args.Argv( 0 ), args.Argv( 1 ) ) );
callback( va( "%s %s aimSkill", args.Argv( 0 ), args.Argv( 1 ) ) );
callback( va( "%s %s skill", args.Argv( 0 ), args.Argv( 1 ) ) );
callback( va( "%s %s uiSkill", args.Argv( 0 ), args.Argv( 1 ) ) );
callback( va( "%s %s doObjectives", args.Argv( 0 ), args.Argv( 1 ) ) );
return;
}
}
/*
===============================================================================
sdAdminSystemLocal
===============================================================================
*/
/*
============
sdAdminSystemLocal::sdAdminSystemLocal
============
*/
sdAdminSystemLocal::sdAdminSystemLocal( void ) :
commandState( CS_NOCOMMAND ),
commandStateTime( 0 ) {
}
/*
============
sdAdminSystemLocal::sdAdminSystemLocal
============
*/
sdAdminSystemLocal::~sdAdminSystemLocal( void ) {
commands.DeleteContents( true );
}
/*
============
sdAdminSystemLocal::Init
============
*/
void sdAdminSystemLocal::Init( void ) {
commands.PreAllocate( 25 ); // NOTE: if you add more commands increase this number to reflect that
commands.Alloc() = new sdAdminSystemCommand_Kick();
commands.Alloc() = new sdAdminSystemCommand_Login();
commands.Alloc() = new sdAdminSystemCommand_Ban();
commands.Alloc() = new sdAdminSystemCommand_SetTeam();
commands.Alloc() = new sdAdminSystemCommand_KickAllBots();
commands.Alloc() = new sdAdminSystemCommand_SetCampaign();
commands.Alloc() = new sdAdminSystemCommand_SetStopWatchMap();
commands.Alloc() = new sdAdminSystemCommand_SetObjectiveMap();
commands.Alloc() = new sdAdminSystemCommand_GlobalMute();
commands.Alloc() = new sdAdminSystemCommand_GlobalVOIPMute();
commands.Alloc() = new sdAdminSystemCommand_PlayerMute();
commands.Alloc() = new sdAdminSystemCommand_PlayerVOIPMute();
commands.Alloc() = new sdAdminSystemCommand_Warn();
commands.Alloc() = new sdAdminSystemCommand_RestartMap();
commands.Alloc() = new sdAdminSystemCommand_RestartCampaign();
commands.Alloc() = new sdAdminSystemCommand_ChangeUserGroup();
commands.Alloc() = new sdAdminSystemCommand_StartMatch();
commands.Alloc() = new sdAdminSystemCommand_ExecConfig();
commands.Alloc() = new sdAdminSystemCommand_ShuffleTeams();
commands.Alloc() = new sdAdminSystemCommand_AddBot();
commands.Alloc() = new sdAdminSystemCommand_AdjustBots();
commands.Alloc() = new sdAdminSystemCommand_DisableProficiency();
commands.Alloc() = new sdAdminSystemCommand_SetTimeLimit();
commands.Alloc() = new sdAdminSystemCommand_SetTeamDamage();
commands.Alloc() = new sdAdminSystemCommand_SetTeamBalance();
commands.Alloc() = new sdAdminSystemCommand_ListBans();
commands.Alloc() = new sdAdminSystemCommand_UnBan();
properties.RegisterProperties();
}
/*
============
sdAdminSystemLocal::PerformCommand
============
*/
void sdAdminSystemLocal::PerformCommand( const idCmdArgs& cmd, idPlayer* player ) {
assert( idStr::Icmp( "admin", cmd.Argv( 0 ) ) == 0 );
sdUserGroupManagerLocal& groupManager = sdUserGroupManager::GetInstance();
const sdUserGroup& userGroup = player != NULL ? groupManager.GetGroup( player->GetUserGroup() ) : groupManager.GetConsoleGroup();
const char* command = cmd.Argv( 1 );
for ( int i = 0; i < commands.Num(); i++ ) {
if ( idStr::Icmp( command, commands[ i ]->GetName() ) ) {
continue;
}
bool success = true;
if ( networkSystem->IsRankedServer() ) {
if ( !commands[ i ]->AllowedOnRankedServer() ) {
success = false;
}
}
if ( success ) {
success = commands[ i ]->PerformCommand( cmd, userGroup, player );
}
if ( player == NULL || player == gameLocal.GetLocalPlayer() ) {
SetCommandState( success ? CS_SUCCESS : CS_FAILED );
} else {
sdReliableServerMessage msg( GAME_RELIABLE_SMESSAGE_ADMINFEEDBACK );
msg.WriteBool( success );
msg.Send( sdReliableMessageClientInfo( player->entityNumber ) );
}
break;
}
}
/*
============
sdAdminSystemLocal::CommandCompletion
============
*/
void sdAdminSystemLocal::CommandCompletion( const idCmdArgs& args, argCompletionCallback_t callback ) {
sdAdminSystemLocal& admin = sdAdminSystem::GetInstance();
const char* cmd = args.Argv( 1 );
for ( int i = 0; i < admin.commands.Num(); i++ ) {
if ( idStr::Icmp( cmd, admin.commands[ i ]->GetName() ) ) {
continue;
}
if ( networkSystem->IsRankedServer() ) {
if ( !admin.commands[ i ]->AllowedOnRankedServer() ) {
continue;
}
}
admin.commands[ i ]->CommandCompletion( args, callback );
}
int cmdLength = idStr::Length( cmd );
for ( int i = 0; i < admin.commands.Num(); i++ ) {
if ( idStr::Icmpn( cmd, admin.commands[ i ]->GetName(), cmdLength ) ) {
continue;
}
if ( networkSystem->IsRankedServer() ) {
if ( !admin.commands[ i ]->AllowedOnRankedServer() ) {
continue;
}
}
callback( va( "%s %s", args.Argv( 0 ), admin.commands[ i ]->GetName() ) );
}
}
/*
============
sdAdminSystemLocal::CreatePlayerAdminList
============
*/
void sdAdminSystemLocal::CreatePlayerAdminList( sdUIList* list ) {
sdUIList::ClearItems( list );
sdUserGroupManagerLocal& groupManager = sdUserGroupManager::GetInstance();
idWStr cleanPlayerName;
int index = 0;
for ( int i = 0; i < MAX_CLIENTS; i++ ) {
idPlayer* player = gameLocal.GetClient( i );
if ( !player ) {
if( g_debugPlayerList.GetInteger() ) {
sdUIList::InsertItem( list, va( L"Player %i\tuser", i ), index, 0 );
}
continue;
}
const sdUserGroup* userGroup = NULL;
if( ( gameLocal.isServer && gameLocal.IsLocalPlayer( player ) ) || ( !gameLocal.isClient && gameLocal.IsLocalPlayer( player ) ) ) {
userGroup = &groupManager.GetConsoleGroup();
} else {
userGroup = &groupManager.GetGroup( player->GetUserGroup() );
}
cleanPlayerName = va( L"%hs", player->userInfo.cleanName.c_str() );
sdUIList::CleanUserInput( cleanPlayerName );
sdUIList::InsertItem( list, cleanPlayerName.c_str(), index, 0 );
if( userGroup->IsSuperUser() ) {
sdUIList::SetItemText( list, L"<loc = 'guis/admin/superuser'>", index, 1 );
} else {
sdUIList::SetItemText( list, va( L"%hs", userGroup->GetName() ), index, 1 );
}
index++;
}
}
/*
===============================================================================
sdAdminProperties
===============================================================================
*/
/*
============
sdAdminProperties::GetProperty
============
*/
sdProperties::sdProperty* sdAdminProperties::GetProperty( const char* name ) {
return properties.GetProperty( name, sdProperties::PT_INVALID, false );
}
/*
============
sdAdminProperties::GetProperty
============
*/
sdProperties::sdProperty* sdAdminProperties::GetProperty( const char* name, sdProperties::ePropertyType type ) {
sdProperties::sdProperty* prop = properties.GetProperty( name, sdProperties::PT_INVALID, false );
if ( prop && type != sdProperties::PT_INVALID && prop->GetValueType() != type ) {
gameLocal.Error( "sdAdminProperties::GetProperty: type mismatch for property '%s'", name );
}
return prop;
}
/*
============
sdAdminProperties::Update
============
*/
void sdAdminProperties::Update( void ) {
idPlayer* localPlayer = gameLocal.GetLocalPlayer();
if ( localPlayer == NULL ) {
return;
}
sdUserGroupManagerLocal& userGroupManager = sdUserGroupManager::GetInstance();
const sdUserGroup& playerGroup = gameLocal.isClient ? userGroupManager.GetGroup( localPlayer->GetUserGroup() ) : userGroupManager.GetConsoleGroup();
isSuperUser = playerGroup.IsSuperUser() ? 1.0f : 0.0f;
if( isSuperUser != 0.0f ) {
userGroup = superUserString->GetText();
} else {
userGroup = va( L"%hs", playerGroup.GetName() );
}
commandState = sdAdminSystem::GetInstance().GetCommandState();
commandStateTime = sdAdminSystem::GetInstance().GetCommandStateTime();
canLogin = userGroupManager.CanLogin();
canAdjustBots = playerGroup.HasPermission( PF_ADMIN_ADJUST_BOTS ) && !networkSystem->IsRankedServer();
canAddBot = playerGroup.HasPermission( PF_ADMIN_ADD_BOT ) && !networkSystem->IsRankedServer();
canDisableProficiency = playerGroup.HasPermission( PF_ADMIN_DISABLE_PROFICIENCY ) && !networkSystem->IsRankedServer();
canKick = playerGroup.HasPermission( PF_ADMIN_KICK );
canBan = playerGroup.HasPermission( PF_ADMIN_BAN );
canSetTeam = playerGroup.HasPermission( PF_ADMIN_SETTEAM );
canChangeCampaign = playerGroup.HasPermission( PF_ADMIN_CHANGE_CAMPAIGN );
canChangeMap = playerGroup.HasPermission( PF_ADMIN_CHANGE_MAP ) && !networkSystem->IsRankedServer();
canGlobalMute = playerGroup.HasPermission( PF_ADMIN_GLOBAL_MUTE ) && !networkSystem->IsRankedServer();
canGlobalMuteVoip = playerGroup.HasPermission( PF_ADMIN_GLOBAL_MUTE_VOIP );
canPlayerMute = playerGroup.HasPermission( PF_ADMIN_PLAYER_MUTE );
canPlayerMuteVoip = playerGroup.HasPermission( PF_ADMIN_PLAYER_MUTE_VOIP );
canWarn = playerGroup.HasPermission( PF_ADMIN_WARN );
canRestartMap = playerGroup.HasPermission( PF_ADMIN_RESTART_MAP );
canRestartCampaign = playerGroup.HasPermission( PF_ADMIN_RESTART_CAMPAIGN );
canStartMatch = playerGroup.HasPermission( PF_ADMIN_START_MATCH ) && !networkSystem->IsRankedServer();
canExecConfig = playerGroup.HasPermission( PF_ADMIN_EXEC_CONFIG );
canShuffleTeams = playerGroup.HasPermission( PF_ADMIN_SHUFFLE_TEAMS );
canSetTimelimit = playerGroup.HasPermission( PF_ADMIN_SET_TIMELIMIT ) && !networkSystem->IsRankedServer();
canSetTeamDamage = playerGroup.HasPermission( PF_ADMIN_SET_TEAMDAMAGE ) && !networkSystem->IsRankedServer();
canSetTeamBalance = playerGroup.HasPermission( PF_ADMIN_SET_TEAMBALANCE ) && !networkSystem->IsRankedServer();
}
/*
============
sdAdminProperties::RegisterProperties
============
*/
SD_UI_PUSH_CLASS_TAG( sdAdminProperties )
void sdAdminProperties::RegisterProperties( void ) {
properties.RegisterProperty( "userGroup", userGroup );
properties.RegisterProperty( "isSuperUser", isSuperUser );
properties.RegisterProperty( "commandState", commandState );
properties.RegisterProperty( "commandStateTime", commandStateTime );
properties.RegisterProperty( "canLogin", canLogin );
properties.RegisterProperty( "canAddBot", canAddBot );
properties.RegisterProperty( "canAdjustBots", canAdjustBots );
properties.RegisterProperty( "canDisableProficiency", canDisableProficiency );
properties.RegisterProperty( "canKick", canKick );
properties.RegisterProperty( "canBan", canBan );
properties.RegisterProperty( "canSetTeam", canSetTeam );
properties.RegisterProperty( "canChangeCampaign", canChangeCampaign );
properties.RegisterProperty( "canChangeMap", canChangeMap );
properties.RegisterProperty( "canGlobalMute", canGlobalMute );
properties.RegisterProperty( "canGlobalMuteVoip", canGlobalMuteVoip );
properties.RegisterProperty( "canPlayerMute", canPlayerMute );
properties.RegisterProperty( "canPlayerMuteVoip", canPlayerMuteVoip );
properties.RegisterProperty( "canWarn", canWarn );
properties.RegisterProperty( "canRestartMap", canRestartMap );
properties.RegisterProperty( "canRestartCampaign", canRestartCampaign );
properties.RegisterProperty( "canStartMatch", canStartMatch );
properties.RegisterProperty( "canExecConfig", canExecConfig );
properties.RegisterProperty( "canShuffleTeams", canShuffleTeams );
properties.RegisterProperty( "canSetTimelimit", canSetTimelimit );
properties.RegisterProperty( "canSetTeamDamage", canSetTeamDamage );
properties.RegisterProperty( "canSetTeamBalance", canSetTeamBalance );
superUserString = declHolder.declLocStrType.LocalFind( "guis/admin/superuser" );
isSuperUser = 0.0f;
commandState = 0.0f;
commandStateTime = 0.0f;
canLogin = 0.0f;
canAddBot = 0.0f;
canAdjustBots = 0.0f;
canDisableProficiency = 0.0f;
canKick = 0.0f;
canBan = 0.0f;
canSetTeam = 0.0f;
canChangeCampaign = 0.0f;
canChangeMap = 0.0f;
canGlobalMute = 0.0f;
canGlobalMuteVoip = 0.0f;
canPlayerMute = 0.0f;
canPlayerMuteVoip = 0.0f;
canWarn = 0.0f;
canRestartMap = 0.0f;
canRestartCampaign = 0.0f;
canStartMatch = 0.0f;
canExecConfig = 0.0f;
canShuffleTeams = 0.0f;
canSetTimelimit = 0.0f;
canSetTeamDamage = 0.0f;
canSetTeamBalance = 0.0f;
SD_UI_PUSH_GROUP_TAG( "Admin Command State" )
SD_UI_ENUM_TAG( CS_NOCOMMAND, "No command has been issued to the admin system." )
sdDeclGUI::AddDefine( va( "CS_NOCOMMAND %i", sdAdminSystemLocal::CS_NOCOMMAND ) );
SD_UI_ENUM_TAG( CS_SUCCESS, "Admin command succeded." )
sdDeclGUI::AddDefine( va( "CS_SUCCESS %i", sdAdminSystemLocal::CS_SUCCESS ) );
SD_UI_ENUM_TAG( CS_FAILED, "Admin command failed." )
sdDeclGUI::AddDefine( va( "CS_FAILED %i", sdAdminSystemLocal::CS_FAILED ) );
SD_UI_POP_GROUP_TAG
}
SD_UI_POP_CLASS_TAG
/*
============
sdAdminSystemLocal::SetCommandState
============
*/
void sdAdminSystemLocal::SetCommandState( commandState_e state ) {
commandState = state;
commandStateTime = gameLocal.time;
}