Подсчёт выстрелов игрока

Nova

Simple Project
Сообщения
262
Реакции
28
Как подсчитать выстрелы игрока за раунд? Перепробовал несколько методов, но желаемого результата не получил.
Сервер: CS:S v34

1.
Этот код не работает: колбэк не вызывается.
C-подобный:
new g_iShots[MAXPLAYERS+1];

public OnPluginStart()
{
    HookEvent("player_shoot", HookEvent_PlayerShoot);
}

public HookEvent_PlayerShoot(Handle:event, const String:name[], bool:dontBroadcast)
{
    new client = GetClientOfUserId(GetEventInt(event, "userid"));
    g_iShots[client]++;
}

2. Этот код работает некорректно: если выстрелить из пистолета и не отпустить клавишу выстрела, то каждый раз будет вызываться колбэк, хотя фактически выстрела не происходит.
C-подобный:
new g_iShots[MAXPLAYERS+1];

public OnPluginStart()
{
    HookEvent("weapon_fire", HookEvent_WeaponFire);
}

public HookEvent_WeaponFire(Handle:event, const String:name[], bool:dontBroadcast)
{
    new client = GetClientOfUserId(GetEventInt(event, "userid"));
    g_iShots[client]++;
}

3. Этот код не работает: колбэк не вызывается.
C-подобный:
new g_iShots[MAXPLAYERS+1];

public OnClientPutInServer(client)
{
    SDKHook(client, SDKHook_FireBulletsPost, FireBulletsPost);
}

public FireBulletsPost(client, shots, const String:weaponname[])
{
    g_iShots[client]++;
}

Есть идеи как это реализовать?
 

Fleeeshi

Добрая душа
Сообщения
231
Реакции
202
Может быть отловить bullet_impact, но не знаю, есть ли такое в 34
 

Grey83

не пишу плагины с весны 2022
Сообщения
8,569
Реакции
5,071
при простреле какого-то объекта (деревянной двери, например) может быть от 2 срабатываний события, хотя выстрел был всего 1
с АВП, например, можно сделать 3 хэдшота 1 выстрелом и будет 3 таких события при этом
 

Nova

Simple Project
Сообщения
262
Реакции
28
при простреле какого-то объекта (деревянной двери, например) может быть от 2 срабатываний события, хотя выстрел был всего 1
с АВП, например, можно сделать 3 хэдшота 1 выстрелом и будет 3 таких события при этом
Да, тоже это уже заметил. Способ отпадает.
Сообщения автоматически склеены:

Как получить значения данных офсетов? (CBasePlayerWeapon)
m_bInReload
m_bFireOnEmpty
 
Последнее редактирование:

Nova

Simple Project
Сообщения
262
Реакции
28
Проблема решена

C-подобный:
new g_iShots[MAXPLAYERS+1];

public OnPluginStart()
{
    HookEvent("weapon_fire", HookEvent_WeaponFire);
}

public HookEvent_WeaponFire(Handle:event, const String:name[], bool:dontBroadcast)
{
    new client = GetClientOfUserId(GetEventInt(event, "userid"));
    
    if (GetEntProp(GetEntDataEnt2(client, FindSendPropOffs("CBasePlayer", "m_hActiveWeapon")), Prop_Send, "m_iClip1") > 0)
        g_iShots[client]++;
}
 

xstage

🏹
Сообщения
726
Реакции
754
Проблема решена

C-подобный:
new g_iShots[MAXPLAYERS+1];

public OnPluginStart()
{
    HookEvent("weapon_fire", HookEvent_WeaponFire);
}

public HookEvent_WeaponFire(Handle:event, const String:name[], bool:dontBroadcast)
{
    new client = GetClientOfUserId(GetEventInt(event, "userid"));
   
    if (GetEntProp(GetEntDataEnt2(client, FindSendPropOffs("CBasePlayer", "m_hActiveWeapon")), Prop_Send, "m_iClip1") > 0)
        g_iShots[client]++;
}
Для этого решения потребовалось 3 месяца ?)
 

Kruzya

Участник
Сообщения
12,970
Реакции
10,924
  • Команда форума
  • #10
Ни на что не намекаю, но обычно результат вызова FindSendPropOffs() кешируют.
 
Сверху Снизу