Не работает плагин

DanZa

Участник
Сообщения
82
Реакции
11
Всем привет, вот код плагина
Код:
#include <sourcemod>

// Функция, которая изменяет запас патронов для указанного steamID и оружия
void ChangeAmmo(const char[] steamID, const char[] weapon, int ammo)
{
    for (int i = 1; i <= MaxClients; i++)
    {
        if (IsClientInGame(i) && !IsFakeClient(i))
        {
            if (StrEqual(GetClientAuthId(i), steamID))
            {
                // Получаем идентификатор оружия
                int weaponID = GetWeaponId(weapon);
                
                // Изменяем запас патронов
                SetEntData(i, Prop_Send, "m_iPrimaryReserveAmmoCount", ammo, weaponID);
            }
        }
    }
}

// Обработчик команды, которая изменяет запас патронов для указанного steamID и оружия
void sm_ChangeAmmoCommand(int client, int args)
{
    if (args != 4)
    {
        ClientPrint(client, print_chat, "Использование: sm_changeammo <steamID> <weapon> <ammo>");
        return;
    }
    
    char steamID[32], weapon[32];
    int ammo;
    GetCmdArg(1, steamID, sizeof(steamID));
    GetCmdArg(2, weapon, sizeof(weapon));
    ammo = StrToInt(GetCmdArg(3));
    
    ChangeAmmo(steamID, weapon, ammo);
    
    ClientPrint(client, print_chat, "Запас патронов изменен для указанного steamID и оружия.");
}

// Обработчик инициализации плагина
void OnPluginStart()
{
    RegConsoleCmd("sm_changeammo", sm_ChangeAmmoCommand, "Изменяет запас патронов для указанного steamID и оружия");
}

// Обработчик выгрузки плагина
void OnPluginEnd()
{
    UnregConsoleCmd("sm_changeammo");
}
Вот конфиг плагина
"personal_patrons"
{
"STEAM_0:1:1036453529"
{
"weapon_m4a1" "100"
"weapon_ak47" "50"
}
}
Плагин написан ChatGPT, в кодерстве не силён, пытался но не получилось, сервер видит плагин, но не видит его команды, при вводе в консоль команды sm_changeammo пишет Unknown command, что скажете в плагине много нужно чего переписывать или где-то маленький косяк?
 

NickFox

Обычный лисюк
Сообщения
138
Реакции
148
1. Строка 23. Калбэк для команды должен идти не с типом void, а с типом Action и возвращать в конце Plugin_Handled (дабы сервер понимал, что команда выполнилась), но оно не должно препятствовать основному функционалу
2. Строка 28. Тогда тут должен быть возврат значения Plugin_Handled (будет показывать, что команда выполнилась), либо же Plugin_Continue (выдаст сообщение, что команда не найдена)

Остальное пока не проверял. Возможно, ещё что-то ошибки содержит
 

DeathScore13

пирожок. пирожочек.
Сообщения
734
Реакции
403
2. Строка 28. Тогда тут должен быть возврат значения Plugin_Handled (будет показывать, что команда выполнилась), либо же Plugin_Continue (выдаст сообщение, что команда не найдена)
здесь Plugin_Continue, а в самом конце каллбека - Plugin_Handled. хотя лучше всегда Plugin_Handled, если нет ничего специфического
 

NickFox

Обычный лисюк
Сообщения
138
Реакции
148
здесь Plugin_Continue, а в самом конце каллбека - Plugin_Handled. хотя лучше всегда Plugin_Handled, если нет ничего специфического
Поэтому и указал оба варианта. И то это лишь то, что сразу в глаза бросается. Остальное пока даже времени проверять особо нет

Оффтоп
 

Palonez

бб братки
Сообщения
3,035
Реакции
1,837
Всем привет, вот код плагина
Код:
#include <sourcemod>

// Функция, которая изменяет запас патронов для указанного steamID и оружия
void ChangeAmmo(const char[] steamID, const char[] weapon, int ammo)
{
    for (int i = 1; i <= MaxClients; i++)
    {
        if (IsClientInGame(i) && !IsFakeClient(i))
        {
            if (StrEqual(GetClientAuthId(i), steamID))
            {
                // Получаем идентификатор оружия
                int weaponID = GetWeaponId(weapon);
          
                // Изменяем запас патронов
                SetEntData(i, Prop_Send, "m_iPrimaryReserveAmmoCount", ammo, weaponID);
            }
        }
    }
}

// Обработчик команды, которая изменяет запас патронов для указанного steamID и оружия
void sm_ChangeAmmoCommand(int client, int args)
{
    if (args != 4)
    {
        ClientPrint(client, print_chat, "Использование: sm_changeammo <steamID> <weapon> <ammo>");
        return;
    }
 
    char steamID[32], weapon[32];
    int ammo;
    GetCmdArg(1, steamID, sizeof(steamID));
    GetCmdArg(2, weapon, sizeof(weapon));
    ammo = StrToInt(GetCmdArg(3));
 
    ChangeAmmo(steamID, weapon, ammo);
 
    ClientPrint(client, print_chat, "Запас патронов изменен для указанного steamID и оружия.");
}

// Обработчик инициализации плагина
void OnPluginStart()
{
    RegConsoleCmd("sm_changeammo", sm_ChangeAmmoCommand, "Изменяет запас патронов для указанного steamID и оружия");
}

// Обработчик выгрузки плагина
void OnPluginEnd()
{
    UnregConsoleCmd("sm_changeammo");
}
Вот конфиг плагина
"personal_patrons"
{
"STEAM_0:1:1036453529"
{
"weapon_m4a1" "100"
"weapon_ak47" "50"
}
}
Плагин написан ChatGPT, в кодерстве не силён, пытался но не получилось, сервер видит плагин, но не видит его команды, при вводе в консоль команды sm_changeammo пишет Unknown command, что скажете в плагине много нужно чего переписывать или где-то маленький косяк?
C-подобный:
#include <sdktools_functions>

public void OnPluginStart()
{
    RegConsoleCmd("sm_changeammo", sm_ChangeAmmoCommand, "Изменяет запас патронов для указанного steamID и оружия");
}

public Action sm_ChangeAmmoCommand(int client, int args)
{
    if(args != 4)
    {
        ReplyToCommand(client, "Использование: sm_changeammo <steamID> <weapon> <ammo>");
        return Plugin_Handled;
    }
 
    char steamID[22], weapon[32], ammo[11];
    GetCmdArg(1, steamID, sizeof(steamID));
    GetCmdArg(2, weapon, sizeof(weapon));
    GetCmdArg(3, ammo, sizeof(ammo));
 
    ChangeAmmo(steamID, weapon, StringToInt(ammo));
 
    PrintToChat(client, "Запас патронов изменен для указанного steamID и оружия.");
    return Plugin_Handled;
}

stock void ChangeAmmo(const char[] steamID, const char[] weapon, int ammo)
{
    for (int i = 1; i <= MaxClients; i++)
    {
        if(IsClientInGame(i) && !IsFakeClient(i))
        {
            char auth[22];
            GetClientAuthId(i, AuthId_SteamID64, auth, sizeof(auth));
            if(strcmp(auth, steamID) == 0)
            {
                for(int j = 0; j <= 1; j++)
                {
                    int ent = GetPlayerWeaponSlot(i, j);
                    char class[32];
                    if(ent > MaxClients && IsValidEdict(ent))
                    {
                        GetEntityClassname(ent, class, sizeof(class));
                        if(strcmp(class, weapon) == 0)
                            SetEntProp(ent, Prop_Send, "m_iPrimaryReserveAmmoCount", ammo);  
                    }
                }
            }
        }
    }
}
Полюбасу не работает, от балды накидал, но примерно так надо
 
Последнее редактирование:

NickFox

Обычный лисюк
Сообщения
138
Реакции
148
Полюбасу не работает, от балды накидал, но примерно так надо
Для калбэков необязательно указывать, что функция публичная, ибо немного для другого используется, но да. Суть сказанного выше верно реализована
 

DanZa

Участник
Сообщения
82
Реакции
11
C-подобный:
#include <sdktools_functions>

public void OnPluginStart()
{
    RegConsoleCmd("sm_changeammo", sm_ChangeAmmoCommand, "Изменяет запас патронов для указанного steamID и оружия");
}

public Action sm_ChangeAmmoCommand(int client, int args)
{
    if(args != 4)
    {
        ReplyToCommand(client, "Использование: sm_changeammo <steamID> <weapon> <ammo>");
        return Plugin_Handled;
    }
 
    char steamID[22], weapon[32], ammo[11];
    GetCmdArg(1, steamID, sizeof(steamID));
    GetCmdArg(2, weapon, sizeof(weapon));
    GetCmdArg(3, ammo, sizeof(ammo));
 
    ChangeAmmo(steamID, weapon, StringToInt(ammo));
 
    PrintToChat(client, "Запас патронов изменен для указанного steamID и оружия.");
    return Plugin_Handled;
}

stock void ChangeAmmo(const char[] steamID, const char[] weapon, int ammo)
{
    for (int i = 1; i <= MaxClients; i++)
    {
        if(IsClientInGame(i) && !IsFakeClient(i))
        {
            char auth[22];
            GetClientAuthId(i, AuthId_SteamID64, auth, sizeof(auth));
            if(strcmp(auth, steamID) == 0)
            {
                for(int j = 0; j <= 1; j++)
                {
                    int ent = GetPlayerWeaponSlot(i, j);
                    char class[32];
                    if(ent > MaxClients && IsValidEdict(ent))
                    {
                        GetEntityClassname(ent, class, sizeof(class));
                        if(strcmp(class, weapon) == 0)
                            SetEntProp(ent, Prop_Send, "m_iPrimaryReserveAmmoCount", ammo); 
                    }
                }
            }
        }
    }
}
Полюбасу не работает, от балды накидал, но примерно так надо
Ну это бот кидал, искуственный интелект)) Просто не хочу плагин покупать, а в открытом доступе такого нету))
 

DeathScore13

пирожок. пирожочек.
Сообщения
734
Реакции
403
Для калбэков необязательно указывать, что функция публичная, ибо немного для другого используется
ты можешь для каждой функции делать паблик, т.к. компилятор начиная с 1.7 определяет ВСЕ функции как паблик
Сообщения автоматически склеены:

Ну это бот кидал, искуственный интелект)) Просто не хочу плагин покупать, а в открытом доступе такого нету))
попробуй завести себе ручного хоббита, который будет делать хотелки только потому что он "тех. админ" на твоём проекте. ну или сооснователь, тут как душе угодно
 
Последнее редактирование:

DanZa

Участник
Сообщения
82
Реакции
11
ты можешь для каждой функции делать паблик, т.к. компилятор начиная с 1.7 определяет ВСЕ функции как паблик
Сообщения автоматически склеены:


попробуй завести себе ручного хоббита, который будет делать хотелки только потому что он "тех. админ" на твоём проекте. ну или сооснователь, тут как душе угодно
Будешь им?)
 
Сверху Снизу