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

xstage

🏹
Сообщения
727
Реакции
756
Подскажите пожалуйста, как подсчитать сколько игрок убил соперников в голову. Нужно в конце раунда вывести текст с информацией сколько игрок убил соперников в голову
C-подобный:
#include <sdktools>

public OnPluginStart() HookEvent("round_end", Event_RoundEnd);

void Event_RoundEnd(Event event, const char[] name, bool dontBroadcast)
{
    for (int i = 1; i <= MaxClients; i++)
    {
        if (IsClientInGame(i) && !IsFakeClient(i))
        {
            PrintToChat(i, "Вы убили в голову %d раз(а)", GetEntProp(i, Prop_Send, "m_iNumRoundKillsHeadshots"));
        }
    }
}
 

7pElllHuK

Участник
Сообщения
1,654
Реакции
639
C-подобный:
#include <sdktools>

public OnPluginStart() HookEvent("round_end", Event_RoundEnd);

void Event_RoundEnd(Event event, const char[] name, bool dontBroadcast)
{
    for (int i = 1; i <= MaxClients; i++)
    {
        if (IsClientInGame(i) && !IsFakeClient(i))
        {
            PrintToChat(i, "Вы убили в голову %d раз(а)", GetEntProp(i, Prop_Send, "m_iNumRoundKillsHeadshots"));
        }
    }
}
[SM] Exception reported: Property "m_iNumRoundKillsHeadshots" not found (entity 1/player)
Ошибку выдает
 

xstage

🏹
Сообщения
727
Реакции
756
[SM] Exception reported: Property "m_iNumRoundKillsHeadshots" not found (entity 1/player)
Ошибку выдает
C-подобный:
#include <sdktools>

public void OnPluginStart()
{
    HookEvent("player_death", Event_PlayerDeath);
    HookEvent("round_end", Event_RoundEnd);
}

int g_iCountHeadshoots[MAXPLAYERS+1];

void Event_PlayerDeath(Event event, const char[] name, bool dontBroadcast)
{
    int client = GetClientOfUserId(event.GetInt("userid"));
    int attacker = GetClientOfUserId(event.GetInt("attacker"));

    if (event.GetBool("headshot") && GetClientTeam(client) != GetClientTeam(attacker))
        g_iCountHeadshoots[attacker]++;
}

void Event_RoundEnd(Event event, const char[] name, bool dontBroadcast)
{
    for (int i = 1; i <= MaxClients; i++)
    {
        if (IsClientInGame(i) && !IsFakeClient(i))
        {
            PrintToChat(i, "Вы убили в голову %d раз(а)", g_iCountHeadshoots[i]);
            g_iCountHeadshoots[i] = 0;
        }
    }
}

public void OnClientDisconnect(int client)
{
    g_iCountHeadshoots[client] = 0;
}
 

7pElllHuK

Участник
Сообщения
1,654
Реакции
639
C-подобный:
#include <sdktools>

public void OnPluginStart()
{
    HookEvent("player_death", Event_PlayerDeath);
    HookEvent("round_end", Event_RoundEnd);
}

int g_iCountHeadshoots[MAXPLAYERS+1];

void Event_PlayerDeath(Event event, const char[] name, bool dontBroadcast)
{
    int client = GetClientOfUserId(event.GetInt("userid"));
    int attacker = GetClientOfUserId(event.GetInt("attacker"));

    if (event.GetBool("headshot") && GetClientTeam(client) != GetClientTeam(attacker))
        g_iCountHeadshoots[attacker]++;
}

void Event_RoundEnd(Event event, const char[] name, bool dontBroadcast)
{
    for (int i = 1; i <= MaxClients; i++)
    {
        if (IsClientInGame(i) && !IsFakeClient(i))
        {
            PrintToChat(i, "Вы убили в голову %d раз(а)", g_iCountHeadshoots[i]);
            g_iCountHeadshoots[i] = 0;
        }
    }
}

public void OnClientDisconnect(int client)
{
    g_iCountHeadshoots[client] = 0;
}
Это именно то что я искал, спасибо большое
 

khood

Участник
Сообщения
273
Реакции
95
напишите плагин чттобы при переподключении на сервер и заход за команды ct\t убивало с ефектом tesla
 

7pElllHuK

Участник
Сообщения
1,654
Реакции
639
Подскажите пожалуйста, как получить в конце раунда время, за которое был сыгран раунд.
Пример: начался раунд и закончился за 40 сек, как эти 40 сек получить в конце раунда (Время может быть любое, нужно получить именно то время за которое раунд закончился)
 

KiKiEEKi

🏆 🥇
Сообщения
653
Реакции
518
Подскажите пожалуйста, как получить в конце раунда время, за которое был сыгран раунд.
Пример: начался раунд и закончился за 40 сек, как эти 40 сек получить в конце раунда (Время может быть любое, нужно получить именно то время за которое раунд закончился)
Можно так например
C-подобный:
int g_iTime[2];

public void OnPluginStart()
{
    HookEvent("round_start", Event_RoundStart, EventHookMode_PostNoCopy);
    HookEvent("round_end", Event_RoundEnd, EventHookMode_PostNoCopy);
}

void Event_RoundStart(Event hEvent, const char[] sEvName, bool bDontBroadcast)
{
    g_iTime[0] = GetTime();
}

void Event_RoundEnd(Event hEvent, const char[] sEvName, bool bDontBroadcast)
{
    g_iTime[1] = GetTime();
    PrintToChatAll("Длительность раунда [%i] секунд!", g_iTime[1] - g_iTime[0]);
}


UPD: Изменил название функции, одинаковые были сори
 
Последнее редактирование:

7pElllHuK

Участник
Сообщения
1,654
Реакции
639
Можно так например
C-подобный:
int g_iTime[2];

public void OnPluginStart()
{
    HookEvent("round_start", Event_RoundStart, EventHookMode_PostNoCopy);
    HookEvent("round_end", Event_RoundEnd, EventHookMode_PostNoCopy);
}

void Event_RoundStart(Event hEvent, const char[] sEvName, bool bDontBroadcast)
{
    g_iTime[0] = GetTime();
}

void Event_RoundEnd(Event hEvent, const char[] sEvName, bool bDontBroadcast)
{
    g_iTime[1] = GetTime();
    PrintToChatAll("Длительность раунда [%i] секунд!", g_iTime[1] - g_iTime[0]);
}


UPD: Изменил название функции, одинаковые были сори
Спасибо большое
 

Artem Chertov

Участник
Сообщения
55
Реакции
9
Здравствуйте!
Мне нужен плагин на подобие !nz (Раунд без прицела), только !deagle (раунд на диглах)
Когда-то видел такое, но найти не смог.

Custom Rounds - не подходит​

 

7pElllHuK

Участник
Сообщения
1,654
Реакции
639
Всем доброе утро, подскажите пожалуйста как исправить ошибку
[SM] Unable to load plugin "[LR] Knife_Score.smx": Could not find required plugin "levelsranks"
Сам плагин levelsranks стоит и он работает
Sourcemod 1.9
Если как-то можно плагин оптимизировать, то буду рад советам
 

Вложения

  • [LR] Knife_Score.sp
    2 КБ · Просмотры: 21
Последнее редактирование:

Nekro

Терра инкогнита
Сообщения
4,169
Реакции
2,500
Всем доброе утро, подскажите пожалуйста как исправить ошибку
[SM] Unable to load plugin "[LR] Knife_Score.smx": Could not find required plugin "levelsranks"
Сам плагин levelsranks стоит и он работает
Sourcemod 1.9
Если как-то можно плагин оптимизировать, то буду рад советам
Возможно при композиции инклюд одной версии, а на сервере плагин другой
 

7pElllHuK

Участник
Сообщения
1,654
Реакции
639
Возможно при композиции инклюд одной версии, а на сервере плагин другой
Точно нет, я глянул версию ядра что стоит на сервере, скачал именно эту версию и скомпилил плагин с библиотекой именно этой версии. Так же пробовал с библиотекой с самого сервера компилить, ошибка есть
 

Nekro

Терра инкогнита
Сообщения
4,169
Реакции
2,500
Точно нет, я глянул версию ядра что стоит на сервере, скачал именно эту версию и скомпилил плагин с библиотекой именно этой версии. Так же пробовал с библиотекой с самого сервера компилить, ошибка есть
Версии одинаковые, одинаковые, но в одной ошибка, а в другой нет..
Сообщения автоматически склеены:

@7pElllHuK, лучше сделать так:
1. Скачать с гита ласт версию
2. Залить в см на компьютере и скомпилировать
3. Залить компилированные и прочие необходимые файлы на сервер
4. В том же см создавать модули
 
Последнее редактирование:

DarkerZ

Участник
Сообщения
466
Реакции
214
Всем доброе утро, подскажите пожалуйста как исправить ошибку
[SM] Unable to load plugin "[LR] Knife_Score.smx": Could not find required plugin "levelsranks"
Сам плагин levelsranks стоит и он работает
Sourcemod 1.9
Если как-то можно плагин оптимизировать, то буду рад советам
посмотри у инклуда lvlranks секцию public SharedPlugin, название должно точно совпадать с названием на сервер sm plugins list (регистр тоже)
 

7pElllHuK

Участник
Сообщения
1,654
Реакции
639
Версии одинаковые, одинаковые, но в одной ошибка, а в другой нет..
Сообщения автоматически склеены:

@7pElllHuK, лучше сделать так:
1. Скачать с гита ласт версию
2. Залить в см на компьютере и скомпилировать
3. Залить компилированные и прочие необходимые файлы на сервер
4. В том же см создавать модули
1) Ласт версия не работает на 1.9 см
2) Компилил плагин именно на том см, что стоит на сервере
Сообщения автоматически склеены:

посмотри у инклуда lvlranks секцию public SharedPlugin, название должно точно совпадать с названием на сервер sm plugins list (регистр тоже)
Название совпадает, 1 в 1
 

7pElllHuK

Участник
Сообщения
1,654
Реакции
639
Всем добрый день, подскажите пожалуйста, почему плагин работает некорректно. Должно вывоводить текст только тогда, когда в команде 1 игрок убил всю вражескую команду, а оно выводит даже если кто-то другой убил 1 игрока.
Пример: Играем 5 на 5, Вася убил 1 игрока, а Петя убил 4, в конце раунда плагин выведет сообщение о том, что Петя сделал Эйс, убив 4 игроков, хотя он убил не всю вражескую команду.
Тоже самое и с "Террористы победили без потерь." и "Спецназ победил без потерь."
Если кто-то 1 из команды умер, то все-равно пишет что Команда победила без потерь
Плагин:
#include <colors>
#include <cstrike>

int iClient_Ace,
    iAttacker_Ace,
    g_iKills[MAXPLAYERS + 1],
    g_iCountCT,
    g_iCountT;
    
public void Round_Start(Event hEvent, const char[] name, bool dontBroadcast)
{
    g_iCountCT = 0;
    g_iCountT = 0;

    for (int i; i <= MaxClients; i++)
    {
        if (!IsValidClient(i)) continue;
        if (!IsPlayerAlive(i)) continue;
        if (GetClientTeam(i) == CS_TEAM_CT) g_iCountCT++;
        else if (GetClientTeam(i) == CS_TEAM_T) g_iCountT++;
        
        g_iKills[i] = 0;
    }
}

public void Death(Event hEvent, const char[] name, bool dontBroadcast)
{
    iClient_Ace = GetClientOfUserId(GetEventInt(hEvent, "userid"));
    iAttacker_Ace = GetClientOfUserId(GetEventInt(hEvent, "attacker"));
    
    if (iClient_Ace == iAttacker_Ace)
    {
        if (GetClientTeam(iAttacker_Ace) == CS_TEAM_CT) g_iCountCT--;
        else if (GetClientTeam(iAttacker_Ace) == CS_TEAM_T) g_iCountT--;
    }
}

public Action Round_End(Event hEvent, const char[] name, bool dontBroadcast)
{
    char szKills[16];
    int winner_team = GetEventInt(hEvent, "winner");
    
    for (int i = 1; i <= MaxClients; i++)
    {
        if (!IsValidClient(i)) continue;
        if (!IsPlayerAlive(i)) continue;
    }

    for (int i; i <= MaxClients; i++)
    {
        if (!IsValidClient(i)) continue;
        if (!IsPlayerAlive(i)) continue;
        if (IsClientInGame(i) && !IsFakeClient(i))
        {
            if (g_iKills[i] >= 0 && g_iKills[i]) //тут проверка нужна для маленького онлайна
            {
                Format(szKills, sizeof(szKills), "игрок%s", (g_iKills[i] > 1) ? "ов" : "а");
                
                if (winner_team == 3 && g_iKills[i] == g_iCountT)
                {
                    CPrintToChatAll("Игрок %N сделал ACE убив %d %s!", i, g_iKills[i], szKills);
                }
                
                else if (winner_team == 2 && g_iKills[i] == g_iCountCT)
                {
                    CPrintToChatAll("Игрок %N сделал ACE убив %d %s!", i, g_iKills[i], szKills);
                }
                
                else if (winner_team == 2 && g_iCountT == g_iCountT)
                {
                    CPrintToChatAll("Террористы победили без потерь.");
                }
                
                else if (winner_team == 3 && g_iCountCT == g_iCountCT)
                {
                    CPrintToChatAll("Спецназ победил без потерь.");
                }
            }
        }
    }
}

stock bool IsValidClient(int iClient)
{
    return (0 < iClient && iClient <= MaxClients && IsClientInGame(iClient) && IsFakeClient(iClient) == false);
}
 
Сверху Снизу