AMX Mod X Moderator
Join Date: Feb 2005
Location: NJ, USA
|
01-20-2017
, 21:13
Re: Random admin for CT and T
|
#23
|
Have not thoroughly tested.
Cvars: - ta_tempadmin_flags = Admin flags that all temporary admins get.
- ta_senior_team_flags = When an admin who has these flags joins a team, the temporary admin on that team loses their admin power. When this senior team-level admin disconnects or changes team, a new random temporary admin is selected for that team.
- ta_senior_server_flags = When an admin who has these flags connects to the server, all temp admins (both teams) immediately lose their admin power. When all senior server-level admins have disconnected, a new random temporary is selected on both teams.
To run in test mode, un-comment the #define TESTING line. This enables logging of all activity, bot support, and enables some server_print()'s that I was using for debugging purposes. Please test and let me know if there are any issues.
PHP Code:
#include <amxmodx> #include <cstrike>
new const Version[] = "0.3";
#define TESTING
#if defined TESTING new const szGetPlayersFlags_Team[] = "eh" new const szGetPlayersFlags_NoTeam[] = "h" #else new const szGetPlayersFlags_Team[] = "ceh" new const szGetPlayersFlags_NoTeam[] = "ch" #endif
#define MAX_PLAYERS 32
enum CVars { Cvar_TempAdmin_Flags, Cvar_Senior_Team_Flags, Cvar_Senior_Server_Flags }
enum SeniorAdmins { Team_Level_T = 1, Team_Level_CT, Server_Level }
enum Teams { Team_T = 1, Team_CT, Team_Both }
new g_tAdmins[ Teams ]; new g_tSeniorAdmins[ SeniorAdmins ]; new g_iCurTeam[ MAX_PLAYERS + 1 ] = { 'U' , ... }; new g_pCvar[ CVars ];
public plugin_init() { register_plugin( "Temp Admins" , Version , "bugsy" ); register_event( "TeamInfo" , "TeamInfo" , "a" ); g_pCvar[ Cvar_TempAdmin_Flags ] = register_cvar( "ta_tempadmin_flags" , "bcdefiju" ); g_pCvar[ Cvar_Senior_Team_Flags ] = register_cvar( "ta_senior_team_flags" , "" ); g_pCvar[ Cvar_Senior_Server_Flags ] = register_cvar( "ta_senior_server_flags" , "a" ); #if defined TESTING set_task( 1.0 , "ShowAdmins" , .flags="b" ); #endif }
#if defined TESTING public ShowAdmins() { new iPlayers[ 32 ] , iNum , szHUD[ 256 ] , iPos , szName[ 32 ]; new const szTeams[ Teams ][] = { "", "T", "CT", "" }; get_players( iPlayers , iNum ); iPos = copy( szHUD , charsmax( szHUD ) , "Temporary Admins:^n^n" ); for ( new Teams:tTeam = Team_T ; tTeam <= Team_CT ; tTeam++ ) { for ( new i = 0 ; i < iNum ; i++ ) { if ( g_tAdmins[ tTeam ] & ( 1 << ( iPlayers[ i ] ) ) ) { get_user_name( iPlayers[ i ] , szName , charsmax( szName ) ); iPos += formatex( szHUD[ iPos ] , charsmax( szHUD ) - iPos , "%s - %s^n" , szTeams[ tTeam ] , szName ); } } } set_hudmessage(255, 255, 255, -1.0, 0.20, 0, 1.0, 1.0) show_hudmessage( 0, szHUD) } #endif
public client_authorized( id ) { new szFlags[ 27 ] , iFlags , iPlayerFlags , szName[ 32 ]; get_pcvar_string( g_pCvar[ Cvar_Senior_Server_Flags ] , szFlags , charsmax( szFlags ) ); iFlags = read_flags( szFlags ); iPlayerFlags = get_user_flags( id ); if ( iFlags && ( ( iPlayerFlags & iFlags ) == iFlags ) ) { g_tSeniorAdmins[ Server_Level ] |= ( 1 << ( id & 31 ) ); get_user_name( id , szName , charsmax( szName ) ); client_print( 0 , print_chat , "[RANDOM ADMIN] Server-level senior admin %s has connected!" , szName ); #if defined TESTING server_print( "[RANDOM ADMIN] Server-level senior admin %s has connected!" , szName ); log_to_file( "TemporaryAdmins.log" , "Senior server-level admin %s has connected." , szName ); #endif RemoveTempAdmin( Team_Both ); } }
public client_disconnect( id ) { new szName[ 32 ] , bool:bWasSeniorLevel; //Check if disconnecting player is a senior-level admin. for ( new SeniorAdmins:saLevel = Team_Level_T ; saLevel <= Server_Level ; saLevel++ ) { //Player is a senior level admin if ( g_tSeniorAdmins[ saLevel ] & ( 1 << ( id & 31 ) ) ) { //Set bit to false in senior admin bit-field for this level admin (team/server) g_tSeniorAdmins[ saLevel ] &= ~( 1 << ( id & 31 ) ); bWasSeniorLevel = true; get_user_name( id , szName , charsmax( szName ) ); client_print( 0 , print_chat , "[RANDOM ADMIN] %s senior admin %s has disconnected!" , saLevel == Server_Level ? "Server-level" : "Team-level" , szName ); #if defined TESTING server_print( "[RANDOM ADMIN] %s senior admin %s has disconnected!" , saLevel == Server_Level ? "Server-level" : "Team-level" , szName ); log_to_file( "TemporaryAdmins.log" , "%s senior admin %s has disconnected!" , saLevel == Server_Level ? "Server-level" : "Team-level" , szName ); #endif //If there are no longer server-seniors online. if ( !g_tSeniorAdmins[ Server_Level ] ) { //Check T and CT team so see if there are team-level seniors. for ( new Teams:tTeam = Team_T ; tTeam <= Team_CT ; tTeam++ ) { //If no team level senior on current team and no temp admin on current team, create a temp admin. //server_print( "if ( g_tSeniorAdmins[ SeniorAdmins:tTeam ]==0 [%d] , g_tAdmins[ tTeam ]==0 [%d] ", g_tSeniorAdmins[ SeniorAdmins:tTeam ] , g_tAdmins[ tTeam ] ) if ( !g_tSeniorAdmins[ SeniorAdmins:tTeam ] && !g_tAdmins[ tTeam ] ) { SetRandomAdmin( id , tTeam ); } } } break; } } if ( bWasSeniorLevel == false ) { for ( new Teams:tTeam = Team_T ; tTeam <= Team_CT ; tTeam++ ) { if ( g_tAdmins[ tTeam ] & ( 1 << ( id & 31 ) ) ) { g_tAdmins[ tTeam ] &= ~( 1 << ( id & 31 ) ); SetRandomAdmin( id , tTeam ); break; } } } }
public TeamInfo() { new id , szTeam[ 2 ] , szFlags[ 27 ] , iFlags , iPlayerFlags , bool:bIsTeamLevelSenior; id = read_data( 1 ); read_data( 2 , szTeam , charsmax( szTeam ) ); //Check if this is the first time a player is joining a team OR a team change occurred. if ( g_iCurTeam[ id ] != szTeam[ 0 ] ) { //Set chosen team as players current team. g_iCurTeam[ id ] = szTeam[ 0 ]; //If there are any server-level seniors, we will not be setting any new temp admins so we can stop execution here. if ( g_tSeniorAdmins[ Server_Level ] ) return; //Check if player who just joined team is a team-level senior. get_pcvar_string( g_pCvar[ Cvar_Senior_Team_Flags ] , szFlags , charsmax( szFlags ) ); iFlags = read_flags( szFlags ); iPlayerFlags = get_user_flags( id ); bIsTeamLevelSenior = ( iFlags && ( ( iFlags & iPlayerFlags ) == iFlags ) ); if ( szTeam[ 0 ] == 'C' || szTeam[ 0 ] == 'T' ) { HandleTeamJoin( bIsTeamLevelSenior , id , szTeam[ 0 ] == 'C' ? Team_CT : Team_T ) } else if ( szTeam[ 0 ] == 'S' ) { if ( bIsTeamLevelSenior ) { for ( new SeniorAdmins:saTeam = Team_Level_T ; saTeam <= Team_Level_CT ; saTeam++ ) { if ( g_tSeniorAdmins[ saTeam ] & ( 1 << ( id & 31 ) ) ) { g_tSeniorAdmins[ saTeam ] &= ~( 1 << ( id & 31 ) ); SetRandomAdmin( id , Teams:saTeam ); #if defined TESTING new szName[ 32 ]; get_user_name( id , szName , charsmax( szName ) ); server_print( "[RANDOM ADMIN] Team-level senior admin %s has joined spectator (was %s)" , szName , saTeam == Team_Level_T ? "T" : "CT" ); log_to_file( "TemporaryAdmins.log" , "Team-level senior admin %s has joined spectator (was %s)" , szName , saTeam == Team_Level_T ? "T" : "CT" ); #endif break; } } } else { } } } }
HandleTeamJoin( bool:bIsTeamLevelSenior , id , Teams:tTeam ) { //Joining player is team-level senior and there is a temp currently on the same team, remove temp admin. if ( bIsTeamLevelSenior ) { new Teams:tPrevTeam = ( tTeam == Team_T ) ? Team_CT : Team_T; //If this is a team-change, remove senior-admin from previous team and assign temp admin to player. if ( g_tSeniorAdmins[ SeniorAdmins:tPrevTeam ] & ( 1 << ( id & 31 ) ) ) { g_tSeniorAdmins[ SeniorAdmins:tPrevTeam ] &= ~( 1 << ( id & 31 ) ); SetRandomAdmin( id , tPrevTeam ); #if defined TESTING new szName[ 32 ]; get_user_name( id , szName , charsmax( szName ) ); server_print( "[RANDOM ADMIN] Team-level senior admin %s has changes teams [Old=%s]" , szName , tPrevTeam == Team_T ? "T" : "CT" ); log_to_file( "TemporaryAdmins.log" , "Team-level senior admin %s has changes teams [Old=%s]" , szName , tPrevTeam == Team_T ? "T" : "CT" ); #endif } //Add senior-admin to new team. g_tSeniorAdmins[ SeniorAdmins:tTeam ] |= ( 1 << ( id & 31 ) ); #if defined TESTING new szName[ 32 ]; get_user_name( id , szName , charsmax( szName ) ); server_print( "[RANDOM ADMIN] Team-level senior admin %s has joined team %s" , szName , tTeam == Team_T ? "T" : "CT" ); log_to_file( "TemporaryAdmins.log" , "Team-level senior admin %s has joined team %s" , szName , tTeam == Team_T ? "T" : "CT" ); #endif if ( g_tAdmins[ tTeam ] ) { RemoveTempAdmin( tTeam ); } } else if ( !g_tAdmins[ tTeam ] ) { SetAdmin( id , tTeam ); } }
SetRandomAdmin( iIgnorePlayer , Teams:tTeam ) { new iPlayers[ 32 ] , iNum , iPlayer , bool:bAdminFound; get_players( iPlayers , iNum , szGetPlayersFlags_Team , tTeam == Team_T ? "TERRORIST" : "CT" );
if ( iNum > 1 ) { while ( !bAdminFound ) { iPlayer = iPlayers[ random( iNum ) ]; if ( ( iPlayer != iIgnorePlayer ) && !( g_tSeniorAdmins[ SeniorAdmins:tTeam ] & ( 1 << ( iPlayer & 31 ) ) ) ) { SetAdmin( iPlayer , tTeam ); bAdminFound = true; break; } } } }
SetAdmin( id , Teams:tTeam ) { new szFlags[ 27 ] , szName[ 32 ]; get_user_name( id , szName , charsmax( szName ) ); get_pcvar_string( g_pCvar[ Cvar_TempAdmin_Flags ] , szFlags , charsmax( szFlags ) ); remove_user_flags( id , -1 ); set_user_flags( id , read_flags( szFlags ) ); g_tAdmins[ tTeam ] |= ( 1 << ( id & 31 ) ); client_print( 0 , print_chat , "[RANDOM ADMIN] Player %s just got Temporary Admin!" , szName ); #if defined TESTING server_print( "[RANDOM ADMIN] Player %s just got Temporary Admin on team %s" , szName , tTeam == Team_T ? "T" : "CT" ); log_to_file( "TemporaryAdmins.log" , "Player %s just got Temporary Admin on team %s" , szName , tTeam == Team_T ? "T" : "CT" ); #endif }
RemoveTempAdmin( Teams:tTeam=Team_Both ) { new iPlayers[ 32 ] , iNum , iPlayer , szName[ 32 ];
//"c" - do not include bots //"e" - match with team //"h" - do not include HLTV proxies
if ( Team_T <= tTeam <= Team_CT ) get_players( iPlayers , iNum , szGetPlayersFlags_Team , tTeam == Team_T ? "TERRORIST" : "CT" ); else get_players( iPlayers , iNum , szGetPlayersFlags_NoTeam ); if ( iNum > 0 ) { for ( new i = 0 ; i < iNum ; i++ ) { iPlayer = iPlayers[ i ]; if ( ( ( tTeam == Team_Both ) && ( ( g_tAdmins[ Team_T ] & ( 1 << ( iPlayer & 31 ) ) ) || ( g_tAdmins[ Team_CT ] & ( 1 << ( iPlayer & 31 ) ) ) ) ) || ( g_tAdmins[ tTeam ] & ( 1 << ( iPlayer & 31 ) ) ) ) { remove_user_flags( iPlayer ); set_user_flags( iPlayer , ADMIN_USER ); get_user_name( iPlayer , szName , charsmax( szName ) ); client_print( 0 , print_chat , "[RANDOM ADMIN] Player %s just lost Temporary Admin due to senior admin connecting." , szName ); #if defined TESTING server_print( "[RANDOM ADMIN] Player %s just lost Temporary Admin (senior admin connected)!" , szName ); log_to_file( "TemporaryAdmins.log" , "Player %s just lost Temporary Admin due to senior admin connecting." , szName ); #endif if ( tTeam == Team_Both ) { g_tAdmins[ Teams:cs_get_user_team( iPlayer ) ] &= ~( 1 << ( iPlayer & 31 ) ); } else { g_tAdmins[ tTeam ] &= ~( 1 << ( iPlayer & 31 ) ); break; } } } } }
__________________
Last edited by Bugsy; 01-22-2017 at 20:56.
|
|