ХитМаркер

0-BuTaJIuK-0

Участник
Сообщения
235
Реакции
57
Здравствуйте, подскажите пожалуйста, как сделать хитмаркер при попадании в голову.
P.S. Тому, кто попал в голову, показывается оверлей в течении 0.5 сек (csgo)

Вот нерабочий код:

PHP:
#pragma semicolon 1
#include <sourcemod>
#include <sdktools>

public OnPluginStart()
{
    HookEvent("player_hurt", EnDamage);
}

public OnConfigsExecuted()
{
     PrecacheDecal("materials/butagames/hitmarker.vtf", true);
     PrecacheDecal("materials/butagames/hitmarker.vtm", true);

     AddFileToDownloadsTable("materials/butagames/hitmarker.vtf");
     AddFileToDownloadsTable("materials/butagames/hitmarker.vmt");
}

ShowOverlayToClient(client, const String:overlaypath[])
{
    ClientCommand(client, "r_screenoverlay \"%s\"", overlaypath);
}

public EnDamage(Handle:event, const String:name[], bool:dontBroadcast)
{
        new hitgroup = GetClientOfUserId(GetEventInt(event, "hitgroup", 1));

    if (hitgroup)
  
        ShowOverlayToClient(hitgroup, "butagames/hitmarker");
        CreateTimer(0.5, NoOverlay, hitgroup);
      
        return;

}

public Action:NoOverlay(Handle:timer, any:client)
{
 if (IsClientInGame(client))
 {
       ShowOverlayToClient(client, "");
 }
}
 
Последнее редактирование:

Drumanid

Нестандартное звание
Сообщения
1,862
Реакции
1,748
PHP:
#include <sdktools_stringtables>

#define TIMER 0.5 // Время через которое оверлей будет удален с экрана игрока
#define OVERLAY "butagames/hitmarker" // Путь к оверлею без 'materials/' и формата файла, тобишь 'vtf/vmt'

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

public void OnMapStart()
{
    char sBuffer[256];
   
    FormatEx(sBuffer, sizeof(sBuffer), "materials/%s.vmt", OVERLAY);
    AddFileToDownloadsTable(sBuffer);
   
    FormatEx(sBuffer, sizeof(sBuffer), "materials/%s.vtf", OVERLAY);
    AddFileToDownloadsTable(sBuffer);
   
    FormatEx(sBuffer, sizeof(sBuffer), "%s.vtf", OVERLAY);
    PrecacheDecal(sBuffer, true);
}

public void PlayerDeath(Event event, const char[] name, bool dbc)
{
    if(event.GetBool("headshot"))
    {
        int iUserId = event.GetInt("userid");
        ClientCommand(GetClientOfUserId(iUserId), "r_screenoverlay %s.vmt", OVERLAY);
       
        CreateTimer(TIMER, TimerOverlayDelete, iUserId);
    }
}

public Action TimerOverlayDelete(Handle hTimer, any iUserId)
{
    int iClient = GetClientOfUserId(iUserId);
    if(IsClientInGame(iClient)) ClientCommand(iClient, "r_screenoverlay 0");
   
    return Plugin_Stop;
}
 

0-BuTaJIuK-0

Участник
Сообщения
235
Реакции
57
PHP:
#include <sdktools_stringtables>

#define TIMER 0.5 // Время через которое оверлей будет удален с экрана игрока
#define OVERLAY "butagames/hitmarker" // Путь к оверлею без 'materials/' и формата файла, тобишь 'vtf/vmt'

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

public void OnMapStart()
{
    char sBuffer[256];
 
    FormatEx(sBuffer, sizeof(sBuffer), "materials/%s.vmt", OVERLAY);
    AddFileToDownloadsTable(sBuffer);
 
    FormatEx(sBuffer, sizeof(sBuffer), "materials/%s.vtf", OVERLAY);
    AddFileToDownloadsTable(sBuffer);
 
    FormatEx(sBuffer, sizeof(sBuffer), "%s.vtf", OVERLAY);
    PrecacheDecal(sBuffer, true);
}

public void PlayerDeath(Event event, const char[] name, bool dbc)
{
    if(event.GetBool("headshot"))
    {
        int iUserId = event.GetInt("userid");
        ClientCommand(GetClientOfUserId(iUserId), "r_screenoverlay %s.vmt", OVERLAY);
     
        CreateTimer(TIMER, TimerOverlayDelete, iUserId);
    }
}

public Action TimerOverlayDelete(Handle hTimer, any iUserId)
{
    int iClient = GetClientOfUserId(iUserId);
    if(IsClientInGame(iClient)) ClientCommand(iClient, "r_screenoverlay 0");
 
    return Plugin_Stop;
}
Спасибо,
'player_death (headshot)' - эвент, срабатывающий при убийстве в голову, а не при попадании в нее.
Исправьте меня, может я не прав и поэтому пытался делать с помощью - 'player_hurt (hitgroup = 1)'
 

Drumanid

Нестандартное звание
Сообщения
1,862
Реакции
1,748
Спасибо,
'player_death (headshot)' - эвент, срабатывающий при убийстве в голову, а не при попадании в нее.
Исправьте меня, может я не прав и поэтому пытался сделать с помощью - 'player_hurt (hitgroup = 1)'
Неправильно понял.

PHP:
#include <sdktools_stringtables>

Handle g_hTimer[MAXPLAYERS +1];

#define TIMER 0.5 // Время через которое оверлей будет удален с экрана игрока
#define OVERLAY "butagames/hitmarker" // Путь к оверлею без 'materials/' и формата файла, тобишь 'vtf/vmt'

public void OnPluginStart()
{
    HookEvent("player_hurt", PlayerHurt);
}

public void OnMapStart()
{
    char sBuffer[256];
  
    FormatEx(sBuffer, sizeof(sBuffer), "materials/%s.vmt", OVERLAY);
    AddFileToDownloadsTable(sBuffer);
  
    FormatEx(sBuffer, sizeof(sBuffer), "materials/%s.vtf", OVERLAY);
    AddFileToDownloadsTable(sBuffer);
  
    FormatEx(sBuffer, sizeof(sBuffer), "%s.vtf", OVERLAY);
    PrecacheDecal(sBuffer, true);
}

public void PlayerHurt(Event event, const char[] name, bool dbc)
{
    if(event.GetInt("hitgroup") == 1)
    {
        int iClient = GetClientOfUserId(event.GetInt("attacker"));
        if(g_hTimer[iClient] == null)
        {          
            ClientCommand(iClient, "r_screenoverlay %s.vmt", OVERLAY);
            g_hTimer[iClient] = CreateTimer(TIMER, TimerOverlayDelete, GetClientUserId(iClient));
        }
    }
}

public Action TimerOverlayDelete(Handle hTimer, any iUserId)
{
    int iClient = GetClientOfUserId(iUserId);
    if(IsClientInGame(iClient)) ClientCommand(iClient, "r_screenoverlay 0");
  
    g_hTimer[iClient] = null;
    return Plugin_Stop;
}

public void OnClientDisconnect(int iClient)
{
    if(g_hTimer[iClient] != null)
    {
        KillTimer(g_hTimer[iClient]);
        g_hTimer[iClient] = null;
    }
}
 
Последнее редактирование модератором:
P

Poseidon959

Неправильно понял.

PHP:
#include <sdktools_stringtables>

Handle g_hTimer[MAXPLAYERS +1];

#define TIMER 0.5 // Время через которое оверлей будет удален с экрана игрока
#define OVERLAY "butagames/hitmarker" // Путь к оверлею без 'materials/' и формата файла, тобишь 'vtf/vmt'

public void OnPluginStart()
{
    HookEvent("player_hurt", PlayerHurt);
}

public void OnMapStart()
{
    char sBuffer[256];
 
    FormatEx(sBuffer, sizeof(sBuffer), "materials/%s.vmt", OVERLAY);
    AddFileToDownloadsTable(sBuffer);
 
    FormatEx(sBuffer, sizeof(sBuffer), "materials/%s.vtf", OVERLAY);
    AddFileToDownloadsTable(sBuffer);
 
    FormatEx(sBuffer, sizeof(sBuffer), "%s.vtf", OVERLAY);
    PrecacheDecal(sBuffer, true);
}

