KillMsg

Grey83

не пишу плагины с весны 2022
Сообщения
8,520
Реакции
4,979
@babka68, в событии смерти после получения индекса игрока забыли поставить проверку равен ли он нулю, скорей всего.
Исходник глянуть ещё не скоро смогу, т.к. на работе сейчас.
Сообщения автоматически склеены:

@babka68, глянул код, пофиксил некоторые косяки, убрал увеличил ограничение на количество убийств в серии до 100 (при этом память будет тратиться в зависимости от значения квара sm_killmsg_maxkills, а не как раньше независимо от него забиралось фиксированное максимальное значение).
Можно было бы добавить проверку на наличие файлов на сервере (PrecacheModel() возвращает число отличное от нуля, если файл существует и был произведён прекеш, правда не помню при дублях возвращает ли он индекс первой попытки прекеша), но мне было лень.
Ещё можно было сохранять пути для отправки оверлея без расширения файла (емнип, оно не обязательно, чтобы оверлей показать), но опять же было лень.
Я подсказал, что можно сделать, а автор пусть сам корячиться, если ему охота. =)
C-подобный:
//// killmsg 1.0.1.sp
//
// Code size:            16912 bytes
// Data size:            16204 bytes
// Stack/heap size:      16384 bytes
// Total requirements:   49500 bytes
//
// Compilation Time: 0,19 sec
// ----------------------------------------

//// killmsg 1.1.0.sp
//
// Code size:            16520 bytes
// Data size:             5276 bytes
// Stack/heap size:      16384 bytes
// Total requirements:   38180 bytes
//
// Compilation Time: 0,19 sec
// ----------------------------------------
 

Вложения

  • killmsg 1.1.0.sp
    5 КБ · Просмотры: 27
Последнее редактирование:

sviridov_artem

Добрая душа
Сообщения
134
Реакции
30
@babka68, в событии смерти после получения индекса игрока забыли поставить проверку равен ли он нулю, скорей всего.
Исходник глянуть ещё не скоро смогу, т.к. на работе сейчас.
Сообщения автоматически склеены:

@babka68, глянул код, пофиксил некоторые косяки, убрал увеличил ограничение на количество убийств в серии до 100 (при этом память будет тратиться в зависимости от значения квара sm_killmsg_maxkills, а не как раньше независимо от него забиралось фиксированное максимальное значение).
Можно было бы добавить проверку на наличие файлов на сервере (PrecacheModel() возвращает число отличное от нуля, если файл существует и был произведён прекеш, правда не помню при дублях возвращает ли он индекс первой попытки прекеша), но мне было лень.
Ещё можно было сохранять пути для отправки оверлея без расширения файла (емнип, оно не обязательно, чтобы оверлей показать), но опять же было лень.
Я подсказал, что можно сделать, а автор пусть сам корячиться, если ему охота. =)
C-подобный:
//// killmsg 1.0.1.sp
//
// Code size:            16912 bytes
// Data size:            16204 bytes
// Stack/heap size:      16384 bytes
// Total requirements:   49500 bytes
//
// Compilation Time: 0,19 sec
// ----------------------------------------

//// killmsg 1.1.0.sp
//
// Code size:            16520 bytes
// Data size:             5276 bytes
// Stack/heap size:      16384 bytes
// Total requirements:   38180 bytes
//
// Compilation Time: 0,19 sec
// ----------------------------------------

Привет. Подскажи, пожалуйста. Я захотел оставить только убийства с 1 по 5. Убрал по идее все лишнее, компилируется без ошибок, пути точно верные, ошибка оверлея. При убийстве розовый экран. Вот правленый мною код.
код:
#pragma semicolon 1

#include <smartdm>

#pragma newdecls required

#include <sdktools_stringtables>

ConVar
    cvTimeOverlay,
    cvOrdinary,
    cvMaxKills;
ArrayList
    hOrdinary;
Handle
    hTimerOverlay[MAXPLAYERS+1];
int
    iCountKill[MAXPLAYERS+1];
char
    sBuffer[PLATFORM_MAX_PATH];

public Plugin myinfo =
{
    name        = "Kill Message Overlays",
    author        = "Nek.a 2x2",
    description    = "Kill Message Overlays",
    version        = "1.1.0 (rewritten by Grey83)",
    url            = "https://ggwp.site/"
}

