Написание плагинов

NeLifeASkazka

Участник
Сообщения
128
Реакции
70
Здравствуйте, нужен плагин блокирующий CT (передвигаться и стрелять нельзя) на N секунд (грубо говоря mp_freezetime только для СT )
code:
#define dTime 10.0 // время через которое КТ смогут ходить
Handle hTimer;
public void OnPluginStart(){
    HookEvent("round_start", OnRoundStart);
    HookEvent("player_spawn", OnPlayerSpawn);
}
public Action OnRoundStart(Event event, const char[] name, bool dontBroadcast){
    hTimer = CreateTimer(dTime, UnFreeze);
}
public Action OnPlayerSpawn(Event event, const char[] name, bool dontBroadcast){
    int client = GetClientOfUserId(event.GetInt("userid"));
    if(hTimer)
    {
        if(IsClientInGame(client) && IsPlayerAlive(client) && GetClientTeam(client) == 3)
        {
            FreezeClient(client, true);
        }
    }
}
public Action UnFreeze(Handle timer){
    for(int client = 1; client <= MaxClients; client++)
    {
        if(IsClientInGame(client))
        {
            FreezeClient(client, false);
        }
    }
}
stock void FreezeClient(int client, bool freeze){
    SetEntityFlags(client, freeze ? (GetEntityFlags(client) | FL_FROZEN) : (GetEntityFlags(client) & ~FL_FROZEN));
}
 

Grey83

не пишу плагины с весны 2022
Сообщения
8,521
Реакции
4,980

Grey83

не пишу плагины с весны 2022
Сообщения
8,521
Реакции
4,980
А вообще заморозка вроде полностью все блокирует
Запусти сервак с ботами и заморозь их после того как они закупятся. Потом попробуй постоять возле ботов противоположной команды.
Сообщения автоматически склеены:

@paradoks5312, так не сможет ни стрелять ни передвигаться (даже может в воздухе зависнуть, если в момент заморозки был в воздухе ^_^):
C-подобный:
#pragma semicolon 1
#pragma newdecls required

#include <sdktools_hooks>
#include <sdktools_functions>

static const float
    NULL_SPEED[3],
    CT_FREEZE_TIME = 5.0;    // время блокировки передвижения и стрельбы CT

Handle hTimer;

public void OnPluginStart()
{
    HookEvent("round_start", Event_Start, EventHookMode_PostNoCopy);
    HookEvent("round_freeze_end", Event_Start, EventHookMode_PostNoCopy);
}

public void OnMapStart()
{
    hTimer = null;
}

public void Event_Start(Event event, const char[] name, bool dontBroadcast)
{
    if(hTimer)
    {
        CloseHandle(hTimer);
        hTimer = null;
    }

    if(name[6] == 'f') hTimer = CreateTimer(CT_FREEZE_TIME, Timer_Unfreeze, _, TIMER_FLAG_NO_MAPCHANGE);
}

public Action Timer_Unfreeze(Handle timer)
{
    hTimer = null;
    return Plugin_Stop;
}

public Action OnPlayerRunCmd(int client, int &buttons, int &impulse, float vel[3], float angles[3], int &weapon, int &subtype, int &cmdnum, int &tickcount, int &seed, int mouse[2])
{
    if(hTimer && IsClientInGame(client) && GetClientTeam(client) == 3 && IsPlayerAlive(client))
    {
        TeleportEntity(client, NULL_VECTOR, NULL_VECTOR, NULL_SPEED);
        buttons = 0;
        return Plugin_Changed
    }
    return Plugin_Continue;
}
 
Последнее редактирование:

Max Rhine

Участник
Сообщения
172
Реакции
29
Хотя вроде ходить ирок не должен был тоже. Какими кнопками передвигаешься?
Это нормальное явление. Тоже столкнулся с подобной проблемой. Из-за большого количества нажатых кнопок, код не всегда выполнялся. Лучше в этом случае ставить vel = 0.0 ( в теории ).
P.s. ещё в sm есть функция заморозки игрока
 
Последнее редактирование:

NeLifeASkazka

Участник
Сообщения
128
Реакции
70
Запусти сервак с ботами и заморозь их после того как они закупятся. Потом попробуй постоять возле ботов противоположной команды.
Только боты могут камерой вертеть, а игроки нет
 

Grey83