public void PlayerHurt(Event event, const char[] name, bool dbc)
{
    if(event.GetInt("hitgroup") == 1)
    {
        int iClient = GetClientOfUserId(event.GetInt("attacker"));
        if(g_hTimer[iClient] == null)
        {        
            ClientCommand(iClient, "r_screenoverlay %s.vmt", OVERLAY);
            g_hTimer[iClient] = CreateTimer(TIMER, TimerOverlayDelete, GetClientUserId(iClient));
        }
    }
}

public Action TimerOverlayDelete(Handle hTimer, any iUserId)
{
    int iClient = GetClientOfUserId(iUserId);
    if(IsClientInGame(iClient)) ClientCommand(iClient, "r_screenoverlay 0");
 
    g_hTimer[iClient] = null;
    return Plugin_Stop;
}

public void OnClientDisconnect(int iClient)
{
    if(g_hTimer[iClient] != null)
    {
        KillTimer(g_hTimer[iClient]);
        g_hTimer[iClient] = null;
    }
}

А можно ещё как-то звук впихнуть туда? Чтобы вышло так:
 

Drumanid

Нестандартное звание
Сообщения
1,862
Реакции
1,748
А можно ещё как-то звук впихнуть туда? Чтобы вышло так:
Удалил первый вариант, че то он совсем глупый...

PHP:
#include <sdktools_stringtables>
#include <sdktools_sound>

Handle g_hTimer[MAXPLAYERS +1];
char g_sBuffer[256];

#define TIMER 0.5 // Время через которое оверлей будет удален с экрана игрока
#define OVERLAY "butagames/hitmarker" // Путь к оверлею без 'materials/' и формата файла, тобишь 'vtf/vmt'
#define SOUND "butagames/hitmarker.mp3" // Путь к звуку без 'sound/'

public void OnPluginStart()
{
    HookEvent("player_hurt", PlayerHurt);
}

public void OnMapStart()
{
    FormatEx(g_sBuffer, sizeof(g_sBuffer), "materials/%s.vmt", OVERLAY);
    AddFileToDownloadsTable(g_sBuffer);

    FormatEx(g_sBuffer, sizeof(g_sBuffer), "materials/%s.vtf", OVERLAY);
    AddFileToDownloadsTable(g_sBuffer);

    FormatEx(g_sBuffer, sizeof(g_sBuffer), "%s.vtf", OVERLAY);
    PrecacheDecal(g_sBuffer, true);
 
    FormatEx(g_sBuffer, sizeof(g_sBuffer), "sound/%s", SOUND);
    AddFileToDownloadsTable(g_sBuffer);
 
    if(GetEngineVersion() == Engine_CSGO)
    {
        FormatEx(g_sBuffer, sizeof(g_sBuffer), "*%s", SOUND);
        AddToStringTable(FindStringTable("soundprecache"), g_sBuffer);
    }
    else
    {
        PrecacheSound(SOUND, true);
        g_sBuffer = SOUND;
    }
}

public void PlayerHurt(Event event, const char[] name, bool dbc)
{
    if(event.GetInt("hitgroup") == 1)
    {
        int iClient = GetClientOfUserId(event.GetInt("attacker"));
        EmitSoundToClient(iClient, g_sBuffer);

        if(g_hTimer[iClient] == null)
        {
            ClientCommand(iClient, "r_screenoverlay %s.vmt", OVERLAY);
            g_hTimer[iClient] = CreateTimer(TIMER, TimerOverlayDelete, GetClientUserId(iClient));
        }
    }
}

public Action TimerOverlayDelete(Handle hTimer, any iUserId)
{
    int iClient = GetClientOfUserId(iUserId);
    if(IsClientInGame(iClient)) ClientCommand(iClient, "r_screenoverlay 0");

    g_hTimer[iClient] = null;
    return Plugin_Stop;
}

public void OnClientDisconnect(int iClient)
{
    if(g_hTimer[iClient] != null)
    {
        KillTimer(g_hTimer[iClient]);
        g_hTimer[iClient] = null;
    }
}
 
Последнее редактирование модератором:
Сверху Снизу