Правила форума Гаранты форума
Размещение рекламы AMX-X компилятор

Здравствуйте, гость Вход | Регистрация

Наши новости:

14-дек
24-апр
10-апр
11-апр

> Правила раздела

Перед созданием новой темы убедитесь, не искал ли кто-нибудь подобный плагин до вас, для этого следует воспользоваться поиском.

Все вновь созданные темы, с названием типа "Помогите найти", "А что это за плагин", "Ищу плагин", "Нужен плагин", "Подскажите пожалуйста название плагина" - будут удалены.
При создании темы постарайтесь максимально понятно сформулировать её заголовок так, чтобы он соответствовал функциям плагина который Вы ищите. В том случае, если Вам не удается сформулировать мысль и правильно расписать всё в теме, воспользуйтесь графическим редактором, к примеру Paint, что бы примерно изобразить функции нужного Вам плагина.

AFK KISS или AntiAfk v1.3 (посоветуйте, поясните...)

, Решил потестировать...
Статус пользователя intercs
сообщение 2.6.2013, 14:04
Сообщение #1


Стаж: 13 лет

Сообщений: 727
Благодарностей: 408
Полезность: 504

Здравствуйте.
Надоело копаться с AFK manager и по предложению из этой темы: https://c-s.net.ua/forum/topic52418.html?pi...mp;#entry437748 решил протестировать AFK KISS, но прошу совета и пояснений по 3 исходникам из официальных источников, от авторов, есть:

1) Не последняя версия - AFK KiSSS","2.5.2","Isobold & Cheesy Peteza с оленей от автора: http://forums.alliedmods.net/showthread.php?t=14419
Скрытый текст
Код:
/*
*
* MMMMMMM ,MMMMMMMMMMMMMMMMMMMMMMMM MMMM .aMMMMM
* 0MMMMMMMMMi MMMMMMMMMMMMMMMMMMMMMMMM MMMM MMMMMr
* MMMMMMMMMM: MMMM MMMM MMMMMM
* 7MMM2 MMMM MMMM MMMM .MMMMM.
* MMMMMM MMMMMM MMMM MMMM MMMMMM
* MMMM MMMM MMMM MMMM rMMMMM
* .iMMMM WMMMMr MMMM MMMM XMMMMM8
* rMMMM MMMM MMMM;WWWWWWWWWWWWWM0 MMMM @MMMM.
* MMMMMM MMMMMM MMMMMMMMMMMMMMMMMMMM MMMMZMMMMMM
* MMMM SMMMM MMMMMMMMMMMMMMMMMMMM MMMMMMMMMMMM8
* MMMM, MMMM2 MMMM MMMMMMM SMMMMM
* 2MMMMa ,ZMMMM MMMM MMMMW MMMMMM
* MMMM irrrrrrr: MMMM MMMM MMMM ;MMMMMi 7Zrrrrrrrr7
* BMMMMMMMMMMMMMMMMMMMMMM0r MMMM MMMM MMMMMX MMMMMMMMMMM
* MMMMMMMMMMMMMMMMMMMMMMMM: MMMM MMMM @MMMMM
* MMMMM8 MMMMMM MMMM MMMM MMMMMZ
* MMMM MMMM MMMM MMMM ZMMMMM
* MMMM ;MMMM MMMM MMMM MMMMM@
* MMMZ2 rMMMMZ ,MMMM MMMM XMMMM
*
*
*
*
* MMM BMMMW ;MMM r @MMMMMMMMM0 . . 0MMMMMMMMM@ r 2MMMMMMMMMM i
* MMM MMMM0 ;MMM MMMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMMM:
* MMM WMMMW @MMMa @MMMM BMMMW ZMMMM. MMMMM rMMMM
* MMM rMMMM iMMM MMMi MMM MMMa MMM MMMX
* MMM MMMMr MZM 2MMM; .MMMS MMMZ
* MMM MMMMM rMMM MMMM, MMMMS MMMMM
* MMM MMMM MMM @MMMMMMMM rrrX, MMMMMMMMMrrrr77 BMMMMMMMMZ;rrr8
* MMMMMMMMMM MMM MMMMMMMMMMMMMM MMMMMMMMMMMMMM ZMMMMMMMMMMMMMi
* MMMMB MMMMr MMM @ZZZSMMMMM MZZZ20MMMM, ZZZZa2MMMM.
* MMM ZMMMM MMM iMMMM: MMMMX MMM0
* MMM WMMM@ MMM .S,X MMM: 2,7 MMMZ Z,r WMM
* MMM MMMM0 MMM MMMMM MMM: WMMMM MMMZ XMMMM @MM
* MMM SMMMM MMM MMM XMMMM. MMM ,MMMMr MMMi MMMZ
* MMM BMMMM MMM rMMMMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMMMMi iMMMMM@MMMMMMMMMMMM:
* MMM 7MMM0 ,MMM S MMMMMMMMMMMM S i.BMMMMMMMMMMM 7 :aMMMMMMMMMMM 7
*
*
*
*
* Kick/Slay/Spec-Switcher for CS with bombdrop
* based on AFK-Kicker by Cheesy Peteza
* Slay ability and Bomb drop added by Isobold (www.clan-nva.de)
* Code revision and some nice hints by juKay
*
* Date: 01-Jul-2005
*
*
* Description: AFK Slay/Kicker for CS. Kicks after mp_afktime and slays player
* if last surviver and afk and minimum afk_minplayers.
* Textmessage elsewhere
* Drops bomb after 25 sec afk
* AFK-Count-Message at roundstart
* AFK-Players are renamed and get their old name back when playing again or being switched spec
* (never the less their afk-name will show up during spectime)
* Able to kick specs after a certain time
*
* Cvars:
* afk_kicktime 150 // Kick people AFK longer than this time
* afk_slaytime 60 // Slay people AFK longer than this time and last survivor
* afk_minplayers 8 // Only kick AFKs when there is atleast this many players on the server
* afk_slayplayers 1 // Shall we slay or shall we not
* afk_adminimmunity 1 // Admins immun from slaying
* // Will show message anyway!
* afk_adminkickimmunity 1 // Admins immun from kicking
* afk_options 1 // 1 - Kick player after kicktime, 0 - switch to spec after kicktime
* afk_rename 1 // Set to 1, it renames AFK players as described before
*
*
*
* Requirements: AMXModX (cstrike and engine module)
*
*
*
*
* Need help with this?
*
* http://www.amxmodx.org/forums/viewtopic.php?t=15163
*
*
*/

#include <amxmodx>
#include <amxmisc>
#include <cstrike>
#include <engine>


#define MIN_AFK_TIME 30 // I use this incase stupid admins accidentally set afk_kicktime to something silly.
#define WARNING_TIME 15 // Start warning the user this many seconds before they are about to be kicked.
#define CHECK_FREQ 5 // This is also the warning message frequency.
#define BOMB_DROP_TIME 25 // Time until bomb gets dropped, it is also afk recognition time
#define SHOW_FREQ 20 // Frequence of afk-count-messages, only needed if the CVAR afk_show_counter is set to 1
#define SPEC_ASK_TIME 30 // Time until demo-menu will pop up ...


new g_oldangles[33][3]
new g_spawnpos[33][3]
new g_afktime[33]
new g_spectime[33]
new st_afk_name[33][33]
new bool:g_spawned[33] = {true, ...}
new bool:g_demorec[33] = {false, ...}
new bool:g_afkname[33] = {false, ...}
new CsTeams:team
new AfkCT
new AfkT
new bombcarrier
new numCT
new numT

// At mapchange init this
public plugin_init() {
register_plugin("AFK KiSSS","2.5.2","Isobold & Cheesy Peteza")
register_cvar("afkslay_version", "2.5.2", FCVAR_SERVER|FCVAR_EXTDLL|FCVAR_SPONLY)

register_cvar("afk_options", "1") // Set to 0 will not kick player but switch him to spec-team
register_cvar("afk_kicktime", "150") // Kick people AFK longer than this time
register_cvar("afk_slaytime", "60") // Slay people AFK and last survivor longer than this time
register_cvar("afk_minplayers", "8") // Only kick AFKs when there is at least this many players on the server
register_cvar("afk_slayplayers", "1") // Shall we slay or shall we not
register_cvar("afk_adminimmunity", "1") // Honor the immunity flag or not
register_cvar("afk_adminkickimmunity", "0") // Honor the immunity flag or not
register_cvar("afk_show_counter", "0") // If set to one, plugin will show number of afk players every SHOW_FREQ seconds
register_cvar("afk_rename", "0") // Renames player for his afk-time, if set to one (triggers at afk_slaytime)
register_cvar("afk_speckick", "0") // Kicks players in spec not admin, not tacking demo after afk_speckkicktime
register_cvar("afk_speckicktime", "300") // Time to wait until afk_speckick, no effect if afk_speckick 0

set_task(float(CHECK_FREQ),"checkPlayers",_,_,_,"b")
register_event("ResetHUD", "playerSpawned", "be")
register_dictionary("afkkicker.txt")
register_logevent("event_RoundStart",2,"0=World triggered","1=Round_Start")
register_logevent("bomb_events", 3, "1=triggered", "2=Spawned_With_The_Bomb", "2=Dropped_The_Bomb", "2=Got_The_Bomb", "2=Planted_The_Bomb")

new keys = MENU_KEY_1|MENU_KEY_2
register_menucmd(register_menuid("Recording a demo?"), keys, "recDemo")
//register_menucmd(register_menuid("Recording a demo?"), 1023, "recDemo")
}


// Check wether one or more players is/are afk
public checkPlayers() {
new playerCount, i, cplayer
new cplayers[32]
get_players(cplayers, playerCount, "ac")
get_alive_nums()

for (i=0; i<playerCount; i++) {
cplayer = cplayers[i]

if (is_user_connected(cplayer) && !is_user_bot(cplayer) && !is_user_hltv(cplayer) && is_user_alive(cplayer) && g_spawned[cplayer]) {
new newangle[3]
g_demorec[cplayer] = false
get_user_origin(cplayer, newangle)
if ( newangle[0] == g_spawnpos[cplayer][0] && newangle[1] == g_spawnpos[cplayer][1] && newangle[2] == g_spawnpos[cplayer][2] ) {
g_afktime[cplayer] += CHECK_FREQ
check_afktime(cplayer)
if(get_cvar_num("afk_rename") && get_cvar_num("afk_slaytime") && !(g_afkname[cplayer])) {
new AFKName[32]
get_user_name(cplayer, st_afk_name[cplayer], 31)
format(AFKName, 31, "[AFK] %s", st_afk_name[cplayer])
set_user_info(cplayer, "name", AFKName)
g_afkname[cplayer] = true
}
if(get_cvar_num("afk_slayplayers"))
check_team(cplayer)
} else {
get_user_origin(cplayer, newangle, 3)
if ( newangle[0] == g_oldangles[cplayer][0] && newangle[1] == g_oldangles[cplayer][1] && newangle[2] == g_oldangles[cplayer][2] ) {
g_afktime[cplayer] += CHECK_FREQ
check_afktime(cplayer)
if(get_cvar_num("afk_rename") && get_cvar_num("afk_slaytime") && !(g_afkname[cplayer])) {
new AFKName[32]
get_user_name(cplayer, st_afk_name[cplayer], 31)
format(AFKName, 31, "[AFK] %s", st_afk_name[cplayer])
set_user_info(cplayer, "name", AFKName)
g_afkname[cplayer] = true
}
if(get_cvar_num("afk_slayplayers"))
check_team(cplayer)
} else {
g_oldangles[cplayer][0] = newangle[0]
g_oldangles[cplayer][1] = newangle[1]
g_oldangles[cplayer][2] = newangle[2]
if(g_afkname[cplayer]) {
new AFKName[32]
format(AFKName, 31, "%s", st_afk_name[cplayer])
set_user_info(cplayer, "name", AFKName)
g_afkname[cplayer] = false
}
g_afktime[cplayer] = 0
}
}
if(g_afktime[cplayer] > BOMB_DROP_TIME && cplayer == bombcarrier) {
client_cmd(cplayer,"use weapon_c4")
client_cmd(cplayer,"drop")
client_print(0, print_chat, "[AFK KiSSS] - Bomb Drop")
}
} else {
if (is_user_connected(cplayer) && !is_user_bot(cplayer) && !is_user_hltv(cplayer))
checkspec(cplayer)
}
}
return PLUGIN_HANDLED
}

