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

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

Drumanid

Нестандартное звание
Сообщения
1,862
Реакции
1,748

Grey83

не пишу плагины с весны 2022
Сообщения
8,521
Реакции
4,981
@Lisoh, по первой ссылке определились, что событие таки всегда срабатывает
Во втором вообще никак не проверяли произошло ли событие во всех случаях.
 

Drumanid

Нестандартное звание
Сообщения
1,862
Реакции
1,748
@Lisoh, по первой ссылке определились, что событие таки всегда срабатывает
Во втором вообще никак не проверяли произошло ли событие во всех случаях.
Так оно работает, сам это проверил когда отвечал на пост R1KO. Ладно, логи скину...

PHP:
L 01/15/2018 - 15:11:48: [ps.smx] ========================= PreStart Round =========================
L 01/15/2018 - 15:11:48: [ps.smx] Dennis | 8
L 01/15/2018 - 15:11:48: [ps.smx] Ethan | 2
L 01/15/2018 - 15:11:48: [ps.smx] Keith | 6
L 01/15/2018 - 15:11:48: [ps.smx] Greg | 7
L 01/15/2018 - 15:11:48: [ps.smx] Wyatt | 4
L 01/15/2018 - 15:11:48: [ps.smx] Drumanid | 1
L 01/15/2018 - 15:11:48: [ps.smx] Adam | 5
L 01/15/2018 - 15:11:48: [ps.smx] Orin | 10
L 01/15/2018 - 15:11:48: [ps.smx] Tom | 3
L 01/15/2018 - 15:11:48: [ps.smx] Will | 9

PHP:
public void OnPluginStart()
{
    HookEvent("round_prestart", EVENTS);
    HookEvent("player_spawn", EVENTS);
}

public Action EVENTS(Event event, const char[] name, bool dbc)
{
    int iClient = GetClientOfUserId(GetEventInt(event, "userid"));
    if(name[6] == 'p') LogToFile("addons/sourcemod/log.txt", "========================= PreStart Round =========================");
    else LogToFile("addons/sourcemod/log.txt", "%N | %i", iClient, iClient);
}

Но проблема заключается в другом, точнее непонятно почему некорректно выдаются данные игроку после события, я не первый кто с этим сталкивался поэтому и рекомендовал использовать hook.
Дело ваше, делайте что хотите, мое дело предупредить. Спорить или доказывать свою правоту не имеет смысла, когда сами столкнетесь, поймете что есть такая ерунда, если же нет... ну значит я криворукий, че поделать.
 

Drumanid

Нестандартное звание
Сообщения
1,862
Реакции
1,748

Grey83

не пишу плагины с весны 2022
Сообщения
8,521
Реакции
4,981
@Lisoh, а отлов события тут при чём?
Ты версию с дебагом делал?
Вполне возможно, что у тебя в косякибыли или в проверках или в вызываемых функциях.
Обычное дело.
Я в таких случаях делаю тестовые версии с выводом промежуточной информации, чтобы определиться в каком месте кода косяк.
 

BossKotoriiNeSmok

Участник
Сообщения
976
Реакции
189
@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:
Спасибо))
 

Drumanid

Нестандартное звание
Сообщения
1,862
Реакции
1,748
@Lisoh, а отлов события тут при чём?
Ты версию с дебагом делал?
Вполне возможно, что у тебя в косякибыли или в проверках или в вызываемых функциях.
Обычное дело.
Я в таких случаях делаю тестовые версии с выводом промежуточной информации, чтобы определиться в каком месте кода косяк.
Нет, не делал. Да, я дурачек. Вспомнил что я делал и почему сделал именно такой вывод.
Через player_spawn радар не исчезал при попытке его скрыть, а через SDKHook_SpawnPost работало идеально.
Видимо событие через sdkhook вызывается позже и если бы я сделал таймер в player_spawn работало бы...

C-подобный:
#include <sdkhooks>

public void OnPluginStart()
{
    HookEvent("player_spawn", Event_PlayerSpawn);
}

public OnClientPostAdminCheck(iClient)
{
    if(!IsFakeClient(iClient)) SDKHook(iClient, SDKHook_SpawnPost, SpawnPost);
}

public void Event_PlayerSpawn(Event hEvent, const char[] sEvName, bool bDbc)
{
    PrintToChat(GetClientOfUserId(hEvent.GetInt("userid")), "player_spawn - use");
}

public void SpawnPost(int iClient)
{
    PrintToChat(iClient, "SDKHook_SpawnPost - use");
}
>>
C-подобный:
player_spawn - use
SDKHook_SpawnPost - use

Не работает:
C-подобный:
public void OnPluginStart()
{
    HookEvent("player_spawn", Event_PlayerSpawn);
}

public void Event_PlayerSpawn(Event hEvent, const char[] sEvName, bool bDbc)
{
    SetEntProp(GetClientOfUserId(hEvent.GetInt("userid")), Prop_Send, "m_iHideHUD", 1 << 12);
}

Работает:
C-подобный:
#include <sdkhooks>

public OnClientPostAdminCheck(iClient)
{
    if(!IsFakeClient(iClient)) SDKHook(iClient, SDKHook_SpawnPost, SpawnPost);
}

public void SpawnPost(int iClient)
{
    SetEntProp(iClient, Prop_Send, "m_iHideHUD", 1 << 12);
}
или
C-подобный:
public void OnPluginStart()
{
    HookEvent("player_spawn", Event_PlayerSpawn);
}

public void Event_PlayerSpawn(Event hEvent, const char[] sEvName, bool bDbc)
{
    CreateTimer(0.0, TimerPlayerSpawn, hEvent.GetInt("userid"));
}

public Action TimerPlayerSpawn(Handle hTimer, any iClient)
{
    iClient = GetClientOfUserId(iClient);
    if(iClient > 0 && IsClientInGame(iClient)) SetEntProp(iClient, Prop_Send, "m_iHideHUD", 1 << 12);
    return Plugin_Stop;
}
 
Сверху Снизу