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

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

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

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

Помогите избавиться от ошибки

, AFK Manager
Статус пользователя Andrey_iokhin
сообщение 6.9.2014, 10:44
Сообщение #1
Стаж: 13 лет

Сообщений: 350
Благодарностей: 45
Полезность: 116

День добрый=)
Есть плагин AFK Manager.
Все плагины в таком духе перепробовал,но этот остается лучшим)

Но вылезает изредка ошибка:
Скрытый текст
Код
L 09/06/2014 - 00:07:30: Start of error session.
L 09/06/2014 - 00:07:30: Info (map "de_aztec") (file "addons/amxmodx/logs/error_20140906.log")
L 09/06/2014 - 00:07:30: [FAKEMETA] Invalid entity
L 09/06/2014 - 00:07:30: [AMXX] Displaying debug trace (plugin "afk_manager.amxx")
L 09/06/2014 - 00:07:30: [AMXX] Run time error 10: native error (native "pev")
L 09/06/2014 - 00:07:30: [AMXX]    [0] afk_manager.sma::func_transfer_bomb (line 251)
L 09/06/2014 - 00:07:30: [AMXX]    [1] afk_manager.sma::func_afk_check (line 203)


Вот исходник:
Скрытый текст
Код
#define PLUGIN  "AFK Manager"
#define AUTHOR  "Leon McVeran"
#define VERSION         "v1.4d"
#define PDATE   "19th May 2010"

#include <amxmodx>
#include <amxmisc>
#include <cstrike>
#include <fakemeta>

#define KICK_IMMUNITY           ADMIN_BAN

#define TASK_AFK_CHECK          142500
#define FREQ_AFK_CHECK          5.0
#define MAX_WARN                3

static const OFFSET_LINUX = 5
new const m_iJoiningState = 125

new bool:g_bSpec[33]
new Float:g_fLastActivity[33]
new g_iAFKCheck
new g_iAFKTime[33]
new g_iDropBomb
new g_iKickTime
new g_iMaxPlayers
new g_iMinPlayers
new g_iTransferTime
new g_iWarn[33]
new g_vOrigin[33][3]

new CVAR_afk_drop_bomb
new CVAR_afk_check
new CVAR_afk_transfer_time
new CVAR_afk_kick_time
new CVAR_afk_kick_players

public plugin_init(){
        register_plugin(PLUGIN, VERSION, AUTHOR)
        register_dictionary("afk_manager.txt")

        register_logevent("event_round_end", 2, "0=World triggered", "1=Round_End")
        register_logevent("event_round_start", 2, "0=World triggered", "1=Round_Start")

        // Support der alten Mens
        register_clcmd("jointeam", "cmd_jointeam") // new menu
        register_menucmd(register_menuid("Team_Select", 1), 511, "cmd_jointeam") // old menu

        register_clcmd("joinclass", "cmd_joinclass") // new menu
        register_menucmd(register_menuid("Terrorist_Select", 1), 511, "cmd_joinclass") // old menu
        register_menucmd(register_menuid("CT_Select", 1), 511, "cmd_joinclass") // old menu

        CVAR_afk_check = register_cvar("afk_check", "2")
        CVAR_afk_drop_bomb = register_cvar("afk_drop_bomb", "2")
        CVAR_afk_transfer_time = register_cvar("afk_transfer_time", "9")
        CVAR_afk_kick_time = register_cvar("afk_kick_time", "0")
        CVAR_afk_kick_players = register_cvar("afk_kick_players", "28")
}

public plugin_cfg(){
        g_iMaxPlayers = get_maxplayers()
}

public client_connect(id){

        // Spieler als Spectator entmarkieren
        g_bSpec[id] = false

        // Positionen zurcksetzen
        g_vOrigin[id] = {0, 0, 0}

        // Counter zurcksetzen
        g_iAFKTime[id] = 0
        g_iWarn[id] = 0
}

