Помощ за проблем със Admin Immunity

Въпроси и проблеми свързани с AMXModX.
Аватар
Siska
Извън линия
Потребител
Потребител
Мнения: 772
Регистриран на: 03 Дек 2019, 22:29
Местоположение: Bedrock
Се отблагодари: 157 пъти
Получена благодарност: 48 пъти
Обратна връзка:

Помощ за проблем със Admin Immunity

Мнение от Siska » 25 Май 2021, 10:31

Здравейте хора :)
Имам проблем със Admin Immunity на този плъгин :
И друг път ми се е случвало с други плъгини. Уж има опция добавена за имунитет на админите, но не работи и плъгина действа върху тях , а аз искам да работи само върху играчите. Какво да направя , за да сложа имунитет на админите ?

Код за потвърждение: Избери целия код

/*
********************************************************************************
*  AMX Mod X script.
*
*   Hobo AFK Manager (hobo_AFK_manager.sma)
*   Copyright (C) 2008-2009 hoboman
*
*   This program is free software; you can redistribute it and/or
*   modify it under the terms of the GNU General Public License
*   as published by the Free Software Foundation; either version 2
*   of the License, or (at your option) any later version.
*
*   This program is distributed in the hope that it will be useful,
*   but WITHOUT ANY WARRANTY; without even the implied warranty of
*   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
*   GNU General Public License for more details.
*
*   You should have received a copy of the GNU General Public License
*   when you downloaded AMX Mod X; if not, write to the Free Software
*   Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.
*
*   In addition, as a special exception, the author gives permission to
*   link the code of this program with the Half-Life Game Engine ("HL
*   Engine") and Modified Game Libraries ("MODs") developed by Valve,
*   L.L.C ("Valve"). You must obey the GNU General Public License in all
*   respects for all of the code used other than the HL Engine and MODs
*   from Valve. If you modify this file, you may extend this exception
*   to your version of the file, but you are not obligated to do so. If
*   you do not wish to do so, delete this exception statement from your
*   version.
*
*********************************************************************************
*/

/*
* For a full plugin description read: http://forums.alliedmods.net/showthread.php?t=69622
*/

#include <amxmodx>
#include <fakemeta>
#include <hamsandwich>

#define PLUGIN	"Hobo AFK Manager"
#define AUTHOR	"hoboman313"
#define VERSION	"1.2a"

#define MAX_PLAYERS 32
//Admins with this flag cannot be kicked
#define AFK_IMMUNITY ADMIN_IMMUNITY 
#define AFK_MOVE_DIST 15

#define OFFSET_TEAM 114
#define OFFSET_INTERNALMODEL 126

#define PUNISH_UNASSIGNED 0
#define PUNISH_SPECTATOR 1
#define PUNISH_AFK_SPECTATOR 2
#define PUNISH_AFK_KICK 3
#define PUNISH_NOMODEL 4


enum CsInternalModel
{
    CS_DONTCHANGE = 0,
    CS_CT_URBAN = 1,
    CS_T_TERROR = 2,
    CS_T_LEET = 3,
    CS_T_ARCTIC = 4,
    CS_CT_GSG9 = 5,
    CS_CT_GIGN = 6,
    CS_CT_SAS = 7,
    CS_T_GUERILLA = 8,
    CS_CT_VIP = 9,
    CZ_T_MILITIA = 10,
    CZ_CT_SPETSNAZ = 11
}

enum CsTeams 
{
    CS_TEAM_UNASSIGNED = 0,
    CS_TEAM_T = 1,
    CS_TEAM_CT = 2,
    CS_TEAM_SPECTATOR = 3
}

new g_oldangles[MAX_PLAYERS+1][3], g_afktime[MAX_PLAYERS+1], saved_freq, bool:freezetimeOver
new bool:player_spawned[MAX_PLAYERS+1],  msgSync, maxplayers, bool:selectedNoModel[MAX_PLAYERS+1]
//cvars
new maxAfkTime, aImmunity, kick, kickPlayers, unassignedTime, warning_time, check_frequency
	
public plugin_init()
{
	register_plugin(PLUGIN, VERSION, AUTHOR)

	check_frequency= register_cvar("hobo_afk_frequency", "1.0")
	maxAfkTime = register_cvar("hobo_afk_time", "20")
	aImmunity = register_cvar("hobo_afk_immunity", "1")
	kick = register_cvar("hobo_afk_kick", "0")
	kickPlayers = register_cvar("hobo_afk_spectator_kick", "16")
	unassignedTime = register_cvar("hobo_afk_unassigned_time", "180")
	warning_time = register_cvar("hobo_afk_warning_time", "15" )
 
	msgSync = CreateHudSyncObj()
	maxplayers = get_maxplayers()
	
	register_logevent("round_start_event", 2, "1=Round_Start")

	RegisterHam(Ham_Spawn, "player", "player_spawn", 1)
	
	if( get_cvar_num("mp_freezetime") > 0 )
		register_event("HLTV", "event_new_round", "a", "1=0", "2=0") 
	
	saved_freq=get_pcvar_num(check_frequency)
	set_task(get_pcvar_float(check_frequency), "checkPlayers", 31337, _, _, "b")
}


public player_spawn(id)
{
	if( is_user_alive(id) && !is_user_bot(id) ) 
	{
		new arrId[1]
		arrId[0]=id
		//player isn't considered spawned until he drops to the ground
		set_task( 0.5, "playerSpawned", id, arrId, 1  )
	}
}


public event_new_round()
	freezetimeOver=false


public round_start_event()
{
	for( new i = 1; i <= maxplayers; i++ )
	{
		player_spawned[i] = false
		
		if( is_user_connected(i) && ( fm_get_user_team(i) == CS_TEAM_CT || fm_get_user_team(i) == CS_TEAM_T ) && !is_user_alive(i) && checkImmunity(i) )
		{
			if( selectedNoModel[i] == true )
				punish_player( i, PUNISH_NOMODEL )
				
			selectedNoModel[i]=true
		}
		else
			selectedNoModel[i]=false
	}
	
	if( saved_freq != get_pcvar_num(check_frequency) )
	{
		change_task( 31337, get_pcvar_float(check_frequency) ) 
		saved_freq = get_pcvar_num(check_frequency)	
	}
	
	freezetimeOver=true
}


public checkPlayers() 
{
	static newangle[3]
	
	if(freezetimeOver)
	{
		for ( new i = 1; i <= maxplayers; i++ ) 
		{
			if ( is_user_alive(i) && player_spawned[i] )
			{
				get_user_origin( i, newangle )

				if ( abs(newangle[0]-g_oldangles[i][0]) < AFK_MOVE_DIST && abs(newangle[1]-g_oldangles[i][1]) < AFK_MOVE_DIST && abs(newangle[2]-g_oldangles[i][2]) < AFK_MOVE_DIST ) 
				{
					g_afktime[i] += get_pcvar_num(check_frequency)
					
					check_afktime(i)
				} 
				else 
				{
					g_oldangles[i][0] = newangle[0]
					g_oldangles[i][1] = newangle[1]
					g_oldangles[i][2] = newangle[2]
					g_afktime[i] = 0
				}
			}
		}
	}
}


public check_afktime(id) 
{
	new afkTimeTmp = get_pcvar_num( maxAfkTime ), afkTimeLeft, kickOrSpect
	
	static punishName[17]
	
	afkTimeLeft = afkTimeTmp - g_afktime[id]
	
	if ( afkTimeLeft <= get_pcvar_num(warning_time) ) 
	{	
		if( ( get_pcvar_num(kick) || get_playersnum() > get_pcvar_num(kickPlayers) ) && checkImmunity(id) )
		{
			kickOrSpect=1
			punishName="kicked"
		}
		else
		{
			kickOrSpect=0
			punishName="put to Spectator"
		}
		
		if(afkTimeLeft>0)
		{
			set_hudmessage(0, 100, 200, -1.0, 0.25, 1, 0.1, 3.0, 0.05, 0.05, -1)
			ShowSyncHudMsg( id, msgSync, "You have %d seconds to move or you will be %s for being AFK", afkTimeLeft, punishName )
		}
	} 
	
	if( g_afktime[id] >= afkTimeTmp ) 
	{
		if( kickOrSpect==1 )
			punish_player(id, PUNISH_AFK_KICK )	
		else
			punish_player(id, PUNISH_AFK_SPECTATOR )
		
		g_afktime[id]=0
	}
}


public client_disconnect(id)
{	
	g_afktime[id] = 0
	selectedNoModel[id]= false	
}


//a player connected so we must find and kick a spectator if there are any
public client_putinserver(id) 
{
	if( is_user_bot(id) || is_user_hltv(id) )
		return
	
	if( checkImmunity(id) )
	{
		new arrId[1]
		arrId[0] = id
		set_task( get_pcvar_float( unassignedTime ), "check_unassigned", id+40, arrId, 1 )
	}
	
	if( get_playersnum() > get_pcvar_num(kickPlayers) )
	{
		for( new i=1; i<=maxplayers; i++ )
		{
			if( is_user_connected(i) && fm_get_user_team(i) == CS_TEAM_SPECTATOR && checkImmunity(i) )
			{
				punish_player( i, PUNISH_SPECTATOR )
				break
			}
		}
	}
}


public check_unassigned( arrId[] )
{
	new id=arrId[0]
	
	//if the player is unassigned after x seconds then kick him
	if( is_user_connected(id) && fm_get_user_team( id ) == CS_TEAM_UNASSIGNED )
		punish_player( id, PUNISH_UNASSIGNED )
}


public playerSpawned(arrId[]) 
{
	new id=arrId[0]
	get_user_origin( id, g_oldangles[id] )
	player_spawned[id] = true
}


stock punish_player( id, punishType )
{
	static name[32]
	get_user_name(id, name, 31)
	
	switch(punishType)
	{
		case PUNISH_UNASSIGNED: 
		{
			client_print( 0, print_chat, "%s was kicked for being unnassigned longer than %d seconds", name, get_pcvar_num(unassignedTime) )
			server_cmd("kick #%d ^"You were kicked for being unassigned for more than %d seconds^"", get_user_userid(id ), get_pcvar_num(unassignedTime) )	
		}
		case PUNISH_SPECTATOR: 
		{
			client_print( 0, print_chat, "%s was kicked for spectating on a server with more than %d players", name, get_pcvar_num(kickPlayers) )
			server_cmd( "kick #%d ^"The server is getting too full to allow spectators^"", get_user_userid(id) )
		}
		case PUNISH_AFK_KICK:
		{
			client_print(0, print_chat, "%s was kicked for being AFK longer than %d seconds", name, get_pcvar_num(maxAfkTime) )
			server_cmd("kick #%d ^"You were kicked for being AFK longer than %d seconds^"", get_user_userid(id), get_pcvar_num(maxAfkTime) )
		}
		case PUNISH_AFK_SPECTATOR:
		{
			client_print(0, print_chat, "%s was put to Spectator for being AFK longer than %d seconds", name, get_pcvar_num(maxAfkTime) )
			user_silentkill(id)
			fm_set_user_team( id, CS_TEAM_SPECTATOR )
		}
		case PUNISH_NOMODEL:
		{
			client_print(0, print_chat, "%s was kicked for joining a team and idling without choosing a model.", name )
			server_cmd("kick #%d ^"You were kicked for joining a team and idling without choosing a model.^"", get_user_userid(id) )
		}
	}
}


public checkImmunity(id)
{
	//if immunity is disabled
	if( get_pcvar_num(aImmunity)==0 )
		return true
	//admin has AFK_IMMUNITY flag
	else if( get_user_flags(id) & AFK_IMMUNITY )
		return false
	
	return true	
}


stock fm_set_user_team(id, CsTeams:team)
{
    set_pdata_int(id, OFFSET_TEAM, _:team)

    dllfunc(DLLFunc_ClientUserInfoChanged, id)

    static teaminfo[12], iMsgid_TeamInfo
    switch(team)
    {
        case CS_TEAM_UNASSIGNED: 
			teaminfo="UNASSIGNED"
        case CS_TEAM_T: 
			teaminfo="TERRORIST"
        case CS_TEAM_CT: 
			teaminfo="CT"
        case CS_TEAM_SPECTATOR: 
			teaminfo="SPECTATOR"
    }

    if(!iMsgid_TeamInfo)
        iMsgid_TeamInfo = get_user_msgid("TeamInfo")
	
    message_begin(MSG_ALL, iMsgid_TeamInfo)
    write_byte(id)
    write_string(teaminfo)
    message_end()
}


stock CsTeams:fm_get_user_team(id)
    return CsTeams:get_pdata_int(id, OFFSET_TEAM)
Търсих врага и го открих : това съм аз , трябва да се победя...
Изображение
WWW.CSMEGAGAMING.COM Изображение Изображение Skype : Sisi-1_1

Аватар
impossible
Извън линия
Потребител
Потребител
Мнения: 488
Регистриран на: 15 Юни 2019, 12:41
Се отблагодари: 23 пъти
Получена благодарност: 47 пъти

Помощ за проблем със Admin Immunity

Мнение от impossible » 25 Май 2021, 19:40

Този плъгин съм го тествал с зададен флаг, също и без флагове и работи перфектно
afk_control.rar
(12.92 MiB) Свалено 73 пъти
afk_control.rar
(12.92 MiB) Свалено 73 пъти

Аватар
Siska
Извън линия
Потребител
Потребител
Мнения: 772
Регистриран на: 03 Дек 2019, 22:29
Местоположение: Bedrock
Се отблагодари: 157 пъти
Получена благодарност: 48 пъти
Обратна връзка:

Помощ за проблем със Admin Immunity

Мнение от Siska » 26 Май 2021, 00:44

impossible написа: 25 Май 2021, 19:40 Този плъгин съм го тествал с зададен флаг, също и без флагове и работи перфектно

afk_control.rar
Имаш ли представа дали може да се направи опцията "bomb transfer" да не е с имунитет за админи ?
Търсих врага и го открих : това съм аз , трябва да се победя...
Изображение
WWW.CSMEGAGAMING.COM Изображение Изображение Skype : Sisi-1_1

