Иконка ресурса

Kills - подсчет убийств 1

R1w3d

Участник
Сообщения
153
Реакции
31
  • Автор ресурса
  • #1
Последнее редактирование:

R1KO

fuck society
Сообщения
9,457
Реакции
7,786
  • Команда форума
  • #2
@riwed, код нормальный. оно не может не работать.

тут можно сделать так:
PHP:
public player_spawn(Handle:event, const String:name[], bool:dontBroadcast)
{
    Kills[GetClientOfUserId(GetEventInt(event, "userid"))] = 0;
}

public player_death(Handle:event, const String:name[], bool:dontBroadcast)
{
    new client = GetClientOfUserId(GetEventInt(event, "attacker"));
    if (client > 0 && GetClientTeam(client) != GetClientTeam(GetClientOfUserId(GetEventInt(event, "userid"))))
    {
        ++Kills[client];
    }
}
 

Vit_ amin

Добрая душа
Сообщения
1,504
Реакции
660
Для лучшей оптимизации лучше использовать iClient != 0
 

Drumanid

Нестандартное звание
Сообщения
1,862
Реакции
1,748
'player_spawn' не совсем корректное т.к некоторых игроков это событие пропускает, лучше всего использовать SDKHook.
Подсчитывает убийства за раунд
PHP:
int Kills[MAXPLAYERS +1];

public void OnPluginStart()
{
    HookEvent("round_start", RoundSE);
    HookEvent("round_end", RoundSE);
    HookEvent("player_death", PlayerDeath);
}

public Action RoundSE(Event event, const char[] name, bool dbc)
{
    if(name[6] == 's')
    {
        for(int i = 1; i <= MaxClients; i++)
        {
            if(IsClientInGame(i)) Kills[i] = 0;
        }
    }
    else
    {
        for(int i = 1; i <= MaxClients; i++)
        {
            if(IsClientInGame(i)) PrintToChat(i, "Вы убили %i игрока(ов)", Kills[i]);
        }
    }
}

public Action PlayerDeath(Event event, const char[] name, bool dbc)
{
    int iAttacker = GetClientOfUserId(GetEventInt(event, "attacker"));
    if(iAttacker > 0 && GetClientTeam(iAttacker) != GetClientTeam(GetClientOfUserId(GetEventInt(event, "userid"))))
    {
        ++Kills[iAttacker];
    }
}

public void OnClientPostAdminCheck(int iClient) { Kills[iClient] = 0; }
Так лучше будет...
 
Последнее редактирование модератором:

R1w3d

Участник
Сообщения
153
Реакции
31
  • Автор ресурса
  • #5
Пользователь riwed обновил ресурс Kills - подсчет убийств новой записью:

Kills - подсчет убийств

Оптимизация - код полностью переписан благодаря Lisoh;
От меня добавлено сообщение "Вы никого не убили, в следующий раз повезет" (при 0 убийствах), должно работать...

Узнать больше об этом обновлении...
 
Последнее редактирование:

KEKEXA

Участник
Сообщения
16
Реакции
1
Возможна ли работоспособность на css v34 [sourcemod 1.6] ?
 

R1w3d

Участник
Сообщения
153
Реакции
31
  • Автор ресурса
  • #8
Пользователь riwed обновил ресурс Kills - подсчет убийств новой записью:

Kills - подсчет убийств

Оптимизация - код полностью переписан благодаря Lisoh;
От меня добавлено сообщение "Вы никого не убили, в следующий раз повезет" , должно работать...

Узнать больше об этом обновлении...
 

Drumanid

Нестандартное звание
Сообщения
1,862
Реакции
1,748
У вас в архиве старая версия и новая(работать так как вы хотите - не будет)

Почитайте основы...
Весь список уроков от @R1KO
[SourcePawn] Уроки (Содержание)

Разбор плагина... (уже с поправкой)
PHP:
int Kills[MAXPLAYERS +1]; // Создаем число(переменную)

public void OnPluginStart() // Загрузка плагина
{
    HookEvent("round_start", RoundSE); // Регистрация события
    HookEvent("round_end", RoundSE);
    HookEvent("player_death", PlayerDeath);
}

public Action RoundSE(Event event, const char[] name, bool dbc) // Паблик события
{
    if(name[6] == 's') // Проверяем имя события
    {
        for(int i = 1; i <= MaxClients; i++) // Цикл по всем игрокам
        {
            if(IsClientInGame(i)) Kills[i] = 0; // Обнуляем число
        }
    }
    else
    {
        for(int i = 1; i <= MaxClients; i++)
        {
            if(IsClientInGame(i)) // Если игрок в сети выполняем ниже написанное
            {
                if(Kills[i] == 0) PrintToChat(i, "Вы никого не убили, в следующий раз повезет"); // Проверяем и выводим сообщение
                else PrintToChat(i, "Вы убили %i игрока(ов)", Kills[i]); // Если...
            }
        }
    }
}

public Action PlayerDeath(Event event, const char[] name, bool dbc)
{
    int iAttacker = GetClientOfUserId(GetEventInt(event, "attacker")); // Получаем атакующего
    if(iAttacker > 0 && GetClientTeam(iAttacker) != GetClientTeam(GetClientOfUserId(GetEventInt(event, "userid"))))        // Если у атакующего id больше чем 0 ...
                                                                                                                    // Получаем команду атакующего, получаем мертвого и проверяем не равен ли атакующий команде мертвого
    {
        ++Kills[iAttacker]; // +1 к числу
    }
}