не пишу плагины с весны 2022
Сообщения
8,521
Реакции
4,980
@NeLifeASkazka, при чём тут вертеть? Они же в тебя стреляют сразу после выключения ноклипа (хотя должны и при включенном стрелять).
 

NeLifeASkazka

Участник
Сообщения
128
Реакции
70
@NeLifeASkazka, при чём тут вертеть? Они же в тебя стреляют сразу после выключения ноклипа (хотя должны и при включенном стрелять).
Они начинают стрелять/ двигаться через 10 секунд
Игроки же вообще ничего не смогут сделать первые 10 секунд
То есть не смогут стрелять, двигаться, и даже вертеть камерой/ двигать мышкой/ менять угол обзора
 

paradoks5312

Участник
Сообщения
34
Реакции
7
code:
#define dTime 10.0 // время через которое КТ смогут ходить
Handle hTimer;
public void OnPluginStart(){
    HookEvent("round_start", OnRoundStart);
    HookEvent("player_spawn", OnPlayerSpawn);
}
public Action OnRoundStart(Event event, const char[] name, bool dontBroadcast){
    hTimer = CreateTimer(dTime, UnFreeze);
}
public Action OnPlayerSpawn(Event event, const char[] name, bool dontBroadcast){
    int client = GetClientOfUserId(event.GetInt("userid"));
    if(hTimer)
    {
        if(IsClientInGame(client) && IsPlayerAlive(client) && GetClientTeam(client) == 3)
        {
            FreezeClient(client, true);
        }
    }
}
public Action UnFreeze(Handle timer){
    for(int client = 1; client <= MaxClients; client++)
    {
        if(IsClientInGame(client))
        {
            FreezeClient(client, false);
        }
    }
}
stock void FreezeClient(int client, bool freeze){
    SetEntityFlags(client, freeze ? (GetEntityFlags(client) | FL_FROZEN) : (GetEntityFlags(client) & ~FL_FROZEN));
}
Идеально работает!))) двигаться нельзя , стрелять тоже (боты могут вертеться - но это и не нужно)
Запусти сервак с ботами и заморозь их после того как они закупятся. Потом попробуй постоять возле ботов противоположной команды.
Сообщения автоматически склеены:

@paradoks5312, так не сможет ни стрелять ни передвигаться (даже может в воздухе зависнуть, если в момент заморозки был в воздухе ^_^):
C-подобный:
#pragma semicolon 1
#pragma newdecls required

#include <sdktools_hooks>
#include <sdktools_functions>

static const float
    NULL_SPEED[3],
    CT_FREEZE_TIME = 5.0;    // время блокировки передвижения и стрельбы CT

Handle hTimer;

public void OnPluginStart()
{
    HookEvent("round_start", Event_Start, EventHookMode_PostNoCopy);
    HookEvent("round_freeze_end", Event_Start, EventHookMode_PostNoCopy);
}

public void OnMapStart()
{
    hTimer = null;
}

public void Event_Start(Event event, const char[] name, bool dontBroadcast)
{
    if(hTimer)
    {
        CloseHandle(hTimer);
        hTimer = null;
    }

    if(name[6] == 'f') hTimer = CreateTimer(CT_FREEZE_TIME, Timer_Unfreeze, _, TIMER_FLAG_NO_MAPCHANGE);
}

public Action Timer_Unfreeze(Handle timer)
{
    hTimer = null;
    return Plugin_Stop;
}

public Action OnPlayerRunCmd(int client, int &buttons, int &impulse, float vel[3], float angles[3], int &weapon, int &subtype, int &cmdnum, int &tickcount, int &seed, int mouse[2])
{
    if(hTimer && IsClientInGame(client) && GetClientTeam(client) == 3 && IsPlayerAlive(client))
    {
        TeleportEntity(client, NULL_VECTOR, NULL_VECTOR, NULL_SPEED);
        buttons = 0;
        return Plugin_Changed
    }
    return Plugin_Continue;
}

Так же все работает , но движения не блокируются, - а замедляются на 99% - по сути передвигаться можно но очень медленно (50 сек для того что бы дойти с респы CT до длины на de_dust2).
Но ваш первый вариант где бег не блочиться (блочиться только стрельба и броски гранат) имеет шанс на "жизнь" - если немного доработать и реализовать как блокировка для читеров по стим ид
(самое забавное в этом: - можешь передвигаться , стрелять(но стрельбу видит только клиент , - сервер не пропускает действие от выстрела)). По сути неплохая издевка над нарушителем (а если привязать к материал админс и использовать это вместо основного бана - это топ!)))

P.S Всем огромное спасибо за оказанную помощь!))
 

khood

Участник
Сообщения
214
Реакции
51
C-подобный:
L 09/30/2023 - 21:25:33: [SM] Exception reported: Invalid timer handle d5e00c9c (error 3)
L 09/30/2023 - 21:25:33: [SM] Blaming: Screamer.smx
L 09/30/2023 - 21:25:33: [SM] Call stack trace:
L 09/30/2023 - 21:25:33: [SM]   [0] KillTimer
L 09/30/2023 - 21:25:33: [SM]   [1] Line 122, C:\Users\\AppData\Local\Temp\Rar$DIa6484.26508\Screamer.sp::Timer_Kill

C-подобный:
fix error pls
 

Вложения

  • Screamer.sp
    5.4 КБ · Просмотры: 4

Palonez

бб братки
Сообщения
3,035
Реакции
1,837
C-подобный:
L 09/30/2023 - 21:25:33: [SM] Exception reported: Invalid timer handle d5e00c9c (error 3)
L 09/30/2023 - 21:25:33: [SM] Blaming: Screamer.smx
L 09/30/2023 - 21:25:33: [SM] Call stack trace:
L 09/30/2023 - 21:25:33: [SM]   [0] KillTimer
L 09/30/2023 - 21:25:33: [SM]   [1] Line 122, C:\Users\\AppData\Local\Temp\Rar$DIa6484.26508\Screamer.sp::Timer_Kill
FIX EROR PLS
C-подобный:
public Action Timer_Kill(Handle timer, int target)
{
    KillTimer(TS[target]);
    ClientCommand(target, "r_screenoverlay 0");
    EmitSoundToClient(target, "Screamer/Serd.mp3", _, _, 0);
    KillTimer(TS2[target]);
}

------------------------------>

public Action Timer_Kill(Handle timer, int target)
{
    if(TS[target] != INVALID_HANDLE)
        TS[target] = null;

    ClientCommand(target, "r_screenoverlay 0");
    EmitSoundToClient(target, "Screamer/Serd.mp3", _, _, 0);
    if(TS2[target] != INVALID_HANDLE)
        TS2[target] = null;
}
 

Grey83

не пишу плагины с весны 2022
Сообщения
8,521
Реакции
4,980
@khood, исправил проблему таймеров и заодно убрал утечку памяти из-за менюшек.
Ну и прочие исправления. Кроме того будет компилиться с помощью SM1.11 без предупреждений.
 

Вложения

  • Screamer 1.1.0_10.10.2023.sp
    5.8 КБ · Просмотры: 8

7pElllHuK

Участник
Сообщения
1,416
Реакции
465
Добрый вечер, подскажите пожалуйста, в чем проблема. Иногда выводит не верное число убитых игроков в голову. К примеру: я убил 1 игрока в голову, пишет что убил 10, при том что всего играло 3 человека
Сам плагин:
Код:
#include <sdktools>

public void OnPluginStart()
{
    HookEvent("player_death", Event_PlayerDeath);
    HookEvent("round_end", Event_RoundEnd);
}

int g_iCountHeadshoots[MAXPLAYERS+1];

void Event_PlayerDeath(Event event, const char[] name, bool dontBroadcast)
{
    int client = GetClientOfUserId(event.GetInt("userid"));
    int attacker = GetClientOfUserId(event.GetInt("attacker"));

    if (event.GetBool("headshot") && GetClientTeam(client) != GetClientTeam(attacker))
        g_iCountHeadshoots[attacker]++;
}

void Event_RoundEnd(Event event, const char[] name, bool dontBroadcast)
{
    for (int i = 1; i <= MaxClients; i++)
    {
        if (IsClientInGame(i) && !IsFakeClient(i))
        {
            PrintToChatAll("Игрок %i убил в голову %d игроков", i, g_iCountHeadshoots[i]);
            g_iCountHeadshoots[i] = 0;
        }
    }
}

public void OnClientDisconnect(int client)
{
    g_iCountHeadshoots[client] = 0;
}
 

Palonez

бб братки
Сообщения
3,035
Реакции
1,837
Добрый вечер, подскажите пожалуйста, в чем проблема. Иногда выводит не верное число убитых игроков в голову. К примеру: я убил 1 игрока в голову, пишет что убил 10, при том что всего играло 3 человека
Сам плагин:
Код:
#include <sdktools>

public void OnPluginStart()
{
    HookEvent("player_death", Event_PlayerDeath);
    HookEvent("round_end", Event_RoundEnd);
}

int g_iCountHeadshoots[MAXPLAYERS+1];

void Event_PlayerDeath(Event event, const char[] name, bool dontBroadcast)
{
    int client = GetClientOfUserId(event.GetInt("userid"));
    int attacker = GetClientOfUserId(event.GetInt("attacker"));

    if (event.GetBool("headshot") && GetClientTeam(client) != GetClientTeam(attacker))
        g_iCountHeadshoots[attacker]++;
}

void Event_RoundEnd(Event event, const char[] name, bool dontBroadcast)
{
    for (int i = 1; i <= MaxClients; i++)
    {
        if (IsClientInGame(i) && !IsFakeClient(i))
        {
            PrintToChatAll("Игрок %i убил в голову %d игроков", i, g_iCountHeadshoots[i]);
            g_iCountHeadshoots[i] = 0;
        }
    }
}

public void OnClientDisconnect(int client)
{
    g_iCountHeadshoots[client] = 0;
}
Та не, не может быть и почему у тебя во фразе игрок - это %i?
 

KiKiEEKi

🏆 🥇
Сообщения
653
Реакции
513
Добрый вечер, подскажите пожалуйста, в чем проблема. Иногда выводит не верное число убитых игроков в голову. К примеру: я убил 1 игрока в голову, пишет что убил 10, при том что всего играло 3 человека
Сам плагин:
Код:
#include <sdktools>

public void OnPluginStart()
{
    HookEvent("player_death", Event_PlayerDeath);
    HookEvent("round_end", Event_RoundEnd);
}

int g_iCountHeadshoots[MAXPLAYERS+1];

void Event_PlayerDeath(Event event, const char[] name, bool dontBroadcast)
{
    int client = GetClientOfUserId(event.GetInt("userid"));
    int attacker = GetClientOfUserId(event.GetInt("attacker"));

    if (event.GetBool("headshot") && GetClientTeam(client) != GetClientTeam(attacker))
        g_iCountHeadshoots[attacker]++;
}

void Event_RoundEnd(Event event, const char[] name, bool dontBroadcast)
{
    for (int i = 1; i <= MaxClients; i++)
    {
        if (IsClientInGame(i) && !IsFakeClient(i))
        {
            PrintToChatAll("Игрок %i убил в голову %d игроков", i, g_iCountHeadshoots[i]);
            g_iCountHeadshoots[i] = 0;
        }
    }
}

public void OnClientDisconnect(int client)
{
    g_iCountHeadshoots[client] = 0;
}
C++:
int g_iHsCount[MAXPLAYERS+1];

public void OnPluginStart()
{
    HookEvent("player_death", Event_PlayerDeath);
    HookEvent("round_end", Event_RoundEnd, EventHookMode_PostNoCopy);
}

public void OnMapStart()
{
    for(int i = 1; i <= MaxClients; ++i) g_iHsCount[i] = 0;
}

void Event_PlayerDeath(Event hEvent, const char[] sEvName, bool bDontBroadcast)
{
    int iAttacker = GetClientOfUserId(hEvent.GetInt("attacker"));

    if(hEvent.GetBool("headshot") && GetClientOfUserId(hEvent.GetInt("userid")) != GetClientTeam(iAttacker)) {
        ++g_iHsCount[iAttacker];
    }
}

void Event_RoundEnd(Event hEvent, const char[] sEvName, bool bDontBroadcast)
{
    for(int i = 1; i <= MaxClients; i++) {
        if(IsClientInGame(i) && !IsFakeClient(i)) {
            PrintToChatAll("Игрок %i убил в голову %d игроков", i, g_iHsCount[i]);
            g_iHsCount[i] = 0;
        }
    }
}

public void OnClientDisconnect(int iClient)
{
    g_iHsCount[iClient] = 0;
}
 

7pElllHuK

Участник
Сообщения
1,416
Реакции
465
Та не, не может быть и почему у тебя во фразе игрок - это %i?
Перепутал)
Сообщения автоматически склеены:

