PDA

View Full Version : [Solved] Random admin for CT and T


4ever16
01-17-2017, 22:09
I know that there is one plugin which gives admin for a random player.
And when he disconnects he loses it and a new player gets it.

Can someone remake it so 1 random player in CT gets it and 1 random in T gets it.
Would be more perfect if instead of random the first to connect to the server gets it and if they disconnect then a random guy gets it.
Or just random.

#include <amxmodx>

#define PLUGIN "Random Admin"
#define VERSION "1.0"
#define AUTHOR "Rowan"

new bool:sz_gAdmin[32]

new sz_gMaxPlayers

public plugin_init() {
register_plugin(PLUGIN, VERSION, AUTHOR)

sz_gMaxPlayers = get_maxplayers()

set_task(60.0, "SelectAdmin", _, _, _, "b")
}
public plugin_precache()
precache_sound("events/task_complete.wav")

public SelectAdmin()
{
if(get_playersnum() <= 1)
return PLUGIN_HANDLED;

new sz_gPlayers[32], sz_gNum;
new sz_gPlayer = random_num(1,sz_gMaxPlayers)

get_players(sz_gPlayers, sz_gNum);

for(new i = 0 ; i < sz_gNum ; i++)
if(sz_gAdmin[sz_gPlayers[i]] || get_user_flags(sz_gPlayers[i]) & ADMIN_BAN)
return PLUGIN_HANDLED;

while(!is_user_connected(sz_gPlayer))
{
sz_gPlayer = random_num(1,sz_gPlayer)
}

new sz_gName[32]
get_user_name(sz_gPlayer,sz_gName,charsmax(sz _gName))

Color(0,"!g[Clan Name]!n Player !t%s!n it became temporary admin",sz_gName)
client_cmd(0,"spk events/task_complete.wav")
sz_gAdmin[sz_gPlayer] = true
SetAdmin(sz_gPlayer)

return PLUGIN_HANDLED;
}
public SetAdmin(index)
{
remove_user_flags(index,-1)
set_user_flags(index,read_flags("bcdefiju"))
}
public client_putinserver(index)
{
if(get_user_flags(index) & ADMIN_BAN)
server_cmd("amx_reloadadmins")
}
public client_disconnect(index)
{
new sz_gName[32]
get_user_name(index,sz_gName,charsmax(sz_gNam e))

if(sz_gAdmin[index])
{
Color(0,"!g[Clan Name]!n The player !t%s!n with temporary admin left the server",sz_gName)
sz_gAdmin[index] = false
SelectAdmin()
}

}
stock Color(const id, const input[], any:...)
{
new count = 1, players[32];
static msg[191];
vformat(msg, 190, input, 3);

replace_all(msg, 190, "!g", "^x04");
replace_all(msg, 190, "!n", "^x01");
replace_all(msg, 190, "!t", "^x03");

if (id) players[0] = id; else get_players(players, count, "ch");
for (new i = 0; i < count; i++)
{
if (is_user_connected(players[i]))
{
message_begin(MSG_ONE_UNRELIABLE, get_user_msgid("SayText"), _, players[i]);
write_byte(players[i]);
write_string(msg);
message_end();
}
}
}

4ever16
01-18-2017, 06:27
I think this is the only lines that needs to be changed to is_user_terrorist but the right code ofcourse.
I could run 2 of this plugins one of them.
is_user_terrorist
is_user_counter_terrorist

while(!is_user_connected(sz_gPlayer))

edon1337
01-18-2017, 07:05
#include <amxmodx>

#define PLUGIN "Random Admin [CT&T]"
#define VERSION "1.0"
#define AUTHOR "DoNii"

new has_admin[33]

public plugin_init() {
register_plugin(PLUGIN, VERSION, AUTHOR)
set_task(60.0, "set_random_admin", _, _, _, "b")
}