public event_round_start(){

        // AFK Check eingeschaltet
        g_iAFKCheck = get_pcvar_num(CVAR_afk_check)
        if (g_iAFKCheck){

                // Spawn-Positionen aktualisieren
                new iPlayers[32], pNum
                get_players(iPlayers, pNum, "a")
                for (new p = 0; p < pNum; p++){
                        get_user_origin(iPlayers[p], g_vOrigin[iPlayers[p]])
                }

                // Loop anlegen falls nicht vorhanden
                if (!task_exists(TASK_AFK_CHECK)) set_task(FREQ_AFK_CHECK, "func_afk_check", TASK_AFK_CHECK, _, _, "b")

                // Kick und Transferzeiten festlegen
                if (get_pcvar_num(CVAR_afk_transfer_time) < 6) set_pcvar_num(CVAR_afk_transfer_time, 6)
                if (get_pcvar_num(CVAR_afk_kick_time) < 6) set_pcvar_num(CVAR_afk_kick_time, 6)
                g_iDropBomb = get_pcvar_num(CVAR_afk_drop_bomb)
                g_iTransferTime = get_pcvar_num(CVAR_afk_transfer_time)
                g_iKickTime = get_pcvar_num(CVAR_afk_kick_time)
                g_iMinPlayers = get_pcvar_num(CVAR_afk_kick_players)
        }

        // AFK Check ausgeschaltet
        else{

                // Loop lн¶ЉнІЁen falls vorhanden
                if (task_exists(TASK_AFK_CHECK)) remove_task(TASK_AFK_CHECK)
        }


}

public cmd_jointeam(id){

        // Spieler als Spectator markieren, sonst kann man den Kick umgehen, indem man keiner Klasse joined.
        g_bSpec[id] = true
}

public cmd_joinclass(id){

        // Spieler als Spectator entmarkieren
        g_bSpec[id] = false

        // Positionen zurcksetzen
        g_vOrigin[id] = {0, 0, 0}

        // Counter zurcksetzen
        g_iAFKTime[id] = 0
        g_iWarn[id] = 0
}

public event_round_end(){

        // Check darf nicht durchgefhrt werden
        g_iAFKCheck = 0
}

public func_afk_check(taskid){
        if (g_iAFKCheck){
                new CsTeams:eTeam

                // Alle Spieler berprfen
                for (new id = 1; id <= g_iMaxPlayers; id++){

                        // Bots nicht berprfen
                        if (is_user_bot(id)) continue

                        // AFK Funktionen fr Specs
                        if (is_user_connected(id) && !is_user_hltv(id)){
                                eTeam = cs_get_user_team(id)
                                if (eTeam == CS_TEAM_SPECTATOR || eTeam == CS_TEAM_UNASSIGNED || g_bSpec[id]){

                                        // Counter erhнµћнґ®
                                        g_iAFKTime[id]++

                                        // Spec-Kick
                                        if (g_iAFKTime[id] >= g_iKickTime - MAX_WARN){
                                                func_kick_player(id)
                                        }
                                }
                        }

                        // AFK Funktionen fr lebende Spieler
                        if (is_user_alive(id)){

                                // Positionen berprfen
                                if (g_iAFKCheck == 1){
                                        new vOrigin[3]
                                        get_user_origin(id, vOrigin)

                                        if (g_vOrigin[id][0] != vOrigin[0] || g_vOrigin[id][1] != vOrigin[1]){
                                                g_vOrigin[id][0] = vOrigin[0]
                                                g_vOrigin[id][1] = vOrigin[1]
                                                g_vOrigin[id][2] = vOrigin[2]
                                                g_iAFKTime[id] = 0
                                                g_iWarn[id] = 0
                                        }
                                        else{
                                                g_iAFKTime[id]++
                                        }
                                }

                                // Letzte AktivitгІ ermitteln
                                else{
                                        new Float:fLastActivity
                                        fLastActivity = cs_get_user_lastactivity(id)

                                        if (fLastActivity != g_fLastActivity[id]){
                                                g_fLastActivity[id] = fLastActivity
                                                g_iAFKTime[id] = 0
                                                g_iWarn[id] = 0
                                        }
                                        else{
                                                g_iAFKTime[id] = floatround((get_gametime() - fLastActivity) / FREQ_AFK_CHECK)
                                        }
                                }

                                // Bombentransfer
                                if (g_iDropBomb && g_iAFKTime[id] >= 3){
                                        if (g_iDropBomb == 1){
                                                if (pev(id, pev_weapons) & (1 << CSW_C4)) engclient_cmd(id, "drop", "weapon_c4")
                                        }
                                        else{
                                                func_transfer_bomb(id)
                                        }
                                }

                                // Spec-Switch
                                if (g_iAFKTime[id] >= g_iTransferTime - MAX_WARN){
                                        func_transfer_player(id)
                                }
                        }
                }
        }
}