Аватар
m0ney
Извън линия
Потребител
Потребител
Мнения: 285
Регистриран на: 13 Апр 2020, 11:36
Се отблагодари: 83 пъти
Получена благодарност: 39 пъти
Обратна връзка:

Помощ за проблем със Admin Immunity

Мнение от m0ney » 26 Май 2021, 00:54

Siska написа: 26 Май 2021, 00:44
impossible написа: 25 Май 2021, 19:40 Този плъгин съм го тествал с зададен флаг, също и без флагове и работи перфектно

afk_control.rar
Имаш ли представа дали може да се направи опцията "bomb transfer" да не е с имунитет за админи ?
Виж в Cvar настройките afk_immunity_flags
Изображение
Изображение

Аватар
Siska
Извън линия
Потребител
Потребител
Мнения: 772
Регистриран на: 03 Дек 2019, 22:29
Местоположение: Bedrock
Се отблагодари: 157 пъти
Получена благодарност: 48 пъти
Обратна връзка:

Помощ за проблем със Admin Immunity

Мнение от Siska » 26 Май 2021, 01:16

m0ney написа: 26 Май 2021, 00:54
Siska написа: 26 Май 2021, 00:44
impossible написа: 25 Май 2021, 19:40 Този плъгин съм го тествал с зададен флаг, също и без флагове и работи перфектно

afk_control.rar
Имаш ли представа дали може да се направи опцията "bomb transfer" да не е с имунитет за админи ?
Виж в Cvar настройките afk_immunity_flags
Аз мисля, че имунитета на админите е за всички опции едновременно, но така е кофти , защото , когато админ е афк с имунитет и с бомба, той ще държи бомбата и няма да я пуска....
Търсих врага и го открих : това съм аз , трябва да се победя...
Изображение
WWW.CSMEGAGAMING.COM Изображение Изображение Skype : Sisi-1_1

Аватар
impossible
Извън линия
Потребител
Потребител
Мнения: 488
Регистриран на: 15 Юни 2019, 12:41
Се отблагодари: 23 пъти
Получена благодарност: 47 пъти

Помощ за проблем със Admin Immunity

Мнение от impossible » 26 Май 2021, 01:28

Премахната е частта от кода с прехвърлянето на бомбата

Код за потвърждение: Избери целия код

#include <amxmodx>
#include <amxmisc>
#include <reapi>
#include <xs>

#define CHAT_PREFIX "^1[^4AFKControl^1]"

enum _:cvars {
	MAX_AFK_WARNS,
	MAX_SPEC_WARNS,
	Float:TIME_AFK_CHECK,
	MIN_SPEC_PLAYERS_CHECK,
	IMMUNITY_FLAGS,
}
enum coords {
	Float:ORIGIN[3],
	Float:ANGLES[3]
}
enum warns {
	AFK,
	SPEC
}

new Float:g_fCoords[MAX_PLAYERS + 1][coords];
new g_iPlayerWarn[MAX_PLAYERS + 1][warns];
new bool:g_IsBot[MAX_PLAYERS + 1];

new g_Cvar[cvars];

public plugin_init()
{
	register_plugin("AFK Control ReNew", "1.2(a)", "neygomon");
	register_dictionary("afk_control.txt");

	RegisterHookChain(RG_CSGameRules_PlayerSpawn, "CSGameRules_PlayerSpawn_Post", true);
	RegisterHookChain(RG_CBasePlayer_Killed, "CBasePlayer_Killed_Post", true);

	bind_pcvar_num(
		create_cvar(
			"afk_max_afk_warns",
			"3",
			.description = fmt("%l", "DESC_MAX_AFK_WARNS"),
			.has_min = true,
			.min_val = 1.0
		),
		g_Cvar[MAX_AFK_WARNS]
	);
	bind_pcvar_num(
		create_cvar(
			"afk_max_spec_warns",
			"2",
			.description = fmt("%l", "DESC_MAX_SPEC_WARNS"),
			.has_min = true,
			.min_val = 1.0
		),
		g_Cvar[MAX_SPEC_WARNS]
	);
	bind_pcvar_num(
		create_cvar(
			"afk_min_spec_players",
			"30",
			.description = fmt("%l", "DESC_MIN_SPEC_PLRS")
		),
		g_Cvar[MIN_SPEC_PLAYERS_CHECK]
	);

	bind_pcvar_float(
		create_cvar(
			"afk_time_afk_check",
			"15.0",
			.description = fmt("%l", "DESC_TIME_AFK_CHECK"),
			.has_min = true,
			.min_val = 5.0
		),
		g_Cvar[TIME_AFK_CHECK]
	);

	new pCvar1 = create_cvar(
		"afk_time_spec_check",
		"15.0",
		.description = fmt("%l", "DESC_TIME_SPEC_CHECK"),
		.has_min = true,
		.min_val = 10.0
	)

	new pCvar2 = create_cvar(
		"afk_immunity_flags",
		"a",
		.description = fmt("%l", "DESC_IMMUNITY_FLAGS")
	);

	AutoExecConfig();
	hook_cvar_change(pCvar2, "hook__cvar_change");
	new szFlags[32]; get_pcvar_string(pCvar2, szFlags, charsmax(szFlags));
	read__flags(szFlags);

	set_task_ex(get_pcvar_float(pCvar1), "check_spectators", .flags = SetTask_Repeat);
}

public client_putinserver(id)
{
	g_IsBot[id] = bool:(is_user_hltv(id) || is_user_bot(id));
	g_iPlayerWarn[id][SPEC] = 0;
}

public client_disconnected(id)
	remove_task(id);

public hook__cvar_change(pCvar, szOldValue[], szNewValue[])
	read__flags(szNewValue);

public CSGameRules_PlayerSpawn_Post(const id)
{
	if(g_IsBot[id]/* || !is_user_alive(id)*/ || get_user_flags(id) & g_Cvar[IMMUNITY_FLAGS])
		return;

	g_iPlayerWarn[id][AFK] = 0;
	get_entvar(id, var_origin, g_fCoords[id][ORIGIN]);
	get_entvar(id, var_angles, g_fCoords[id][ANGLES]);

	remove_task(id);
	set_task_ex(g_Cvar[TIME_AFK_CHECK], "check_afk", id, .flags = SetTask_Repeat);
}

public CBasePlayer_Killed_Post(const id)
	remove_task(id);

public check_afk(id)
{
	if(!is_user_alive(id))
		remove_task(id);
	else
	{
		static Float:fOrigin[3], Float:fAngles[3];
		get_entvar(id, var_origin, fOrigin);
		get_entvar(id, var_angles, fAngles);

		if(!xs_vec_equal(g_fCoords[id][ORIGIN], fOrigin) || !xs_vec_equal(g_fCoords[id][ANGLES], fAngles))
		{
			g_iPlayerWarn[id][AFK] = 0;
			xs_vec_copy(fOrigin, g_fCoords[id][ORIGIN]);
			xs_vec_copy(fAngles, g_fCoords[id][ANGLES]);
		}
		else if(++g_iPlayerWarn[id][AFK] >= g_Cvar[MAX_AFK_WARNS])
		{
			user_kill(id, 1);
			rg_internal_cmd(id, "jointeam", "6");
			rg_send_audio(id, "sound/events/friend_died.wav");
			client_print_color(0, id, "%s %l", CHAT_PREFIX, "MSG_TRANSFER_PLAYER", id);
		}
		else
		{
			rg_send_audio(id, "sound/events/tutor_msg.wav");
			client_print_color(id, print_team_default, "%s %l", CHAT_PREFIX, "MSG_PLAYER_CHECK_ACTIVITY", g_iPlayerWarn[id][AFK], g_Cvar[MAX_AFK_WARNS]);
		}
	}
}

public check_spectators()
{
	if(get_playersnum() < g_Cvar[MIN_SPEC_PLAYERS_CHECK])
		return;

	new players[MAX_PLAYERS], pnum; 
	get_players_ex(players, pnum, GetPlayers_ExcludeBots|GetPlayers_ExcludeHLTV|GetPlayers_MatchTeam, "SPECTATOR");
	for(new i, id; i < pnum; i++)
	{
		id = players[i];

		if(get_user_flags(id) & g_Cvar[IMMUNITY_FLAGS])
			continue;

		switch(get_member(id, m_iTeam)) 
		{
			case TEAM_UNASSIGNED, TEAM_SPECTATOR: 
			{
				if(++g_iPlayerWarn[id][SPEC] >= g_Cvar[MAX_SPEC_WARNS])
				{
					client_print_color(0, id, "%s %l", CHAT_PREFIX, "MSG_KICK_SPEC_REASON", id);
					server_cmd("kick #%d %l", get_user_userid(id), "MSG_KICK_PLAYER_REASON");
				}
			}
		}
	}
}

read__flags(str[])
	g_Cvar[IMMUNITY_FLAGS] = read_flags(str);
може да премахнеш и от lang файла редовете
DESC_TRANSFER_BOMB = Передавать бомбу другому игроку или нет MSG_TRANSFER_BOMB = ^4У игрока ^3%n ^4отобрана бомбу, так как находится ^3AFK DESC_TRANSFER_BOMB = Pass the bomb to another player or not MSG_TRANSFER_BOMB = ^4Player ^3%n ^4got the bomb, since player with C4 was ^3AFK

Аватар
Siska
Извън линия
Потребител
Потребител
Мнения: 772
Регистриран на: 03 Дек 2019, 22:29
Местоположение: Bedrock
Се отблагодари: 157 пъти
Получена благодарност: 48 пъти
Обратна връзка:

Помощ за проблем със Admin Immunity

