
Стаж: 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
|