// All players in your team afk or not?
check_team(id) {
if(g_afktime[id] < get_cvar_num("afk_slaytime")) {
} else {
team = cs_get_user_team(id)
if((team == CS_TEAM_T && numT > 0) || (team == CS_TEAM_CT && numCT > 0)) {
} else {
if(get_playersnum() < get_cvar_num("afk_minplayers") || (get_user_flags(id)&ADMIN_IMMUNITY && get_cvar_num("afk_adminimmunity"))) {
client_print(0, print_chat, "[AFK KiSSS]: %L", LANG_PLAYER, "AFK_INFO_MSG")
} else {
new sid[1]
sid[0] = id
delayed_wc3_slay(sid)
new pname[32]
get_user_name(id, pname, 31)
client_print(0, print_chat, "[AFK KiSSS]: %L", LANG_PLAYER, "AFK_KILL_MSG", pname)
}
}
}
}

// Check what to do when afk
check_afktime(id) {
new numplayers = get_playersnum()
new minplayers = get_cvar_num("afk_minplayers")

if(!(get_user_flags(id)&ADMIN_IMMUNITY && get_cvar_num("afk_adminkickimmunity")))
{
if (numplayers >= minplayers) {
new maxafktime = get_cvar_num("afk_kicktime")
if (maxafktime < MIN_AFK_TIME) {
log_amx("cvar afk_kicktime %i is too low. Minimum value is %i.", maxafktime, MIN_AFK_TIME)
maxafktime = MIN_AFK_TIME
set_cvar_num("afk_kicktime", MIN_AFK_TIME)
}
new name[32]
get_user_name(id, name, 31)
if(get_cvar_num("afk_options")==1) {
if ( maxafktime-WARNING_TIME <= g_afktime[id] < maxafktime) {
new timeleft = maxafktime - g_afktime[id]
client_print(id, print_chat, "[AFK KiSSS] %L", id, "AFK_TIMELEFT", timeleft)
} else if (g_afktime[id] > maxafktime) {
client_print(0, print_chat, "[AFK KiSSS]: %L", LANG_PLAYER, "AFK_KICKED", name, maxafktime)
log_amx("%s was kicked for being AFK longer than %i seconds", name, maxafktime)
server_cmd("kick #%d ^"You were kicked for being AFK longer than %i seconds^"", get_user_userid(id), maxafktime)
}
} else {
if ( maxafktime-WARNING_TIME <= g_afktime[id] < maxafktime) {
new timeleft = maxafktime - g_afktime[id]
client_print(id, print_chat, "[AFK KiSSS] %L", id, "AFK_STIME", timeleft)
} else if (g_afktime[id] > maxafktime) {
log_amx("%s was switched to spec for being AFK longer than %i seconds", name, maxafktime)
client_cmd(id,"kill")
cs_set_user_team(id, CS_TEAM_SPECTATOR)
client_print(0, print_chat, "[AFK KiSSS] - Spec Switch")
g_afktime[id] = 0
g_spectime[id] = 0
new sid[1]
sid[0] = id
set_task(0.5,"delayed_wc3_slay",_,sid)
if(get_cvar_num("afk_rename") && g_afkname[id]) {
new AFKName[32]
format(AFKName, 31, "%s", st_afk_name[id])
set_user_info(id, "name", AFKName)
g_afkname[id] = false
}
}
}
}
}
}

checkspec(cplayer) {
log_amx("Checkspec for id: %i", cplayer)
if(get_cvar_num("afk_speckick") == 1 && cs_get_user_team(cplayer) == CS_TEAM_SPECTATOR && g_demorec[cplayer] == false) {
if(!(get_user_flags(cplayer)&ADMIN_IMMUNITY && get_cvar_num("afk_adminkickimmunity"))) {
// Spectatorbehandlung hier rein
new maxspectime = get_cvar_num("afk_speckicktime")
new sname[32]
get_user_name(cplayer, sname, 31)
if(g_spectime[cplayer] > SPEC_ASK_TIME) {
log_amx("Showing demo menu to %s - id: %i", sname, cplayer)
ShowDemoMenu(cplayer)
}
g_spectime[cplayer] += CHECK_FREQ
if(g_spectime[cplayer] > maxspectime) {
client_print(0, print_chat, "[AFK KiSSS]: %L", LANG_PLAYER, "AFK_KICKED", sname, maxspectime)
log_amx("%s was kicked for being spec longer than %i seconds", sname, maxspectime)
server_cmd("kick #%d ^"You were kicked for being spec longer than %i seconds^"", cplayer, maxspectime)
}
}
}
}

// just connected you are not afk for shure ;)
public client_connect(id) {
g_afktime[id] = 0
g_spectime[id] = 0
g_demorec[id] = false
g_afkname[id] = false
get_user_name(id, st_afk_name[id], 31)
return PLUGIN_HANDLED
}

// just connected you are not afk for shure ;)
public client_putinserver(id) {
g_afktime[id] = 0
g_spectime[id] = 0
g_demorec[id] = false
g_afkname[id] = false
get_user_name(id, st_afk_name[id], 31)
return PLUGIN_HANDLED
}

// get player position after spawn
public playerSpawned(id) {
g_spawned[id] = false
g_demorec[id] = false
new sid[1]
sid[0] = id
set_task(0.75, "delayedSpawn",_, sid, 1) // Give the player time to drop to the floor when spawning
return PLUGIN_HANDLED
}

// Used to get playerposition after spawn and drop
public delayedSpawn(sid[]) {
get_user_origin(sid[0], g_oldangles[sid[0]], 3)
get_user_origin(sid[0], g_spawnpos[sid[0]])
g_spawned[sid[0]] = true
return PLUGIN_HANDLED
}

public event_RoundStart() {
new playerCount, Players[32], l
if(task_exists (95729,0)) remove_task (95729,0)
get_players(Players, playerCount, "ac")
for(l=0;l<32;l++) {
if(task_exists (2945 + l,0)) remove_task (2945 + l,0)
}
set_task(2.0, "afk_rs_msg")
if(get_cvar_num("afk_show_counter") == 1) set_task(float(SHOW_FREQ),"afk_rs_msg",95729,_,_,"b")
return PLUGIN_HANDLED
}

// Collect and displays informations about number and team of afk-players
public afk_rs_msg() {
new playerCount, i, player
new Players[32]
get_players(Players, playerCount, "ac")
AfkT = 0
AfkCT = 0

for (i=0; i<playerCount; i++) {
player = Players[i]
if(g_afktime[player] > BOMB_DROP_TIME) {
if(cs_get_user_team(player) == CS_TEAM_T)
AfkT++
if(cs_get_user_team(player) == CS_TEAM_CT)
AfkCT++
}
}
if(AfkT > 0 || AfkCT > 0) client_print(0, print_chat, "[AFK KiSSS]: %i T AFK - %i CT AFK", AfkT, AfkCT)
return PLUGIN_HANDLED
}

// Tracks the bombholder
public bomb_events() {

new arg0[64], action[64], name[33], userid, id;

// Read the log data that we need
read_logargv(0,arg0,63)
read_logargv(2,action,63)

// Find the id of the player that triggered the log
parse_loguser(arg0,name,32,userid)
id = find_player("k",userid)

// Find out what action it was
if (equal(action,"Spawned_With_The_Bomb")) {
bombcarrier = id;
} else if (equal(action,"Dropped_The_Bomb")) {
bombcarrier = 0;
} else if (equal(action,"Got_The_Bomb")) {
bombcarrier = id;
} else if (equal(action, "Planted_The_Bomb")) {
bombcarrier = 0;
}

return PLUGIN_HANDLED

}

// Retrieves the number of non-afk alive players
get_alive_nums() {
new playerCount, i, gplayer
new Players[32]
get_players(Players, playerCount, "ac")
numCT = 0
numT = 0

for (i=0; i<playerCount; i++) {
gplayer = Players[i]
if(cs_get_user_team(gplayer) == CS_TEAM_T && g_afktime[gplayer] < BOMB_DROP_TIME)
numT++
if(cs_get_user_team(gplayer) == CS_TEAM_CT && g_afktime[gplayer] < BOMB_DROP_TIME)
numCT++
}
}


public delayed_wc3_slay(sid[]) {
new id
id = sid[0]
log_amx("Trying to wc3-slay %i",id)
if(is_user_alive(id)) {
client_cmd(id,"kill")
set_task(2.0,"delayed_wc3_slay",2945 + id,sid)
}
}


public ShowDemoMenu(specid)
{
new menu[192]
new keys = MENU_KEY_1|MENU_KEY_2

format(menu, 191, "Recording a demo?^n^n1. Yes^n2. No")
show_menu(specid, keys, menu)
}

public recDemo(specid, key)
{
// if they pressed yes...
if ( key == 0 )
g_demorec[specid] = true // If recording a demo, don't bother him anymore, only kick real afk-specs
}


КВАРЫ
register_cvar("afk_options", "1") // Set to 0 will not kick player but switch him to spec-team
register_cvar("afk_kicktime", "150") // Kick people AFK longer than this time
register_cvar("afk_slaytime", "60") // Slay people AFK and last survivor longer than this time
register_cvar("afk_minplayers", "8") // Only kick AFKs when there is at least this many players on the server
register_cvar("afk_slayplayers", "1") // Shall we slay or shall we not
register_cvar("afk_adminimmunity", "1") // Honor the immunity flag or not
register_cvar("afk_adminkickimmunity", "0") // Honor the immunity flag or not
register_cvar("afk_show_counter", "0") // If set to one, plugin will show number of afk players every SHOW_FREQ seconds
register_cvar("afk_rename", "0") // Renames player for his afk-time, if set to one (triggers at afk_slaytime)
register_cvar("afk_speckick", "0") // Kicks players in spec not admin, not tacking demo after afk_speckkicktime
register_cvar("afk_speckicktime", "300") // Time to wait until afk_speckick, no effect if afk_speckick 0


2) Последняя версия - AFK KiSSS","3.0.0 Beta 1","Isobold" с оленей от автора: http://forums.alliedmods.net/showthread.php?t=14419
Скрытый текст
Код:
/*
*
* MMMMMMM ,MMMMMMMMMMMMMMMMMMMMMMMM MMMM .aMMMMM
* 0MMMMMMMMMi MMMMMMMMMMMMMMMMMMMMMMMM MMMM MMMMMr
* MMMMMMMMMM: MMMM MMMM MMMMMM
* 7MMM2 MMMM MMMM MMMM .MMMMM.
* MMMMMM MMMMMM MMMM MMMM MMMMMM
* MMMM MMMM MMMM MMMM rMMMMM
* .iMMMM WMMMMr MMMM MMMM XMMMMM8
* rMMMM MMMM MMMM;WWWWWWWWWWWWWM0 MMMM @MMMM.
* MMMMMM MMMMMM MMMMMMMMMMMMMMMMMMMM MMMMZMMMMMM
* MMMM SMMMM MMMMMMMMMMMMMMMMMMMM MMMMMMMMMMMM8
* MMMM, MMMM2 MMMM MMMMMMM SMMMMM
* 2MMMMa ,ZMMMM MMMM MMMMW MMMMMM
* MMMM irrrrrrr: MMMM MMMM MMMM ;MMMMMi 7Zrrrrrrrr7
* BMMMMMMMMMMMMMMMMMMMMMM0r MMMM MMMM MMMMMX MMMMMMMMMMM
* MMMMMMMMMMMMMMMMMMMMMMMM: MMMM MMMM @MMMMM
* MMMMM8 MMMMMM MMMM MMMM MMMMMZ
* MMMM MMMM MMMM MMMM ZMMMMM
* MMMM ;MMMM MMMM MMMM MMMMM@
* MMMZ2 rMMMMZ ,MMMM MMMM XMMMM
*
*
*
*
* MMM BMMMW ;MMM r @MMMMMMMMM0 . . 0MMMMMMMMM@ r 2MMMMMMMMMM i
* MMM MMMM0 ;MMM MMMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMMM:
* MMM WMMMW @MMMa @MMMM BMMMW ZMMMM. MMMMM rMMMM
* MMM rMMMM iMMM MMMi MMM MMMa MMM MMMX
* MMM MMMMr MZM 2MMM; .MMMS MMMZ
* MMM MMMMM rMMM MMMM, MMMMS MMMMM
* MMM MMMM MMM @MMMMMMMM rrrX, MMMMMMMMMrrrr77 BMMMMMMMMZ;rrr8
* MMMMMMMMMM MMM MMMMMMMMMMMMMM MMMMMMMMMMMMMM ZMMMMMMMMMMMMMi
* MMMMB MMMMr MMM @ZZZSMMMMM MZZZ20MMMM, ZZZZa2MMMM.
* MMM ZMMMM MMM iMMMM: MMMMX MMM0
* MMM WMMM@ MMM .S,X MMM: 2,7 MMMZ Z,r WMM
* MMM MMMM0 MMM MMMMM MMM: WMMMM MMMZ XMMMM @MM
* MMM SMMMM MMM MMM XMMMM. MMM ,MMMMr MMMi MMMZ
* MMM BMMMM MMM rMMMMMMMMMMMMMMMMMM MMMMMMMMMMMMMMMMMMi iMMMMM@MMMMMMMMMMMM:
* MMM 7MMM0 ,MMM S MMMMMMMMMMMM S i.BMMMMMMMMMMM 7 :aMMMMMMMMMMM 7
*
*
*
*
* Extremly configurable AFK-Handler.
* Kick/Slay/Spec-Switcher for CS with bombdrop
* Version 3 is a complete rewrite from scratch by Isobold (www.clan-nva.de)
* AFK-Slay-idea seen on some other servers, hints from my loyal testers and ideas seen on other plugins description.
*
* Date: 19 - Jul - 2005
* Requirements: AMXModX (cstrike, engine and amxmisc module)
*
*
*
*
* Need help with this?
*
* http://www.amxmodx.org/forums/viewtopic.php?t=15163
*
*
*/

#include <amxmodx>
#include <amxmisc>
#include <cstrike>
#include <engine>

#define AFK_CHECK_FREQ 5 // Check for afk-frequency. This is also the warning message frequency.
#define SPEC_CHECK_FREQ 30 // Check for spec-kick. Has effect in afk_options 2 mode only.
#define MIN_AFK_TIME 30 // I use this incase stupid admins accidentally set afk_optstime to something silly.
#define BOMB_DROP_TIME 25 // Time until bomb gets dropped, it is also afk recognition time.
#define SHOW_FREQ 20 // Frequence of afk-count-messages, only needed if the CVAR afk_show_counter is set to 1
#define SPEC_AFK_CHECK_FREQ 180 // To recheck specplayers if afk or not with a menu ...
#define WARNING_TIME 25 // Time to start warning players before kick or spec-switch

// Do not touch the following items:
#define MENU_SIZE 256



new AfkT
new AfkCT
new numTalive
new numCTalive
new bombcarrier
new lastCounterShow
new i_afktime[33]
new i_spectime[33]
new s_plname[33][33]
new f_lastangles[33][3]
new f_spawnposition[33][3]
new bool:b_spawned[33] = {true, ...}
new bool:b_demorec[33] = {false, ...}
new bool:b_afkname[33] = {false, ...}
new bool:is_admin[33] = {false, ...}
new bool:b_tobeslayed[33] = {false, ...}
new g_iMenuPosition[33]
new g_coloredMenus



// On plugin start

public plugin_init() {
register_plugin("AFK KiSSS","3.0.0 Beta 1","Isobold")
register_cvar("afkslay_version", "3.0.0 Beta 1", FCVAR_SERVER|FCVAR_EXTDLL|FCVAR_SPONLY)

register_cvar("afk_slaytime", "90") // AFK-Time until slay
register_cvar("afk_optstime", "150") // AFK-Time until afk_options will take effect (afk_kicktime in v.2)
register_cvar("afk_options", "1") // 0 Spec, 1 Kick, 2 Spec+Kick, 3 Kick normal Players and Switch Admins to Spec, 4 nothing of these
// in case 3 afk_adminkimmunity will have no effect
register_cvar("afk_speckick", "120") // time to be spec until kick (afk_options 2 only)
register_cvar("afk_minplayers", "8") // Minimum players to kick someone (afk_options 1 and 2 only)

// 0 deactivate, 1 activate the following functions
register_cvar("afk_bombdrop", "1") // 1 Bomb will be dropped after BOMB_DROP_TIME
register_cvar("afk_slayplayers", "1") // 1 Slays AFK-Players when last survivor
register_cvar("afk_adminsimmunity", "0") // 1 Admin immune against slay
register_cvar("afk_adminkimmunity", "1") // 1 Admin immune against kick (against spec-kick to) (afk_options 1 and 2 only)
register_cvar("afk_admincimmunity", "1") // 1 Admin immune against switch to specmode (afk_options 0 and 2 only)
register_cvar("afk_show_counter", "1") // 1 Displays a message every 20 seconds with the numbers and teams of afk_players ...
// ... if at least 1 AFK detected
register_cvar("afk_rename", "1") // 1 Rename afk-players
register_cvar("afk_disable", "0") // 1 Disable this plugin (4 example for clanwars)

register_event("ResetHUD", "playerSpawned", "be")
register_dictionary("afkkicker.txt")
register_dictionary("common.txt")
register_logevent("bomb_events", 3, "1=triggered", "2=Spawned_With_The_Bomb", "2=Dropped_The_Bomb", "2=Got_The_Bomb", "2=Planted_The_Bomb")




set_task(float(AFK_CHECK_FREQ),"checkPositions",_,_,_,"b")
set_task(float(AFK_CHECK_FREQ),"checkDeath",_,_,_,"b")
}

public checkPositions() {
new playernum, pl, t_slay, t_opts, t_bomb, t_slay_time, t_opts_time, min_players
new a_ids[32], playerpos[3], playerview[3]
if(get_cvar_num("afk_disable")) return PLUGIN_HANDLED
get_players(a_ids, playernum, "ac")
t_slay = get_cvar_num("afk_slayplayers")
t_opts = get_cvar_num("afk_options")
t_bomb = get_cvar_num("afk_bombdrop")
t_slay_time = get_cvar_num("afk_slaytime")
t_opts_time = get_cvar_num("afk_optstime")
min_players = get_cvar_num("afk_minplayers")

if(t_opts == 2) {
if(!(task_exists(29034,0)))
set_task(float(SPEC_CHECK_FREQ),"checkSpec",29034,_,_,"b")
}

get_alive_nums()
for(new i = 0; i < playernum; i++) {
pl = a_ids[i]
if(is_user_connected(pl) && !is_user_bot(pl) && !is_user_hltv(pl) && is_user_alive(pl) && b_spawned[pl]) {
get_user_origin(pl, playerview, 3)
get_user_origin(pl, playerpos)

// Has player moved since last check?
if((playerview[0] == f_lastangles[pl][0] && playerview[1] == f_lastangles[pl][1] && playerview[2] == f_lastangles[pl][2]) || (playerpos[0] == f_spawnposition[pl][0] && playerpos[1] == f_spawnposition[pl][1] && playerpos[2] == f_spawnposition[pl][2])) {
i_afktime[pl] += AFK_CHECK_FREQ
if(t_bomb == 1 && i_afktime[pl] >= BOMB_DROP_TIME && pl == bombcarrier) {
client_cmd(pl,"use weapon_c4")
client_cmd(pl,"drop")
client_print(0, print_chat, "[AFK KiSSS] - Bomb Drop")
}
if(t_opts == 0 || t_opts == 2) {
if(playernum >= min_players)
CheckSwitchSpec(pl, t_opts_time)
}
if(t_opts == 1 || t_opts == 3) {
if(playernum >= min_players)
checkKick(pl, t_opts, t_opts_time)
}
if(t_slay == 1) {
if(t_slay_time <= i_afktime[pl])
checkSlay(pl)
}
} else {
i_afktime[pl] = 0
}
f_lastangles[pl][0] = playerview[0]
f_lastangles[pl][1] = playerview[1]
f_lastangles[pl][2] = playerview[2]
}
}
afk_rs_msg()
if((numTalive == 0 && AfkT > 0) || (numCTalive == 0 && AfkCT > 0)) {
client_print(0, print_chat, "[AFK KiSSS]: %L", LANG_PLAYER, "AFK_INFO_MSG")
}
return PLUGIN_HANDLED
}


// Handle Situations

//Check for Slay
checkSlay(id) {
if(!((cs_get_user_team(id) == CS_TEAM_T && numTalive > 0) || (cs_get_user_team(id) == CS_TEAM_CT && numCTalive > 0))) {
if(!(get_playersnum() < get_cvar_num("afk_minplayers") || (get_cvar_num("afk_adminsimmunity") == 1 && is_admin[id]))) {
client_cmd(id,"kill")
b_tobeslayed[id] = true
}
}
}

CheckSwitchSpec(id, opts_time) {
if (opts_time-WARNING_TIME <= i_afktime[id] < opts_time) {
new timeleft = opts_time - i_afktime[id]
client_print(id, print_chat, "[AFK KiSSS] %L", id, "AFK_STIME", timeleft)
} else if (i_afktime[id] > opts_time) {
SwitchSpec(id)
}
return PLUGIN_CONTINUE
}

public checkKick(id, opt, opts_time) {
if(get_cvar_num("afk_adminsimmunity") == 1 && is_admin[id] && opt == 1) {
return PLUGIN_HANDLED
} else {
if(opts_time-WARNING_TIME <= i_afktime[id] < opts_time) {
new timeleft = opts_time - i_afktime[id]
if(is_admin[id] && opt == 3) {
client_print(id, print_chat, "[AFK KiSSS] %L", id, "AFK_STIME", timeleft)
} else {
client_print(id, print_chat, "[AFK KiSSS] %L", id, "AFK_TIMELEFT", timeleft)
}
} else if (i_afktime[id] > opts_time) {
if(is_admin[id] && opt == 3) {
SwitchSpec(id)
} else {
new name[33]
get_user_name(id, name, 32)
client_print(0, print_chat, "[AFK KiSSS]: %L", LANG_PLAYER, "AFK_KICKED", name, opts_time)
log_amx("%s was kicked for being AFK longer than %i seconds", name, opts_time)
server_cmd("kick #%d ^"You were kicked for being AFK longer than %i seconds^"", get_user_userid(id), opts_time)
}
}
}
return PLUGIN_CONTINUE
}

SwitchSpec(id) {
client_cmd(id,"kill")
cs_set_user_team(id, CS_TEAM_SPECTATOR)
client_print(0, print_chat, "[AFK KiSSS] - Spec Switch")
b_tobeslayed[id] = true
i_spectime[id] = 0
i_afktime[id] = 0
return PLUGIN_CONTINUE
}


// Control Spec-Players
public checkSpec() {
new playernum, admin_imun, pl, kicktime, j
new a_ids[32]
admin_imun = get_cvar_num("afk_adminkimmunity")
kicktime = get_cvar_num("afk_speckick")
get_players(a_ids,playernum,"ce","SPECTATOR")
for(j = 0; j < playernum; j++) {
pl = a_ids[j]
if(!is_user_hltv(pl) && is_user_connected(pl) && !is_user_bot(pl)) {
if(!(admin_imun == 1 && is_admin[pl])) {
i_spectime[pl] += SPEC_CHECK_FREQ
if(i_spectime[pl] > kicktime) {
new name[33]
get_user_name(pl, name, 32)
client_print(0, print_chat, "[AFK KiSSS]: %L", LANG_PLAYER, "AFK_KICKED", name, kicktime)
log_amx("%s was kicked for being AFK longer than %i seconds", name, kicktime)
server_cmd("kick #%d ^"You were kicked for being AFK longer than %i seconds^"", get_user_userid(pl), kicktime)
}
}
}
}
return PLUGIN_HANDLED
}