public func_transfer_bomb(id){

        // Abbrechen wenn der Spieler keine Bombe hat
        if (!(pev(id, pev_weapons) & (1 << CSW_C4))) return

        // Ermittle alle lebenden Terroristen
        new iPlayers[32], pNum
        get_players(iPlayers, pNum, "ae", "TERRORIST")

        // Abbrechen falls weniger als 2 Terroristen leben
        if (pNum < 2) return

        // Finde den nгўЁsten Terroristen der nicht AFK ist
        new vCarrier[3], vRecipient[3], iRecipient, iDistance, iMinDistance = 999999
        get_user_origin(id, vCarrier)
        for (new p = 0; p < pNum; p++){
                if (g_iAFKTime[iPlayers[p]] < 2){
                        get_user_origin(iPlayers[p], vRecipient)
                        iDistance = get_distance(vCarrier, vRecipient)
                        if (iDistance < iMinDistance){
                                iMinDistance = iDistance
                                iRecipient = iPlayers[p]
                        }
                }
        }

        // Abbrechen wenn alle Terroristen AFK sind
        if (!iRecipient) return

        // Bombe transferieren
        engclient_cmd(id, "drop", "weapon_c4")
        new iC4 = engfunc(EngFunc_FindEntityByString, -1, "classname", "weapon_c4")
        if (pev_valid(iC4)){
                new iBackpack = pev(iC4, pev_owner)
                if (iBackpack > g_iMaxPlayers){
                        set_pev(iBackpack, pev_flags, pev(iBackpack, pev_flags) | FL_ONGROUND)
                        dllfunc(DLLFunc_Touch, iBackpack, iRecipient)
                }
        }

        // Nachrichten anzeigen
        new szRecipient[32], szMsg[128]
        get_user_name(iRecipient, szRecipient, 31)
        set_hudmessage(255, 255, 0, -1.0, 0.8, 0, 3.0, 6.0, 0.1, 0.2, -1)
        for (new p = 0; p < pNum; p++){
                if (iPlayers[p] != iRecipient){
                        format(szMsg, 127, "%L", iPlayers[p], "AFK_TRANSFER_BOMB", szRecipient)
                        show_hudmessage(iPlayers[p], "%s", szMsg)
                }
        }
        format(szMsg, 127, "%L", iRecipient, "AFK_GOT_BOMB")
        show_hudmessage(iRecipient, szMsg)
}

public func_transfer_player(id){

        // Warnung anzeigen, wenn nicht schon max-mal verwarnt
        if (g_iWarn[id] < MAX_WARN){
                ChatColor(id, "!g[Инфо]!y %L", LANG_PLAYER, "AFK_TRANSFER_WARN", floatround(FREQ_AFK_CHECK) * (MAX_WARN - g_iWarn[id]))
                g_iWarn[id]++
                return
        }

        // Eigentlich sollte die Bombe schon transferiert worden sein
        if (pev(id, pev_weapons) & (1 << CSW_C4)){
                engclient_cmd(id, "drop", "weapon_c4")
        }

        // Spieler tranferieren
        if (is_user_alive(id)) user_silentkill(id)

        // Allow players to choose a team more than one time per round (Thanks ConnorMcLeod)
        // I use this method caused of some issue with deathmatch (Player will be respawned as T or CT)
        set_pdata_int(id, m_iJoiningState, get_pdata_int(id, m_iJoiningState, OFFSET_LINUX) & ~(1<<8), OFFSET_LINUX)
        engclient_cmd(id, "jointeam", "6")
        set_pdata_int(id, m_iJoiningState, get_pdata_int(id, m_iJoiningState, OFFSET_LINUX) & ~(1<<8), OFFSET_LINUX)
        //cs_set_user_team(id, CS_TEAM_SPECTATOR)
        //cs_reset_user_model(id)

        // Positionen zurcksetzen
        g_vOrigin[id] = {0, 0, 0}

        // Counter zurcksetzen
        g_iAFKTime[id] = 0
        g_iWarn[id] = 0

        // Nachrichten anzeigen
        new szName[32]
        get_user_name(id, szName, 31)
        ChatColor(0, "!g[Инфо]!y %L", LANG_PLAYER, "AFK_TRANSFER_PLAYER", szName)
}

