ChatGPT умеет писать плагины на sourcepawn?

LeXon

Участник
Сообщения
317
Реакции
29
Я попросил бота написать плагин внутриигровой валюты

Плагин игровой валюты:
#include <sourcemod>

enum CurrencyType
{
    CASH,
    COINS
}

new Handle:g_hTimer;

public Plugin myPlugin;
public Dictionary g_PlayerCurrency;

public void OnPluginStart()
{
    myPlugin = Plugin();
    myPlugin.SetAuthor("Your Name");
    myPlugin.SetVersion("1.0");
    myPlugin.SetDescription("Currency system example");
    
    g_PlayerCurrency = CreateDictionary();
    
    RegisterEvent("player_spawn", "OnPlayerSpawn", EventPriority_Normal);
    RegisterCommand("givecurrency", "cmdGiveCurrency", ADMFLAG_GENERIC, "Give currency to a player", FCVAR_NONE);
    RegisterCommand("checkcurrency", "cmdCheckCurrency", ADMFLAG_GENERIC, "Check a player's currency balance", FCVAR_NONE);
    
    g_hTimer = CreateTimer(60.0, Timer_UpdateCurrency, _, TIMER_FLAG_RECURRING);
}

public Action OnPlayerSpawn(int client)
{
    DisplayCurrencyMessage(client);
    return Plugin_Handled;
}

public void DisplayCurrencyMessage(int client)
{
    int cash = GetPlayerCurrency(client, CASH);
    int coins = GetPlayerCurrency(client, COINS);
    
    PrintToChat(client, "Your currency balance: Cash - %d, Coins - %d", cash, coins);
}

public int GetPlayerCurrency(int client, CurrencyType type)
{
    if (!g_PlayerCurrency.Contains(client))
    {
        g_PlayerCurrency[client] = CreateDictionary();
    }
    
    int currency = 0;
    g_PlayerCurrency[client].GetValue(type, currency);
    return currency;
}

public void SetPlayerCurrency(int client, CurrencyType type, int value)
{
    if (!g_PlayerCurrency.Contains(client))
    {
        g_PlayerCurrency[client] = CreateDictionary();
    }
    
    g_PlayerCurrency[client][type] = value;
}

public void AddPlayerCurrency(int client, CurrencyType type, int amount)
{
    int currentBalance = GetPlayerCurrency(client, type);
    SetPlayerCurrency(client, type, currentBalance + amount);
}

public void cmdGiveCurrency(int client, const char[] args)
{
    if (args.ArgC() < 3)
    {
        PrintToChat(client, "Usage: sm_givecurrency <target> <amount>");
        return;
    }

    int targetClient = FindTargetClient(args.Arg(1));
    if (targetClient == -1)
    {
        PrintToChat(client, "Player not found!");
        return;
    }

    int amount = StrToInt(args.Arg(2));
    AddPlayerCurrency(targetClient, CASH, amount);
    DisplayCurrencyMessage(targetClient);
}

public void cmdCheckCurrency(int client, const char[] args)
{
    DisplayCurrencyMessage(client);
}

public void Timer_UpdateCurrency(Handle hTimer)
{
    for (int i = 1; i <= MaxClients; i++)
    {
        if (IsClientInGame(i))
        {
            AddPlayerCurrency(i, COINS, 1);
        }
    }
}
Насколько хорошо он справился?
 

Ice_Sochi

Участник
Сообщения
709
Реакции
413
Сам по себе плагин, если учесть, что заработает, выглядит бесполезным
Как основа для чего-то большего - ну, может кому и сойдет.
 

LeXon

Участник
Сообщения
317
Реакции
29
@Ice_Sochi, это хорошо что он вообще знаком с таким узконаправленным языком.
Маленькие плагины то он точно сможет писать хоть пачками, любой запрос.
GPT в принципе решает 80% моих проблем, где мне лень копаться он правит сам за секунду, и это касается всех сфер где его можно применить.
 

Ice_Sochi

Участник
Сообщения
709
Реакции
413
Маленькие плагины то он точно сможет писать
Возможно, но многое зависит все же от тз, не думаю, что уж пачками.
GPT в принципе решает 80% моих проблем, где мне лень копаться он правит сам за секунду, и это касается всех сфер где его можно применить.
Есть конкретные примеры, где он правит уже написанные плагины?
 

LeXon

Участник
Сообщения
317
Реакции
29
Возможно, но многое зависит все же от тз, не думаю, что уж пачками.
напиши любой запрос на небольшой плагин, попробую выдоить с него, заодно посмотрим на результат
Есть конкретные примеры, где он правит уже написанные плагины?
ему в принципе плевать что править, я пока не знаю уровня его возможностей, нужно учитывать что это бесплатная версия с уровнем знаний 2021 или 22 года, если купить платную версию то там всё намного лучше с возможностями
 

Ice_Sochi

Участник
Сообщения
709
Реакции
413
напиши любой запрос на небольшой плагин, попробую выдоить с него, заодно посмотрим на результат
Давай попробуем Этот
Если сможет сделать настройку в конфиге - класс, но хотябы то, что уже есть в конкретном готовом.
 

Nekro

Терра инкогнита
Сообщения
4,025
Реакции
2,260
напиши любой запрос на небольшой плагин
Вы бы лучше привели 3-4 примера плагинов его, что вообще работают
бесплатная версия с уровнем знаний 2021 или 22 года
Да хоть 15 года знания этого языка, плагины будут работать
 

suremiur

♂ overlay master ♂
Сообщения
537
Реакции
585
Без собственных знаний в языке - может не получиться даже с маленькими плагинами (я про 200-400 строк), с изменением существующих - еще более проблематично. Но все возможно, если есть хоть крупица понимания как работает SP.
АИ мешает синтаксис, выдумывает собственные ограничения и функции, которые реализовать можно только с большим багажом знаний. Выдаивать его придется долго, править его ответы, а чем больше запросов вы отправляете, тем сильнее он начинает на них опираться, и на свои ответы - в конечном итоге зацикливается и еще больше ошибается.
Уже поднимали тему, он хорош в придумывании и основного наброска элементов.

Кстати, с помощью него можно собственно говоря и "учиться" SP. Просто кидаете код и пишете "Добавь комментарии к каждой строке".
 

7pElllHuK

Участник
Сообщения
1,416
Реакции
465
Мне частенько он помогал в плагинах, иногда интересные вариации предлагал к использованию, до которых я сам догадаться никак не мог. Так что в принципе чатгпт справляется со своей задачей, но как сказали выше до меня, без знаний в Sourcepawn код не пригодится, так как в 90% он не рабочий.
 

LeXon

Участник
Сообщения
317
Реакции
29
@Ice_Sochi,
код:
#include <sourcemod>

new bool g_bUsed[MAXPLAYERS];
new Handle g_hMenu_Main;

static const String g_sSndDisplay[][] =
{
    "Фраза 1",
    "Фраза 2",
    "Фраза 3",
    // Добавьте свои фразы по аналогии
};

static const String g_sSndChat[][] =
{
    "Фраза 1!",
    "Фраза 2!",
    "Фраза 3!",
    // Добавьте свои фразы по аналогии
};

static const String g_sSndPath[][] =
{
    "sound/фраза1.mp3",
    "sound/фраза2.mp3",
    "sound/фраза3.mp3",
    // Укажите путь к своим аудиофайлам
};

public Plugin:myinfo =
{
    name = "[VIP] Voice Sound Player",
    author = "Ваше Имя",
    description = "Плагин для воспроизведения голосовых фраз",
    version = "1.0",
    url = ""
};

public OnPluginStart()
{
    RegConsoleCmd("sm_snd", Command_Menu);
    HookEvent("round_start", Event_OnRoundStart, EventHookMode_PostNoCopy);

    g_hMenu_Main = CreateMenu(Menu_Main_Handler);
    SetMenuTitle(g_hMenu_Main, "Меню фраз:");
    SetMenuExitButton(g_hMenu_Main, true);

    for (new i; i < sizeof(g_sSndDisplay); i++)
    {
        AddMenuItem(g_hMenu_Main, "", g_sSndDisplay[i], g_sSndPath[i][0] != '\0' ? ITEMDRAW_DEFAULT : ITEMDRAW_DISABLED);
    }
}

public OnMapStart()
{
    decl String: sBuff[192];
    for (new i; i < sizeof(g_sSndPath); i++)
    {
        PrecacheSoundAny(g_sSndPath[i]);
        FormatEx(sBuff, sizeof(sBuff), "sound/%s", g_sSndPath[i]);
        AddFileToDownloadsTable(sBuff);
    }
}

public Action:Command_Menu(client, args)
{
    if (client)
    {
        if (g_bUsed[client])
        {
            ReplyToCommand(client, "Следующий звук можно проиграть только в новом раунде.");
            return Plugin_Handled;
        }

        DisplayMenu(g_hMenu_Main, client, MENU_TIME_FOREVER);
    }
    else
    {
        ReplyToCommand(client, "Команда доступна только в игре.");
    }
    return Plugin_Handled;
}

public Menu_Main_Handler(Handle:h, MenuAction:a, c, o)
{
    switch (a)
    {
        case MenuAction_Select:
        {
            PrintToChatAll(" \x01\x0B\x02★\x04%N\x01:\x0E%s", c, g_sSndChat[o]);
            EmitSoundToAllAny(g_sSndPath[o]);
            g_bUsed[c] = true;
        }
    }
}

public Event_OnRoundStart(Handle:event, const String:name[], bool:silent)
{
    for (new i = 1; i <= MaxClients; ++i)
    {
        g_bUsed[i] = false;
    }
}
чтобы что-то он мог написать, ему нужно нормально растолковать ТЗ, а если написать сделай то шо я хочу, он соответственно и выдаст шопопало.
Сообщения автоматически склеены:

Вы бы лучше привели 3-4 примера плагинов его, что вообще работают
зависит от объёма кода, маленькие думаю работать будут и они не привязаны к местным обычаям и стандартам, там только отдельные самостоятельные плагины.
Сообщения автоматически склеены:

@suremiur, это однозначно лучше чем ничего, такие советы как даёт по тому же соурс павну, типы берут деньги, даже часто за пару строчек, не говоря уже о том что ко-то будет обучать.
Сообщения автоматически склеены:

@7pElllHuK, прям в 90%?
 
Последнее редактирование:

Ice_Sochi

Участник
Сообщения
709
Реакции
413
@Ice_Sochi,
код:
#include <sourcemod>

new bool g_bUsed[MAXPLAYERS];
new Handle g_hMenu_Main;

static const String g_sSndDisplay[][] =
{
    "Фраза 1",
    "Фраза 2",
    "Фраза 3",
    // Добавьте свои фразы по аналогии
};

static const String g_sSndChat[][] =
{
    "Фраза 1!",
    "Фраза 2!",
    "Фраза 3!",
    // Добавьте свои фразы по аналогии
};

static const String g_sSndPath[][] =
{
    "sound/фраза1.mp3",
    "sound/фраза2.mp3",
    "sound/фраза3.mp3",
    // Укажите путь к своим аудиофайлам
};

public Plugin:myinfo =
{
    name = "[VIP] Voice Sound Player",
    author = "Ваше Имя",
    description = "Плагин для воспроизведения голосовых фраз",
    version = "1.0",
    url = ""
};

public OnPluginStart()
{
    RegConsoleCmd("sm_snd", Command_Menu);
    HookEvent("round_start", Event_OnRoundStart, EventHookMode_PostNoCopy);

    g_hMenu_Main = CreateMenu(Menu_Main_Handler);
    SetMenuTitle(g_hMenu_Main, "Меню фраз:");
    SetMenuExitButton(g_hMenu_Main, true);

    for (new i; i < sizeof(g_sSndDisplay); i++)
    {
        AddMenuItem(g_hMenu_Main, "", g_sSndDisplay[i], g_sSndPath[i][0] != '\0' ? ITEMDRAW_DEFAULT : ITEMDRAW_DISABLED);
    }
}

public OnMapStart()
{
    decl String: sBuff[192];
    for (new i; i < sizeof(g_sSndPath); i++)
    {
        PrecacheSoundAny(g_sSndPath[i]);
        FormatEx(sBuff, sizeof(sBuff), "sound/%s", g_sSndPath[i]);
        AddFileToDownloadsTable(sBuff);
    }
}

public Action:Command_Menu(client, args)
{
    if (client)
    {
        if (g_bUsed[client])
        {
            ReplyToCommand(client, "Следующий звук можно проиграть только в новом раунде.");
            return Plugin_Handled;
        }

        DisplayMenu(g_hMenu_Main, client, MENU_TIME_FOREVER);
    }
    else
    {
        ReplyToCommand(client, "Команда доступна только в игре.");
    }
    return Plugin_Handled;
}

public Menu_Main_Handler(Handle:h, MenuAction:a, c, o)
{
    switch (a)
    {
        case MenuAction_Select:
        {
            PrintToChatAll(" \x01\x0B\x02★\x04%N\x01:\x0E%s", c, g_sSndChat[o]);
            EmitSoundToAllAny(g_sSndPath[o]);
            g_bUsed[c] = true;
        }
    }
}

public Event_OnRoundStart(Handle:event, const String:name[], bool:silent)
{
    for (new i = 1; i <= MaxClients; ++i)
    {
        g_bUsed[i] = false;
    }
}
чтобы что-то он мог написать, ему нужно нормально растолковать ТЗ, а если написать сделай то шо я хочу, он соответственно и выдаст шопопало.
Я сейчас не могу глянуть код плагина образца, но по-моему он взял код под копирку, даже названия переменных
 

LeXon

Участник
Сообщения
317
Реакции
29
@Ice_Sochi, так тут на выбор либо понятным ему языком объяснить что от него хотят либо написать ему сделать такую же идею плагина но по своему
 

LeXon

Участник
Сообщения
317
Реакции
29
@Grey83, не было возможности проверить на платной версии?
 

Grey83

не пишу плагины с весны 2022
Сообщения
8,521
Реакции
4,980
@LeXon, уже несколько раз приносили сюда код написанный этим ботом (без понятия какой версией).
Емнип, ни разу не скомпилировался. =)
 

d3v

Участник
Сообщения
470
Реакции
146
Если грамотно прописывать для него промты, он сгенерирует то, что от него требуется, но нужно понимать что от него требовать
 

LeXon

Участник
Сообщения
317
Реакции
29
@d3v, @Grey83, @Synd1qate, @Ice_Sochi, @7pElllHuK, @suremiur, @Nekro,
вот он за секунд 40 перевёл достататочно сложный перевод, это сколько же времени сэкономил

перевод:
Исправлено:

```json
"Phrases"
{
    "Slot Block Message 1"
    {
        "en"    "Consider which map you want to play",
        "ru"    "Обдумайте, какую карту вы хотите играть"
    }

    "Slot Block Message 2"
    {
        "en"    "and don't hit buttons thoughtlessly."
    }

    "Map Vote Menu Title"
    {
        "en"    "Vote for the next map!",
        "ru"    "Голосуй за следующую карту!"
    }

    "Group Vote Menu Title"
    {
        "en"    "Vote for the next map group!",
        "ru"    "Голосуй за следующую группу карт!"
    }

    "Extend Map"
    {
        "en"    "Extend Map",
        "ru"    "Продлить карту"
    }

    "Don't Change"
    {
        "en"    "Don't Change",
        "ru"    "Не изменять"
    }

    "End of Map Vote Over"
    {
        "en"    "Map Voting has finished.",
        "ru"    "Голосование за карту завершено."
    }

    "Map Extended"
    {
        "en"    "The current map will be extended.",
        "ru"    "Текущая карта будет продлена."
    }

    "End of Map Vote Map Won"
    {
        "#format"   "{1:s}",
        "en"    "The next map will be {1}.",
        "ru"    "Следующей картой будет {1}."
    }

    "Vote Win Percentage"
    {
        "#format"   "{1:.f},{2:i}",
        "en"    "Received {1}%% of {2} votes",
        "ru"    "Получено {1}%% от {2} голосов"
    }

    "Map Unchanged"
    {
        "en"    "The map will not be changed.",
        "ru"    "Карта не будет изменена."
    }

    "Map Change in 5"
    {
        "en"    "Map changing in 5 seconds.",
        "ru"    "Смена карты через 5 секунд."
    }

    "Map Change at Round End"
    {
        "en"    "Map will change at the end of this round.",
        "ru"    "Карта изменится в конце этого раунда."
    }

    "End of Map Vote Group Won"
    {
        "#format"   "{1:s},{2:s}",
        "en"    "The next map will be '{1},' chosen from map group '{2}.",
        "ru"    "Следующей картой будет '{1},' выбранная из группы карт '{2}."
    }

    "Runoff Msg"
    {
        "en"    "Vote Failed! No majority has been reached.",
        "ru"    "Голосование не удалось! Никто не получил большинства голосов."
    }

    "Another Vote"
    {
        "#format"   "{1:i}",
        "en"    "Another vote is on the way in {1} seconds.",
        "ru"    "Еще одно голосование через {1} секунд."
    }

    "Player Disconnect RTV"
    {
        "en"    "Player disconnect triggered Rock the Vote.",
        "ru"    "Отключение игрока вызвало Rock the Vote."
    }

    "Not Enough Players"
    {
        "#format"   "{1:i}",
        "en"    "Not enough players on the server for the current map. ({1} required)",
        "ru"    "Недостаточно игроков на сервере для текущей карты. (требуется {1})"
    }

    "Too Many Players"
    {
        "#format"   "{1:i}",
        "en"    "Too many players on the server for the current map. ({1} maximum)",
        "ru"    "Слишком много игроков на сервере для текущей карты. (максимум {1})"
    }

    "No RTV Player Count"
    {
        "#format"   "{1:i}",
        "en"    "Cannot Rock the Vote until {1} more players are connected to the server.",
        "ru"    "Нельзя начать Rock the Vote, пока не подключится еще {1} игроков."
    }

    "No RTV Nextmap"
    {
        "en"    "Cannot Rock the Vote until the next map.",
        "ru"    "Нельзя начать Rock the Vote до следующей карты."
    }

    "No RTV Time"
    {
        "#format"   "{1:.f}",
        "en"    "Cannot Rock the Vote for {1} more seconds.",
        "ru"    "Нельзя начать Rock the Vote еще {1} секунд."
    }

    "More Required"
    {
        "#format"   "{1:i}",
        "en"    "{1} more required",
        "ru"    "Требуется еще {1}"
    }

    "RTV Entered"
    {
        "#format"   "{1:s}",
        "en"    "{1} wants to Rock the Vote.",
        "ru"    "{1} хочет начать голосование (Rock the Vote)."
    }

    "RTV Info Msg"
    {
        "en"    "Type 'rtv' to join, or type 'nominate' to nominate a map.",
        "ru"    "Введите 'rtv', чтобы присоединиться, или 'nominate', чтобы выдвинуть карту."
    }

    "RTV Start"
    {
        "en"    "Rocking the Vote!",
        "ru"    "Голосование началось!"
    }

    "Vote In Progress"
    {
        "en"    "Vote already in progress.",
        "ru"    "Голосование уже идет."
    }

    "RTV Already Entered"
    {
        "en"    "You have already entered Rock the Vote.",
        "ru"    "Вы уже присоединились к голосованию (Rock the Vote)."
    }

    "No Nominate Nextmap"
    {
        "en"    "Cannot nominate until the next map.",
        "ru"    "Нельзя выдвигать карты до следующей."
    }

    "Pending Vote"
    {
        "en"    "Pending Vote",
        "ru"    "Ожидающее голосование"
    }

    "Next Map"
    {
        "#format"

   "{1:s}",
        "en"    "Next Map: {1}",
        "ru"    "Следующая карта: {1}"
    }

    "Player Nomination"
    {
        "#format"   "{1:s},{2:s}",
        "en"    "{1} has nominated {2}.",
        "ru"    "{1} выдвинул карту {2}."
    }

    "Nomination Menu Title"
    {
        "en"    "Nominate a map.",
        "ru"    "Выдвинуть карту."
    }

    "Yes/No Menu Title"
    {
        "#format"   "{1:s}",
        "en"    "Change map to {1}?",
        "ru"    "Изменить карту на {1}?"
    }

    "Yes"
    {
        "en"    "Yes",
        "ru"    "Да"
    }

    "No"
    {
        "en"    "No",
        "ru"    "Нет"
    }

    "Starting Map Vote"
    {
        "en"    "Starting map vote. Map will change once voting is over.",
        "ru"    "Начинаем голосование за карту. Карта изменится после завершения голосования."
    }

    "Default Warning"
    {
        "en"    "{TIME} seconds until vote.",
        "ru"    "{TIME} секунд до голосования."
    }
    
    "Vote Failed"
    {
        "en"    "Map voting has failed. The winning option did not receive a high enough percentage of the votes.",
        "ru"    "Голосование за карту не удалось. Победивший вариант не получил достаточно голосов."
    }
    
    "Selective Runoff"
    {
        "en"    "Presenting vote menu to players who did not vote or whose votes were eliminated.",
        "ru"    "Предоставление меню голосования игрокам, которые не голосовали или чьи голоса были исключены."
    }
    
    "No RTV Admin"
    {
        "en"    "You do not have the required priveleges to enter Rock the Vote.",
        "ru"    "У вас нет необходимых привилегий для участия в Rock the Vote."
    }
    
    "No Nominate Admin"
    {
        "en"    "You do not have the required priveleges to nominate a map.",
        "ru"    "У вас нет необходимых привилегий для выдвижения карты."
    }
}
```
Сообщения автоматически склеены:

@d3v, я тоже об этом пишу, что нужно каждую деталь указать, каждое пожелание вплоть до технически сложных моментов на уровне знаний написания плагинов, также он может задать вопросы перед написанием плагина и если ответа на них не знать, тогда норм результата не будет.
 

Palonez

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

Он, конечно, создаст гугл, но в общих чертах 😆
 
  • Мне нравится
Реакции: d3v

Grey83

не пишу плагины с весны 2022
Сообщения
8,521
Реакции
4,980
вот он за секунд 40 перевёл достататочно сложный перевод
С английского переводил?
Я и без переводчика практически всё переведу.
Но да, не за 40 секунд (я так быстро читать и печатать не сумею ^_^).

При этом то, что он что-то там перевёл никак не связано с его возможностями написания кода на каком-либо языке.
я тоже об этом пишу, что нужно каждую деталь указать, каждое пожелание вплоть до технически сложных моментов на уровне знаний написания плагинов, также он может задать вопросы перед написанием плагина и если ответа на них не знать, тогда норм результата не будет.
Почти как в случае ТЗ для программиста. =)
 
Сверху Снизу