// Help functions

// Verifies if players are really dead
public checkDeath() {
new playernum, pl
new a_ids[32]

if(get_cvar_num("afk_disable")) return PLUGIN_HANDLED
get_players(a_ids, playernum, "ac")

for(new i = 0; i < playernum; i++) {
pl = a_ids[i]
if(b_tobeslayed[pl]) {
client_cmd(pl,"kill")
}
}
return PLUGIN_HANDLED
}

// Tracks the bombholder
public bomb_events() {
new arg0[64], action[64], name[33], userid, bid

if(get_cvar_num("afk_disable")) return PLUGIN_HANDLED

// Read the log data that we need
read_logargv(0,arg0,63)
read_logargv(2,action,63)

// Find the id of the player that triggered the log
parse_loguser(arg0,name,32,userid)
bid = find_player("k",userid)

// Find out what action it was
if (equal(action,"Spawned_With_The_Bomb")) {
bombcarrier = bid;
} else if (equal(action,"Dropped_The_Bomb")) {
bombcarrier = 0;
} else if (equal(action,"Got_The_Bomb")) {
bombcarrier = bid;
} else if (equal(action, "Planted_The_Bomb")) {
bombcarrier = 0;
}
return PLUGIN_HANDLED
}

// Collect and displays informations about number and team of afk-players
public afk_rs_msg() {
new playerCount, i, player
new Players[32]
get_players(Players, playerCount, "ac")
AfkT = 0
AfkCT = 0

for (i=0; i<playerCount; i++) {
player = Players[i]
if(i_afktime[player] > BOMB_DROP_TIME) {
if(cs_get_user_team(player) == CS_TEAM_T)
AfkT++
if(cs_get_user_team(player) == CS_TEAM_CT)
AfkCT++
}
}
if((AfkT > 0 || AfkCT > 0) && get_cvar_num("afk_show_counter") == 1) {
lastCounterShow += AFK_CHECK_FREQ
if(lastCounterShow >= SHOW_FREQ) {
client_print(0, print_chat, "[AFK KiSSS]: %i T AFK - %i CT AFK", AfkT, AfkCT)
lastCounterShow = 0
}
}
return PLUGIN_CONTINUE
}

// Retrieves the number of non-afk alive players
get_alive_nums() {
new playerCount, i, gplayer
new Players[32]
get_players(Players, playerCount, "ac")
numCTalive = 0
numTalive = 0

for (i=0; i<playerCount; i++) {
gplayer = Players[i]
if(cs_get_user_team(gplayer) == CS_TEAM_T && i_afktime[gplayer] < BOMB_DROP_TIME)
numTalive++
if(cs_get_user_team(gplayer) == CS_TEAM_CT && i_afktime[gplayer] < BOMB_DROP_TIME)
numCTalive++
}
return PLUGIN_CONTINUE
}

// On new Round get Spawnpositions
public playerSpawned(id) {
b_spawned[id] = false
b_demorec[id] = false
b_tobeslayed[id] = false
new a_id[1]
a_id[0] = id
set_task(0.75, "getFirstPos",_, a_id, 1)
return PLUGIN_HANDLED
}

public getFirstPos(a_id[]) {
new id = a_id[0]
b_spawned[id] = true
get_user_origin(id, f_lastangles[id], 3)
get_user_origin(id, f_spawnposition[id])
if(get_user_flags(id)&ADMIN_IMMUNITY) {
is_admin[id] = true
}
return PLUGIN_HANDLED
}


// On player connect

public client_connect(id) {
i_afktime[id] = 0
i_spectime[id] = 0
b_spawned[id] = false
b_demorec[id] = false
b_afkname[id] = false
is_admin[id] = false
b_tobeslayed[id] = false
get_user_name(id, s_plname[id], 32)
return PLUGIN_HANDLED
}

public client_putinserver(id) {
i_afktime[id] = 0
i_spectime[id] = 0
b_spawned[id] = false
b_demorec[id] = false
b_afkname[id] = false
is_admin[id] = false
b_tobeslayed[id] = false
get_user_name(id, s_plname[id], 32)
return PLUGIN_HANDLED
}


КВАРЫ
register_cvar("afk_slaytime", "90") // AFK-Time until slay
register_cvar("afk_optstime", "150") // AFK-Time until afk_options will take effect (afk_kicktime in v.2)
register_cvar("afk_options", "1") // 0 Spec, 1 Kick, 2 Spec+Kick, 3 Kick normal Players and Switch Admins to Spec, 4 nothing of these
// in case 3 afk_adminkimmunity will have no effect
register_cvar("afk_speckick", "120") // time to be spec until kick (afk_options 2 only)
register_cvar("afk_minplayers", "8") // Minimum players to kick someone (afk_options 1 and 2 only)

// 0 deactivate, 1 activate the following functions
register_cvar("afk_bombdrop", "1") // 1 Bomb will be dropped after BOMB_DROP_TIME
register_cvar("afk_slayplayers", "1") // 1 Slays AFK-Players when last survivor
register_cvar("afk_adminsimmunity", "0") // 1 Admin immune against slay
register_cvar("afk_adminkimmunity", "1") // 1 Admin immune against kick (against spec-kick to) (afk_options 1 and 2 only)
register_cvar("afk_admincimmunity", "1") // 1 Admin immune against switch to specmode (afk_options 0 and 2 only)
register_cvar("afk_show_counter", "1") // 1 Displays a message every 20 seconds with the numbers and teams of afk_players ...
// ... if at least 1 AFK detected
register_cvar("afk_rename", "1") // 1 Rename afk-players
register_cvar("afk_disable", "0") // 1 Disable this plugin (4 example for clanwars)


3) Русскоязычный плагин AntiAfk v1.3 от русского автора "pic" : http://amxmodx.su/forum/viewtopic.php?f=5&t=2384
Скрытый текст
Код:
#include <amxmodx>
#include <cstrike>
#include <fakemeta>
#include <hamsandwich>

#define PLUGIN "AntiAfk"
#define AUTHOR "pic"
#define VERSION "1.2"

#define AFK_IMMUNITY ADMIN_RESERVATION // Иммунитет у тех, у кого ADMIN_RESERVATION (Можно поменять на свой)
#define MAXANG 15 // Погрешность угла обзора (При атаке afk, у него он может изменится)
#define MAXPOS 15 // Погрешность положения игрока на карте (При атаке afk, у него оно может изменится)
#define MAXFLY 1.3 // Время приземления на спавне (Можно поставить меньше, если нет карт 1hp, 35hp)
#define TASKID 142531
#define PUNISH_SPECTATOR 1
#define PUNISH_AFK_SPECTATOR 2
#define PUNISH_AFK_KICK 3


new Float:g_oldang[33][3], g_oldpos[33][3], g_afktime[33], bool:player_spawned[33]
new maxplayers, afkmaxplayers, afkbombdrop_time, warning_time, maxafk_time, afkbombtransfer, aimmunity, kick, check_frequency, bool:freezetime

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

check_frequency = register_cvar("afk_frequency", "1.0") // Время между проверками на простой в секундах
maxafk_time = register_cvar("afk_time", "25") // Максимальное время простоя
afkbombdrop_time = register_cvar("afk_bomb_drop_time", "15") // Время простоя, после которого у игрока отнимет бомбу
afkbombtransfer = register_cvar("afk_bomb_transfer", "1") // Передавать бомбу другому игроку, или просто выкинуть на землю
aimmunity = register_cvar("afk_immunity", "1") // Иммунитет от кика
kick = register_cvar("afk_kick", "0") // Кикать сразу простаивающего, не перенося в зрители
warning_time = register_cvar("afk_warning_time", "15") // Время простоя, при котором покажет таймер простаивающему игроку

maxplayers = get_maxplayers()
afkmaxplayers = maxplayers - get_cvar_num("amx_reservation")

RegisterHam(Ham_Spawn, "player", "player_spawn")
register_logevent("round_start_event", 2, "1=Round_Start")
if(!get_pcvar_num(afkbombdrop_time) || get_pcvar_num(afkbombdrop_time) >= get_pcvar_num(maxafk_time))
set_pcvar_num(afkbombdrop_time, get_pcvar_num(maxafk_time) - 1)
if(get_cvar_num("mp_freezetime") > 0)
register_event("HLTV", "event_new_round", "a", "1=0", "2=0")

set_task(get_pcvar_float(check_frequency), "checkPlayers", TASKID, _, _, "b")
}

public round_start_event()
freezetime = false

public event_new_round()
freezetime = true

public player_spawn(id)
{
if(task_exists(id))
remove_task(id)

player_spawned[id] = false
if(is_user_bot(id) || is_user_hltv(id))
return

set_task(MAXFLY, "playerSpawned", id)
}

public playerSpawned(id)
{
if(!is_user_connected(id) || !is_user_alive(id))
return

pev(id, pev_v_angle, g_oldang[id])
get_user_origin(id, g_oldpos[id])
player_spawned[id] = true

}

public checkPlayers()
{
static Float:newang[3]
static newpos[3]
static i, players[32], num, player
get_players(players, num, "ach")

if(freezetime || num < 2)
return

for(i=0; i<num; i++)
{
player = players[i]
if(is_user_connected(player) && player_spawned[player])
{
pev(player, pev_v_angle, newang)
get_user_origin(player, newpos)

if(abs(floatround(newang[0])-floatround(g_oldang[player][0]))>MAXANG
|| abs(floatround(newang[1])-floatround(g_oldang[player][1]))>MAXANG)
{
g_oldang[player][0] = newang[0]
g_oldang[player][1] = newang[1]
g_afktime[player] = 0
continue
}
if(abs(newpos[0]-g_oldpos[player][0])>MAXPOS
|| abs(newpos[1]-g_oldpos[player][1])>MAXPOS
|| newpos[2] != g_oldpos[player][2])
{
g_oldpos[player][0] = newpos[0]
g_oldpos[player][1] = newpos[1]
g_oldpos[player][2] = newpos[2]
g_afktime[player] = 0
continue
}
g_afktime[player] += get_pcvar_num(check_frequency)
check_afktime(player)
}
}
}

public check_afktime(id)
{
new afktimetmp = get_pcvar_num(maxafk_time), afktimeleft, kickorspect
static punishname[40]
afktimeleft = afktimetmp - g_afktime[id]

if(get_pcvar_num(afkbombdrop_time) == g_afktime[id])
transfer_bomb(id)

if (afktimeleft <= get_pcvar_num(warning_time))
{
if((get_pcvar_num(kick) || get_playersnum() >= afkmaxplayers ) && checkimmunity(id))
{
kickorspect = 1
punishname = "кикнуты"
}
else
{
kickorspect = 0
punishname = "перенесены в зрители"
}

if(afktimeleft > 0)
{
set_hudmessage(255, 0, 0, -1.0, -0.9, 0, get_pcvar_float(check_frequency), get_pcvar_float(check_frequency)-0.1, 0.0, 0.0, -1)
show_hudmessage(id, "Вы будете %s за простой, через %d сек.", punishname, afktimeleft)
}
}

if(is_user_connected(id) && g_afktime[id] >= afktimetmp)
{
if(kickorspect == 1)
punish_player(id, PUNISH_AFK_KICK)
else
{
punish_player(id, PUNISH_AFK_SPECTATOR)
player_spawned[id] = false
g_afktime[id] = 0
}
}
}