public func_kick_player(id){

        // Abbrechen wenn es sich um einen Admin handelt
        if (get_user_flags(id) & KICK_IMMUNITY) return

        // Anzahl der  aktuellen Spieler ermitteln
        new iCurrentPlayers = get_playersnum(1)

        // Sind noch Plгієe frei?
        if (iCurrentPlayers < g_iMinPlayers || !g_iMinPlayers) return

        // Warnung anzeigen, wenn nicht schon max-mal verwarnt
        if (g_iWarn[id] < MAX_WARN){
                ChatColor(id, "!g[Инфо]!y %L", LANG_PLAYER, "AFK_KICK_WARN", floatround(FREQ_AFK_CHECK) * (MAX_WARN - g_iWarn[id]))
                g_iWarn[id]++
                return
        }

        // Spieler kicken
        new szMsg[192]
        format(szMsg, 191, "%L", id, "AFK_KICK_REASON")
        server_cmd("kick #%d ^"%s^"", get_user_userid(id), szMsg)

        // Nachrichten anzeigen
        new szName[32]
        get_user_name(id, szName, 31)
        ChatColor(0, "!g[Инфо]!y %L", LANG_PLAYER, "AFK_KICK_PLAYER", szName)
}

stock ChatColor(const id, const input[], any:...)
{
   new count = 1, players[32]
   static msg[191]
   vformat(msg, 190, input, 3)
  
   replace_all(msg, 190, "!g", "^4")
   replace_all(msg, 190, "!y", "^1")
   replace_all(msg, 190, "!t", "^3")
  
   if (id) players[0] = id; else get_players(players, count, "ch")
   {
      for (new i = 0; i < count; i++)
      {
         if (is_user_connected(players[i]))
         {
            message_begin(MSG_ONE_UNRELIABLE, get_user_msgid("SayText"), _, players[i])
            write_byte(players[i]);
            write_string(msg);
            message_end();
         }
      }
   }
}


Помогите пожалуйста избавиться от этой ошибки)
Перейти в начало страницы         Просмотр профиля    Отправить личное сообщение
   Цитировать сообщение
Статус пользователя MiXa
сообщение 6.9.2014, 20:59
Сообщение #2


Стаж: 12 лет

Сообщений: 415
Благодарностей: 91
Полезность: 181

Andrey_iokhin,
не передавай бомбу другому игроку а просто викидывай, я так и не смог решить проблему,может скриптеры помогут


Допомога з встановлення / налаштування / оновлення за $ :>>> Сервери \ Моди \ Плагіни \ Модулі
Перейти в начало страницы         Просмотр профиля    Отправить личное сообщение
Поблагодарили 1 раз
   + Цитировать сообщение
Статус пользователя Andrey_iokhin
сообщение 7.9.2014, 16:38
Сообщение #3
Стаж: 13 лет

Сообщений: 350
Благодарностей: 45
Полезность: 116

Лан) Может кто еще посмотрит_)
Перейти в начало страницы         Просмотр профиля    Отправить личное сообщение
   + Цитировать сообщение
Статус пользователя ex3m777
сообщение 7.9.2014, 16:40
Сообщение #4


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

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

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

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

Код:
/*
neygomon created ^_^ | http://www.neugomon.ru
Original code: Freedo.m
*/

#include <amxmodx>
#include <fakemeta>
#include <colorprint>
#pragma semicolon 1