C++:
int g_iHsCount[MAXPLAYERS+1];

public void OnPluginStart()
{
    HookEvent("player_death", Event_PlayerDeath);
    HookEvent("round_end", Event_RoundEnd, EventHookMode_PostNoCopy);
}

public void OnMapStart()
{
    for(int i = 1; i <= MaxClients; ++i) g_iHsCount[i] = 0;
}

void Event_PlayerDeath(Event hEvent, const char[] sEvName, bool bDontBroadcast)
{
    int iAttacker = GetClientOfUserId(hEvent.GetInt("attacker"));

    if(hEvent.GetBool("headshot") && GetClientOfUserId(hEvent.GetInt("userid")) != GetClientTeam(iAttacker)) {
        ++g_iHsCount[iAttacker];
    }
}

void Event_RoundEnd(Event hEvent, const char[] sEvName, bool bDontBroadcast)
{
    for(int i = 1; i <= MaxClients; i++) {
        if(IsClientInGame(i) && !IsFakeClient(i)) {
            PrintToChatAll("Игрок %i убил в голову %d игроков", i, g_iHsCount[i]);
            g_iHsCount[i] = 0;
        }
    }
}

public void OnClientDisconnect(int iClient)
{
    g_iHsCount[iClient] = 0;
}
Спасибо большое, проверю отпишусь
 

Grey83

не пишу плагины с весны 2022
Сообщения
8,521
Реакции
4,980
@7pElllHuK, попробуй такой вариант:
C-подобный:
#pragma semicolon 1
#pragma newdecls required

int iHS[MAXPLAYERS+1];

public void OnPluginStart()
{
    HookEvent("round_freeze_end", Event_RoundStart, EventHookMode_PostNoCopy);
    HookEvent("player_death", Event_PlayerDeath);
    HookEvent("round_end", Event_RoundEnd, EventHookMode_PostNoCopy);
}

public void OnClientDisconnect(int client)
{
    iHS[client] = 0;
}

public void Event_RoundStart(Event event, const char[] name, bool dontBroadcast)
{
    for(int i = 1; i <= MaxClients; i++) iHS[i] = 0;    // обнуляем все счётчики без исключений
}

public void Event_PlayerDeath(Event event, const char[] name, bool dontBroadcast)
{
    if(!event.GetBool("headshot"))    // ну тут всё понятно: нас интересуют только хэдшоты
        return;

    int attacker = GetClientOfUserId(event.GetInt("attacker"));
    // вдруг убийство было произведено картой (ну мало ли какие есть извращения на картах) или ботом
    if(!attacker || IsFakeClient(attacker))
        return;

    int client = GetClientOfUserId(event.GetInt("userid"));
    // свою команду тоже не считаем
    if(client && GetClientTeam(client) != GetClientTeam(attacker)) iHS[attacker]++;
}

public void Event_RoundEnd(Event event, const char[] name, bool dontBroadcast)
{
                                        // выводим только тех игроков, кто делал хэдшоты
    for(int i = 1; i <= MaxClients; i++) if(iHS[i] && IsClientInGame(i) && !IsFakeClient(i))
        PrintToChatAll("Игрок %N убил в голову %i игроков", i, iHS[i]);
}
 

Grey83

не пишу плагины с весны 2022
Сообщения
8,521
Реакции
4,980
C-подобный:
public void OnMapStart()
{
    for(int i = 1; i <= MaxClients; i++) hTimer[i] = null;
}

public void Event_player_spawn(Event event, const char[] name, bool dontBroadcast)
{
    int userid = event.GetInt("userid");
    int client = GetClientOfUserId(userid);

    if(!client || !IsClientInGame(client) || IsFakeClient(client) || !IsPlayerAlive(client))
        return;

    if(hTimer[client]) CloseHandle(hTimer[client]);
    hTimer[client] = CreateTimer(TIMER_SPAWN, Timer_spawn, userid, TIMER_FLAG_NO_MAPCHANGE);
}

public Action Timer_spawn(Handle timer, int userid)
{
    int client = GetClientOfUserId(userid);
    if(!client)
        return Plugin_Stop;

    if(IsPlayerAlive(client))
    {
        GetClientEyePosition(client, fPosition[client]);
        GetClientEyeAngles(client, fAngles[client]);
        hTimer[client] = CreateTimer(TIMER_CHECK, Timer_check, userid, TIMER_FLAG_NO_MAPCHANGE);
    }
    else hTimer[client] = null;

    return Plugin_Stop;
}

public Action Timer_check(Handle timer, int userid)
{
    int client = GetClientOfUserId(userid);
    if(!client)
        return Plugin_Stop;

    if(IsPlayerAlive(client))
    {
        float pos[3], ang[3];
        GetClientEyePosition(client, pos);
        GetClientEyeAngles(client, ang);
        if(fPosition[client][0] == pos[0] && fPosition[client][1] == pos[1]
        || fAngles[client][0] == ang[0] && fAngles[client][1] == ang[1])
        {
            CPrintToChat(client, MSG_CHECK);
            ChangeClientTeam(client, CS_TEAM_SPECTATOR);
        }
    }

    hTimer[client] = null;
    return Plugin_Stop;
}

public void OnClientDisconnect(int client)
{
    if(hTimer[client])
    {
        CloseHandle(hTimer[client]);
        hTimer[client] = null;
    }
}
UPD исправил 3-ю строку кода
 
Последнее редактирование:

7pElllHuK

Участник
Сообщения
1,416
Реакции
465
C++:
int g_iHsCount[MAXPLAYERS+1];

public void OnPluginStart()
{
    HookEvent("player_death", Event_PlayerDeath);
    HookEvent("round_end", Event_RoundEnd, EventHookMode_PostNoCopy);
}

public void OnMapStart()
{
    for(int i = 1; i <= MaxClients; ++i) g_iHsCount[i] = 0;
}

void Event_PlayerDeath(Event hEvent, const char[] sEvName, bool bDontBroadcast)
{
    int iAttacker = GetClientOfUserId(hEvent.GetInt("attacker"));

    if(hEvent.GetBool("headshot") && GetClientOfUserId(hEvent.GetInt("userid")) != GetClientTeam(iAttacker)) {
        ++g_iHsCount[iAttacker];
    }
}

void Event_RoundEnd(Event hEvent, const char[] sEvName, bool bDontBroadcast)
{
    for(int i = 1; i <= MaxClients; i++) {
        if(IsClientInGame(i) && !IsFakeClient(i)) {
            PrintToChatAll("Игрок %i убил в голову %d игроков", i, g_iHsCount[i]);
            g_iHsCount[i] = 0;
        }
    }
}

public void OnClientDisconnect(int iClient)
{
    g_iHsCount[iClient] = 0;
}
Вроде все отлично работает, спасибо
Сообщения автоматически склеены:

@7pElllHuK, попробуй такой вариант:
C-подобный:
#pragma semicolon 1
#pragma newdecls required

int iHS[MAXPLAYERS+1];

public void OnPluginStart()
{
    HookEvent("round_freeze_end", Event_RoundStart, EventHookMode_PostNoCopy);
    HookEvent("player_death", Event_PlayerDeath);
    HookEvent("round_end", Event_RoundEnd, EventHookMode_PostNoCopy);
}

public void OnClientDisconnect(int client)
{
    iHS[client] = 0;
}

public void Event_RoundStart(Event event, const char[] name, bool dontBroadcast)
{
    for(int i = 1; i <= MaxClients; i++) iHS[i] = 0;    // обнуляем все счётчики без исключений
}

public void Event_PlayerDeath(Event event, const char[] name, bool dontBroadcast)
{
    if(!event.GetBool("headshot"))    // ну тут всё понятно: нас интересуют только хэдшоты
        return;

    int attacker = GetClientOfUserId(event.GetInt("attacker"));
    // вдруг убийство было произведено картой (ну мало ли какие есть извращения на картах) или ботом
    if(!attacker || IsFakeClient(attacker))
        return;

    int client = GetClientOfUserId(event.GetInt("userid"));
    // свою команду тоже не считаем
    if(client && GetClientTeam(client) != GetClientTeam(attacker)) iHS[attacker]++;
}

public void Event_RoundEnd(Event event, const char[] name, bool dontBroadcast)
{
                                        // выводим только тех игроков, кто делал хэдшоты
    for(int i = 1; i <= MaxClients; i++) if(iHS[i] && IsClientInGame(i) && !IsFakeClient(i))
        PrintToChatAll("Игрок %N убил в голову %i игроков", i, iHS[i]);
}
Тоже все отлично, работает, спасибо большое
 
Сверху Снизу