Advertisement
Guest User

Untitled

a guest
Apr 30th, 2017
117
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Pawn 10.02 KB | None | 0 0
  1.  
  2. #define PLUGIN  "AFK Manager"
  3. #define AUTHOR  "Leon McVeran"
  4. #define VERSION     "v1.6"
  5. #define PDATE   "2nd August 2011"
  6.  
  7. #include <amxmodx>
  8. #include <amxmisc>
  9. #include <cstrike>
  10. #include <fakemeta>
  11.  
  12. #define KICK_IMMUNITY       ADMIN_BAN
  13.  
  14. #define TASK_AFK_CHECK      142500
  15. #define FREQ_AFK_CHECK      7.0
  16. #define MAX_WARN        3
  17.  
  18. static const OFFSET_LINUX = 5
  19. new const m_iJoiningState = 125
  20.  
  21. new bool:g_bSpec[33]
  22. new bool:g_bSpecAccess[33]
  23. new Float:g_fLastActivity[33]
  24. new g_iAFKCheck
  25. new g_iAFKTime[33]
  26. new g_iDropBomb
  27. new g_iKickTime
  28. new g_iMaxPlayers
  29. new g_iMinPlayers
  30. new g_iTransferTime
  31. new g_iWarn[33]
  32. new g_vOrigin[33][3]
  33.  
  34. new CVAR_afk_drop_bomb
  35. new CVAR_afk_check
  36. new CVAR_afk_transfer_time
  37. new CVAR_afk_kick_time
  38. new CVAR_afk_kick_players
  39.  
  40. new CVAR_afk_spec_pw
  41.  
  42.  
  43. public plugin_init(){
  44.     register_plugin(PLUGIN, VERSION, AUTHOR)
  45.     register_dictionary("afk_manager.txt")
  46.  
  47.     register_logevent("event_round_end", 2, "0=World triggered", "1=Round_End")
  48.     register_logevent("event_round_start", 2, "0=World triggered", "1=Round_Start")
  49.  
  50.     // Support der alten Menüs
  51.     register_clcmd("jointeam", "cmd_jointeam") // new menu
  52.     register_menucmd(register_menuid("Team_Select", 1), 511, "cmd_jointeam") // old menu
  53.  
  54.     register_clcmd("joinclass", "cmd_joinclass") // new menu
  55.     register_menucmd(register_menuid("Terrorist_Select", 1), 511, "cmd_joinclass") // old menu
  56.     register_menucmd(register_menuid("CT_Select", 1), 511, "cmd_joinclass") // old menu
  57.  
  58.     register_clcmd("say", "cmd_say")
  59.  
  60.     CVAR_afk_check = register_cvar("afk_check", "1")
  61.     CVAR_afk_drop_bomb = register_cvar("afk_drop_bomb", "2")
  62.     CVAR_afk_transfer_time = register_cvar("afk_transfer_time", "9")
  63.     CVAR_afk_kick_time = register_cvar("afk_kick_time", "24")
  64.     CVAR_afk_kick_players = register_cvar("afk_kick_players", "12")
  65.  
  66.     CVAR_afk_spec_pw = register_cvar("afk_spec_pw", "password")
  67. }
  68.  
  69. public plugin_cfg(){
  70.     g_iMaxPlayers = get_maxplayers()
  71. }
  72.  
  73. public client_connect(id){
  74.  
  75.     // Spieler als Spectator entmarkieren
  76.     g_bSpec[id] = false
  77.     g_bSpecAccess[id] = false
  78.  
  79.     // Positionen zurücksetzen
  80.     g_vOrigin[id] = {0, 0, 0}
  81.  
  82.     // Counter zurücksetzen
  83.     g_iAFKTime[id] = 0
  84.     g_iWarn[id] = 0
  85. }
  86.  
  87. public event_round_start(){
  88.  
  89.     // AFK Check eingeschaltet
  90.     g_iAFKCheck = get_pcvar_num(CVAR_afk_check)
  91.     if (g_iAFKCheck){
  92.  
  93.         // Spawn-Positionen aktualisieren
  94.         new iPlayers[32], pNum
  95.         get_players(iPlayers, pNum, "a")
  96.         for (new p = 0; p < pNum; p++){
  97.             get_user_origin(iPlayers[p], g_vOrigin[iPlayers[p]])
  98.         }
  99.  
  100.         // Loop anlegen falls nicht vorhanden
  101.         if (!task_exists(TASK_AFK_CHECK)) set_task(FREQ_AFK_CHECK, "func_afk_check", TASK_AFK_CHECK, _, _, "b")
  102.  
  103.         // Kick und Transferzeiten festlegen
  104.         if (get_pcvar_num(CVAR_afk_transfer_time) < 6) set_pcvar_num(CVAR_afk_transfer_time, 6)
  105.         if (get_pcvar_num(CVAR_afk_kick_time) < 6) set_pcvar_num(CVAR_afk_kick_time, 6)
  106.         g_iDropBomb = get_pcvar_num(CVAR_afk_drop_bomb)
  107.         g_iTransferTime = get_pcvar_num(CVAR_afk_transfer_time)
  108.         g_iKickTime = get_pcvar_num(CVAR_afk_kick_time)
  109.         g_iMinPlayers = get_pcvar_num(CVAR_afk_kick_players)
  110.     }
  111.  
  112.     // AFK Check ausgeschaltet
  113.     else{
  114.  
  115.         // Loop löschen falls vorhanden
  116.         if (task_exists(TASK_AFK_CHECK)) remove_task(TASK_AFK_CHECK)
  117.     }
  118.  
  119.  
  120. }
  121.  
  122. public event_round_end(){
  123.  
  124.     // Check darf nicht durchgeführt werden
  125.     g_iAFKCheck = 0
  126. }
  127.  
  128. public cmd_jointeam(id){
  129.  
  130.     // Spieler als Spectator markieren, sonst kann man den Kick umgehen, indem man keiner Klasse joined.
  131.     g_bSpec[id] = true
  132. }
  133.  
  134. public cmd_joinclass(id){
  135.  
  136.     // Spieler als Spectator entmarkieren
  137.     g_bSpec[id] = false
  138.  
  139.     // Positionen zurücksetzen
  140.     g_vOrigin[id] = {0, 0, 0}
  141.  
  142.     // Counter zurücksetzen
  143.     g_iAFKTime[id] = 0
  144.     g_iWarn[id] = 0
  145. }
  146.  
  147. public cmd_say(id){
  148.     new szMsg[64], szCommand[16], szTrash[2]
  149.     read_args(szMsg, 63)
  150.     remove_quotes(szMsg)
  151.     parse(szMsg, szCommand, 15, szTrash, 1)
  152.  
  153.     // Wir interessieren uns nur für Chatnachrichten die nicht mehr als 2 Wörter beinhalten
  154.     if (!szTrash[0]){
  155.  
  156.         new szPassword[32]
  157.         get_pcvar_string(CVAR_afk_spec_pw, szPassword, 31)
  158.         if (equal(szCommand, szPassword)){
  159.             client_print(id, print_chat, "[AMXX] %L", LANG_PLAYER, "AFK_ACCESS_GRANTED")
  160.             g_bSpecAccess[id] = true
  161.             return PLUGIN_HANDLED
  162.         }
  163.     }
  164.     return PLUGIN_CONTINUE
  165. }
  166.  
  167. public func_afk_check(taskid){
  168.     if (g_iAFKCheck){
  169.         new CsTeams:eTeam
  170.  
  171.         // Alle Spieler überprüfen
  172.         for (new id = 1; id <= g_iMaxPlayers; id++){
  173.  
  174.             // Bots nicht überprüfen
  175.             if (is_user_bot(id)) continue
  176.  
  177.             // AFK Funktionen für Specs
  178.             if (is_user_connected(id) && !is_user_hltv(id)){
  179.                 eTeam = cs_get_user_team(id)
  180.                 if (eTeam == CS_TEAM_SPECTATOR || eTeam == CS_TEAM_UNASSIGNED || g_bSpec[id]){
  181.  
  182.                     // Counter erhöhen
  183.                     g_iAFKTime[id]++
  184.  
  185.                     // Spec-Kick
  186.                     if (g_iAFKTime[id] >= g_iKickTime - MAX_WARN){
  187.                         func_kick_player(id)
  188.                     }
  189.                 }
  190.             }
  191.  
  192.             // AFK Funktionen für lebende Spieler
  193.             if (is_user_alive(id)){
  194.  
  195.                 // Positionen überprüfen
  196.                 if (g_iAFKCheck == 1){
  197.                     new vOrigin[3]
  198.                     get_user_origin(id, vOrigin)
  199.  
  200.                     if (g_vOrigin[id][0] != vOrigin[0] || g_vOrigin[id][1] != vOrigin[1]){
  201.                         g_vOrigin[id][0] = vOrigin[0]
  202.                         g_vOrigin[id][1] = vOrigin[1]
  203.                         g_vOrigin[id][2] = vOrigin[2]
  204.                         g_iAFKTime[id] = 0
  205.                         g_iWarn[id] = 0
  206.                     }
  207.                     else{
  208.                         g_iAFKTime[id]++
  209.                     }
  210.                 }
  211.  
  212.                 // Letzte Aktivität ermitteln
  213.                 else{
  214.                     new Float:fLastActivity
  215.                     fLastActivity = cs_get_user_lastactivity(id)
  216.  
  217.                     if (fLastActivity != g_fLastActivity[id]){
  218.                         g_fLastActivity[id] = fLastActivity
  219.                         g_iAFKTime[id] = 0
  220.                         g_iWarn[id] = 0
  221.                     }
  222.                     else{
  223.                         g_iAFKTime[id] = floatround((get_gametime() - fLastActivity) / FREQ_AFK_CHECK)
  224.                     }
  225.                 }
  226.  
  227.                 // Bombentransfer
  228.                 if (g_iDropBomb && g_iAFKTime[id] >= 3){
  229.                     if (g_iDropBomb == 1){
  230.                         if (pev(id, pev_weapons) & (1 << CSW_C4)) engclient_cmd(id, "drop", "weapon_c4")
  231.                     }
  232.                     else{
  233.                         func_transfer_bomb(id)
  234.                     }
  235.                 }
  236.  
  237.                 // Spec-Switch
  238.                 if (g_iAFKTime[id] >= g_iTransferTime - MAX_WARN){
  239.                     func_transfer_player(id)
  240.                 }
  241.             }
  242.         }
  243.     }
  244. }
  245.  
  246. public func_transfer_bomb(id){
  247.  
  248.     // Abbrechen wenn der Spieler keine Bombe hat
  249.     if (!(pev(id, pev_weapons) & (1 << CSW_C4))) return
  250.  
  251.     // Ermittle alle lebenden Terroristen
  252.     new iPlayers[32], pNum
  253.     get_players(iPlayers, pNum, "ae", "TERRORIST")
  254.  
  255.     // Abbrechen falls weniger als 2 Terroristen leben
  256.     if (pNum < 2) return
  257.  
  258.     // Finde den nächsten Terroristen der nicht AFK ist
  259.     new vCarrier[3], vRecipient[3], iRecipient, iDistance, iMinDistance = 999999
  260.     get_user_origin(id, vCarrier)
  261.     for (new p = 0; p < pNum; p++){
  262.         if (g_iAFKTime[iPlayers[p]] < 2){
  263.             get_user_origin(iPlayers[p], vRecipient)
  264.             iDistance = get_distance(vCarrier, vRecipient)
  265.             if (iDistance < iMinDistance){
  266.                 iMinDistance = iDistance
  267.                 iRecipient = iPlayers[p]
  268.             }
  269.         }
  270.     }
  271.  
  272.     // Abbrechen wenn alle Terroristen AFK sind
  273.     if (!iRecipient) return
  274.  
  275.     // Bombe transferieren
  276.     engclient_cmd(id, "drop", "weapon_c4")
  277.     new iC4 = engfunc(EngFunc_FindEntityByString, -1, "classname", "weapon_c4")
  278.     if (pev_valid(iC4)){
  279.         new iBackpack = pev(iC4, pev_owner)
  280.         if (iBackpack > g_iMaxPlayers){
  281.             set_pev(iBackpack, pev_flags, pev(iBackpack, pev_flags) | FL_ONGROUND)
  282.             dllfunc(DLLFunc_Touch, iBackpack, iRecipient)
  283.         }
  284.     }
  285.  
  286.     // Nachrichten anzeigen
  287.     new szRecipient[32], szMsg[128]
  288.     get_user_name(iRecipient, szRecipient, 31)
  289.     set_hudmessage(255, 255, 0, -1.0, 0.8, 0, 3.0, 6.0, 0.1, 0.2, -1)
  290.     for (new p = 0; p < pNum; p++){
  291.         if (iPlayers[p] != iRecipient){
  292.             format(szMsg, 127, "%L", iPlayers[p], "AFK_TRANSFER_BOMB", szRecipient)
  293.             show_hudmessage(iPlayers[p], "%s", szMsg)
  294.         }
  295.     }
  296.     format(szMsg, 127, "%L", iRecipient, "AFK_GOT_BOMB")
  297.     show_hudmessage(iRecipient, szMsg)
  298. }
  299.  
  300. public func_transfer_player(id){
  301.  
  302.     // Warnung anzeigen, wenn nicht schon max-mal verwarnt
  303.     if (g_iWarn[id] < MAX_WARN){
  304.         client_print(id, print_chat, "[AMXX] %L", LANG_PLAYER, "AFK_TRANSFER_WARN", floatround(FREQ_AFK_CHECK) * (MAX_WARN - g_iWarn[id]))
  305.         g_iWarn[id]++
  306.         return
  307.     }
  308.  
  309.     // Eigentlich sollte die Bombe schon transferiert worden sein
  310.     if (pev(id, pev_weapons) & (1 << CSW_C4)){
  311.         engclient_cmd(id, "drop", "weapon_c4")
  312.     }
  313.  
  314.     // Spieler tranferieren
  315.     if (is_user_alive(id)) user_silentkill(id)
  316.  
  317.     // Allow players to choose a team more than one time per round (Thanks ConnorMcLeod)
  318.     // I use this method caused of some issue with deathmatch (Player will be respawned as T or CT)
  319.     set_pdata_int(id, m_iJoiningState, get_pdata_int(id, m_iJoiningState, OFFSET_LINUX) & ~(1<<8), OFFSET_LINUX)
  320.     engclient_cmd(id, "jointeam", "6")
  321.     set_pdata_int(id, m_iJoiningState, get_pdata_int(id, m_iJoiningState, OFFSET_LINUX) & ~(1<<8), OFFSET_LINUX)
  322.     //cs_set_user_team(id, CS_TEAM_SPECTATOR)
  323.     //cs_reset_user_model(id)
  324.  
  325.     // Positionen zurücksetzen
  326.     g_vOrigin[id] = {0, 0, 0}
  327.  
  328.     // Counter zurücksetzen
  329.     g_iAFKTime[id] = 0
  330.     g_iWarn[id] = 0
  331.  
  332.     // Nachrichten anzeigen
  333.     new szName[32]
  334.     get_user_name(id, szName, 31)
  335.     client_print(0, print_chat, "[AMXX] %L", LANG_PLAYER, "AFK_TRANSFER_PLAYER", szName)
  336.     log_amx("Player ^"%s^" was transferred to the spectators for being AFK.", szName)
  337. }
  338.  
  339. public func_kick_player(id){
  340.  
  341.     // Abbrechen wenn es sich um einen Admin handelt
  342.     if (get_user_flags(id) & KICK_IMMUNITY || g_bSpecAccess[id]) return
  343.  
  344.     // Anzahl der  aktuellen Spieler ermitteln
  345.     new iCurrentPlayers = get_playersnum(1)
  346.  
  347.     // Sind noch Plätze frei?
  348.     if (iCurrentPlayers < g_iMinPlayers || !g_iMinPlayers) return
  349.  
  350.     // Warnung anzeigen, wenn nicht schon max-mal verwarnt
  351.     if (g_iWarn[id] < MAX_WARN){
  352.         client_print(id, print_chat, "[AMXX] %L", LANG_PLAYER, "AFK_KICK_WARN", floatround(FREQ_AFK_CHECK) * (MAX_WARN - g_iWarn[id]))
  353.         g_iWarn[id]++
  354.         return
  355.     }
  356.  
  357.     // Spieler kicken
  358.     new szMsg[192]
  359.     format(szMsg, 191, "%L", id, "AFK_KICK_REASON")
  360.     server_cmd("kick #%d ^"%s^"", get_user_userid(id), szMsg)
  361.  
  362.     // Nachrichten anzeigen
  363.     new szName[32]
  364.     get_user_name(id, szName, 31)
  365.     client_print(0, print_chat, "[AMXX] %L", LANG_PLAYER, "AFK_KICK_PLAYER", szName)
  366.     log_amx("Player ^"%s^" was kicked for being AFK.", szName)
  367. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement