Написание плагинов

StrAnn1k

Участник
Сообщения
237
Реакции
23
L 09/03/2023 - 01:11:43: [SM] Exception reported: Handle 8a201f43 is invalid (error 1)
L 09/03/2023 - 01:11:43: [SM] Blaming: hide.smx
L 09/03/2023 - 01:11:43: [SM] Call stack trace:
L 09/03/2023 - 01:11:43: [SM] [0] CloseHandle
L 09/03/2023 - 01:11:43: [SM] [1] Line 98, C:\Users\auque\OneDriveРабочий стол\sourcemod\addons\sourcemod\scripting\hide.sp::OnClientConnected
L 09/03/2023 - 01:21:06: [SM] Exception reported: Handle 874023ac is invalid (error 1)
L 09/03/2023 - 01:21:06: [SM] Blaming: hide.smx
L 09/03/2023 - 01:21:06: [SM] Call stack trace:
L 09/03/2023 - 01:21:06: [SM] [0] CloseHandle
L 09/03/2023 - 01:21:06: [SM] [1] Line 216, C:\Users\auque\OneDriveРабочий стол\sourcemod\addons\sourcemod\scripting\hide.sp::OnMapEnd
 

Вложения

  • hide.sp
    5.9 КБ · Просмотры: 6

Palonez

бб братки
Сообщения
3,035
Реакции
1,837
L 09/03/2023 - 01:11:43: [SM] Exception reported: Handle 8a201f43 is invalid (error 1)
L 09/03/2023 - 01:11:43: [SM] Blaming: hide.smx
L 09/03/2023 - 01:11:43: [SM] Call stack trace:
L 09/03/2023 - 01:11:43: [SM] [0] CloseHandle
L 09/03/2023 - 01:11:43: [SM] [1] Line 98, C:\Users\auque\OneDriveРабочий стол\sourcemod\addons\sourcemod\scripting\hide.sp::OnClientConnected
L 09/03/2023 - 01:21:06: [SM] Exception reported: Handle 874023ac is invalid (error 1)
L 09/03/2023 - 01:21:06: [SM] Blaming: hide.smx
L 09/03/2023 - 01:21:06: [SM] Call stack trace:
L 09/03/2023 - 01:21:06: [SM] [0] CloseHandle
L 09/03/2023 - 01:21:06: [SM] [1] Line 216, C:\Users\auque\OneDriveРабочий стол\sourcemod\addons\sourcemod\scripting\hide.sp::OnMapEnd
Удали в онмапенд закрытие таймеров и поставь TIMER_FLAG_NOMAPCHANGE
 

7pElllHuK

Участник
Сообщения
1,416
Реакции
465
Всем добрый вечер, подскажите пожалуйста, как получить меткость игрока в течении раунда в % соотношении и как узнать меткость команды, так же в % соотношении. Пример: Аркадий стрелял с меткостью 62%, меткость остальных террористов —13%. Игра ксс 34
 
Последнее редактирование:

Grey83

не пишу плагины с весны 2022
Сообщения
8,520
Реакции
4,979
@7pElllHuK, считать выстрелы игрока и сравнивать с попадениями (через события player_hurt или с помощью хука SDKHook_OnTakeDamageAlivePost). Правда могут быть прострелы через нескольких игроков (авп может до трёх человек прострелить одним выстрелом) или попадения из дробовика, так что нужно будет ещё это как-то учитывать (таймером, например).
 

7pElllHuK

Участник
Сообщения
1,416
Реакции
465
@7pElllHuK, считать выстрелы игрока и сравнивать с попадениями (через события player_hurt или с помощью хука SDKHook_OnTakeDamageAlivePost). Правда могут быть прострелы через нескольких игроков (авп может до трёх человек прострелить одним выстрелом) или попадения из дробовика, так что нужно будет ещё это как-то учитывать (таймером, например).
Можете дать пример кода пожалуйста? Я это буду реализовывать неделю)
 

Grey83

не пишу плагины с весны 2022
Сообщения
8,520
Реакции
4,979
@7pElllHuK, нет у меня примера кода (емнип, мне такое и не было нужно никогда).
Но возможно такие примеры найдутся в коде всяких плагинов статистики.
 

NeLifeASkazka

Участник
Сообщения
128
Реакции
70
Можете дать пример кода пожалуйста? Я это буду реализовывать неделю)
code:
int iCountHit[MAXPLAYERS+1]; // Счетчик попаданий игрока
int iCountShoot[MAXPLAYERS+1]; // Счетчик выстрелов игрока
int iCountHitTeam[2]; // Счетчик попаданий команд (0 - команда Т, 1 - команда КТ)
int iCountShootTeam[2]; // Счетчик выстрелов команд (0 - команда Т, 1 - команда КТ)
public void OnPluginStart(){
    HookEvent("round_start", OnRoundStart);
    HookEvent("weapon_fire", OnWeaponFire);
    HookEvent("player_hurt", OnPlayerHurt);
    HookEvent("round_end", OnRoundEnd);
}
// Обнуляем счетчики попаданий и выстрелов для всех игроков и команд в начале раунда
public Action OnRoundStart(Event event, const char[] name, bool dontBroadcast){
    for(int client = 1; client <= MaxClients; client++)
    {
        iCountShoot[client] = iCountHit[client] = 0;
    }
    iCountShootTeam[0] = iCountHitTeam[1] = 0;
}  
// Считаем выстрелы игрока и команд
public Action OnWeaponFire(Event event, const char[] name, bool dontBroadcast){
    int client = GetClientOfUserId(event.GetInt("userid"));
    iCountShoot[client]++; // Сохраняем каждый выстрел игрока
    if(GetClientTeam(client) == 2) // Если игрок за Т, сохраняем выстрелы и для его команды
    {
        iCountShootTeam[0]++; // Сохраняем выстрелы команды Т
    }
    else // Если игрок за КТ...
    {
        iCountShootTeam[1]++; // Сохраняем выстрелы команды КТ
    }
}  
// Считаем попадания игроков и команд
public Action OnPlayerHurt(Event event, const char[] name, bool dontBroadcast){
    int client = GetClientOfUserId(event.GetInt("userid"));
    int attacker = GetClientOfUserId(event.GetInt("attacker"));
    if((1 <= attacker && attacker <= MaxClients && IsClientInGame(attacker))
    && (1 <= client && client <= MaxClients && IsClientInGame(client)))
    {
        if(attacker != client) // Учитывем что игрок не может сам себе навредить
        {
            // Дальше все также, как и в функции OnWeaponFire
            iCountHit[attacker]++;
            if(GetClientTeam(attacker) == 2)
            {
                iCountHitTeam[0]++;
            }
            else
            {
                iCountHitTeam[1]++;
            }
        }
    }
}  
// Выводим статистику попаданий игроков и команд в конце раунда
public Action OnRoundEnd(Event event, const char[] name, bool dontBroadcast){
    for(int client = 1; client <= MaxClients; client++)
    {
        if(IsClientInGame(client))
        {
            if(iCountHit[client] > 0 && iCountShoot[client] > 0) // Учитываем что игрок должен иметь больше 0 попаданий и выстрелов
            {
                float fPercentHits = iCountHit[client] / iCountShoot[client] * 100.0;
                PrintToChatAll("Игрок %N имеет %.1f%% попаданий", client, fPercentHits);
            }
        }
    }
   
    if(iCountHitTeam[0] > 0 && iCountShootTeam[0] > 0) // Учитываем что команда должна иметь кол-во выстрелов и попаданий больше 0 (команда Т)
    {
        float fPercentHitsT = iCountHitTeam[0] / iCountShootTeam[0] * 100.0;
        PrintToChatAll("Команда террористов имеет %.1f%% попаданий!", fPercentHitsT);
    }
    if(iCountHitTeam[1] > 0 && iCountShootTeam[1] > 0) // Учитываем что команда должна иметь кол-во выстрелов и попаданий больше 0 (команда КТ)
    {
        float fPercentHitsCT = iCountHitTeam[1] / iCountShootTeam[1] * 100.0;
        PrintToChatAll("Команда спецназа имеет %.1f%% попаданий!", fPercentHitsCT);
    }
}

Только это приблизительный код, так как есть моменты которые стоит учитывать и исправить

Да и лучше делать, как написал Grey83, через SDKHook_OnTakeDamageAlivePost, так как через player_hurt будет считать попадания если игрок нанесет урон с ножа/гранаты и тд
Хотя можно и в player_hurt все сделать, наверн
Сообщения автоматически склеены:

C-подобный:
SetEntProp(iEntity, Prop_Send, "m_CollisionGroup", 17);
Пробовал
Вообще оно странно работает
При спавне пропа, когда устнавливаю флаг, тогда можно сделать чтобы оно или получало урон, или было твердым
Если менять значения во время игры, тогда можно подобрать что-то
И вот когда я получил необходимый мне флаг, и ставлю его в момент спавна пропа, ничего не меняется 🤷‍♂️
 

7pElllHuK

Участник
Сообщения
1,416
Реакции
465
code:
int iCountHit[MAXPLAYERS+1]; // Счетчик попаданий игрока
int iCountShoot[MAXPLAYERS+1]; // Счетчик выстрелов игрока
int iCountHitTeam[2]; // Счетчик попаданий команд (0 - команда Т, 1 - команда КТ)
int iCountShootTeam[2]; // Счетчик выстрелов команд (0 - команда Т, 1 - команда КТ)
public void OnPluginStart(){
    HookEvent("round_start", OnRoundStart);
    HookEvent("weapon_fire", OnWeaponFire);
    HookEvent("player_hurt", OnPlayerHurt);
    HookEvent("round_end", OnRoundEnd);
}
// Обнуляем счетчики попаданий и выстрелов для всех игроков и команд в начале раунда
public Action OnRoundStart(Event event, const char[] name, bool dontBroadcast){
    for(int client = 1; client <= MaxClients; client++)
    {
        iCountShoot[client] = iCountHit[client] = 0;
    }
    iCountShootTeam[0] = iCountHitTeam[1] = 0;
}
// Считаем выстрелы игрока и команд
public Action OnWeaponFire(Event event, const char[] name, bool dontBroadcast){
    int client = GetClientOfUserId(event.GetInt("userid"));
    iCountShoot[client]++; // Сохраняем каждый выстрел игрока
    if(GetClientTeam(client) == 2) // Если игрок за Т, сохраняем выстрелы и для его команды
    {
        iCountShootTeam[0]++; // Сохраняем выстрелы команды Т
    }
    else // Если игрок за КТ...
    {
        iCountShootTeam[1]++; // Сохраняем выстрелы команды КТ
    }
}
// Считаем попадания игроков и команд
public Action OnPlayerHurt(Event event, const char[] name, bool dontBroadcast){
    int client = GetClientOfUserId(event.GetInt("userid"));
    int attacker = GetClientOfUserId(event.GetInt("attacker"));
    if((1 <= attacker && attacker <= MaxClients && IsClientInGame(attacker))
    && (1 <= client && client <= MaxClients && IsClientInGame(client)))
    {
        if(attacker != client) // Учитывем что игрок не может сам себе навредить
        {
            // Дальше все также, как и в функции OnWeaponFire
            iCountHit[attacker]++;
            if(GetClientTeam(attacker) == 2)
            {
                iCountHitTeam[0]++;
            }
            else
            {
                iCountHitTeam[1]++;
            }
        }
    }
}
// Выводим статистику попаданий игроков и команд в конце раунда
public Action OnRoundEnd(Event event, const char[] name, bool dontBroadcast){
    for(int client = 1; client <= MaxClients; client++)
    {
        if(IsClientInGame(client))
        {
            if(iCountHit[client] > 0 && iCountShoot[client] > 0) // Учитываем что игрок должен иметь больше 0 попаданий и выстрелов
            {
                float fPercentHits = iCountHit[client] / iCountShoot[client] * 100.0;
                PrintToChatAll("Игрок %N имеет %.1f%% попаданий", client, fPercentHits);
            }
        }
    }
 
    if(iCountHitTeam[0] > 0 && iCountShootTeam[0] > 0) // Учитываем что команда должна иметь кол-во выстрелов и попаданий больше 0 (команда Т)
    {
        float fPercentHitsT = iCountHitTeam[0] / iCountShootTeam[0] * 100.0;
        PrintToChatAll("Команда террористов имеет %.1f%% попаданий!", fPercentHitsT);
    }
    if(iCountHitTeam[1] > 0 && iCountShootTeam[1] > 0) // Учитываем что команда должна иметь кол-во выстрелов и попаданий больше 0 (команда КТ)
    {
        float fPercentHitsCT = iCountHitTeam[1] / iCountShootTeam[1] * 100.0;
        PrintToChatAll("Команда спецназа имеет %.1f%% попаданий!", fPercentHitsCT);
    }
}

Только это приблизительный код, так как есть моменты которые стоит учитывать и исправить

Да и лучше делать, как написал Grey83, через SDKHook_OnTakeDamageAlivePost, так как через player_hurt будет считать попадания если игрок нанесет урон с ножа/гранаты и тд
Хотя можно и в player_hurt все сделать, наверн
Сообщения автоматически склеены:


Пробовал
Вообще оно странно работает
При спавне пропа, когда устнавливаю флаг, тогда можно сделать чтобы оно или получало урон, или было твердым
Если менять значения во время игры, тогда можно подобрать что-то
И вот когда я получил необходимый мне флаг, и ставлю его в момент спавна пропа, ничего не меняется 🤷‍♂️
Спасибо большое. Отдельная благодарность за комментарии)
 

-=|УЧЕНИК|=-

вся жизнь,сплошной цирк.
Сообщения
876
Реакции
212
Привет всем!
Можно ли тут сделать,чтоб No Zoom срабатывал всегда?
На данный момент скидывается постоянно,даже когда просто перебираешь оружие.
Или может кто напишет простенький код.
Заранее благодарю!
 

Вложения

  • No_zoom_awp.sp
    2.4 КБ · Просмотры: 7
Последнее редактирование:

7pElllHuK

Участник
Сообщения
1,416
Реакции
465
Всем доброго времени суток, подскажите пожалуйста, как это реализовать:
Есть 2 сообщения под 1 условием, которые выводятся в конце раунда нужно вывести с начала первое сообщение (раунд закончился и выводится сообщение 1), затем закончился следующий раунд и выводится сообщение 2, потом опять заканчивается раунд и выводится опять 1 сообщение (Все по кругу идет, чтоб сообщения не повторялись).
Пример:
Код:
if (g_iCountHeadshoots[i])            //Убийства в голову
{
    CPrintToChatAll("Игрок: Аркаша убил 2 игроков в голову");  //Это первое сообщение
    CPrintToChatAll("Игрок: Аркаша убил 2 игроков");  //Это второе сообщение
}
Через GetRandomInt(); не вариант, так как по случайности 1 из 2 сообщений может быть продублировано подрят несколько раз
 

rejchev

менеджер клоунов
Сообщения
1,669
Реакции
1,291
Всем доброго времени суток, подскажите пожалуйста, как это реализовать:
Есть 2 сообщения под 1 условием, которые выводятся в конце раунда нужно вывести с начала первое сообщение (раунд закончился и выводится сообщение 1), затем закончился следующий раунд и выводится сообщение 2, потом опять заканчивается раунд и выводится опять 1 сообщение (Все по кругу идет, чтоб сообщения не повторялись).
Пример:
Код:
if (g_iCountHeadshoots[i])            //Убийства в голову
{
    CPrintToChatAll("Игрок: Аркаша убил 2 игроков в голову");  //Это первое сообщение
    CPrintToChatAll("Игрок: Аркаша убил 2 игроков");  //Это второе сообщение
}
Через GetRandomInt(); не вариант, так как по случайности 1 из 2 сообщений может быть продублировано подрят несколько раз
Берите остаток от деления, если нужна синхронизация. В ином случае - меняйте состояние для каждого клиента после отправки
 

7pElllHuK

Участник
Сообщения
1,416
Реакции
465
Берите остаток от деления, если нужна синхронизация. В ином случае - меняйте состояние для каждого клиента после отправки
Можете дать пример кода? Я даже представить не могу как это реалиовать
 

rejchev

менеджер клоунов
Сообщения
1,669
Реакции
1,291
Можете дать пример кода? Я даже представить не могу как это реалиовать
Ну Вы уж постарайтесь представить, в следующий раз

C-подобный:
#pragma newdecls required

int iRounds;

public void OnPluginStart()
{
    HookEvent("round_end", OnRoundEnd);
}

public void OnMapStart()
{
    iRounds = 1;
}

public void OnRoundEnd(Event event, const char[] name, bool dbc)
{
    // шаблонные сообщения с двумя параметрами
    //
    // @param %s - строка
    // @param %d - число
    //
    // @warn порядок упоминания и количество параметров един для всех сообщений
    static const char szTemplates[][] = {
        "Сообщение 1: %s упал с %d этажа",
        "Сообщение 2: %s упад с %d этажа и уехал"
    }

    for(int i = 1; i <= MaxClients; i++)
    {
        if(!IsClientInGame(i) || IsFakeClient(i) || IsClientSourceTV(i))
            continue;


        // Отправка шаблонного сообщения
        PrintToChat(i, szTemplates[ChooseTemplateSync(i, sizeof(szTemplates))], GetClientNameEx(i), GetRandomInt(1, 10));
    }

    iRounds++;
}

// Правило выбора шаблонного сообщения
// Все клиенты получают один шаблон в момент времени
int ChooseTemplateSync(int iClient, any data)
{
    return iRounds % view_as<int>(data);
}

// Каждый клиент получает свой шаблон в момент времени
int ChooseTemplateCustom(int iClient, any data)
{
    static int iLastState[MAXPLAYERS+1];

    iLastState[iClient]++;

    if(iLastState[iClient] >= view_as<int>(data))
        iLastState[iClient] = 0;

    return iLastState[iClient];
}

char[] GetClientNameEx(int iClient)
{
    char szBuffer[MAX_NAME_LENGTH];

    if(!GetClientName(iClient, szBuffer, sizeof(szBuffer)))
        szBuffer = "unnamed";
    
    return szBuffer;
}
 

7pElllHuK

Участник
Сообщения
1,416
Реакции
465
Ну Вы уж постарайтесь представить, в следующий раз

C-подобный:
#pragma newdecls required

int iRounds;

public void OnPluginStart()
{
    HookEvent("round_end", OnRoundEnd);
}

public void OnMapStart()
{
    iRounds = 1;
}

public void OnRoundEnd(Event event, const char[] name, bool dbc)
{
    // шаблонные сообщения с двумя параметрами
    //
    // @param %s - строка
    // @param %d - число
    //
    // @warn порядок упоминания и количество параметров един для всех сообщений
    static const char szTemplates[][] = {
        "Сообщение 1: %s упал с %d этажа",
        "Сообщение 2: %s упад с %d этажа и уехал"
    }

    for(int i = 1; i <= MaxClients; i++)
    {
        if(!IsClientInGame(i) || IsFakeClient(i) || IsClientSourceTV(i))
            continue;


        // Отправка шаблонного сообщения
        PrintToChat(i, szTemplates[ChooseTemplateSync(i, sizeof(szTemplates))], GetClientNameEx(i), GetRandomInt(1, 10));
    }

    iRounds++;
}

// Правило выбора шаблонного сообщения
// Все клиенты получают один шаблон в момент времени
int ChooseTemplateSync(int iClient, any data)
{
    return iRounds % view_as<int>(data);
}

// Каждый клиент получает свой шаблон в момент времени
int ChooseTemplateCustom(int iClient, any data)
{
    static int iLastState[MAXPLAYERS+1];

    iLastState[iClient]++;

    if(iLastState[iClient] >= view_as<int>(data))
        iLastState[iClient] = 0;

    return iLastState[iClient];
}

char[] GetClientNameEx(int iClient)
{
    char szBuffer[MAX_NAME_LENGTH];

    if(!GetClientName(iClient, szBuffer, sizeof(szBuffer)))
        szBuffer = "unnamed";
  
    return szBuffer;
}
Спасибо большое, все отлично работает. В следующий раз постараюсь представить 😃
 

khood

Участник
Сообщения
214
Реакции
51
Напишите плагин, чтобы рандомно несколько пуль не регало в человека
 
Сверху Снизу