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

Крузяра

Супермодератор
Сообщения
7,275
Реакции
5,549
А это, кстати, хороший вопрос. Даже не обратил внимание на неё.
 
Сообщения
235
Реакции
9
что за функция 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;
}
 
Сообщения
441
Реакции
266
Отправка сообщение реальным игрокам. Ну вот как весь плагин:
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:
 

Loco

Тяп, ляп и готово
Сообщения
857
Реакции
231
Отправка сообщение реальным игрокам. Ну вот как весь плагин:
Можно же напрямую сделать, а проверку выше.
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)
{
}
 
Сообщения
235
Реакции
9
[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]
Зачем?
 
Сообщения
441
Реакции
266
[QUOTE = "d4Ck, сообщение: 417775, участник: 91305"]
Так она возвращает bool, а там id игрок должен быть: Цензура:
[/ QUOTE]
всё правильно там, там идет отправка сообщение через цикл игрокам.
Сообщения автоматически склеены:


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

Крузяра

Супермодератор
Сообщения
7,275
Реакции
5,549
Собственно, все сказали выше.
Вам нужно делать цикл по игрокам, и с каждым персонально делать отправку панели.
 

Loco

Тяп, ляп и готово
Сообщения
857
Реакции
231
[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

похухоль
Сообщения
2,811
Реакции
1,542
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

похухоль
Сообщения
2,811
Реакции
1,542
d4Ck, насколько я понимаю, return прерывает цикл и завершает выполнение функции
 

Grey83

похухоль
Сообщения
2,811
Реакции
1,542
d4Ck, правда?
PHP:
public void OnPluginStart()
{
    PrintToServer("\n<Cycle check>");
    for(int i = 1; i <= MaxClients; i++)
    {
        PrintToServer("  #%i", i);
        return;
    }
    PrintToServer("</Cycle check>\n ");
}
Выдаёт вот это:
Код:
[BotNames] Names loaded: 46

<Cycle check>
  #1

Weapons with infinite clip allowed:
 
Сообщения
13
Реакции
1
Ну раз написал, значит не работает :D
все верно, не работает... Там проблема из-за дм'a, после рестарта сервера ничего не происходит... Тупо очки за убийства не даются... Надо сделать так чтоб раз в час в консоль прописывалась данная команда, mp_restartgame 1..
 

Loco

Тяп, ляп и готово
Сообщения
857
Реакции
231
Как работает FindEntityByClassname? а именно для info_player_terrorist / info_player_counterterrorist
При

PHP:
    if (FindEntityByClassname (-1, "info_player_terrorist") <= 0 && FindEntityByClassname (-1, "info_player_counterterrorist") <= 0)
    {   
        if (GetTeamClientCount(2) == GetTeamClientCount(3))             
            PrintToChatAll("есть два")
        else if (GetTeamClientCount(3) < GetTeamClientCount(2))     
            PrintToChatAll("есть т2")
        else if (GetTeamClientCount(2) < GetTeamClientCount(3))     
            PrintToChatAll("есть кт2")
    }
    if (FindEntityByClassname (-1, "info_player_terrorist") <= 0)       
        PrintToChatAll("есть т")
    if (FindEntityByClassname (-1, "info_player_counterterrorist") <= 0)    
        PrintToChatAll("есть кт")
пишет в чат следущее:
43768

Если задать > 0, то обще не пишет, тестил на карте mg_100traps, где доступна только кт команда.
 

Крузяра

Супермодератор
Сообщения
7,275
Реакции
5,549
Так функция возвращает -1, если энтити совсем не найдено.
 

Loco

Тяп, ляп и готово
Сообщения
857
Реакции
231
Так функция возвращает -1, если энтити совсем не найдено.
Ну так ентити есть, и даже не одна, но когда ставлю ">= 0", то ничего не происходит.
Сообщения автоматически склеены:

Какой лимит каналов для ShowHudText? И правда что канал не должен соотвествовать каналу худа ( m_iHideHud )? Просто проблема выходит, что иногда мерцает другой ShowHudText, когда появляется ещё один.
43769
 
Последнее редактирование:

Grey83

похухоль
Сообщения
2,811
Реакции
1,542
6 каналов одновременно на экране максимум
 
Все изображения и файлы загружайте только на наш сервер! Для этого используйте кнопку Прикрепить файлы, расположенную ниже или просто перетащите необходимые файлы/изображения со своего компьютера в окно редактора.
Сверху