public transfer_bomb(id)
{
if(is_user_bot(id) || is_user_hltv(id))
return

if(!is_user_connected(id) || !is_user_alive(id) || !(pev(id, pev_weapons) & (1 << CSW_C4)))
return

new i, players[32], num, player
get_players(players, num, "ache", "TERRORIST")
if(num < 2)
return

if(get_pcvar_num(afkbombtransfer) == 0)
{
engclient_cmd(id, "drop", "weapon_c4")
return
}

new g_carrier[3], g_recipient[3], recipient, distance, mindistance = 999999
get_user_origin(id, g_carrier)
for (i = 0; i < num; i++)
{
player = players[i]
if(!is_user_connected(player) || player == id)
continue

get_user_origin(player, g_recipient)
distance = get_distance(g_carrier, g_recipient)
if(distance < mindistance)
{
mindistance = distance
recipient = player
}
}
if(!recipient)
return

engclient_cmd(id, "drop", "weapon_c4")
new c4 = engfunc(EngFunc_FindEntityByString, -1, "classname", "weapon_c4")
if(pev_valid(c4))
{
new backpack = pev(c4, pev_owner)
if(backpack > maxplayers)
{
set_pev(backpack, pev_flags, pev(backpack, pev_flags) | FL_ONGROUND)
dllfunc(DLLFunc_Touch, backpack, recipient)
}
}
}

public client_putinserver(id)
{
player_spawned[id] = false
g_afktime[id] = 0

if(task_exists(id + 100))
remove_task(id + 100)

if(is_user_bot(id) || is_user_hltv(id))
return

set_task(get_pcvar_float(maxafk_time),"check_unassigned", id + 100)

if(get_playersnum() < afkmaxplayers)
return

static i, players[32], num, player
get_players(players, num, "ch")

for(i=0; i<num; i++)
{
player = players[i]
if(is_user_connected(player) && id != player && cs_get_user_team(player) == CS_TEAM_SPECTATOR && checkimmunity(player))
{
punish_player(player, PUNISH_SPECTATOR)
break
}
}
}

public check_unassigned(id)
{
new player = id - 100
if(is_user_connected(player) && cs_get_user_team(player) == CS_TEAM_UNASSIGNED)
client_cmd(player, "jointeam 6")
}

public checkimmunity(id)
{
if(get_pcvar_num(aimmunity)==0)
return true
else
if(get_user_flags(id) & AFK_IMMUNITY)
return false

return true
}

public plugin_end()
remove_task(TASKID)

stock punish_player(id, punishtype)
{
if(!is_user_connected(id))
return

static name[32]
get_user_name(id, name, 31)

switch(punishtype)
{
case PUNISH_SPECTATOR:
{
client_print(0, print_chat, "%s был кикнут из зрителей, т.к. сервер почти заполнен", name)
server_cmd("kick #%d ^"Вы были кикнуты из зрителей, т.к. сервер почти заполнен^"", get_user_userid(id))
}
case PUNISH_AFK_KICK:
{
client_print(0, print_chat, "%s был кикнут за простой", name)
server_cmd("kick #%d ^"Вы были кикнуты за простой^"", get_user_userid(id))
}
case PUNISH_AFK_SPECTATOR:
{
client_print(0, print_chat, "%s был перенесен в зрители за простой", name)
if (is_user_alive(id))
{
user_kill(id, 1)
cs_set_user_deaths(id, (cs_get_user_deaths(id)-1))
}
cs_set_user_team(id, CS_TEAM_SPECTATOR)
}
}
}


КВАРЫ
#define AFK_IMMUNITY ADMIN_RESERVATION // Иммунитет у тех, у кого ADMIN_RESERVATION (Можно поменять на свой)
#define MAXANG 15 // Погрешность угла обзора (При атаке afk, у него он может изменится)
#define MAXPOS 15 // Погрешность положения игрока на карте (При атаке afk, у него оно может изменится)
#define MAXFLY 1.3 // Время приземления на спавне (Можно поставить меньше, если нет карт 1hp, 35hp)
#define TASKID 142531
#define PUNISH_SPECTATOR 1
#define PUNISH_AFK_SPECTATOR 2
#define PUNISH_AFK_KICK 3


check_frequency = register_cvar("afk_frequency", "1.0") // Время между проверками на простой в секундах
maxafk_time = register_cvar("afk_time", "25") // Максимальное время простоя
afkbombdrop_time = register_cvar("afk_bomb_drop_time", "15") // Время простоя, после которого у игрока отнимет бомбу
afkbombtransfer = register_cvar("afk_bomb_transfer", "1") // Передавать бомбу другому игроку, или просто выкинуть на землю
aimmunity = register_cvar("afk_immunity", "1") // Иммунитет от кика
kick = register_cvar("afk_kick", "0") // Кикать сразу простаивающего, не перенося в зрители
warning_time = register_cvar("afk_warning_time", "15") // Время простоя, при котором покажет таймер простаивающему игроку


ВОПРОС: Какой из этих плагинов, Вы, как профессиональный и логичный администратор своих серверов выбрали бы и что можете сказать о каждой из этих 3-х версиях?


Дополнение к вопросу: Это очень важно, т.к. прочитав все мнения и проанализировав доводы у меня будет мини-заказ, на то, что в одном из этих исходниках, надо будет сделать, чтоб админов по флагу (А или С) кикало бы из спектов не как всех игроков на основании квара, а через 7 или 10 минут...
Помогите разобраться и определиться... А то в просторах инета все на что-то жалуются по поводу багов и тд. на все эти афк манагеры...
Но советуют большинство ставить: AFK KiSSS","3.0.0 Beta 1","Isobold"

Отредактировал: intercs, - 2.6.2013, 14:06
Перейти в начало страницы         Просмотр профиля    Отправить личное сообщение
   Цитировать сообщение
Статус пользователя X*CaHeK*X
сообщение 2.6.2013, 14:07
Сообщение #2
Стаж: 17 лет

Сообщений: 705
Благодарностей: 225
Полезность: 561

Пользовался 2.5.2 - с каким-то из установленных плагинов были проблемы. Поставил 3.0.1 - все шикарно. Правда все-равно пришлось подредактировать исходник. Не слеил нормально игроков со стимом...
Перейти в начало страницы         Просмотр профиля    Отправить личное сообщение
   + Цитировать сообщение
Статус пользователя intercs
сообщение 2.6.2013, 14:17
Сообщение #3


Стаж: 13 лет

Сообщений: 727
Благодарностей: 408
Полезность: 504

Цитата(X*CaHeK*X @ 2.6.2013, 16:07) *
Пользовался 2.5.2 - с каким-то из установленных плагинов были проблемы. Поставил 3.0.1 - все шикарно. Правда все-равно пришлось подредактировать исходник. Не слеил нормально игроков со стимом...


Я тоже думаю её сейчас потестить на пейнтбольном сервере, глянуть как поведёт себя...
А можно попросить занять минутку времени, для пользы информативной, которую мы предоставляем в этой теме и скинуть вашу настройку кваров с описанием их на русском... В принципе я их понимаю, но я думаю другим тоже будет полезна информация...

амх_............... "число" // это отвечает за то что тра-ля-ля. 0 - кикать без перевода в спект. 1- переводить в спект.
и тд.

А я же в свою очередь кидаю русский .тхт раздобытый мною на AFK KiSSS","2.5.2","Isobold & Cheesy Peteza", т.к. русский текстовик на AFK KiSSS","3.0.0 Beta 1","Isobold" не нашёл... А самому перевести сейчас лень-)))

Отредактировал: intercs, - 2.6.2013, 14:29
Прикрепленные файлы:
Прикрепленный файл  afkkicker_rus.rar ( 17,47 килобайт ) Кол-во скачиваний: 35
Перейти в начало страницы         Просмотр профиля    Отправить личное сообщение
   + Цитировать сообщение
Статус пользователя X*CaHeK*X
сообщение 2.6.2013, 14:56
Сообщение #4
Стаж: 17 лет

Сообщений: 705
Благодарностей: 225
Полезность: 561

Пожалуйста ....
Свободный перевод. От меня.

Код
#define AFK_CHECK_FREQ        5 // Частота проверки на afk. Так-же отвечает за вывод предупреждений.
#define SPEC_CHECK_FREQ      30 // Отвечает за спек-кик. Имеет эффект только при afk_options 2
#define MIN_AFK_TIME         30 // Отвечает за минимальное значение команды afk_optstime
#define BOMB_DROP_TIME       25 // Время, до того, как бомба будет выброшена, так-же отвечает за обнаружение АФК
#define SHOW_FREQ            20 // Частота вывода счетчика АФК игроков в командах, необходимо только при afk_show_counter 1
#define SPEC_AFK_CHECK_FREQ 180 // Отвечает за перепроверку АФК игроков в наблюдающих
#define WARNING_TIME         25 // Время начала вывода предупреждений до кика или перевода в спектра
------------------------------
    register_cvar("afk_slaytime",      "20") // Время до слея
    register_cvar("afk_optstime",     "150") // Время до приведения afk_options в действие (afk_kicktime in v.2)
    register_cvar("afk_options",        "2") // 0 Набл., 1 Кик, 2 Набл.+Кик, 3 Кик обычных игроков и перевод админов в спектра, 4 ничего из вышеупомянутого
                                                // при значении 3, квар afk_adminkimmunity не нужен
    register_cvar("afk_speckick",     "1200") // время до кика наблюдаетелей (только для afk_options 2)
    register_cvar("afk_minplayers",     "8") // Мин. кол-во игроков для кика (только при afk_options 1 и 2)

    // 0 отключение, 1 включение
    register_cvar("afk_bombdrop",       "0") // 1 Выбрасывать бомбу после истечения BOMB_DROP_TIME
    register_cvar("afk_slayplayers",    "1") // 1 Убийство АФК игроков (если все не-афк игроки мертвы)
    register_cvar("afk_adminsimmunity", "0") // 1 Админ иммунитет против слея
    register_cvar("afk_adminkimmunity", "1") // 1 Админ иммунитет против кик (так-же и против spec-kick) (только при afk_options 1 и 2)
    register_cvar("afk_admincimmunity", "0") // 1 Админ иммунитет против переведения в наблюдатели (только при afk_options 0 и 2)
    register_cvar("afk_show_counter",   "0") // 1 Показ сообщения о кол-ве АФК в командах, каждые 20 секунд ...
                                                // ... если обнаружен хоть 1 AFK
    register_cvar("afk_rename",         "0") // 1 Переименовывание афк игроков
    register_cvar("afk_disable",        "0") // 1 Отключение плагина (например для проведения кланваров)


Прикрепленные файлы:
Прикрепленный файл  afkkisss.sma ( 17,13 килобайт ) Кол-во скачиваний: 67
Прикрепленный файл  afkkicker.txt ( 790 байт ) Кол-во скачиваний: 90
Перейти в начало страницы         Просмотр профиля    Отправить личное сообщение
   + Цитировать сообщение
Статус пользователя ex3m777
сообщение 2.6.2013, 15:05
Сообщение #5


Стаж: 13 лет
Город: Москва

Сообщений: 2037
Благодарностей: 1135
Полезность: 968

Меценат Меценат

3) Поставил его около 2-3 месяцев назад, плагин очень хорош. лично Я бы его посоветовал.


Перейти в начало страницы         Просмотр профиля    Отправить личное сообщение
   + Цитировать сообщение
BENDERJKE
сообщение 2.6.2013, 15:12
Сообщение #6
Стаж: 15 лет

Сообщений: 270
Благодарностей: 70
Полезность: 0

я бы лучше свой написал.. под свои нужны ;)
Перейти в начало страницы         Просмотр профиля    Отправить личное сообщение
   + Цитировать сообщение
Статус пользователя intercs
сообщение 2.6.2013, 15:20
Сообщение #7


Стаж: 13 лет

Сообщений: 727
Благодарностей: 408
Полезность: 504

Цитата(grishka444 @ 2.6.2013, 17:05) *
3) Поставил его около 2-3 месяцев назад, плагин очень хорош. лично Я бы его посоветовал.


Честно говоря, простой плагин и я думаю заслуживающий похвалы, в отличии от громоздких плагинов на оленях с ненужными функциями слея и слепа.

Но ходят слухи, что из-за действий в плагинах афк всяких кваров с бомбой, происходит то, что иногда бомба теряется на радаре у Т...
1) Как обстоят дела с этим плагином? А то меня уже достал баг пропажи бомбы на радаре, при этом даже не помогает последний delta.lst, которыйскидывал Сафетист...
2) В плане нагрузки на сервер ваше мнение от 1 до 10 как? Там ведь проверка каждую 1.0 секудну, хотя её можно и поменять.