public void OnClientPostAdminCheck(int iClient) { Kills[iClient] = 0; } // Обнуляем заходящего игрока на сервер, мало ли возродиться после старта раунда.
 

R1KO

fuck society
Сообщения
9,457
Реакции
7,786
  • Команда форума
  • #10

Drumanid

Нестандартное звание
Сообщения
1,862
Реакции
1,748
пруфы есть? ни разу с таким не сталкивался.
Пруфов не будет. Сам решил убедиться сделав логирование. Все игроки были посчитаны (боты)...
С чего был сделан такой вывод?
То ли модель выдавал, то ли таймер пытался уничтожишь и в итоге что то пропускало, а что то выполнялось - это я отчетливо помню, тогда и сделал такой вывод и с тех пор перестал использовать это событие, т.к sdkhooks все было нормально.
 

BossKotoriiNeSmok

Участник
Сообщения
976
Реакции
189
Прикольно так то,было б еще прикольно,тип сделать в конце сколько всего дамага снес.
 

Grey83

не пишу плагины с весны 2022
Сообщения
8,521
Реакции
4,980
@BossKotoriiNeSmok, так, что ли?
PHP:
#pragma semicolon 1
#pragma newdecls required

#include <sdkhooks>

bool bLate;
int iKills[MAXPLAYERS+1];
float fDmg[MAXPLAYERS+1];

public Plugin myinfo =
{
    name        = "Round kill & damage stats",
    author        = "Grey83",
    description    = "Shows to the player at the end of the each round statistics of kills and damage that he inflicted",
    version        = "1.0.0",
    url            = "http://steamcommunity.com/groups/grey83ds"
};

public APLRes AskPluginLoad2(Handle myself, bool late, char[] error, int err_max)
{
    bLate = late;
    return APLRes_Success;
}

public void OnPluginStart()
{
    HookEvent("round_start", Event_Start, EventHookMode_PostNoCopy);
    HookEvent("round_end", Event_End, EventHookMode_PostNoCopy);
    HookEvent("player_death", Event_Death);

    if(bLate)
    {
        for(int i = 1; i <= MaxClients; i++) if(IsClientAuthorized(i)) OnClientPostAdminCheck(i);
        bLate = false;
    }
}

public void OnClientPostAdminCheck(int client)
{
    iKills[client] = 0;
    fDmg[client] = 0.0;
    SDKHook(client, SDKHook_OnTakeDamagePost, OnTakeDamage);
}

public void OnTakeDamage(int victim, int attacker, int inflictor, float damage, int damagetype)
{
    if(((damagetype & DMG_BULLET) || (damagetype & DMG_SLASH) || (damagetype & DMG_BLAST) || (damagetype & DMG_CLUB)
    || (damagetype & DMG_BUCKSHOT)) && IsClientsValid(attacker, victim))
        fDmg[attacker] += damage;
}

public void Event_Start(Event event, const char[] name, bool dontBroadcast)
{
    for(int i = 1; i <= MaxClients; i++)
    {
        iKills[i] = 0;
        fDmg[i] = 0.0;
    }
}

public void Event_End(Event event, const char[] name, bool dontBroadcast)
{
    static char msg[256];
    for(int i = 1; i <= MaxClients; i++) if(IsClientInGame(i) && !IsFakeClient(i) && fDmg[i])
    {
        if(!fDmg[i]) Format(msg, 256, "насчитали %i ворон", GetRandomInt(0, 99));
        else
        {
            Format(msg, 256, "нанесли при этом %i урона.", RoundToNearest(fDmg[i]));
            if(!iKills[i]) Format(msg, 256, "никого не убили, но %s", msg);
            else Format(msg, 256, "убили %i противников и %s", iKills[i], msg);
        }
        PrintToChat(i, "В течении раунда Вы %s", msg);
    }
}

public void Event_Death(Event event, const char[] name, bool dontBroadcast)
{
    static int attacker;
    if(IsClientsValid((attacker = GetClientOfUserId(event.GetInt("attacker"))), GetClientOfUserId(event.GetInt("userid"))))
        iKills[attacker]++;
}

stock bool IsClientsValid(int attacker, int victim)
{
    static int teamA, teamV;
    return IsClientValid(attacker, true) && !IsFakeClient(attacker) && IsClientValid(victim)
    && (teamV = GetClientTeam(victim)) > 1 && (teamA = GetClientTeam(attacker)) > 1 && teamA != teamV;
}

stock bool IsClientValid(int client, bool in_game = false)
{
    return 0 < client <= MaxClients && (!in_game || IsClientInGame(client));
}
--- Добавлено позже ---
Лол, у меня скомпиленный плагин весит столько же, что и у ТСа архив с плагином. :mocking:
 

Вложения

  • round_kill&dmg_stats.sp
    2.8 КБ · Просмотры: 26
  • round_kill&dmg_stats.smx
    5.6 КБ · Просмотры: 17
Последнее редактирование:

Allen

love society
Сообщения
352
Реакции
274
  • Команда форума
  • #20
Пруфов не будет. Сам решил убедиться сделав логирование. Все игроки были посчитаны (боты)...
С чего был сделан такой вывод?
То ли модель выдавал, то ли таймер пытался уничтожишь и в итоге что то пропускало, а что то выполнялось - это я отчетливо помню, тогда и сделал такой вывод и с тех пор перестал использовать это событие, т.к sdkhooks все было нормально.
Не может быть такого.
 
Сверху Снизу