#define ACCESS_LEVEL_IMMUNITY (ADMIN_MENU) // Уровень доступа позволяющий беспрепятственно сидеть в зрителях
#define TIME_AFK_CHECK 25.0 // Интервал между проверками игроков, чем меньше значение, тем больше нагрузка на сервер.
#define MAX_AFK_WARNING 3 // Количество предупреждений после которых последует наказание.
#define TIME_SPECT_CHECK 60.0 // Интервал между проверками зрителей, чем меньше значение, тем больше нагрузка на сервер.
#define MAX_SPECT_CHECK_PL 2 // Количество проверок игрока на нахождение в зрителях, после которых его кикнет
#define MIN_PLAYERS_CHECK 20 // Минимальное количество игроков, когда включается функция проверки зрителей.
// #define NOROUND // Включает поддержку серверов с бесконечным раундом. Например CSDM, GunGame
// #define BOMB_TRANSFER // Передавать ли бомбу игрокам, если игрок AFK.
// [Закомментируйте, если хотите, чтобы бомба просто выкидывалась]
// !!! Включение прибавит чутка нагрузки !!!
#if defined NOROUND
#include <hamsandwich>
#endif
#define get_bit(%1,%2) (%1 & (1 << (%2 & 31)))
#define set_bit(%1,%2) %1 |= (1 << (%2 & 31))
#define clr_bit(%1,%2) %1 &= ~(1 << (%2 & 31))

new Float:g_fOldOrigin[33][3], Float:g_fOldAngles[33][3];
new g_iBitValid, g_iWarning[33];
new g_count[33];
new name[32];
new players[32], pnum;

public plugin_init()
{
register_plugin("Afk Control", "0.5", "neygomon");
#if defined NOROUND
RegisterHam(Ham_Spawn, "player", "PlrSpwn_Post", true);
#else
register_event("HLTV", "RoundStart", "a", "1=0", "2=0");
#endif
set_task(TIME_SPECT_CHECK, "SpectatorCheck", .flags = "b");
}

public client_putinserver(id)
{
if(is_user_bot(id) || is_user_hltv(id)) return;
set_bit(g_iBitValid, id);
g_count[id] = 0;
}

public client_disconnect(id)
clr_bit(g_iBitValid, id);
#if defined NOROUND
public PlrSpwn_Post(id)
{
if(is_user_alive(id))
set_task(1.0, "CheckSpawn_Pos", id);
}
#else
public RoundStart()
set_task(1.0, "CheckSpawn_Pos");
#endif
public CheckSpawn_Pos(id)
{
#if defined NOROUND
g_iWarning[id] = 0;

pev(id, pev_origin, g_fOldOrigin[id]);
pev(id, pev_angles, g_fOldAngles[id]);
#else
get_players(players, pnum, "ah");
for(new i; i < pnum; i++)
{
g_iWarning[players[i]] = 0;

pev(players[i], pev_origin, g_fOldOrigin[players[i]]);
pev(players[i], pev_angles, g_fOldAngles[players[i]]);
}
if(!task_exists(87892789))
set_task(TIME_AFK_CHECK, "AfkCheck", 87892789, .flags="b");
else
change_task(87892789, TIME_AFK_CHECK);
#endif
}

public AfkCheck()
{
get_players(players, pnum, "ah");
for(new i; i < pnum; i++)
{
new Float:fNewOrigin[3], Float:fNewAngles[3];
pev(players[i], pev_origin, fNewOrigin);
pev(players[i], pev_angles, fNewAngles);
if(xs_vec_equal(g_fOldOrigin[players[i]], fNewOrigin) && xs_vec_equal(g_fOldAngles[players[i]], fNewAngles))
{
get_user_name(players[i], name, charsmax(name));

if(++g_iWarning[players[i]] >= MAX_AFK_WARNING)
{
user_kill(players[i], 1);
engclient_cmd(players[i], "jointeam", "6");
client_cmd(players[i], "spk events/friend_died");
}
else client_cmd(players[i], "spk events/tutor_msg");
PrintChat(players[i], _, _, "^4[Server]^1 Вы не проявляете активность! Предупреждения: ^3%i/%i", g_iWarning[players[i]], MAX_AFK_WARNING);

if(user_has_weapon(players[i], CSW_C4))
{
engclient_cmd(players[i], "drop", "weapon_c4");
#if defined BOMB_TRANSFER
for(new x; x < pnum; x++)
{
if(players[x] != players[i] && is_user_alive(players[x]) && get_pdata_int(players[x], 114) == 1)
{
new iWeaponC4 = engfunc(EngFunc_FindEntityByString, -1, "classname", "weapon_c4");
if(pev_valid(iWeaponC4))
{
new iOwner = pev(iWeaponC4, pev_owner);
if(iOwner > pnum)
{
set_pev(iOwner, pev_flags, pev(iOwner, pev_flags) | FL_ONGROUND);
dllfunc(DLLFunc_Touch, iOwner, players[x]);
}
}
break;
}
}
#endif
}
}
else
{
if(g_iWarning[players[i]]) g_iWarning[players[i]] = 0;
xs_vec_copy(fNewOrigin, g_fOldOrigin[players[i]]);
xs_vec_copy(fNewAngles, g_fOldAngles[players[i]]);
}
}
}