Цитата(BENDERJKE @ 2.6.2013, 17:12) *
я бы лучше свой написал.. под свои нужны ;)


Так вот я и узнаю мнения всех, дабы потом выбрав самый оптимизационный и не нагружающий сервер исходник с уже готовыми примочками и заказать некоторую свою примочку, где бы обычных игроков кикакло по кварам и зспектатора, а всех админов, даже с иммунитетом лишь через 7 или 10 минут.

Меня всегда волнует вопрос нагрузки на сервер, ибо хочу из серверов своих сделать конфетки постепенно не торопясь и обдумывая приятные для игроков решения, за что они нас черти и любят, что заботимся о комфортной игре-)

Отредактировал: intercs, - 2.6.2013, 15:22
Перейти в начало страницы         Просмотр профиля    Отправить личное сообщение
   + Цитировать сообщение
Статус пользователя ex3m777
сообщение 2.6.2013, 15:21
Сообщение #8


Стаж: 13 лет
Город: Москва

Сообщений: 2037
Благодарностей: 1135
Полезность: 968

Меценат Меценат

Цитата(intercs @ 2.6.2013, 16:20) *
Честно говоря, простой плагин и я думаю заслуживающий похвалы, в отличии от громоздких плагинов на оленях с ненужными функциями слея и слепа.

Но ходят слухи, что из-за действий в плагинах афк всяких кваров с бомбой, происходит то, что иногда бомба теряется на радаре у Т...
1) Как обстоят дела с этим плагином? А то меня уже достал баг пропажи бомбы на радаре, при этом даже не помогает последний delta.lst, которыйскидывал Сафетист...
2) В плане нагрузки на сервер ваше мнение от 1 до 10 как? Там ведь проверка каждую 1.0 секудну, хотя её можно и поменять.




Так вот я и узнаю мнения всех, дабы потом выбрав самый оптимизационный и не нагружающий сервер исходник с уже готовыми примочками и заказать некоторую свою примочку, где бы обычных игроков кикакло по кварам и зспектатора, а всех админов, даже с иммунитетом лишь через 7 или 10 минут.

данных проблем не замечаю. и нагрузки тоже.. если тебя напрягает что проверка каждую секунду - поменяй, в чем проблема?


Перейти в начало страницы         Просмотр профиля    Отправить личное сообщение
   + Цитировать сообщение
Статус пользователя intercs
сообщение 2.6.2013, 15:26
Сообщение #9


Стаж: 13 лет

Сообщений: 727
Благодарностей: 408
Полезность: 504

Цитата(grishka444 @ 2.6.2013, 17:21) *
данных проблем не замечаю. и нагрузки тоже.. если тебя напрягает что проверка каждую секунду - поменяй, в чем проблема?


Ок-) вообщем я решил начать тест с этого простого AntiAfk v1.3, т.к. не вижу смысла в лишних кодировок как на оленях на слей, слап и ещё всякой маркетинг-ход лабуды, которая по факту для афк-плагина не к чему...

Вот если бы - бреобрести плагин с ДС.ру, где спрашивает:
Вы мол сейчас играете?
Да. Нет.

То было бы супер-) Там регистрироваться гемор... Вроде как пригласить должны или что-то ещё.

-----------------------------------------
А не...СТОП! В этом AntiAfk v1.3 нет моей любимой функции, как в том же старом АФК манагер, как отсчёт времени кика из спектаторов только тогда, когда на сервере станет больше - квар "число игроков на сервере". Но зато, есть в описании плагина, что: http://amxmodx.su/forum/viewtopic.php?f=5&t=2384
Скрытый текст
Версия обновилась - v1.3 (19 апреля 2012)

Особенность:
Этот плагин отличается от ему подобных тем, что время простоя не сбрасывается после, будь-то начало нового раунда или просто смерть игрока.
Демонстрация на видео
Очень полезен на маленьких картах или когда запущен round nonstop (csdm, gungame)*.

Возможности:
Плагин переносит простаивающих игроков в зрители;
Если сервер полон то кикает простаивающего;
Кикает одного из зрителей при подключении нового игрока, если сервер заполнен;

Можно указать время, по истечению которого, бомба от простаивающего передается другому игроку или ее выкинет на землю.

*На gungame и csdm ставить только! в паре с UnlimitedChooseTeam, иначе могут быть проблемы.

Доступные настройки:
afk_frequency 1.0 - Время между проверками на простой в секундах
afk_time 25 - Максимальное время простоя
afk_bomb_drop_time 15 - Время простоя, после которого у игрока отнимет бомбу
afk_bomb_transfer 1 - Передавать бомбу другому игроку, или просто выкинуть на землю
afk_immunity 1 - Иммунитет от кика
afk_kick 0 - Кикать сразу простаивающего, не перенося в зрители
afk_warning_time 15 - Время простоя, при котором покажет таймер простаивающему игроку


Изменения в версии 1.2:
Оптимизация в коде;
Если на сервере один игрок, простой ему не засчитывается;
Убрана настройка кол-ва игроков при котором включался кик, теперь кикает только тогда, когда сервер заполнен полностью;
Найден и исправлен малозначительный баг, связанный с меню выбора команды;
Добавлена проверка на freeztime, время freeztime'а не учитывается;
Добавлена опция передачи бомбы другому игроку или просто выкинуть бомбу, при простое более чем указанное время.


Изменения в версии 1.3:
Немного изменен код перевода игрока за зрителя;
Добавил пару проверок на коннект;


Иду тестить-) Но блин, сразу же вопрос, на 32 слоте стоит перенаправление на свой 2 сервер и только админ может зайти без перенаправления на 32 слот, будет ли плагин понимать это...?

Отредактировал: intercs, - 2.6.2013, 15:36
Перейти в начало страницы         Просмотр профиля    Отправить личное сообщение
   + Цитировать сообщение
Статус пользователя intercs
сообщение 2.6.2013, 17:17
Сообщение #10


Стаж: 13 лет

Сообщений: 727
Благодарностей: 408
Полезность: 504

вообщем потестил достаточно простой плагин: AntiAfk v1.3: http://amxmodx.su/forum/viewtopic.php?f=5&t=2384

В итоге, нагрузки вроде никакой не несёт - выставил проверку через каждые 10 секунд. Вроде такой простой плагин, а оказался самым нужным из всех навороченных. Плюс есть ХУД оповещение о том, что ты АФК и тебя скоро переведут в спектр чере ** сек. Т.к. чат редко в этот момент замечают.
Понравилось то, что переводит афк в спект, а ауже из спектра кикает тех, кто бездействует и в спектре (это огромный плюс) при заполненном сервере...
Но пойду стукну автору за кое-какой примочкой...

А может тут кто-нибудь подскажет сразу из знающих?

Подскажите...
У меня сервер 32 слота.
На 32 слоте стоит перенаправление игроков на свой 2 сервер, но на 32 слот без перенаправления могут зайти только админы...
Подскажите, где в исходнике выставить число на то, чтобы плагин считал, что сервер якобы состоит из 31 слота и в итоге при 31/32 начал бы кикать из спектра АФК при входе новых игроков?

Скрытый текст
Код:
#include <amxmodx>
#include <cstrike>
#include <fakemeta>
#include <hamsandwich>

#define PLUGIN "AntiAfk"
#define AUTHOR "pic"
#define VERSION "1.2"

#define AFK_IMMUNITY ADMIN_RESERVATION // Иммунитет у тех, у кого ADMIN_RESERVATION (Можно поменять на свой)
#define MAXANG 15 // Погрешность угла обзора (При атаке afk, у него он может изменится)
#define MAXPOS 15 // Погрешность положения игрока на карте (При атаке afk, у него оно может изменится)
#define MAXFLY 1.3 // Время приземления на спавне (Можно поставить меньше, если нет карт 1hp, 35hp)
#define TASKID 142531
#define PUNISH_SPECTATOR 1
#define PUNISH_AFK_SPECTATOR 2
#define PUNISH_AFK_KICK 3


new Float:g_oldang[33][3], g_oldpos[33][3], g_afktime[33], bool:player_spawned[33]
new maxplayers, afkmaxplayers, afkbombdrop_time, warning_time, maxafk_time, afkbombtransfer, aimmunity, kick, check_frequency, bool:freezetime

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

check_frequency = register_cvar("afk_frequency", "10.0") // Время между проверками на простой в секундах
maxafk_time = register_cvar("afk_time", "70") // Максимальное время простоя
afkbombdrop_time = register_cvar("afk_bomb_drop_time", "10") // Время простоя, после которого у игрока отнимет бомбу
afkbombtransfer = register_cvar("afk_bomb_transfer", "0") // Передавать бомбу другому игроку, или просто выкинуть на землю
aimmunity = register_cvar("afk_immunity", "0") // Иммунитет от кика
kick = register_cvar("afk_kick", "0") // Кикать сразу простаивающего, не перенося в зрители
warning_time = register_cvar("afk_warning_time", "30") // Время простоя, при котором покажет таймер простаивающему игроку

maxplayers = get_maxplayers()
afkmaxplayers = maxplayers - get_cvar_num("amx_reservation")

RegisterHam(Ham_Spawn, "player", "player_spawn")
register_logevent("round_start_event", 2, "1=Round_Start")
if(!get_pcvar_num(afkbombdrop_time) || get_pcvar_num(afkbombdrop_time) >= get_pcvar_num(maxafk_time))
set_pcvar_num(afkbombdrop_time, get_pcvar_num(maxafk_time) - 1)
if(get_cvar_num("mp_freezetime") > 0)
register_event("HLTV", "event_new_round", "a", "1=0", "2=0")

set_task(get_pcvar_float(check_frequency), "checkPlayers", TASKID, _, _, "b")
}

public round_start_event()
freezetime = false

public event_new_round()
freezetime = true

public player_spawn(id)
{
if(task_exists(id))
remove_task(id)

player_spawned[id] = false
if(is_user_bot(id) || is_user_hltv(id))
return

set_task(MAXFLY, "playerSpawned", id)
}

public playerSpawned(id)
{
if(!is_user_connected(id) || !is_user_alive(id))
return

pev(id, pev_v_angle, g_oldang[id])
get_user_origin(id, g_oldpos[id])
player_spawned[id] = true

}

public checkPlayers()
{
static Float:newang[3]
static newpos[3]
static i, players[32], num, player
get_players(players, num, "ach")

if(freezetime || num < 2)
return

for(i=0; i<num; i++)
{
player = players[i]
if(is_user_connected(player) && player_spawned[player])
{
pev(player, pev_v_angle, newang)
get_user_origin(player, newpos)

if(abs(floatround(newang[0])-floatround(g_oldang[player][0]))>MAXANG
|| abs(floatround(newang[1])-floatround(g_oldang[player][1]))>MAXANG)
{
g_oldang[player][0] = newang[0]
g_oldang[player][1] = newang[1]
g_afktime[player] = 0
continue
}
if(abs(newpos[0]-g_oldpos[player][0])>MAXPOS
|| abs(newpos[1]-g_oldpos[player][1])>MAXPOS
|| newpos[2] != g_oldpos[player][2])
{
g_oldpos[player][0] = newpos[0]
g_oldpos[player][1] = newpos[1]
g_oldpos[player][2] = newpos[2]
g_afktime[player] = 0
continue
}
g_afktime[player] += get_pcvar_num(check_frequency)
check_afktime(player)
}
}
}

public check_afktime(id)
{
new afktimetmp = get_pcvar_num(maxafk_time), afktimeleft, kickorspect
static punishname[40]
afktimeleft = afktimetmp - g_afktime[id]

if(get_pcvar_num(afkbombdrop_time) == g_afktime[id])
transfer_bomb(id)

if (afktimeleft <= get_pcvar_num(warning_time))
{
if((get_pcvar_num(kick) || get_playersnum() >= afkmaxplayers ) && checkimmunity(id))
{
kickorspect = 1
punishname = "кикнуты"
}
else
{
kickorspect = 0
punishname = "перенесены в зрители"
}

if(afktimeleft > 0)
{
set_hudmessage(255, 0, 0, -1.0, 0.55, 0, get_pcvar_float(check_frequency), get_pcvar_float(check_frequency)-0.1, 0.0, 0.0, -1)
show_hudmessage(id, "[AFK] Вы будете %s за бездействие, через %d сек.", punishname, afktimeleft)
}
}

if(is_user_connected(id) && g_afktime[id] >= afktimetmp)
{
if(kickorspect == 1)
punish_player(id, PUNISH_AFK_KICK)
else
{
punish_player(id, PUNISH_AFK_SPECTATOR)
player_spawned[id] = false
g_afktime[id] = 0
}
}
}

