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

mar1q

Участник
Сообщения
13
Реакции
1
Доброго времени суток. Помогите написать плагин который будет автоматически после рестарта сервера прописывать в консоль команду mp_restartgame1, сервер АВП ДМ, если не прописать данную команду в консоли LVL ranks работать не будет.
 

alexmy

Участник
Сообщения
284
Реакции
13
C-подобный:
Handle WelcomePanel = CreatePanel(INVALID_HANDLE);
            Format(message2, sizeof(message2), "%N C Хомячил(а) Аптечку. Кол-во: %i", player, counts[player]);
            SetPanelTitle(WelcomePanel, message2);
           
            Format(message2, sizeof(message2), "Было ХП %i Стало %i ХП", Health, heal);
            DrawPanelText(WelcomePanel, message2);
           
            SendPanelToClient(WelcomePanel, FakeClient(), NullMenuHandler, 10);
            CloseHandle(WelcomePanel);
Привет всем, интересует такое. В начале карты отображается, стоит маленько поиграть. перестает отображаться
 

Kruzya

Участник
Сообщения
12,970
Реакции
10,914
@alexmy, число 10 в SendPanelToClient() замените на нужное время по отображению. Можно указать 0 (навсегда).
 

alexmy

Участник
Сообщения
284
Реакции
13
@alexmy, число 10 в SendPanelToClient() замените на нужное время по отображению. Можно указать 0 (навсегда).
Ты не понял. То есть в начале все норм. например в середине игры выполняется эта часть кода, сообщение вообще не появляется.
 

Kruzya

Участник
Сообщения
12,970
Реакции
10,914
А не вылезает оно, потому что есть незакрытая панель, которая как бы открыта, но не отображается. Во всём есть своя логика.
Код изначально странно написан. И не показали даже обработчик.
 

alexmy

Участник
Сообщения
284
Реакции
13
А не вылезает оно, потому что есть незакрытая панель, которая как бы открыта, но не отображается. Во всём есть своя логика.
Код изначально странно написан. И не показали даже обработчик.
О_о, если не сложно покажи как?
 

Акакий

Участник
Сообщения
59
Реакции
4
Доброго времени суток. Помогите написать плагин который будет автоматически после рестарта сервера прописывать в консоль команду mp_restartgame1, сервер АВП ДМ, если не прописать данную команду в консоли LVL ranks работать не будет.
вроде бы и без этого ведь работает
 

Kruzya

Участник
Сообщения
12,970
Реакции
10,914
А это, кстати, хороший вопрос. Даже не обратил внимание на неё.
 

alexmy

Участник
Сообщения
284
Реакции
13
что за функция FakeClient() и что она возвращает?
Отправка сообщение реальным игрокам. Ну вот как весь плагин:
PHP:
#pragma semicolon 1
#include <sourcemod>
#include <sdktools>

char  message[100];
int  counts[MAXPLAYERS+1];
static int Health, heal;

public void OnPluginStart()
{
    HookEvent("heal_success", Event_Heal_Success, EventHookMode_Post);
    
    HookEvent("heal_begin", Event_Heal_Begin, EventHookMode_Post);
    
    HookEvent("round_start",      eventResetSettings, EventHookMode_PostNoCopy);
    HookEvent("round_end",        eventResetSettings, EventHookMode_PostNoCopy);
    HookEvent("finale_win",       eventResetSettings, EventHookMode_PostNoCopy);
    HookEvent("mission_lost",     eventResetSettings, EventHookMode_PostNoCopy);
    HookEvent("map_transition",   eventResetSettings, EventHookMode_PostNoCopy);
}

public void eventResetSettings(Event event, const char[] name, bool dontBroadcast)
{
    for(int i = 1; i <= MaxClients; i++) if(IsClientInGame(i)) counts[i] = 0;
}

public void Event_Heal_Begin(Event event, const char[] name, bool dontBroadcast)
{
    Health = 0;
    int client = GetClientOfUserId(event.GetInt("userid")); 
    int player = GetClientOfUserId(event.GetInt("subject"));
    if(client == player && !IsFakeClient(client))
        Health = GetEntProp(player, Prop_Send, "m_iHealth");   
}

public void Event_Heal_Success(Event event, const char[] name, bool dontBroadcast)
{
    heal = 0;
    int client = GetClientOfUserId(event.GetInt("userid")); 
    int player = GetClientOfUserId(event.GetInt("subject"));
    {
        if(client == player && !IsFakeClient(client))
        {
            counts[player]++;
            heal = GetEntProp(player, Prop_Send, "m_iHealth");
            
            Handle WelcomePanel = CreatePanel(INVALID_HANDLE);
            Format(message2, sizeof(message2), "%N C Хомячил(а) Аптечку. Кол-во: %i", player, counts[player]);
            SetPanelTitle(WelcomePanel, message2);
          
            Format(message2, sizeof(message2), "Было ХП %i Стало %i ХП", Health, heal);
            DrawPanelText(WelcomePanel, message2);
          
            SendPanelToClient(WelcomePanel, FakeClient(), NullMenuHandler, 10);
            CloseHandle(WelcomePanel);
        }
    }
}

int NullMenuHandler(Handle menu, MenuAction action, int param1, int param2)
{
}

bool FakeClient()
{
    for(int i = 1; i <= MaxClients; i++) if(IsClientInGame(i) && !IsFakeClient(i))
        return true;
    return false;
}
 

d4Ck

Урегулированный
Сообщения
730
Реакции
562
Отправка сообщение реальным игрокам. Ну вот как весь плагин:
PHP:
#pragma semicolon 1
#include <sourcemod>
#include <sdktools>

char  message[100];
int  counts[MAXPLAYERS+1];
static int Health, heal;

public void OnPluginStart()
{
    HookEvent("heal_success", Event_Heal_Success, EventHookMode_Post);
  
    HookEvent("heal_begin", Event_Heal_Begin, EventHookMode_Post);
  
    HookEvent("round_start",      eventResetSettings, EventHookMode_PostNoCopy);
    HookEvent("round_end",        eventResetSettings, EventHookMode_PostNoCopy);
    HookEvent("finale_win",       eventResetSettings, EventHookMode_PostNoCopy);
    HookEvent("mission_lost",     eventResetSettings, EventHookMode_PostNoCopy);
    HookEvent("map_transition",   eventResetSettings, EventHookMode_PostNoCopy);
}

public void eventResetSettings(Event event, const char[] name, bool dontBroadcast)
{
    for(int i = 1; i <= MaxClients; i++) if(IsClientInGame(i)) counts[i] = 0;
}

public void Event_Heal_Begin(Event event, const char[] name, bool dontBroadcast)
{
    Health = 0;
    int client = GetClientOfUserId(event.GetInt("userid"));
    int player = GetClientOfUserId(event.GetInt("subject"));
    if(client == player && !IsFakeClient(client))
        Health = GetEntProp(player, Prop_Send, "m_iHealth"); 
}

public void Event_Heal_Success(Event event, const char[] name, bool dontBroadcast)
{
    heal = 0;
    int client = GetClientOfUserId(event.GetInt("userid"));
    int player = GetClientOfUserId(event.GetInt("subject"));
    {
        if(client == player && !IsFakeClient(client))
        {
            counts[player]++;
            heal = GetEntProp(player, Prop_Send, "m_iHealth");
          
            Handle WelcomePanel = CreatePanel(INVALID_HANDLE);
            Format(message2, sizeof(message2), "%N C Хомячил(а) Аптечку. Кол-во: %i", player, counts[player]);
            SetPanelTitle(WelcomePanel, message2);
        
            Format(message2, sizeof(message2), "Было ХП %i Стало %i ХП", Health, heal);
            DrawPanelText(WelcomePanel, message2);
        
            SendPanelToClient(WelcomePanel, FakeClient(), NullMenuHandler, 10);
            CloseHandle(WelcomePanel);
        }
    }
}

int NullMenuHandler(Handle menu, MenuAction action, int param1, int param2)
{
}

bool FakeClient()
{
    for(int i = 1; i <= MaxClients; i++) if(IsClientInGame(i) && !IsFakeClient(i))
        return true;
    return false;
}
Так она возвращает bool, а там id игрока должен быть:censored:
 

iLoco

Пишу плагины за печеньки 🍪🍪🍪
Сообщения
2,265
Реакции
1,323
Отправка сообщение реальным игрокам. Ну вот как весь плагин:
Можно же напрямую сделать, а проверку выше.
PHP:
#pragma semicolon 1
#include <sourcemod>
#include <sdktools>

char  message2[100];
int  counts[MAXPLAYERS+1];
static int Health, heal;

public void OnPluginStart()
{
    HookEvent("heal_success", Event_Heal_Success, EventHookMode_Post);
    
    HookEvent("heal_begin", Event_Heal_Begin, EventHookMode_Post);
    
    HookEvent("round_start",      eventResetSettings, EventHookMode_PostNoCopy);
    HookEvent("round_end",        eventResetSettings, EventHookMode_PostNoCopy);
    HookEvent("finale_win",       eventResetSettings, EventHookMode_PostNoCopy);
    HookEvent("mission_lost",     eventResetSettings, EventHookMode_PostNoCopy);
    HookEvent("map_transition",   eventResetSettings, EventHookMode_PostNoCopy);
}

public void eventResetSettings(Event event, const char[] name, bool dontBroadcast)
{
    for(int i = 1; i <= MaxClients; i++) if(IsClientInGame(i)) counts[i] = 0;
}

public void Event_Heal_Begin(Event event, const char[] name, bool dontBroadcast)
{
    Health = 0;
    int client = GetClientOfUserId(event.GetInt("userid"));
    int player = GetClientOfUserId(event.GetInt("subject"));
    if(client == player && !IsFakeClient(client))
        Health = GetEntProp(player, Prop_Send, "m_iHealth");   
}

public void Event_Heal_Success(Event event, const char[] name, bool dontBroadcast)
{
    heal = 0;
    int client = GetClientOfUserId(event.GetInt("userid"));
    int player = GetClientOfUserId(event.GetInt("subject"));
    {
        if(client == player && !IsFakeClient(client) && IsClientInGame(client))
        {
            counts[player]++;
            heal = GetEntProp(player, Prop_Send, "m_iHealth");
            
            Handle WelcomePanel = CreatePanel(INVALID_HANDLE);
            Format(message2, sizeof(message2), "%N C Хомячил(а) Аптечку. Кол-во: %i", player, counts[player]);
            SetPanelTitle(WelcomePanel, message2);
          
            Format(message2, sizeof(message2), "Было ХП %i Стало %i ХП", Health, heal);
            DrawPanelText(WelcomePanel, message2);
          
            SendPanelToClient(WelcomePanel, client, NullMenuHandler, 10);
            CloseHandle(WelcomePanel);
        }
    }
}

int NullMenuHandler(Handle menu, MenuAction action, int param1, int param2)
{
}
 

alexmy

Участник
Сообщения
284
Реакции
13
[QUOTE = "d4Ck, сообщение: 417775, участник: 91305"]
Так она возвращает bool, а там id игрок должен быть: Цензура:
[/ QUOTE]
всё правильно там, там идет отправка сообщение через цикл игрокам.
Сообщения автоматически склеены:

Можно же напрямую сделать, а проверку выше.
PHP:
#pragma semicolon 1
#include <sourcemod>
#include <sdktools>

char  message2[100];
int  counts[MAXPLAYERS+1];
static int Health, heal;

public void OnPluginStart()
{
    HookEvent("heal_success", Event_Heal_Success, EventHookMode_Post);
   
    HookEvent("heal_begin", Event_Heal_Begin, EventHookMode_Post);
   
    HookEvent("round_start",      eventResetSettings, EventHookMode_PostNoCopy);
    HookEvent("round_end",        eventResetSettings, EventHookMode_PostNoCopy);
    HookEvent("finale_win",       eventResetSettings, EventHookMode_PostNoCopy);
    HookEvent("mission_lost",     eventResetSettings, EventHookMode_PostNoCopy);
    HookEvent ("map_transition", eventResetSettings, EventHookMode_PostNoCopy);
}

public void eventResetSettings (Событие события, имя const char [], bool dontBroadcast)
{
    for (int i = 1; i <= MaxClients; i ++), если (IsClientInGame (i)) считается [i] = 0;
}

public void Event_Heal_Begin (Событие события, имя const char [], bool dontBroadcast)
{
    Здоровье = 0;
    int client = GetClientOfUserId (event.GetInt ("идентификатор пользователя"));
    int player = GetClientOfUserId (event.GetInt ("subject"));
    if (client == player &&! IsFakeClient (client))
        Health = GetEntProp (игрок, Prop_Send, "m_iHealth");  
}

public void Event_Heal_Success (Событие события, имя const char [], bool dontBroadcast)
{
    заживать = 0;
    int client = GetClientOfUserId (event.GetInt ("идентификатор пользователя"));
    int player = GetClientOfUserId (event.GetInt ("subject"));
    {
        if (client == player &&! IsFakeClient (клиент) && IsClientInGame (клиент))
        {
            отсчеты [игрок] ++;
            heal = GetEntProp (игрок, Prop_Send, "m_iHealth");
           
            Дескриптор WelcomePanel = CreatePanel (INVALID_HANDLE);
            Формат (message2, sizeof (message2), "% NC Хомячил (а) Аптечку. Кол-во:% i", игрок, счет [игрок]);
            SetPanelTitle (WelcomePanel, message2);
         
            Формат (message2, sizeof (message2), "Было ХП% i Стало% i ХП", Здоровье, исцеление);
            DrawPanelText (WelcomePanel, message2);
         
            SendPanelToClient (WelcomePanel, клиент, NullMenuHandler, 10);
            CloseHandle (WelcomePanel);
        }
    }
}

int NullMenuHandler (Управление меню, действие MenuAction, int param1, int param2)
{
}
[/КОД]
[/СПОЙЛЕР]
[/ QUOTE]
Зачем мне же видеть, мои данные мне одному?
Сообщения автоматически склеены:

Можно же напрямую сделать, а проверку выше.
PHP:
#pragma semicolon 1
#include <sourcemod>
#include <sdktools>

char  message2[100];
int  counts[MAXPLAYERS+1];
static int Health, heal;

public void OnPluginStart()
{
    HookEvent("heal_success", Event_Heal_Success, EventHookMode_Post);
   
    HookEvent("heal_begin", Event_Heal_Begin, EventHookMode_Post);
   
    HookEvent("round_start",      eventResetSettings, EventHookMode_PostNoCopy);
    HookEvent("round_end",        eventResetSettings, EventHookMode_PostNoCopy);
    HookEvent("finale_win",       eventResetSettings, EventHookMode_PostNoCopy);
    HookEvent("mission_lost",     eventResetSettings, EventHookMode_PostNoCopy);
    HookEvent ("map_transition", eventResetSettings, EventHookMode_PostNoCopy);
}

public void eventResetSettings (Событие события, имя const char [], bool dontBroadcast)
{
    for (int i = 1; i <= MaxClients; i ++), если (IsClientInGame (i)) считается [i] = 0;
}

public void Event_Heal_Begin (Событие события, имя const char [], bool dontBroadcast)
{
    Здоровье = 0;
    int client = GetClientOfUserId (event.GetInt ("идентификатор пользователя"));
    int player = GetClientOfUserId (event.GetInt ("subject"));
    if (client == player &&! IsFakeClient (client))
        Health = GetEntProp (игрок, Prop_Send, "m_iHealth");  
}

public void Event_Heal_Success (Событие события, имя const char [], bool dontBroadcast)
{
    заживать = 0;
    int client = GetClientOfUserId (event.GetInt ("идентификатор пользователя"));
    int player = GetClientOfUserId (event.GetInt ("subject"));
    {
        if (client == player &&! IsFakeClient (клиент) && IsClientInGame (клиент))
        {
            отсчеты [игрок] ++;
            heal = GetEntProp (игрок, Prop_Send, "m_iHealth");
           
            Дескриптор WelcomePanel = CreatePanel (INVALID_HANDLE);
            Формат (message2, sizeof (message2), "% NC Хомячил (а) Аптечку. Кол-во:% i", игрок, счет [игрок]);
            SetPanelTitle (WelcomePanel, message2);
         
            Формат (message2, sizeof (message2), "Было ХП% i Стало% i ХП", Здоровье, исцеление);
            DrawPanelText (WelcomePanel, message2);
         
            SendPanelToClient (WelcomePanel, клиент, NullMenuHandler, 10);
            CloseHandle (WelcomePanel);
        }
    }
}

int NullMenuHandler (Управление меню, действие MenuAction, int param1, int param2)
{
}
[/КОД]
[/СПОЙЛЕР]
[/ QUOTE]
Зачем?
 

d4Ck

Урегулированный
Сообщения
730
Реакции
562
[QUOTE = "d4Ck, сообщение: 417775, участник: 91305"]
Так она возвращает bool, а там id игрок должен быть: Цензура:
[/ QUOTE]
всё правильно там, там идет отправка сообщение через цикл игрокам.
Сообщения автоматически склеены:


Сообщения автоматически склеены:
Ты че прикалываешься, там true или false возвращает, когда в функции используется id игрока.
 

Kruzya

Участник
Сообщения
12,970
Реакции
10,914
Собственно, все сказали выше.
Вам нужно делать цикл по игрокам, и с каждым персонально делать отправку панели.
 

iLoco

Пишу плагины за печеньки 🍪🍪🍪
Сообщения
2,265
Реакции
1,323
[QUOTE = "d4Ck, сообщение: 417775, участник: 91305"]
Так она возвращает bool, а там id игрок должен быть: Цензура:
[/ QUOTE]
всё правильно там, там идет отправка сообщение через цикл игрокам.
Сообщения автоматически склеены:


Сообщения автоматически склеены:
Прочтите API SendPanelToClient · menus · SourceMod Scripting API Reference, там чётко сказано что нужен id игрока, а не bool,

А этот цикл проверяет кажого игрока не фейл ли он и если он в игре. И возвращает bool значение, а нужно id игрока.
PHP:
bool FakeClient()
{
    for(int i = 1; i <= MaxClients; i++) if(IsClientInGame(i) && !IsFakeClient(i))
        return true;
    return false;
}
 

Grey83

не пишу плагины с весны 2022
Сообщения
8,520
Реакции
4,979
PHP:
bool FakeClient()
{
    for(int i = 1; i <= MaxClients; i++) if(IsClientInGame(i) && !IsFakeClient(i))
        return true;
    return false;
}
лол, оно даже цикл не делает, а отсылает true при нахождении первого же реального игрока и прекращает работу :rtfm:
Сообщения автоматически склеены:

вот так попробуй:
PHP:
#pragma semicolon 1

int counts[MAXPLAYERS+1], iHP;

public void OnPluginStart()
{
    HookEvent("heal_begin", Event_Heal_Begin);
    HookEvent("heal_success", Event_Heal_Success);

    HookEvent("round_start",    Event_Reset, EventHookMode_PostNoCopy);
    HookEvent("round_end",        Event_Reset, EventHookMode_PostNoCopy);
    HookEvent("finale_win",        Event_Reset, EventHookMode_PostNoCopy);
    HookEvent("mission_lost",    Event_Reset, EventHookMode_PostNoCopy);
    HookEvent("map_transition",    Event_Reset, EventHookMode_PostNoCopy);
}

public void OnClientConnected(int client)
{
    counts[client] = 0;
}

public void Event_Reset(Event event, const char[] name, bool dontBroadcast)
{
    for(int i = 1; i <= MaxClients; i++) counts[i] = 0;
}

public void Event_Heal_Begin(Event event, const char[] name, bool dontBroadcast)
{
    iHP = 0;
    static int uid, client;
    if((uid = event.GetInt("userid")) == event.GetInt("subject") && (client = GetClientOfUserId(uid))
    && !IsFakeClient(client))
        iHP = GetClientHealth(client);
}

public void Event_Heal_Success(Event event, const char[] name, bool dontBroadcast)
{
    static int uid, client;
    if((uid = event.GetInt("userid")) == event.GetInt("subject") && (client = GetClientOfUserId(uid))
    && !IsFakeClient(client))
    {
        counts[client]++;

        static char buffer[100];
        Panel panel = CreatePanel();
        FormatEx(buffer, sizeof(buffer), "%N схомячил(а) аптечку. Кол-во: %i", client, counts[client]);
        SetPanelTitle(panel, buffer);

        FormatEx(buffer, sizeof(buffer), "Было ХП %i Стало %i ХП", iHP, GetClientHealth(client));
        DrawPanelText(panel, buffer);

        for(int i = 1; i <= MaxClients; i++) if(IsClientInGame(i) && !IsFakeClient(i))
            SendPanelToClient(panel, i, NullMenuHandler, 10);
        CloseHandle(panel);
    }
}

public int NullMenuHandler(Menu menu, MenuAction action, int param1, int param2){}
 
Последнее редактирование:

Grey83

не пишу плагины с весны 2022
Сообщения
8,520
Реакции
4,979
d4Ck, насколько я понимаю, return прерывает цикл и завершает выполнение функции
 
Сверху Снизу