Промпт для создания скрипта MoonLoader (SAMP, Lua)...

생성일: 2025년 3월 7일

답변에 사용된 모델 O1 by Chat01

질문

Промпт для создания скрипта MoonLoader (SAMP, Lua)
Задача: Написать скрипт на Lua для MoonLoader (SAMP), который:

Работает в Open.MP.
Открывает GUI-меню при вводе команды /buse.
Имеет два пункта в меню:
Считать (позволяет ввести название предмета, цену покупки, количество, валюту).
Логи (показывает список сделок и позволяет их удалять).
Формула расчёта:
(Количество * Цена покупки) = Потрачено.
(Количество * Цена продажи) = Получено.
(Получено - Потрачено) = Прибыль.
Данные сохраняются в таблицу и остаются до перезапуска игры.
В логах можно удалить запись.
📌 Требования к коду:
Использовать MoonLoader API (sampRegisterChatCommand).
Использовать Imgui для отображения GUI-меню.
Скрипт должен быть максимально коротким и оптимизированным.
НЕ использовать sampfuncs (так как Open.MP его не поддерживает).
Должен работать в Open.MP без багов.
🎯 Входные данные (пример ввода в GUI):
Название: Металл
Цена покупки: 200000 Са
Количество: 200
Валюта: Са
Цена продажи: 210000 Са
🎯 Ожидаемый вывод в чат:
markdown
Копировать
Редактировать
[Калькулятор]: Вы купили 200 шт. Металл за 200000 Са.
[Калькулятор]: Вы продали за 210000 Са. Ваша прибыль: 10000 Са.

사고

Creating Lua script options

I’m pulling together a Lua script for SAMP using MoonLoader with Imgui, including a UI for setting up items and viewing transaction logs.

Crafting the script

OK, let’s use MoonLoader and ImGui to streamline the UI for inputting item details and transaction logs. No external libraries needed; focusing on an efficient and concise implementation.

Setting up UI tabs

I’m arranging the UI into two tabs: "Calculator" for item details and "Logs" for transactions. Each entry includes item specifics and a "Delete" button.

Prioritizing simplicity

I’m working on keeping the script concise and effective, using a non-persistent table for logs, and ensuring it’s in Russian, focusing on clear and succinct comments.

Crafting the script

I’m detailing the UI, including item details input and a calculation button. The script formulates transaction details, stores them in a table, and sends a formatted message to chat.

Mapping out transaction logs

I’m navigating the "Logs" tab for viewing and managing transactions, including "Delete" buttons for each record. Checking the standard method for using sampAddChatMessage in MoonLoader.

Confirming standard usage

I'm verifying the standard method sampAddChatMessage for the MoonLoader environment, ensuring compatibility and adhering to best practices for concise and readable code.

Reasoned about Lua script for MoonLoader for 19 seconds

답변

Ниже приведён максимально краткий пример Lua-скрипта для MoonLoader, работающего в Open.MP без sampfuncs. Скрипт регистрирует команду /buse, при вызове которой открывается окно на ImGui с двумя вкладками: «Считать» и «Логи». Во вкладке «Считать» можно ввести данные (название, цены, количество, валюту) и при нажатии кнопки «Рассчитать» автоматически добавляется запись в лог и выводится сообщение в чат. Во вкладке «Логи» отображаются все операции и есть кнопка «Удалить» для удаления конкретной записи.

lua
script_name("buseCalc") script_author("YourName") local imgui = require 'imgui' local mainWindow = imgui.ImBool(false) local activeTab = 1 -- Поля ввода local itemName = imgui.ImBuffer(256) local buyPrice = imgui.ImBuffer(256) local sellPrice = imgui.ImBuffer(256) local quantity = imgui.ImBuffer(256) local currency = imgui.ImBuffer(256) local logs = {} function main() -- Ждём, пока SAMP станет доступен while not isSampAvailable() do wait(0) end -- Регистрируем команду sampRegisterChatCommand("buse", function() mainWindow.v = not mainWindow.v end) -- Обрабатываем рендер окна imgui.OnFrame(function() if mainWindow.v then imgui.SetNextWindowSize(imgui.ImVec2(400,300), imgui.Cond.FirstUseEver) imgui.Begin("Buse Calc", mainWindow) -- Кнопки переключения вкладок if imgui.Button("Считать") then activeTab = 1 end imgui.SameLine() if imgui.Button("Логи") then activeTab = 2 end -- Вкладка "Считать" if activeTab == 1 then imgui.InputText("Название", itemName) imgui.InputText("Цена покупки", buyPrice) imgui.InputText("Количество", quantity) imgui.InputText("Валюта", currency) imgui.InputText("Цена продажи", sellPrice) if imgui.Button("Рассчитать") then local bp = tonumber(buyPrice.v) or 0 local sp = tonumber(sellPrice.v) or 0 local qt = tonumber(quantity.v) or 0 local spent = bp * qt local received = sp * qt local profit = received - spent -- Сохраняем в логи table.insert(logs, { name = itemName.v, buy = bp, sell = sp, qty = qt, cur = currency.v, spent = spent, received = received, profit = profit }) -- Выводим в чат sampAddChatMessage(string.format("[Калькулятор]: Вы купили %d шт. %s за %d %s.", qt, itemName.v, bp, currency.v), 0xFFFFFF) sampAddChatMessage(string.format("[Калькулятор]: Вы продали за %d %s. Ваша прибыль: %d %s.", sp, currency.v, profit, currency.v), 0xFFFFFF) end -- Вкладка "Логи" elseif activeTab == 2 then for i, v in ipairs(logs) do -- Кнопка с краткой информацией if imgui.Button(string.format("%s x%d (%d/%d)##%d", v.name, v.qty, v.buy, v.sell, i)) then end imgui.SameLine() -- Кнопка удаления if imgui.Button("Удалить##"..i) then table.remove(logs, i) break end end end imgui.End() end end) -- Главный цикл, в котором ImGui-окно обрабатывает события while true do wait(0) imgui.Process = mainWindow.v end end

Как это работает:

  1. После загрузки скрипта в MoonLoader (не забудьте переименовать файл в buseCalc.lua или любой другой .lua) зайдите в игру с Open.MP.
  2. Введите /buse в чат, чтобы открыть ImGui-окно.
  3. Во вкладке «Считать» заполните поля: Название, Цена покупки, Количество, Валюта, Цена продажи. Нажмите «Рассчитать».
  4. Скрипт добавит запись в локальную таблицу logs и выведет сообщение в чат с подробной информацией о сделке и прибыли.
  5. Во вкладке «Логи» вы увидите список всех операций. Нажав «Удалить», можно стереть конкретную запись из лога. Все данные хранятся только до перезапуска игры.

이 Q&A 공유하기