public void OnPluginStart()
{
    cvTimeOverlay = CreateConVar("sm_killmsg_timeoverlay", "20.0", "Время отображения оверлея", _, true, 0.1);

    cvOrdinary = CreateConVar("sm_killmsg_ordinary", "killmessages/ggwp/4v/kills_", "Обычное убийство", FCVAR_PRINTABLEONLY);

    cvMaxKills = CreateConVar("sm_killmsg_maxkills", "5", "Максимальное количество убийств в серии (максимум - 5 ^_^)", _, true, 1.0, true, 5.0);

    AutoExecConfig(true, "KillMsg");

    HookEvent("player_death", Event_PlayerDeath);
    HookEvent("round_end", Event_RoundReset, EventHookMode_PostNoCopy);
    HookEvent("round_start", Event_RoundReset, EventHookMode_Pre);

    hOrdinary = new ArrayList(ByteCountToCells(PLATFORM_MAX_PATH));
}

public void OnMapStart()
{

    if(hOrdinary.Length) hOrdinary.Clear();
    cvOrdinary.GetString(sBuffer, sizeof(sBuffer));
    if(sBuffer[0])
    {
        char sFormat[PLATFORM_MAX_PATH];
        for(int i; i < cvMaxKills.IntValue; i++)
        {
            Format(sFormat, sizeof(sFormat), "materials/%s%d.vmt", sBuffer, i+1);
            PrecacheModel(sFormat, true);
            Downloader_AddFileToDownloadsTable(sFormat);
            hOrdinary.PushString(sFormat[10]);
        }
    }


}

public void OnClientDisconnect(int client)
{
    if(hTimerOverlay[client]) delete hTimerOverlay[client];
}

void Event_PlayerDeath(Event event, const char[] name, bool dontBroadcast)
{
    int client = GetClientOfUserId(GetEventInt(event, "userid"));
    if(client) iCountKill[client] = 0;

    int attacker = GetClientOfUserId(GetEventInt(event, "attacker"));
    if(!attacker || attacker == client || IsFakeClient(attacker))
        return;

    GetEventString(event, "weapon", sBuffer, 12);


    {
        hOrdinary.GetString(iCountKill[attacker], sBuffer, sizeof(sBuffer));
        SendOverlay(attacker, sBuffer);
    }

    if(++iCountKill[attacker] >= cvMaxKills.IntValue) iCountKill[attacker] = 0;
}

void Event_RoundReset(Event event, const char[] name, bool dontBroadcast)
{
    for(int i = 1; i <= MaxClients; i++)
    {
        iCountKill[i] = 0;
        if(!hTimerOverlay[i])
            continue;

        ClientCommand(i, "r_screenoverlay \"\"");
        delete hTimerOverlay[i];
    }
}

void SendOverlay(int client, char[] sOverlay)
{
    if(!sOverlay[0])
        return;

    OnClientDisconnect(client);
    ClientCommand(client, "r_screenoverlay \"%s\"", sOverlay);
    hTimerOverlay[client] = CreateTimer(cvTimeOverlay.FloatValue, OverlayEndTimer, GetClientUserId(client));
}

Action OverlayEndTimer(Handle timer, int client)
{
    if((client = GetClientOfUserId(client)))
    {
        ClientCommand(client, "r_screenoverlay \"\"");
        hTimerOverlay[client] = null;
    }
    return Plugin_Stop;
}
 

Grey83

не пишу плагины с весны 2022
Сообщения
8,520
Реакции
4,979
@sviridov_artem, розовый экран при проблеме с текстурой должен быть.
Или файл не загрузился клиенту или у vtf и vmt имена отличаются (ну или путь внутри неправильно прописан).
 

Synd1qate

Участник
Сообщения
744
Реакции
259
Привет. Подскажи, пожалуйста. Я захотел оставить только убийства с 1 по 5. Убрал по идее все лишнее, компилируется без ошибок, пути точно верные, ошибка оверлея. При убийстве розовый экран. Вот правленый мною код.
код:
#pragma semicolon 1

#include <smartdm>

#pragma newdecls required

#include <sdktools_stringtables>

ConVar
    cvTimeOverlay,
    cvOrdinary,
    cvMaxKills;
ArrayList
    hOrdinary;
Handle
    hTimerOverlay[MAXPLAYERS+1];
int
    iCountKill[MAXPLAYERS+1];
char
    sBuffer[PLATFORM_MAX_PATH];

public Plugin myinfo =
{
    name        = "Kill Message Overlays",
    author        = "Nek.a 2x2",
    description    = "Kill Message Overlays",
    version        = "1.1.0 (rewritten by Grey83)",
    url            = "https://ggwp.site/"
}

public void OnPluginStart()
{
    cvTimeOverlay = CreateConVar("sm_killmsg_timeoverlay", "20.0", "Время отображения оверлея", _, true, 0.1);

    cvOrdinary = CreateConVar("sm_killmsg_ordinary", "killmessages/ggwp/4v/kills_", "Обычное убийство", FCVAR_PRINTABLEONLY);

    cvMaxKills = CreateConVar("sm_killmsg_maxkills", "5", "Максимальное количество убийств в серии (максимум - 5 ^_^)", _, true, 1.0, true, 5.0);

    AutoExecConfig(true, "KillMsg");

    HookEvent("player_death", Event_PlayerDeath);
    HookEvent("round_end", Event_RoundReset, EventHookMode_PostNoCopy);
    HookEvent("round_start", Event_RoundReset, EventHookMode_Pre);

    hOrdinary = new ArrayList(ByteCountToCells(PLATFORM_MAX_PATH));
}

public void OnMapStart()
{

    if(hOrdinary.Length) hOrdinary.Clear();
    cvOrdinary.GetString(sBuffer, sizeof(sBuffer));
    if(sBuffer[0])
    {
        char sFormat[PLATFORM_MAX_PATH];
        for(int i; i < cvMaxKills.IntValue; i++)
        {
            Format(sFormat, sizeof(sFormat), "materials/%s%d.vmt", sBuffer, i+1);
            PrecacheModel(sFormat, true);
            Downloader_AddFileToDownloadsTable(sFormat);
            hOrdinary.PushString(sFormat[10]);
        }
    }


}

public void OnClientDisconnect(int client)
{
    if(hTimerOverlay[client]) delete hTimerOverlay[client];
}

void Event_PlayerDeath(Event event, const char[] name, bool dontBroadcast)
{
    int client = GetClientOfUserId(GetEventInt(event, "userid"));
    if(client) iCountKill[client] = 0;

    int attacker = GetClientOfUserId(GetEventInt(event, "attacker"));
    if(!attacker || attacker == client || IsFakeClient(attacker))
        return;

    GetEventString(event, "weapon", sBuffer, 12);


    {
        hOrdinary.GetString(iCountKill[attacker], sBuffer, sizeof(sBuffer));
        SendOverlay(attacker, sBuffer);
    }

    if(++iCountKill[attacker] >= cvMaxKills.IntValue) iCountKill[attacker] = 0;
}

void Event_RoundReset(Event event, const char[] name, bool dontBroadcast)
{
    for(int i = 1; i <= MaxClients; i++)
    {
        iCountKill[i] = 0;
        if(!hTimerOverlay[i])
            continue;

        ClientCommand(i, "r_screenoverlay \"\"");
        delete hTimerOverlay[i];
    }
}

void SendOverlay(int client, char[] sOverlay)
{
    if(!sOverlay[0])
        return;

    OnClientDisconnect(client);
    ClientCommand(client, "r_screenoverlay \"%s\"", sOverlay);
    hTimerOverlay[client] = CreateTimer(cvTimeOverlay.FloatValue, OverlayEndTimer, GetClientUserId(client));
}

Action OverlayEndTimer(Handle timer, int client)
{
    if((client = GetClientOfUserId(client)))
    {
        ClientCommand(client, "r_screenoverlay \"\"");
        hTimerOverlay[client] = null;
    }
    return Plugin_Stop;
}
Смотри пути по текстурам, в vtf и в принципе
 

sviridov_artem

Добрая душа
Сообщения
134
Реакции
30
Synd1qate , Grey83 спасибо большое, точно путь не верный был, думал в коде ошибку сделал)), зачем-то в vmt добавил еще автоматом materials в путь,

Ребят, а еще не подскажете, пожалуйста, желательно бы примером в коде, как определить команду и выводить в зависимости от команды текстуры, буду очень признателен

cvOrdinary = CreateConVar("sm_killmsg_ordinary_t", "killmessages/ggwp/t/kills_", "Обычное убийство", FCVAR_PRINTABLEONLY);
cvOrdinary = CreateConVar("sm_killmsg_ordinary_ct", "killmessages/ggwp/ct/kills_", "Обычное убийство", FCVAR_PRINTABLEONLY);
 
Последнее редактирование:

Nekro

Терра инкогнита
Сообщения
4,025
Реакции
2,260
  • Автор ресурса
  • #46
Synd1qate , Grey83 спасибо большое, точно путь не верный был, думал в коде ошибку сделал)), зачем-то в vmt добавил еще автоматом materials в путь,

Ребят, а еще не подскажете, пожалуйста, желательно бы примером в коде, как определить команду и выводить в зависимости от команды текстуры, буду очень признателен

cvOrdinary = CreateConVar("sm_killmsg_ordinary_t", "killmessages/ggwp/t/kills_", "Обычное убийство", FCVAR_PRINTABLEONLY);
cvOrdinary = CreateConVar("sm_killmsg_ordinary_ct", "killmessages/ggwp/ct/kills_", "Обычное убийство", FCVAR_PRINTABLEONLY);
if(GetClientTeam(client) == 2) //Если так, то это Т, если равен 3, то КТ, если 0, то ещё не определился, 1 это спеки
 

sviridov_artem

Добрая душа
Сообщения
134
Реакции
30
if(GetClientTeam(client) == 2) //Если так, то это Т, если равен 3, то КТ, если 0, то ещё не определился, 1 это спеки
Проверил, работает. Спасибо большое. Только if(GetClientTeam(client) == 3) - T, а 2 if(GetClientTeam(client) == 2) это КТ.
 

Nekro

Терра инкогнита
Сообщения
4,025
Реакции
2,260
  • Автор ресурса
  • #48

Recrutabr

Участник
Сообщения
10
Реакции
1
@babka68, в событии смерти после получения индекса игрока забыли поставить проверку равен ли он нулю, скорей всего.
Исходник глянуть ещё не скоро смогу, т.к. на работе сейчас.
Сообщения автоматически склеены:

@babka68, глянул код, пофиксил некоторые косяки, убрал увеличил ограничение на количество убийств в серии до 100 (при этом память будет тратиться в зависимости от значения квара sm_killmsg_maxkills, а не как раньше независимо от него забиралось фиксированное максимальное значение).
Можно было бы добавить проверку на наличие файлов на сервере (PrecacheModel() возвращает число отличное от нуля, если файл существует и был произведён прекеш, правда не помню при дублях возвращает ли он индекс первой попытки прекеша), но мне было лень.
Ещё можно было сохранять пути для отправки оверлея без расширения файла (емнип, оно не обязательно, чтобы оверлей показать), но опять же было лень.
Я подсказал, что можно сделать, а автор пусть сам корячиться, если ему охота. =)
C-подобный:
//// killmsg 1.0.1.sp
//
// Code size:            16912 bytes
// Data size:            16204 bytes
// Stack/heap size:      16384 bytes
// Total requirements:   49500 bytes
//
// Compilation Time: 0,19 sec
// ----------------------------------------

//// killmsg 1.1.0.sp
//
// Code size:            16520 bytes
// Data size:             5276 bytes
// Stack/heap size:      16384 bytes
// Total requirements:   38180 bytes
//
// Compilation Time: 0,19 sec
// ----------------------------------------
Привет! Спасибо за все внимание, которое вы мне оказали! Я создаю сервер в Бразилии и установил плагин, который редактировал мой друг Grey83, хотелось бы, чтобы время наложения на экране было больше, на данный момент в CVAR оно настроено так:

// По умолчанию: "3.0"
// Минимум: "0,100000"
sm_killmsg_timeoverlay "3.0"

Выставляю время "5.0" и ничего не меняется, сообщение держится на экране менее 1 секунды. Пожалуйста, не могли бы вы мне помочь?
 

Synd1qate

Участник
Сообщения
744
Реакции
259
Привет! Спасибо за все внимание, которое вы мне оказали! Я создаю сервер в Бразилии и установил плагин, который редактировал мой друг Grey83, хотелось бы, чтобы время наложения на экране было больше, на данный момент в CVAR оно настроено так:

// По умолчанию: "3.0"
// Минимум: "0,100000"
sm_killmsg_timeoverlay "3.0"

Выставляю время "5.0" и ничего не меняется, сообщение держится на экране менее 1 секунды. Пожалуйста, не могли бы вы мне помочь?
HItmarker случайно не установлен?
 

ColdWind

Участник
Сообщения
68
Реакции
29
Добавьте если не сложно возможность скрытия оверлеев через команду в чате
 
Последнее редактирование:

ColdWind

Участник
Сообщения
68
Реакции
29
Сверху Снизу