Мнение от Siska » 26 Май 2021, 01:51

impossible написа: 26 Май 2021, 01:28 Премахната е частта от кода с прехвърлянето на бомбата

Код за потвърждение: Избери целия код

#include <amxmodx>
#include <amxmisc>
#include <reapi>
#include <xs>

#define CHAT_PREFIX "^1[^4AFKControl^1]"

enum _:cvars {
	MAX_AFK_WARNS,
	MAX_SPEC_WARNS,
	Float:TIME_AFK_CHECK,
	MIN_SPEC_PLAYERS_CHECK,
	IMMUNITY_FLAGS,
}
enum coords {
	Float:ORIGIN[3],
	Float:ANGLES[3]
}
enum warns {
	AFK,
	SPEC
}

new Float:g_fCoords[MAX_PLAYERS + 1][coords];
new g_iPlayerWarn[MAX_PLAYERS + 1][warns];
new bool:g_IsBot[MAX_PLAYERS + 1];

new g_Cvar[cvars];

public plugin_init()
{
	register_plugin("AFK Control ReNew", "1.2(a)", "neygomon");
	register_dictionary("afk_control.txt");

	RegisterHookChain(RG_CSGameRules_PlayerSpawn, "CSGameRules_PlayerSpawn_Post", true);
	RegisterHookChain(RG_CBasePlayer_Killed, "CBasePlayer_Killed_Post", true);

	bind_pcvar_num(
		create_cvar(
			"afk_max_afk_warns",
			"3",
			.description = fmt("%l", "DESC_MAX_AFK_WARNS"),
			.has_min = true,
			.min_val = 1.0
		),
		g_Cvar[MAX_AFK_WARNS]
	);
	bind_pcvar_num(
		create_cvar(
			"afk_max_spec_warns",
			"2",
			.description = fmt("%l", "DESC_MAX_SPEC_WARNS"),
			.has_min = true,
			.min_val = 1.0
		),
		g_Cvar[MAX_SPEC_WARNS]
	);
	bind_pcvar_num(
		create_cvar(
			"afk_min_spec_players",
			"30",
			.description = fmt("%l", "DESC_MIN_SPEC_PLRS")
		),
		g_Cvar[MIN_SPEC_PLAYERS_CHECK]
	);

	bind_pcvar_float(
		create_cvar(
			"afk_time_afk_check",
			"15.0",
			.description = fmt("%l", "DESC_TIME_AFK_CHECK"),
			.has_min = true,
			.min_val = 5.0
		),
		g_Cvar[TIME_AFK_CHECK]
	);

	new pCvar1 = create_cvar(
		"afk_time_spec_check",
		"15.0",
		.description = fmt("%l", "DESC_TIME_SPEC_CHECK"),
		.has_min = true,
		.min_val = 10.0
	)

	new pCvar2 = create_cvar(
		"afk_immunity_flags",
		"a",
		.description = fmt("%l", "DESC_IMMUNITY_FLAGS")
	);

	AutoExecConfig();
	hook_cvar_change(pCvar2, "hook__cvar_change");
	new szFlags[32]; get_pcvar_string(pCvar2, szFlags, charsmax(szFlags));
	read__flags(szFlags);

	set_task_ex(get_pcvar_float(pCvar1), "check_spectators", .flags = SetTask_Repeat);
}

public client_putinserver(id)
{
	g_IsBot[id] = bool:(is_user_hltv(id) || is_user_bot(id));
	g_iPlayerWarn[id][SPEC] = 0;
}

public client_disconnected(id)
	remove_task(id);

public hook__cvar_change(pCvar, szOldValue[], szNewValue[])
	read__flags(szNewValue);

public CSGameRules_PlayerSpawn_Post(const id)
{
	if(g_IsBot[id]/* || !is_user_alive(id)*/ || get_user_flags(id) & g_Cvar[IMMUNITY_FLAGS])
		return;

	g_iPlayerWarn[id][AFK] = 0;
	get_entvar(id, var_origin, g_fCoords[id][ORIGIN]);
	get_entvar(id, var_angles, g_fCoords[id][ANGLES]);

	remove_task(id);
	set_task_ex(g_Cvar[TIME_AFK_CHECK], "check_afk", id, .flags = SetTask_Repeat);
}

public CBasePlayer_Killed_Post(const id)
	remove_task(id);

public check_afk(id)
{
	if(!is_user_alive(id))
		remove_task(id);
	else
	{
		static Float:fOrigin[3], Float:fAngles[3];
		get_entvar(id, var_origin, fOrigin);
		get_entvar(id, var_angles, fAngles);

		if(!xs_vec_equal(g_fCoords[id][ORIGIN], fOrigin) || !xs_vec_equal(g_fCoords[id][ANGLES], fAngles))
		{
			g_iPlayerWarn[id][AFK] = 0;
			xs_vec_copy(fOrigin, g_fCoords[id][ORIGIN]);
			xs_vec_copy(fAngles, g_fCoords[id][ANGLES]);
		}
		else if(++g_iPlayerWarn[id][AFK] >= g_Cvar[MAX_AFK_WARNS])
		{
			user_kill(id, 1);
			rg_internal_cmd(id, "jointeam", "6");
			rg_send_audio(id, "sound/events/friend_died.wav");
			client_print_color(0, id, "%s %l", CHAT_PREFIX, "MSG_TRANSFER_PLAYER", id);
		}
		else
		{
			rg_send_audio(id, "sound/events/tutor_msg.wav");
			client_print_color(id, print_team_default, "%s %l", CHAT_PREFIX, "MSG_PLAYER_CHECK_ACTIVITY", g_iPlayerWarn[id][AFK], g_Cvar[MAX_AFK_WARNS]);
		}
	}
}

public check_spectators()
{
	if(get_playersnum() < g_Cvar[MIN_SPEC_PLAYERS_CHECK])
		return;

	new players[MAX_PLAYERS], pnum; 
	get_players_ex(players, pnum, GetPlayers_ExcludeBots|GetPlayers_ExcludeHLTV|GetPlayers_MatchTeam, "SPECTATOR");
	for(new i, id; i < pnum; i++)
	{
		id = players[i];

		if(get_user_flags(id) & g_Cvar[IMMUNITY_FLAGS])
			continue;

		switch(get_member(id, m_iTeam)) 
		{
			case TEAM_UNASSIGNED, TEAM_SPECTATOR: 
			{
				if(++g_iPlayerWarn[id][SPEC] >= g_Cvar[MAX_SPEC_WARNS])
				{
					client_print_color(0, id, "%s %l", CHAT_PREFIX, "MSG_KICK_SPEC_REASON", id);
					server_cmd("kick #%d %l", get_user_userid(id), "MSG_KICK_PLAYER_REASON");
				}
			}
		}
	}
}

read__flags(str[])
	g_Cvar[IMMUNITY_FLAGS] = read_flags(str);
може да премахнеш и от lang файла редовете
DESC_TRANSFER_BOMB = Передавать бомбу другому игроку или нет MSG_TRANSFER_BOMB = ^4У игрока ^3%n ^4отобрана бомбу, так как находится ^3AFK DESC_TRANSFER_BOMB = Pass the bomb to another player or not MSG_TRANSFER_BOMB = ^4Player ^3%n ^4got the bomb, since player with C4 was ^3AFK
Извинявай , но мисля , че стана леко недоразумение. "Bomb transfer" функцията е хубава , а и с нея спестяваме един плъгин , ако ползваме този в сървър с бомба. Самата функция няма нужда да се маха , защото тя нали си има cvar за пускане и спиране. А аз си мислех дали е възможно просто да няма имунитет за тази опция. И така , когато имаме админ с имунитет той няма да бъде прехвърлян и плъгина няма да има действие върху него, но дали може в същото време "Bomb transfer" да продължи да работи за админите , а те да имат имунитет само за другите опции на плъгина.
Търсих врага и го открих : това съм аз , трябва да се победя...
Изображение
WWW.CSMEGAGAMING.COM Изображение Изображение Skype : Sisi-1_1

Аватар
m0ney
Извън линия
Потребител
Потребител
Мнения: 285
Регистриран на: 13 Апр 2020, 11:36
Се отблагодари: 83 пъти
Получена благодарност: 39 пъти
Обратна връзка:

Помощ за проблем със Admin Immunity

Мнение от m0ney » 26 Май 2021, 02:25

Siska написа: 26 Май 2021, 01:16
m0ney написа: 26 Май 2021, 00:54
Siska написа: 26 Май 2021, 00:44

Имаш ли представа дали може да се направи опцията "bomb transfer" да не е с имунитет за админи ?
Виж в Cvar настройките afk_immunity_flags
Аз мисля, че имунитета на админите е за всички опции едновременно, но така е кофти , защото , когато админ е афк с имунитет и с бомба, той ще държи бомбата и няма да я пуска....
А? Точно този cvar отговоря за всички опции на играчи с имунитет в сървъра и точно ако сложиш някакъв измислен флаг примерно x, ще прехвърля бомбата от всички.(поне така мисля или го сложи на оунерския флаг l) :huh:
Изображение
Изображение

Аватар
Siska
Извън линия
Потребител
Потребител
Мнения: 772
Регистриран на: 03 Дек 2019, 22:29
Местоположение: Bedrock
Се отблагодари: 157 пъти
Получена благодарност: 48 пъти
Обратна връзка:

Помощ за проблем със Admin Immunity

Мнение от Siska » 26 Май 2021, 02:34

m0ney написа: 26 Май 2021, 02:25
Siska написа: 26 Май 2021, 01:16
m0ney написа: 26 Май 2021, 00:54

Виж в Cvar настройките afk_immunity_flags
Аз мисля, че имунитета на админите е за всички опции едновременно, но така е кофти , защото , когато админ е афк с имунитет и с бомба, той ще държи бомбата и няма да я пуска....
А? Точно този cvar отговоря за всички опции на играчи с имунитет в сървъра и точно ако сложиш някакъв измислен флаг примерно x, ще прехвърля бомбата от всички.(поне така мисля или го сложи на оунерския флаг l) :huh:
Аз ли не мога да разбера или щото е късно не можем да се разберем ? :)
Ако променя флага админите няма да имат имунитет и бомб-трансфера ще работи за всички, но тогава и другите опции ще работят за всички. А аз питам дали е възможно имунитета на админите да го няма , но само за бомб-трансфер опцията , а да има имунитет за AFK опциите...
Търсих врага и го открих : това съм аз , трябва да се победя...
Изображение
WWW.CSMEGAGAMING.COM Изображение Изображение Skype : Sisi-1_1

Аватар
m0ney
Извън линия
Потребител
Потребител
Мнения: 285
Регистриран на: 13 Апр 2020, 11:36
Се отблагодари: 83 пъти
Получена благодарност: 39 пъти
Обратна връзка:

Помощ за проблем със Admin Immunity

Мнение от m0ney » 26 Май 2021, 23:06

Siska написа: 26 Май 2021, 02:34
m0ney написа: 26 Май 2021, 02:25
Siska написа: 26 Май 2021, 01:16
Аз мисля, че имунитета на админите е за всички опции едновременно, но така е кофти , защото , когато админ е афк с имунитет и с бомба, той ще държи бомбата и няма да я пуска....
А? Точно този cvar отговоря за всички опции на играчи с имунитет в сървъра и точно ако сложиш някакъв измислен флаг примерно x, ще прехвърля бомбата от всички.(поне така мисля или го сложи на оунерския флаг l) :huh:
Аз ли не мога да разбера или щото е късно не можем да се разберем ? :)
Ако променя флага админите няма да имат имунитет и бомб-трансфера ще работи за всички, но тогава и другите опции ще работят за всички. А аз питам дали е възможно имунитета на админите да го няма , но само за бомб-трансфер опцията , а да има имунитет за AFK опциите...
От възрастта е xD


Пробвала ли си плъгина дали не хвърля бомбата и с имунитет флага попринцип? Като гледам по-долния код за трансфер на бомбата няма функция за имунитет а следващата за местене на афк има - public check_spectators() има if(get_user_flags(id) & g_Cvar[IMMUNITY_FLAGS])

Код за потвърждение: Избери целия код

public check_afk(id)
{
	if(!is_user_alive(id))
		remove_task(id);
	else
	{
		static Float:fOrigin[3], Float:fAngles[3];
		get_entvar(id, var_origin, fOrigin);
		get_entvar(id, var_angles, fAngles);

		if(!xs_vec_equal(g_fCoords[id][ORIGIN], fOrigin) || !xs_vec_equal(g_fCoords[id][ANGLES], fAngles))
		{
			g_iPlayerWarn[id][AFK] = 0;
			xs_vec_copy(fOrigin, g_fCoords[id][ORIGIN]);
			xs_vec_copy(fAngles, g_fCoords[id][ANGLES]);
		}
		else if(++g_iPlayerWarn[id][AFK] >= g_Cvar[MAX_AFK_WARNS])
		{
			user_kill(id, 1);
			rg_internal_cmd(id, "jointeam", "6");
			rg_send_audio(id, "sound/events/friend_died.wav");
			client_print_color(0, id, "%s %l", CHAT_PREFIX, "MSG_TRANSFER_PLAYER", id);
		}
		else
		{
			if(rg_has_item_by_name(id, "weapon_c4"))
			{
				client_print_color(0, id, "%s %l", CHAT_PREFIX, "MSG_TRANSFER_BOMB", id);

				if(g_Cvar[TRANSFER_BOMB])
					rg_transfer_c4(id, 0);
				else	rg_drop_items_by_slot(id, C4_SLOT);
			}

			rg_send_audio(id, "sound/events/tutor_msg.wav");
			client_print_color(id, print_team_default, "%s %l", CHAT_PREFIX, "MSG_PLAYER_CHECK_ACTIVITY", g_iPlayerWarn[id][AFK], g_Cvar[MAX_AFK_WARNS]);
		}
	}
}
^липсва имунитет проверка
Изображение
Изображение

Публикувай отговор
  • Подобни теми
    Отговори
    Преглеждания
     Последно мнение

Обратно към “Поддръжка / Помощ”

Кой е на линия

Потребители разглеждащи този форум: Bing [Bot] и 12 госта