public transfer_bomb(id)
{
if(is_user_bot(id) || is_user_hltv(id))
return

if(!is_user_connected(id) || !is_user_alive(id) || !(pev(id, pev_weapons) & (1 << CSW_C4)))
return

new i, players[32], num, player
get_players(players, num, "ache", "TERRORIST")
if(num < 2)
return

if(get_pcvar_num(afkbombtransfer) == 0)
{
engclient_cmd(id, "drop", "weapon_c4")
return
}

new g_carrier[3], g_recipient[3], recipient, distance, mindistance = 999999
get_user_origin(id, g_carrier)
for (i = 0; i < num; i++)
{
player = players[i]
if(!is_user_connected(player) || player == id)
continue

get_user_origin(player, g_recipient)
distance = get_distance(g_carrier, g_recipient)
if(distance < mindistance)
{
mindistance = distance
recipient = player
}
}
if(!recipient)
return

engclient_cmd(id, "drop", "weapon_c4")
new c4 = engfunc(EngFunc_FindEntityByString, -1, "classname", "weapon_c4")
if(pev_valid(c4))
{
new backpack = pev(c4, pev_owner)
if(backpack > maxplayers)
{
set_pev(backpack, pev_flags, pev(backpack, pev_flags) | FL_ONGROUND)
dllfunc(DLLFunc_Touch, backpack, recipient)
}
}
}

public client_putinserver(id)
{
player_spawned[id] = false
g_afktime[id] = 0

if(task_exists(id + 100))
remove_task(id + 100)

if(is_user_bot(id) || is_user_hltv(id))
return

set_task(get_pcvar_float(maxafk_time),"check_unassigned", id + 100)

if(get_playersnum() < afkmaxplayers)
return

static i, players[32], num, player
get_players(players, num, "ch")

for(i=0; i<num; i++)
{
player = players[i]
if(is_user_connected(player) && id != player && cs_get_user_team(player) == CS_TEAM_SPECTATOR && checkimmunity(player))
{
punish_player(player, PUNISH_SPECTATOR)
break
}
}
}

public check_unassigned(id)
{
new player = id - 100
if(is_user_connected(player) && cs_get_user_team(player) == CS_TEAM_UNASSIGNED)
client_cmd(player, "jointeam 6")
}

public checkimmunity(id)
{
if(get_pcvar_num(aimmunity)==0)
return true
else
if(get_user_flags(id) & AFK_IMMUNITY)
return false

return true
}

public plugin_end()
remove_task(TASKID)

stock punish_player(id, punishtype)
{
if(!is_user_connected(id))
return

static name[32]
get_user_name(id, name, 31)

switch(punishtype)
{
case PUNISH_SPECTATOR:
{
client_print(0, print_chat, "[AFK] %s был кикнут из зрителей, т.к. сервер почти заполнен", name)
server_cmd("kick #%d ^"[AFK] Вы были кикнуты из зрителей, т.к. сервер почти заполнен^"", get_user_userid(id))
}
case PUNISH_AFK_KICK:
{
client_print(0, print_chat, "[AFK] %s был кикнут за бездействие", name)
server_cmd("kick #%d ^"[AFK] Вы были кикнуты за бездействие^"", get_user_userid(id))
}
case PUNISH_AFK_SPECTATOR:
{
client_print(0, print_chat, "[AFK] %s был перенесен в зрители за бездействие", name)
if (is_user_alive(id))
{
user_kill(id, 1)
cs_set_user_deaths(id, (cs_get_user_deaths(id)-1))
}
cs_set_user_team(id, CS_TEAM_SPECTATOR)
}
}
}


Отредактировал: intercs, - 2.6.2013, 17:29
Перейти в начало страницы         Просмотр профиля    Отправить личное сообщение
   + Цитировать сообщение
steev
сообщение 4.6.2013, 23:35
Сообщение #11
Стаж: 13 лет

Сообщений: 46
Благодарностей: 2
Полезность: 0

Пользовался 2.5.2 с каким-то из установленных плагинов были проблемы. Поставил 3.0.1 - все отлично
Перейти в начало страницы         Просмотр профиля    Отправить личное сообщение
   + Цитировать сообщение
Статус пользователя leshiy
сообщение 3.4.2015, 20:31
Сообщение #12


Стаж: 12 лет

Сообщений: 82
Благодарностей: 19
Полезность: 156

Как в antiafk сделать, чтобы худ сообщение показывалось не всем, а только тому, кто простаивает на месте?
Перейти в начало страницы         Просмотр профиля    Отправить личное сообщение
   + Цитировать сообщение
Статус пользователя capone
сообщение 3.11.2015, 18:36
Сообщение #13
Стаж: 10 лет

Сообщений: 8
Благодарностей: 1
Полезность: 0

AntiAfk, подскажите что тут надо изменить что бы был иммунитет админа от кика

Cкрытый текст
#include <amxmodx>
#include <cstrike>
#include <fakemeta>
#include <hamsandwich>

#define PLUGIN "AntiAfk"
#define AUTHOR "pic"
#define VERSION "1.2"

#define AFK_IMMUNITY ADMIN_RESERVATION // Иммунитет у тех, у кого ADMIN_RESERVATION (Можно поменять на свой)
#define MAXANG 15 // Погрешность угла обзора (При атаке afk, у него он может изменится)
#define MAXPOS 15 // Погрешность положения игрока на карте (При атаке afk, у него оно может изменится)
#define MAXFLY 1.3 // Время приземления на спавне (Можно поставить меньше, если нет карт 1hp, 35hp)
#define TASKID 142531
#define PUNISH_SPECTATOR 1
#define PUNISH_AFK_SPECTATOR 2
#define PUNISH_AFK_KICK 3


new Float:g_oldang[33][3], g_oldpos[33][3], g_afktime[33], bool:player_spawned[33]
new maxplayers, afkmaxplayers, afkbombdrop_time, warning_time, maxafk_time, afkbombtransfer, aimmunity, kick, check_frequency, bool:freezetime

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

check_frequency = register_cvar("afk_frequency", "1.0") // Время между проверками на простой в секундах
maxafk_time = register_cvar("afk_time", "25") // Максимальное время простоя
afkbombdrop_time = register_cvar("afk_bomb_drop_time", "15") // Время простоя, после которого у игрока отнимет бомбу
afkbombtransfer = register_cvar("afk_bomb_transfer", "1") // Передавать бомбу другому игроку, или просто выкинуть на землю
aimmunity = register_cvar("afk_immunity", "1") // Иммунитет от кика
kick = register_cvar("afk_kick", "0") // Кикать сразу простаивающего, не перенося в зрители
warning_time = register_cvar("afk_warning_time", "15") // Время простоя, при котором покажет таймер простаивающему игроку

maxplayers = get_maxplayers()
afkmaxplayers = maxplayers - get_cvar_num("amx_reservation")

RegisterHam(Ham_Spawn, "player", "player_spawn")
register_logevent("round_start_event", 2, "1=Round_Start")
if(!get_pcvar_num(afkbombdrop_time) || get_pcvar_num(afkbombdrop_time) >= get_pcvar_num(maxafk_time))
set_pcvar_num(afkbombdrop_time, get_pcvar_num(maxafk_time) - 1)
if(get_cvar_num("mp_freezetime") > 0)
register_event("HLTV", "event_new_round", "a", "1=0", "2=0")

set_task(get_pcvar_float(check_frequency), "checkPlayers", TASKID, _, _, "b")
}

public round_start_event()
freezetime = false

public event_new_round()
freezetime = true

public player_spawn(id)
{
if(task_exists(id))
remove_task(id)

player_spawned[id] = false
if(is_user_bot(id) || is_user_hltv(id))
return

set_task(MAXFLY, "playerSpawned", id)
}

public playerSpawned(id)
{
if(!is_user_connected(id) || !is_user_alive(id))
return

pev(id, pev_v_angle, g_oldang[id])
get_user_origin(id, g_oldpos[id])
player_spawned[id] = true

}

public checkPlayers()
{
static Float:newang[3]
static newpos[3]
static i, players[32], num, player
get_players(players, num, "ach")

if(freezetime || num < 2)
return

for(i=0; i<num; i++)
{
player = players[i]
if(is_user_connected(player) && player_spawned[player])
{
pev(player, pev_v_angle, newang)
get_user_origin(player, newpos)

if(abs(floatround(newang[0])-floatround(g_oldang[player][0]))>MAXANG
|| abs(floatround(newang[1])-floatround(g_oldang[player][1]))>MAXANG)
{
g_oldang[player][0] = newang[0]
g_oldang[player][1] = newang[1]
g_afktime[player] = 0
continue
}
if(abs(newpos[0]-g_oldpos[player][0])>MAXPOS
|| abs(newpos[1]-g_oldpos[player][1])>MAXPOS
|| newpos[2] != g_oldpos[player][2])
{
g_oldpos[player][0] = newpos[0]
g_oldpos[player][1] = newpos[1]
g_oldpos[player][2] = newpos[2]
g_afktime[player] = 0
continue
}
g_afktime[player] += get_pcvar_num(check_frequency)
check_afktime(player)
}
}
}

public check_afktime(id)
{
new afktimetmp = get_pcvar_num(maxafk_time), afktimeleft, kickorspect
static punishname[40]
afktimeleft = afktimetmp - g_afktime[id]

if(get_pcvar_num(afkbombdrop_time) == g_afktime[id])
transfer_bomb(id)

if (afktimeleft <= get_pcvar_num(warning_time))
{
if((get_pcvar_num(kick) || get_playersnum() >= afkmaxplayers ) && checkimmunity(id))
{
kickorspect = 1
punishname = "кикнуты"
}
else
{
kickorspect = 0
punishname = "перенесены в зрители"
}

if(afktimeleft > 0)
{
set_hudmessage(255, 0, 0, -1.0, -0.9, 0, get_pcvar_float(check_frequency), get_pcvar_float(check_frequency)-0.1, 0.0, 0.0, -1)
show_hudmessage(id, "Вы будете %s за простой, через %d сек.", punishname, afktimeleft)
}
}

if(is_user_connected(id) && g_afktime[id] >= afktimetmp)
{
if(kickorspect == 1)
punish_player(id, PUNISH_AFK_KICK)
else
{
punish_player(id, PUNISH_AFK_SPECTATOR)
player_spawned[id] = false
g_afktime[id] = 0
}
}
}

public transfer_bomb(id)
{
if(is_user_bot(id) || is_user_hltv(id))
return

if(!is_user_connected(id) || !is_user_alive(id) || !(pev(id, pev_weapons) & (1 << CSW_C4)))
return

new i, players[32], num, player
get_players(players, num, "ache", "TERRORIST")
if(num < 2)
return

if(get_pcvar_num(afkbombtransfer) == 0)
{
engclient_cmd(id, "drop", "weapon_c4")
return
}

new g_carrier[3], g_recipient[3], recipient, distance, mindistance = 999999
get_user_origin(id, g_carrier)
for (i = 0; i < num; i++)
{
player = players[i]
if(!is_user_connected(player) || player == id)
continue

get_user_origin(player, g_recipient)
distance = get_distance(g_carrier, g_recipient)
if(distance < mindistance)
{
mindistance = distance
recipient = player
}
}
if(!recipient)
return

engclient_cmd(id, "drop", "weapon_c4")
new c4 = engfunc(EngFunc_FindEntityByString, -1, "classname", "weapon_c4")
if(pev_valid(c4))
{
new backpack = pev(c4, pev_owner)
if(backpack > maxplayers)
{
set_pev(backpack, pev_flags, pev(backpack, pev_flags) | FL_ONGROUND)
dllfunc(DLLFunc_Touch, backpack, recipient)
}
}
}