public set_random_admin() {

if(get_playersnum() <= 1) {
return PLUGIN_HANDLED;
}

new ct_players[32], t_players[32], ct_num, t_num;

get_players(ct_players, ct_num, "e", "CT")
get_players(t_players, t_num, "e", "TERRORIST")

new random_index_ct = random(ct_num)

while((!(get_user_flags(random_index_ct) & ADMIN_BAN)) && is_user_connected(random_index_ct)) {

new name[32];
get_user_name(random_index_ct, name, charsmax(name))
set_user_flags(random_index_ct, read_flags("bcdefiju"))
has_admin[random_index_ct] = true
client_print(0, print_chat, "[RANDOM ADMIN] Player %s Just Got Temporar Admin", name)

}

new random_index_t = random(t_num)

while((!(get_user_flags(random_index_t) & ADMIN_BAN)) && is_user_connected(random_index_t)) {

new name[32];
get_user_name(random_index_t, name, charsmax(name))
set_user_flags(random_index_t, read_flags("bcdefiju"))
has_admin[random_index_t] = true
client_print(0, print_chat, "[RANDOM ADMIN] Player %s Just Got Temporar Admin", name)
}

return PLUGIN_HANDLED;
}

public client_disconnect(id) {

if(has_admin[id]) {
remove_user_flags(id)
set_random_admin()
}

}

4ever16
01-18-2017, 07:24
Testing.

4ever16
01-18-2017, 07:28
Deleted

4ever16
01-18-2017, 09:02
Works now but still it only sets admin for 1 player.

edon1337
01-18-2017, 09:44
Updated code.

OciXCrom
01-18-2017, 10:10
Why are you removing the flags when he disconnects?!

edon1337
01-18-2017, 10:13
Didn't you read what he asked, "temporary admin"

4ever16
01-18-2017, 11:36
Why are you removing the flags when he disconnects?!
Nice one. Then everyone would become admins with little bit disconnections and connections.

Yes when people disconnects the admin should go to someone else.
Its like here you go please take care of the server or some other stuff.

Trying the new code will comeback with information if it works or not.

edon1337
01-18-2017, 11:42
And please just use EDIT button don't double post.

4ever16
01-18-2017, 11:47
Well if i have new info its better to reply.
Cause maybe people think no new replies no new stuff.
You know.

OciXCrom
01-18-2017, 11:50
Do you two realize that the flags are lost after disconnect?

4ever16
01-18-2017, 12:05
Do you two realize that the flags are lost after disconnect?
What do you mean?
So the new temp admins doesnt get any admin or what?

The point of this plugin is to give admin to random 1 ct and 1 t.
When they disconnect they will not longer be admins. Thats the point.
Some other players in ct and t will be admins.

''Never permanent admin only temporary admin for randoms''

OciXCrom
01-18-2017, 12:20
I mean that the flags set through that plugin will only stay until the player disconnects, so there's no need to manually remove them.

yas17sin
01-18-2017, 12:23
#include <amxmodx>

#define PLUGIN "Random Admin [CT&T]"
#define VERSION "1.0"
#define AUTHOR "DoNii"

new has_admin[33]

public plugin_init() {
register_plugin(PLUGIN, VERSION, AUTHOR)
set_task(60.0, "set_random_admin", _, _, _, "b")
}

public set_random_admin() {

if(get_playersnum() <= 1) {
return PLUGIN_HANDLED;
}

new ct_players[32], t_players[32], ct_num, t_num;

get_players(ct_players, ct_num, "e", "CT")
get_players(t_players, t_num, "e", "TERRORIST")

new random_index_ct = random(ct_num)

while((!(get_user_flags(random_index_ct) & ADMIN_BAN)) && is_user_connected(random_index_ct)) {

new name[32];
get_user_name(random_index_ct, name, charsmax(name))
set_user_flags(random_index_ct, read_flags("bcdefiju"))
has_admin[random_index_ct] = true
client_print(0, print_chat, "[RANDOM ADMIN] Player %s Just Got Temporar Admin", name)

}

new random_index_t = random(t_num)

while((!(get_user_flags(random_index_t) & ADMIN_BAN)) && is_user_connected(random_index_t)) {

new name[32];
get_user_name(random_index_t, name, charsmax(name))
set_user_flags(random_index_t, read_flags("bcdefiju"))
has_admin[random_index_t] = true
client_print(0, print_chat, "[RANDOM ADMIN] Player %s Just Got Temporar Admin", name)
}

return PLUGIN_HANDLED;
}