public SpectatorCheck()
{
if(get_playersnum() < MIN_PLAYERS_CHECK) return;
static players[32], pcount;
get_players(players, pcount, "h");
for(new i; i < pcount; i++)
{
if(!get_bit(g_iBitValid, players[i]) || get_user_flags(players[i]) & ACCESS_LEVEL_IMMUNITY) continue;
switch(get_pdata_int(players[i], 114))
{
case 0, 3: if(++g_count[players[i]] >= MAX_SPECT_CHECK_PL)
{
get_user_name(players[i], name, charsmax(name));
server_cmd("kick #%d ^"Вы были кикнуты из-за длительного нахождения в зрителях.^"", get_user_userid(players[i]));
}
}
}
}

stock bool:xs_vec_equal(const Float:vec1[], const Float:vec2[])
return (vec1[0] == vec2[0]) && (vec1[1] == vec2[1]) && (vec1[2] == vec2[2]);

stock xs_vec_copy(const Float:vecIn[], Float:vecOut[])
{
vecOut[0] = vecIn[0];
vecOut[1] = vecIn[1];
vecOut[2] = vecIn[2];
}


Перейти в начало страницы         Просмотр профиля    Отправить личное сообщение
   + Цитировать сообщение
Статус пользователя Andrey_iokhin
сообщение 7.9.2014, 17:09
Сообщение #5
Стаж: 13 лет

Сообщений: 350
Благодарностей: 45
Полезность: 116

Прост все альтернативные плагины,не понятно работают.
На маленьких картах ,где раунд длиться менее 45 секунд,АФК может простоять хоть минут 20.
То-есть при новом раунде плагин считает эти секунды заново.

А этот плагин (который скинул я) не смотрит на это,а переносит игрока при недвижимости 45 сек.




Вот то что ты скинул , он при новом раунде считает заново время
Перейти в начало страницы         Просмотр профиля    Отправить личное сообщение
   + Цитировать сообщение
Статус пользователя ex3m777
сообщение 7.9.2014, 17:09
Сообщение #6


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

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

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

попробуй тогда такой

Код:
#include <amxmodx>
#include <cstrike>
#include <fakemeta>
#include <hamsandwich>
#pragma tabsize 0

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

#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", "40") // Максимальное время простоя
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(0, 255, 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:
{
server_cmd("kick #%d ^"Вы были кикнуты из зрителей, т.к. сервер почти заполнен^"", get_user_userid(id))
}
case PUNISH_AFK_KICK:
{
server_cmd("kick #%d ^"Вы были кикнуты за простой^"", get_user_userid(id))
}
case PUNISH_AFK_SPECTATOR:
{
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)
}
}
}


Перейти в начало страницы         Просмотр профиля    Отправить личное сообщение
Поблагодарили 1 раз
   + Цитировать сообщение
Статус пользователя Andrey_iokhin
сообщение 7.9.2014, 17:11
Сообщение #7
Стаж: 13 лет

Сообщений: 350
Благодарностей: 45
Полезность: 116

Ок=) попробую,буду у компа)

Хотя этот вариант тоже кажись пробовал

Отредактировал: Andrey_iokhin, - 7.9.2014, 17:14
Перейти в начало страницы         Просмотр профиля    Отправить личное сообщение
   + Цитировать сообщение
  Ответить в данную темуНачать новую тему
 
0 пользователей и 1 гостей читают эту тему: