SourcePawn ServerCommand проблема

X X X

Участник
Сообщения
31
Реакции
3
Я новичок и ещё плохо пишу скрипты. У меня есть скрипт который при убийстве в голову должен выдавать денег игроку через команду sm_cash, но через ServerCommand она не работает, подскажите почему и как использовать такие команды пожалуйса?

SourcePawn:
#include <sdkhooks>
#include <sdktools>
#include <sourcemod>
#include <console>
#include <cstrike>
#include <clients>
#include <csgo_colors>
#pragma newdecls required
#pragma semicolon 1


public Plugin myinfo =
{
    name = "iks_test",
    author = "iks",
    description = "",
    version = "1.0.0",
};


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

public Action Event_PlayerDeath(Event hEvent, const char[] sEvName, bool bDontBroadCast)
{
    int iUserId = hEvent.GetInt("userid");
    int iClient = GetClientOfUserId(iUserId);
    char sKilled[128];
    char sKilledName[128];
    if (IsClientInGame(iClient) && IsClientInGame(GetClientOfUserId(hEvent.GetInt("attacker"))))
    {
        GetClientName(iClient, sKilledName, sizeof(sKilledName));
        strcopy(sKilled, sizeof(sKilled), "Вы убили игрока в голову");
        Format(sKilled, sizeof(sKilled), "Вы убили игрока %s в голову", sKilledName);
        if (hEvent.GetBool("headshot"))
        {
            CGOPrintToChat(GetClientOfUserId(hEvent.GetInt("attacker")), "{GREEN}Вы убили игрока {RED}%s {GREEN}в голову!", sKilledName);

            ServerCommand("sm_cash \"#%i\" +1500", hEvent.GetInt("attacker"));
            PrintToServer("sm_cash \"#%i\" +1500", hEvent.GetInt("attacker"));
            CGOPrintToChat(GetClientOfUserId(hEvent.GetInt("attacker")),"{GREEN}За это вы получаете 1500$!");
        }
    }
   

    return Plugin_Continue;
}
 

danil253467

💘Italo-Disco & Neon One Love💘
Сообщения
90
Реакции
52
Я новичок и ещё плохо пишу скрипты. У меня есть скрипт который при убийстве в голову должен выдавать денег игроку через команду sm_cash, но через ServerCommand она не работает, подскажите почему и как использовать такие команды пожалуйса?

SourcePawn:
#include <sdkhooks>
#include <sdktools>
#include <sourcemod>
#include <console>
#include <cstrike>
#include <clients>
#include <csgo_colors>
#pragma newdecls required
#pragma semicolon 1


public Plugin myinfo =
{
    name = "iks_test",
    author = "iks",
    description = "",
    version = "1.0.0",
};


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

public Action Event_PlayerDeath(Event hEvent, const char[] sEvName, bool bDontBroadCast)
{
    int iUserId = hEvent.GetInt("userid");
    int iClient = GetClientOfUserId(iUserId);
    char sKilled[128];
    char sKilledName[128];
    if (IsClientInGame(iClient) && IsClientInGame(GetClientOfUserId(hEvent.GetInt("attacker"))))
    {
        GetClientName(iClient, sKilledName, sizeof(sKilledName));
        strcopy(sKilled, sizeof(sKilled), "Вы убили игрока в голову");
        Format(sKilled, sizeof(sKilled), "Вы убили игрока %s в голову", sKilledName);
        if (hEvent.GetBool("headshot"))
        {
            CGOPrintToChat(GetClientOfUserId(hEvent.GetInt("attacker")), "{GREEN}Вы убили игрока {RED}%s {GREEN}в голову!", sKilledName);

            ServerCommand("sm_cash \"#%i\" +1500", hEvent.GetInt("attacker"));
            PrintToServer("sm_cash \"#%i\" +1500", hEvent.GetInt("attacker"));
            CGOPrintToChat(GetClientOfUserId(hEvent.GetInt("attacker")),"{GREEN}За это вы получаете 1500$!");
        }
    }
  

    return Plugin_Continue;
}
Для работы команды через ServerCommand она уже должна существовать. Для создания команды используй RegConsoleCmd в OnPluginStart.

Например:

C++:
public void OnPluginStart()
{
    RegConsoleCmd("sm_cash", OnCash); // OnCash - название каллбэка, в нем будет расписано действие команды. Назвать его можно как угодно   
}

Action OnCash(int client, int args)
{
    // Здесь уже что-то происходит
    return Plugin_Handled; // Обязательно в конце пишем это во избежание ошибки Unknown Command
}
 

X X X

Участник
Сообщения
31
Реакции
3
я не уверен что там нужен "+"
он нужен, потому что мне надо прибавлять, без него тоже не работает
Сообщения автоматически склеены:

Для работы команды через ServerCommand она уже должна существовать. Для создания команды используй RegConsoleCmd в OnPluginStart.

Например:

C++:
public void OnPluginStart()
{
    RegConsoleCmd("sm_cash", OnCash); // OnCash - название каллбэка, в нем будет расписано действие команды. Назвать его можно как угодно  
}

Action OnCash(int client, int args)
{
    // Здесь уже что-то происходит
    return Plugin_Handled; // Обязательно в конце пишем это во избежание ошибки Unknown Command
}
Эта команда из другого плагина. Так будет работать?
 

Palonez

бб братки
Сообщения
3,035
Реакции
1,837
C-подобный:
#include <sourcemod>
#include <cstrike>
#include <csgo_colors>

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

public Action Event_PlayerDeath(Event hEvent, const char[] sEvName, bool bDontBroadCast)
{
    int iClient = GetClientOfUserId(hEvent.GetInt("userid"));
    int iAttacker = GetClientOfUserId(hEvent.GetInt("attacker"));
    if(IsClientInGame(iClient) && IsClientInGame(iAttacker))
    {
        if (hEvent.GetBool("headshot"))
        {
            CGOPrintToChat(iAttacker, "{GREEN}Вы убили игрока {RED}%N {GREEN}в голову!", iClient);
            SetEntProp(iAttacker, Prop_Send, "m_iAccount", GetEntProp(iAttacker, Prop_Data, "m_iAccount") + 1500);
            CGOPrintToChat(iAttacker,"{GREEN}За это вы получаете 1500$!");
        }
    }
  
    return Plugin_Continue;
}
 

X X X

Участник
Сообщения
31
Реакции
3
C-подобный:
#include <sourcemod>
#include <cstrike>
#include <csgo_colors>

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

public Action Event_PlayerDeath(Event hEvent, const char[] sEvName, bool bDontBroadCast)
{
    int iClient = GetClientOfUserId(hEvent.GetInt("userid"));
    int iAttacker = GetClientOfUserId(hEvent.GetInt("attacker"));
    if(IsClientInGame(iClient) && IsClientInGame(iAttacker))
    {
        if (hEvent.GetBool("headshot"))
        {
            CGOPrintToChat(iAttacker, "{GREEN}Вы убили игрока {RED}%N {GREEN}в голову!", iClient);
            SetEntProp(iAttacker, Prop_Send, "m_iAccount", GetEntProp(iAttacker, Prop_Data, "m_iAccount") + 1500);
            CGOPrintToChat(iAttacker,"{GREEN}За это вы получаете 1500$!");
        }
    }
 
    return Plugin_Continue;
}
Можно пожалуйста с объяснением на SetEntProp и GetEntProp буду очень благодарен!
Сообщения автоматически склеены:

и что это за параметр? "m_iAccount"
 

Grey83

не пишу плагины с весны 2022
Сообщения
8,519
Реакции
4,979
попробуй вот так:
C-подобный:
#pragma semicolon 1
#pragma newdecls required

#include <csgo_colors>

public Plugin myinfo =
{
    name    = "iks_test",
    author    = "iks",
    version    = "1.0.0_fix",
}

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

public void Event_PlayerDeath(Event event, const char[] name, bool dontBroadcast)
{
    if(!event.GetBool("headshot"))
        return;

    int victim = GetClientOfUserId(event.GetInt("userid"));
    if(!victim || !IsClientInGame(victim))
        return;

    int client = GetClientOfUserId(event.GetInt("attacker"));
    if(!client || client == victim || !IsClientInGame(client) || IsFakeClient(client))
        return;

    CGOPrintToChat(client, "{GREEN}Вы убили игрока {RED}%N {GREEN}в голову!", victim);
    int uid = GetClientUserId(client);
    ServerCommand("sm_cash #%i +1500", uid);
    PrintToServer("sm_cash #%i +1500", uid);
    CGOPrintToChat(client,"{GREEN}За это вы получаете $1500!");
}
Сообщения автоматически склеены:

в принципе некоторые проверки - перестраховка, но мешать не должны (кстати, ботам писать так не будет и давать деньг - тоже)
 

X X X

Участник
Сообщения
31
Реакции
3
Огромное спасибо парни, обожаю вас и эту часть комьюнити хлмода)
Сообщения автоматически склеены:

C-подобный:
#include <sourcemod>
#include <cstrike>
#include <csgo_colors>

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

public Action Event_PlayerDeath(Event hEvent, const char[] sEvName, bool bDontBroadCast)
{
    int iClient = GetClientOfUserId(hEvent.GetInt("userid"));
    int iAttacker = GetClientOfUserId(hEvent.GetInt("attacker"));
    if(IsClientInGame(iClient) && IsClientInGame(iAttacker))
    {
        if (hEvent.GetBool("headshot"))
        {
            CGOPrintToChat(iAttacker, "{GREEN}Вы убили игрока {RED}%N {GREEN}в голову!", iClient);
            SetEntProp(iAttacker, Prop_Send, "m_iAccount", GetEntProp(iAttacker, Prop_Data, "m_iAccount") + 1500);
            CGOPrintToChat(iAttacker,"{GREEN}За это вы получаете 1500$!");
        }
    }
 
    return Plugin_Continue;
}
возникла ошибка:
C-подобный:
L 03/16/2023 - 19:15:48: [SM] Exception reported: Property "m_iAccount" not found (entity 2/player)
L 03/16/2023 - 19:15:48: [SM] Blaming: iks_test.smx
L 03/16/2023 - 19:15:48: [SM] Call stack trace:
L 03/16/2023 - 19:15:48: [SM]   [0] GetEntProp
L 03/16/2023 - 19:15:48: [SM]   [1] Line 19, c:\Users\Iks\Desktop\plugin\scripting\iks_test.sp::Event_PlayerDeath
 
Последнее редактирование:

Palonez

бб братки
Сообщения
3,035
Реакции
1,837
Огромное спасибо парни, обожаю вас и эту часть комьюнити хлмода)
Сообщения автоматически склеены:


возникла ошибка:
C-подобный:
L 03/16/2023 - 19:15:48: [SM] Exception reported: Property "m_iAccount" not found (entity 2/player)
L 03/16/2023 - 19:15:48: [SM] Blaming: iks_test.smx
L 03/16/2023 - 19:15:48: [SM] Call stack trace:
L 03/16/2023 - 19:15:48: [SM]   [0] GetEntProp
L 03/16/2023 - 19:15:48: [SM]   [1] Line 19, c:\Users\Iks\Desktop\plugin\scripting\iks_test.sp::Event_PlayerDeath
C-подобный:
#include <sourcemod>
#include <csgo_colors>

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

public void Event_PlayerDeath(Event hEvent, const char[] sEvName, bool bDontBroadCast)
{
    int iClient = GetClientOfUserId(hEvent.GetInt("userid"));
    int iAttacker = GetClientOfUserId(hEvent.GetInt("attacker"));
    if(0 < iAttacker && IsClientInGame(iClient) && IsClientInGame(iAttacker) && !IsFakeClient(iAttacker))
    {
        if(hEvent.GetBool("headshot"))
        {
            SetEntProp(iAttacker, Prop_Send, "m_iAccount", GetEntProp(iAttacker, Prop_Data, "m_iAccount") + 1500);
            CGOPrintToChat(iAttacker,"{GREEN}Вы убили игрока {RED}%N {GREEN}в голову!\n{GREEN}За это вы получаете 1500$!", iClient);
        }
    }
}
 

Grey83

не пишу плагины с весны 2022
Сообщения
8,519
Реакции
4,979
IsClientInGame(iAttacker) && !IsFakeClient(iAttacker)
Я бы сначала ещё бы и индекс убийцы проверял на твоём месте: игрок мог выйти или убийцей мог быть мир (в обеих случаях индекс был равен 0).
 

Palonez

бб братки
Сообщения
3,035
Реакции
1,837
Я бы сначала ещё бы и индекс убийцы проверял на твоём месте: игрок мог выйти или убийцей мог быть мир (в обеих случаях индекс был равен 0).
Мне кажется этот шанс настолько мелкий, что смысла нет проверять на выход. Там же в долях секунд это все происходит, чтобы он вышел сразу же после убийства, это еще нужно постараться
 

Grey83

не пишу плагины с весны 2022
Сообщения
8,519
Реакции
4,979
Сверху Снизу