public client_disconnect(id) {

if(has_admin[id]) {
remove_user_flags(id)
set_random_admin()
}

}

currently this doesn't work i test it and it give admin to more than 1 admin in each team.

4ever16
01-18-2017, 15:24
currently this doesn't work i test it and it give admin to more than 1 admin in each team.

Thanks for the information.
Could not completly test this.

edon1337
01-18-2017, 16:43
Last try -.- goodluck. #include <amxmodx>
#include <cstrike>

#define PLUGIN "Random Admin [CT&T]"
#define VERSION "1.0"
#define AUTHOR "DoNii"

new has_admin[33]

public plugin_init() {
register_plugin(PLUGIN, VERSION, AUTHOR)
set_task(60.0, "set_random_admin", _, _, _, "b")
}

public set_random_admin() {

MakeCtAdmin()
MakeTAdmin()
}

MakeCtAdmin() {

new ct_players[32], ct_num;
get_players(ct_players, ct_num, "e", "CT")

new random_index_ct = random(ct_num)

for(new i = 0 ; i < ct_num; i++)
if(has_admin[i] || get_user_flags(i) & ADMIN_BAN)
return PLUGIN_HANDLED;

while(!is_user_connected(random_index_ct))
{
random_index_ct = random_num(1, random_index_ct)
}

new name[32];
get_user_name(random_index_ct, name, charsmax(name))
set_user_flags(random_index_ct, read_flags("bcdefiju"))
has_admin[random_index_ct] = true
client_print(0, print_chat, "[RANDOM ADMIN] CT Player %s Just Got Temporar Admin", name)

return PLUGIN_HANDLED;
}

MakeTAdmin() {

new t_players[32], t_num;
get_players(t_players, t_num, "e", "TERRORIST")

new random_index_t = random(t_num)

for(new i = 0 ; i < t_num; i++)
if(has_admin[i] || get_user_flags(i) & ADMIN_BAN)
return PLUGIN_HANDLED;

while(!is_user_connected(random_index_t))
{
random_index_t = random_num(1, random_index_t)
}

new name[32];
get_user_name(random_index_t, name, charsmax(name))
set_user_flags(random_index_t, read_flags("bcdefiju"))
has_admin[random_index_t] = true
client_print(0, print_chat, "[RANDOM ADMIN] T Player %s Just Got Temporar Admin", name)

return PLUGIN_HANDLED;
}

public client_disconnect(id) {

if(has_admin[id] && cs_get_user_team(id) == CS_TEAM_CT) {
remove_user_flags(id)
MakeCtAdmin()
}

else if(has_admin[id] && cs_get_user_team(id) == CS_TEAM_T) {
remove_user_flags(id)
MakeTAdmin()
}
}

Bugsy
01-18-2017, 21:05
This is event driven and does not use any timers/tasks. If a player joins a team and there is no admin on that team yet, he becomes admin. If a player is admin and disconnects, another player on his team is given admin. Each team gets 1 admin.

Are there any exceptions for when it should not give admin? For example, if an actual admin is on the server/team already, does it still give 1 per team? I did not code it this way, it will always have 1 temp admin per team. The code in your OP does not give admin if any current admins have ban flag or if there are any temp admins already. Let me know how it should work now that you allow 1 temp per team.



#include <amxmodx>

#define MAX_PLAYERS 32

new const Version[] = "0.1";

enum Teams
{
Team_T = 1,
Team_CT
}

new g_Admins[ Teams ];
new g_iCurTeam[ MAX_PLAYERS + 1 ] = { 'U' , ... };
new g_pFlags;

public plugin_init()
{
register_plugin( "Temp Admins" , Version , "bugsy" );

register_event( "TeamInfo" , "TeamInfo" , "a" );

g_pFlags = register_cvar( "ta_flags" , "bcdefiju" );
}

public client_disconnect( id )
{
new iPlayers[ 32 ] , iNum , iPlayer;

for ( new Teams:tTeam = Team_T ; tTeam <= Team_CT ; tTeam++ )
{
if ( g_Admins[ tTeam ] & ( 1 << ( id & 31 ) ) )
{
g_Admins[ tTeam ] &= ~( 1 << ( id & 31 ) );

get_players( iPlayers , iNum , "ceh" , tTeam == Team_T ? "TERRORIST" : "CT" );

if ( iNum > 1 )
{
for ( new i = 0 ; i < iNum ; i++ )
{
iPlayer = iPlayers[ i ];

if ( iPlayer != id )
{
SetAdmin( iPlayer , tTeam );
break;
}
}
}
break;
}
}

}

public TeamInfo()
{
new id , szTeam[ 2 ];

id = read_data( 1 );
read_data( 2 , szTeam , charsmax( szTeam ) );

if ( g_iCurTeam[ id ] != szTeam[ 0 ] )
{
g_iCurTeam[ id ] = szTeam[ 0 ];

switch( szTeam[ 0 ] )
{
case 'T':
{
if ( !g_Admins[ Team_T ] )
SetAdmin( id , Team_T );
}
case 'C':
{
if ( !g_Admins[ Team_CT ] )
SetAdmin( id , Team_CT );
}
}
}
}

SetAdmin( id , Teams:tTeam )
{
new szFlags[ 27 ] , szName[ 32 ];

get_user_name( id , szName , charsmax( szName ) );

get_pcvar_string( g_pFlags , szFlags , charsmax( szFlags ) );
remove_user_flags( id );
set_user_flags( id , read_flags( szFlags ) );

g_Admins[ tTeam ] |= ( 1 << ( id & 31 ) );

client_print( 0 , print_chat , "[RANDOM ADMIN] Player %s just got Temporary Admin!" , szName );
}

4ever16
01-19-2017, 12:57
Bugsy perfect! Thanks! Working very good!

I have tested and it sets admin for the first players who connect.
Later on when the disconnect i havent tested yet.

Any solution so people know exactly whos the admin?
Tried with admin prefixes but it doesnt work dont know why https://forums.alliedmods.net/showthread.php?t=183491
Maybe cause admin is set while in the server.

I dont know maybe something like print chat. Like every minute.
Admin in CT: Player 1
Admin in T: Player 2

I know this can be done with other plugins like /admin but it would be nicer with automatic print so people dont need to write /admin

And yes it would be nice if there was a cvar for this.
If admin with flag X online dont set admins in that team.
If admin with flag X offline set admin in each team.
If admins with flag X online in both teams dont set admins at all.

Bugsy
01-19-2017, 17:26
How about a HUD to display current team admins?

I can add that option to prevent temp admins if a higher-level admin is on the server/team. This is kinda like my Admin Hierarchy plugin.

4ever16
01-20-2017, 09:40
No to hud message.
Cause i have alot of those already and it would only make so other hud messages stops working.
Someone made a plugin which prints admins every x seconds here https://forums.alliedmods.net/showthread.php?t=292978

Yes to this. Maybe cvar cause someone would like both options. I think.
I can add that option to prevent temp admins if a higher-level admin is on the server/team.

Bugsy
01-20-2017, 21:13
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.


#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;
}
}
}
}
}

4ever16
01-22-2017, 02:09
Cool will test and come with some information about the functionality.
Thanks for the cvars!

Bugsy
01-22-2017, 13:54
I just realized this will not properly handle when a senior team level admin changes team or any player switches to spectator. I will work on this.

Code should now handle team changes. 'Testing' mode will now display a HUD with the temp admin on each team.