public client_putinserver(id)
{
player_spawned[id] = false
g_afktime[id] = 0

if(task_exists(id + 100))
remove_task(id + 100)

if(is_user_bot(id) || is_user_hltv(id))
return

set_task(get_pcvar_float(maxafk_time),"check_unassigned", id + 100)

if(get_playersnum() < afkmaxplayers)
return

static i, players[32], num, player
get_players(players, num, "ch")

for(i=0; i<num; i++)
{
player = players[i]
if(is_user_connected(player) && id != player && cs_get_user_team(player) == CS_TEAM_SPECTATOR && checkimmunity(player))
{
punish_player(player, PUNISH_SPECTATOR)
break
}
}
}

public check_unassigned(id)
{
new player = id - 100
if(is_user_connected(player) && cs_get_user_team(player) == CS_TEAM_UNASSIGNED)
client_cmd(player, "jointeam 6")
}

public checkimmunity(id)
{
if(get_pcvar_num(aimmunity)==0)
return true
else
if(get_user_flags(id) & AFK_IMMUNITY)
return false

return true
}

public plugin_end()
remove_task(TASKID)

stock punish_player(id, punishtype)
{
if(!is_user_connected(id))
return

static name[32]
get_user_name(id, name, 31)

switch(punishtype)
{
case PUNISH_SPECTATOR:
{
client_print(0, print_chat, "%s был кикнут из зрителей, т.к. сервер почти заполнен", name)
server_cmd("kick #%d ^"Вы были кикнуты из зрителей, т.к. сервер почти заполнен^"", get_user_userid(id))
}
case PUNISH_AFK_KICK:
{
client_print(0, print_chat, "%s был кикнут за простой", name)
server_cmd("kick #%d ^"Вы были кикнуты за простой^"", get_user_userid(id))
}
case PUNISH_AFK_SPECTATOR:
{
client_print(0, print_chat, "%s был перенесен в зрители за простой", name)
if (is_user_alive(id))
{
user_kill(id, 1)
cs_set_user_deaths(id, (cs_get_user_deaths(id)-1))
}
cs_set_user_team(id, CS_TEAM_SPECTATOR)
}
}
}
Перейти в начало страницы         Просмотр профиля    Отправить личное сообщение
   + Цитировать сообщение
Статус пользователя adva
сообщение 3.11.2015, 18:40
Сообщение #14


Иконка группы

Стаж: 12 лет

Сообщений: 2543
Благодарностей: 1676
Полезность: 819

Меценат Меценат

Цитата(capone @ 3.11.2015, 19:31) *
AntiAfk, подскажите что тут надо изменить что бы был иммунитет админа от кика

Cкрытый текст
#include <amxmodx>
#include <cstrike>
#include <fakemeta>
#include <hamsandwich>

#define PLUGIN "AntiAfk"
#define AUTHOR "pic"
#define VERSION "1.2"

#define AFK_IMMUNITY ADMIN_RESERVATION // Иммунитет у тех, у кого ADMIN_RESERVATION (Можно поменять на свой)
#define MAXANG 15 // Погрешность угла обзора (При атаке afk, у него он может изменится)
#define MAXPOS 15 // Погрешность положения игрока на карте (При атаке afk, у него оно может изменится)
#define MAXFLY 1.3 // Время приземления на спавне (Можно поставить меньше, если нет карт 1hp, 35hp)
#define TASKID 142531
#define PUNISH_SPECTATOR 1
#define PUNISH_AFK_SPECTATOR 2
#define PUNISH_AFK_KICK 3


new Float:g_oldang[33][3], g_oldpos[33][3], g_afktime[33], bool:player_spawned[33]
new maxplayers, afkmaxplayers, afkbombdrop_time, warning_time, maxafk_time, afkbombtransfer, aimmunity, kick, check_frequency, bool:freezetime

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

check_frequency = register_cvar("afk_frequency", "1.0") // Время между проверками на простой в секундах
maxafk_time = register_cvar("afk_time", "25") // Максимальное время простоя
afkbombdrop_time = register_cvar("afk_bomb_drop_time", "15") // Время простоя, после которого у игрока отнимет бомбу
afkbombtransfer = register_cvar("afk_bomb_transfer", "1") // Передавать бомбу другому игроку, или просто выкинуть на землю
aimmunity = register_cvar("afk_immunity", "1") // Иммунитет от кика
kick = register_cvar("afk_kick", "0") // Кикать сразу простаивающего, не перенося в зрители
warning_time = register_cvar("afk_warning_time", "15") // Время простоя, при котором покажет таймер простаивающему игроку

maxplayers = get_maxplayers()
afkmaxplayers = maxplayers - get_cvar_num("amx_reservation")

RegisterHam(Ham_Spawn, "player", "player_spawn")
register_logevent("round_start_event", 2, "1=Round_Start")
if(!get_pcvar_num(afkbombdrop_time) || get_pcvar_num(afkbombdrop_time) >= get_pcvar_num(maxafk_time))
set_pcvar_num(afkbombdrop_time, get_pcvar_num(maxafk_time) - 1)
if(get_cvar_num("mp_freezetime") > 0)
register_event("HLTV", "event_new_round", "a", "1=0", "2=0")

set_task(get_pcvar_float(check_frequency), "checkPlayers", TASKID, _, _, "b")
}

public round_start_event()
freezetime = false

public event_new_round()
freezetime = true

public player_spawn(id)
{
if(task_exists(id))
remove_task(id)

player_spawned[id] = false
if(is_user_bot(id) || is_user_hltv(id))
return

set_task(MAXFLY, "playerSpawned", id)
}

public playerSpawned(id)
{
if(!is_user_connected(id) || !is_user_alive(id))
return

pev(id, pev_v_angle, g_oldang[id])
get_user_origin(id, g_oldpos[id])
player_spawned[id] = true

}

public checkPlayers()
{
static Float:newang[3]
static newpos[3]
static i, players[32], num, player
get_players(players, num, "ach")

if(freezetime || num < 2)
return

for(i=0; i<num; i++)
{
player = players[i]
if(is_user_connected(player) && player_spawned[player])
{
pev(player, pev_v_angle, newang)
get_user_origin(player, newpos)

if(abs(floatround(newang[0])-floatround(g_oldang[player][0]))>MAXANG
|| abs(floatround(newang[1])-floatround(g_oldang[player][1]))>MAXANG)
{
g_oldang[player][0] = newang[0]
g_oldang[player][1] = newang[1]
g_afktime[player] = 0
continue
}
if(abs(newpos[0]-g_oldpos[player][0])>MAXPOS
|| abs(newpos[1]-g_oldpos[player][1])>MAXPOS
|| newpos[2] != g_oldpos[player][2])
{
g_oldpos[player][0] = newpos[0]
g_oldpos[player][1] = newpos[1]
g_oldpos[player][2] = newpos[2]
g_afktime[player] = 0
continue
}
g_afktime[player] += get_pcvar_num(check_frequency)
check_afktime(player)
}
}
}

public check_afktime(id)
{
new afktimetmp = get_pcvar_num(maxafk_time), afktimeleft, kickorspect
static punishname[40]
afktimeleft = afktimetmp - g_afktime[id]

if(get_pcvar_num(afkbombdrop_time) == g_afktime[id])
transfer_bomb(id)

if (afktimeleft <= get_pcvar_num(warning_time))
{
if((get_pcvar_num(kick) || get_playersnum() >= afkmaxplayers ) && checkimmunity(id))
{
kickorspect = 1
punishname = "кикнуты"
}
else
{
kickorspect = 0
punishname = "перенесены в зрители"
}

if(afktimeleft > 0)
{
set_hudmessage(255, 0, 0, -1.0, -0.9, 0, get_pcvar_float(check_frequency), get_pcvar_float(check_frequency)-0.1, 0.0, 0.0, -1)
show_hudmessage(id, "Вы будете %s за простой, через %d сек.", punishname, afktimeleft)
}
}

if(is_user_connected(id) && g_afktime[id] >= afktimetmp)
{
if(kickorspect == 1)
punish_player(id, PUNISH_AFK_KICK)
else
{
punish_player(id, PUNISH_AFK_SPECTATOR)
player_spawned[id] = false
g_afktime[id] = 0
}
}
}

public transfer_bomb(id)
{
if(is_user_bot(id) || is_user_hltv(id))
return

if(!is_user_connected(id) || !is_user_alive(id) || !(pev(id, pev_weapons) & (1 << CSW_C4)))
return

new i, players[32], num, player
get_players(players, num, "ache", "TERRORIST")
if(num < 2)
return

if(get_pcvar_num(afkbombtransfer) == 0)
{
engclient_cmd(id, "drop", "weapon_c4")
return
}

new g_carrier[3], g_recipient[3], recipient, distance, mindistance = 999999
get_user_origin(id, g_carrier)
for (i = 0; i < num; i++)
{
player = players[i]
if(!is_user_connected(player) || player == id)
continue

get_user_origin(player, g_recipient)
distance = get_distance(g_carrier, g_recipient)
if(distance < mindistance)
{
mindistance = distance
recipient = player
}
}
if(!recipient)
return

engclient_cmd(id, "drop", "weapon_c4")
new c4 = engfunc(EngFunc_FindEntityByString, -1, "classname", "weapon_c4")
if(pev_valid(c4))
{
new backpack = pev(c4, pev_owner)
if(backpack > maxplayers)
{
set_pev(backpack, pev_flags, pev(backpack, pev_flags) | FL_ONGROUND)
dllfunc(DLLFunc_Touch, backpack, recipient)
}
}
}

public client_putinserver(id)
{
player_spawned[id] = false
g_afktime[id] = 0

if(task_exists(id + 100))
remove_task(id + 100)

if(is_user_bot(id) || is_user_hltv(id))
return

set_task(get_pcvar_float(maxafk_time),"check_unassigned", id + 100)

if(get_playersnum() < afkmaxplayers)
return

static i, players[32], num, player
get_players(players, num, "ch")

for(i=0; i<num; i++)
{
player = players[i]
if(is_user_connected(player) && id != player && cs_get_user_team(player) == CS_TEAM_SPECTATOR && checkimmunity(player))
{
punish_player(player, PUNISH_SPECTATOR)
break
}
}
}

public check_unassigned(id)
{
new player = id - 100
if(is_user_connected(player) && cs_get_user_team(player) == CS_TEAM_UNASSIGNED)
client_cmd(player, "jointeam 6")
}

public checkimmunity(id)
{
if(get_pcvar_num(aimmunity)==0)
return true
else
if(get_user_flags(id) & AFK_IMMUNITY)
return false

return true
}

public plugin_end()
remove_task(TASKID)

stock punish_player(id, punishtype)
{
if(!is_user_connected(id))
return

static name[32]
get_user_name(id, name, 31)

switch(punishtype)
{
case PUNISH_SPECTATOR:
{
client_print(0, print_chat, "%s был кикнут из зрителей, т.к. сервер почти заполнен", name)
server_cmd("kick #%d ^"Вы были кикнуты из зрителей, т.к. сервер почти заполнен^"", get_user_userid(id))
}
case PUNISH_AFK_KICK:
{
client_print(0, print_chat, "%s был кикнут за простой", name)
server_cmd("kick #%d ^"Вы были кикнуты за простой^"", get_user_userid(id))
}
case PUNISH_AFK_SPECTATOR:
{
client_print(0, print_chat, "%s был перенесен в зрители за простой", name)
if (is_user_alive(id))
{
user_kill(id, 1)
cs_set_user_deaths(id, (cs_get_user_deaths(id)-1))
}
cs_set_user_team(id, CS_TEAM_SPECTATOR)
}
}
}


поменять ADMIN_RESERVATION на ADMIN_BAN
Перейти в начало страницы         Просмотр профиля    Отправить личное сообщение
   + Цитировать сообщение
  Ответить в данную темуНачать новую тему
 
0 пользователей и 1 гостей читают эту тему: