Вопросы по Lua скриптингу

Общая тема для вопросов по разработке скриптов на языке программирования Lua, в частности под MoonLoader.
  • Задавая вопрос, убедитесь, что его нет в списке частых вопросов и что на него ещё не отвечали (воспользуйтесь поиском).
  • Поищите ответ в теме посвященной разработке Lua скриптов в MoonLoader
  • Отвечая, убедитесь, что ваш ответ корректен.
  • Старайтесь как можно точнее выразить мысль, а если проблема связана с кодом, то обязательно прикрепите его к сообщению, используя блок [code=lua]здесь мог бы быть ваш код[/code].
  • Если вопрос связан с MoonLoader-ом первым делом желательно поискать решение на wiki.

Частые вопросы

Как научиться писать скрипты? С чего начать?
Информация - Гайд - Всё о Lua скриптинге для MoonLoader(https://blast.hk/threads/22707/)
Как вывести текст на русском? Вместо русского текста у меня какие-то каракули.
Изменить кодировку файла скрипта на Windows-1251. В Atom: комбинация клавиш Ctrl+Shift+U, в Notepad++: меню Кодировки -> Кодировки -> Кириллица -> Windows-1251.
Как получить транспорт, в котором сидит игрок?
Lua:
local veh = storeCarCharIsInNoSave(PLAYER_PED)
Как получить свой id или id другого игрока?
Lua:
local _, id = sampGetPlayerIdByCharHandle(PLAYER_PED) -- получить свой ид
local _, id = sampGetPlayerIdByCharHandle(ped) -- получить ид другого игрока. ped - это хендл персонажа
Как проверить, что строка содержит какой-то текст?
Lua:
if string.find(str, 'текст', 1, true) then
-- строка str содержит "текст"
end
Как эмулировать нажатие игровой клавиши?
Lua:
local game_keys = require 'game.keys' -- где-нибудь в начале скрипта вне функции main

setGameKeyState(game_keys.player.FIREWEAPON, -1) -- будет сэмулировано нажатие клавиши атаки
Все иды клавиш находятся в файле moonloader/lib/game/keys.lua.
Подробнее о функции setGameKeyState здесь: lua - setgamekeystate | BlastHack — DEV_WIKI(https://www.blast.hk/wiki/lua:setgamekeystate)
Как получить id другого игрока, в которого целюсь я?
Lua:
local valid, ped = getCharPlayerIsTargeting(PLAYER_HANDLE) -- получить хендл персонажа, в которого целится игрок
if valid and doesCharExist(ped) then -- если цель есть и персонаж существует
  local result, id = sampGetPlayerIdByCharHandle(ped) -- получить samp-ид игрока по хендлу персонажа
  if result then -- проверить, прошло ли получение ида успешно
    -- здесь любые действия с полученным идом игрока
  end
end
Как зарегистрировать команду чата SAMP?
Lua:
-- До бесконечного цикла/задержки
sampRegisterChatCommand("mycommand", function (param)
     -- param будет содержать весь текст введенный после команды, чтобы разделить его на аргументы используйте string.match()
    sampAddChatMessage("MyCMD", -1)
end)
Крашит игру при вызове sampSendChat. Как это исправить?
Это происходит из-за бага в SAMPFUNCS, когда производится попытка отправки пакета определенными функциями изнутри события исходящих RPC и пакетов. Исправления для этого бага нет, но есть способ не провоцировать его. Вызов sampSendChat изнутри обработчика исходящих RPC/пакетов нужно обернуть в скриптовый поток с нулевой задержкой:
Lua:
function onSendRpc(id)
  -- крашит:
  -- sampSendChat('Send RPC: ' .. id)

  -- норм:
  lua_thread.create(function()
    wait(0)
    sampSendChat('Send RPC: ' .. id)
  end)
end
 
Последнее редактирование:

Hund dev.

Участник
47
2
Удивительный сервер, за 7 лет, наверное ни разу не видел диалог с двумя инпут текстами, скинул бы скрин, было бы легче
Нет, вы меня не так поняли. Открывается имгуи меню, и там уже 2 инпут текста.
1600605866309.png

Прикрепляю скрины что должен делать скрипт при нажатии кнопочки
1600605892805.png

он открывал диалог центрального рынка аризоны
1600605371699.png

Чтобы скрипт выбирал покупать товар, дальше
сам вводил название
1600605400197.png

после чего выбирал цвет
1600605426488.png

потом открывал диалог и нажимал "добавить на покупку"
1600605468634.png

и после чего выбирал из этого перечня товар
1600605510269.png

и выставлял цену и кол-во которые были введены в imgui.Input text (С СОХРАНЕНИЕМ В ИНИ!!!)
1600605558554.png

надеюсь понятно обьяснил, я только учусь, а разобрать действие функции не могу
 

Вложения

  • 1600605837316.png
    1600605837316.png
    33.1 KB · Просмотры: 83
Последнее редактирование:

kin4stat

mq-team · kin4@naebalovo.team
Всефорумный модератор
2,731
4,714
Как получить название части тела в который попал игрок через функцию onSendGiveDamage?(Не ID, а именно часть тела)
Только создать свою таблицу или массив, и там хранить имена.
1600606065485.png
 
  • Нравится
Реакции: S-Sirius

banan4eg

Известный
47
15
Нет, вы меня не так поняли. Открывается имгуи меню, и там уже 2 инпут текста.
Посмотреть вложение 69388
Прикрепляю скрины что должен делать скрипт при нажатии кнопочки
Посмотреть вложение 69389
он открывал диалог центрального рынка аризоны
Посмотреть вложение 69381
Чтобы скрипт выбирал покупать товар, дальше
сам вводил название
Посмотреть вложение 69382
после чего выбирал цвет
Посмотреть вложение 69383
потом открывал диалог и нажимал "добавить на покупку"
Посмотреть вложение 69384
и после чего выбирал из этого перечня товар
Посмотреть вложение 69385
и выставлял цену и кол-во которые были введены в imgui.Input text (С СОХРАНЕНИЕМ В ИНИ!!!)
Посмотреть вложение 69386
надеюсь понятно обьяснил, я только учусь, а разобрать действие функции не могу
Ну распознавание диалога как-то так выглядит, а выбор строки и ввод текста через sampSendDialogResponse
Lua:
local ev = require 'lib.samp.events'

function ev.onShowDialog(id, style, title, button1, button2, text)
    if id == 228 then -- Или по id диалога
        sampSendDialogResponse(id, button, listitem, input)
    end
 
    if title:find('Заголовок диалога') then -- Или по тайтлу, просто серверные id иногда могут меняться, и придется их менять в скрипте
        sampSendDialogResponse(id, button, listitem, input)
    end
end
 
Последнее редактирование:
  • Вау
Реакции: samartinell1

samartinell1

Участник
98
14
Нет, вы меня не так поняли. Открывается имгуи меню, и там уже 2 инпут текста. Прикрепляю скрины:
Посмотреть вложение 69381
Чтобы скрипт выбирал покупать товар, дальше
сам вводил название
Посмотреть вложение 69382
после чего выбирал цвет
Посмотреть вложение 69383
потом открывал диалог и нажимал "добавить на покупку"
Посмотреть вложение 69384
и после чего выбирал из этого перечня товар
Посмотреть вложение 69385
и выставлял цену и кол-во которые были введены в imgui.Input text (С СОХРАНЕНИЕМ В ИНИ!!!)
Посмотреть вложение 69386
надеюсь понятно обьяснил, я только учусь, а разобрать действие функции не могу
узнай id каждого диалога, далее с подключенным samp events в функции function sampev.onShowDialog(dialogId, style, title, button1, button2, text) отправляй данные ( https://www.blast.hk/wiki/lua:sampsenddialogresponse ) , можешь сделать процесс невидимым, добавив return false на конце, список считается от нуля(то есть первый элемент списка - 0, второй - 1), в инпут вставишь значения с ини файла (если не знаешь как работать, есть канал на ютубе TheChampGuess, там подробно объясняется) и в принципе всё.
Пример:
Lua:
local sampev = require 'lib.samp.events'

function sampev.onShowDialog(dialogId, style, title, button1, button2, text)
    if dialogId == 228 then
        sampSendDialogResponse(228, 0, 0, nil) --продавать товар (первый скрин), первый ноль означает кнопку (левая, "принять"), второй ноль означает номер эл. по списку
   elseif dialogId == 229 then
        sampSendDialogResponse(229, 0, 0, "Скупка")
        return false -- если хочешь чтобы все проходило незаметно
    end
end
 
  • Нравится
Реакции: banan4eg

Hund dev.

Участник
47
2
Ну распознавание диалога как-то так выглядит, а выбор строки и ввод текста через sampSendDialogResponse
Lua:
local ev = require 'lib.samp.events'

function ev.onShowDialog(id, style, title, button1, button2, text)
    if id == 228 then -- Или по id диалога
        sampSendDialogResponse(id, button, listitem, input)
    end

    if title:find('Заголовок диалога') then -- Или по тайтлу, просто серверные id иногда могут меняться, и придется их менять в скрипте
        sampSendDialogResponse(id, button, listitem, input)
    end
end
спасибо, а как "впихнуть" это в код?


Code:
if imgui.Button('Начать скупку', imgui.ImVec2(300, 1000)) then
        -- Сюда нужно впихнуть то, что Вы написали
end
 

banan4eg

Известный
47
15
спасибо, а как "впихнуть" это в код?


Code:
if imgui.Button('Начать скупку', imgui.ImVec2(300, 1000)) then
        -- Сюда нужно впихнуть то, что Вы написали
end
То что я написал
local ev = require 'lib.samp.events'
Это вверху скрипта вставляешь,
А функцию где-то после функции main()
Потом в твою кнопку вставляешь команду, которая вызывает меню покупки/продажи
Lua:
if imgui.Button(u8'Начать скупку', imgui.ImVec2(300, 1000)) then
        sampSendChat('/command') -- Команду для вызова меню, сюда
end
И потом уже как откроется окно, функция onShowDialog() будет инициализировать диалог, вроде объяснил
 
Последнее редактирование:
D

deleted-user-210352

Гость
Нет, вы меня не так поняли. Открывается имгуи меню, и там уже 2 инпут текста.
Посмотреть вложение 69388
Прикрепляю скрины что должен делать скрипт при нажатии кнопочки
Посмотреть вложение 69389
он открывал диалог центрального рынка аризоны
Посмотреть вложение 69381
Чтобы скрипт выбирал покупать товар, дальше
сам вводил название
Посмотреть вложение 69382
после чего выбирал цвет
Посмотреть вложение 69383
потом открывал диалог и нажимал "добавить на покупку"
Посмотреть вложение 69384
и после чего выбирал из этого перечня товар
Посмотреть вложение 69385
и выставлял цену и кол-во которые были введены в imgui.Input text (С СОХРАНЕНИЕМ В ИНИ!!!)
Посмотреть вложение 69386
надеюсь понятно обьяснил, я только учусь, а разобрать действие функции не могу
как-то некрасиво у других тырить, хотя я его дорабатываю все лучше и лучше
1600609499651.png
 

S-Sirius

Известный
353
21
Как можно увелечить количество символов в сообщение чата от скрипта (sampAddChatMessage)? То есть, если обычно текст sampAddChatMessage перевышает какой то лимит сообщение отображается до этого лимита, можно увелечить этот лимит?
 

Vintik

Мечтатель
Проверенный
1,473
922
Как можно увелечить количество символов в сообщение чата от скрипта (sampAddChatMessage)? То есть, если обычно текст sampAddChatMessage перевышает какой то лимит сообщение отображается до этого лимита, можно увелечить этот лимит?
Теоретически можно, на практике нет, тем более на луа нельзя. Стандартное максимальное количество символов - 128. Если надо больше, перенеси строку на следующую
 

kin4stat

mq-team · kin4@naebalovo.team
Всефорумный модератор
2,731
4,714
Как можно увелечить количество символов в сообщение чата от скрипта (sampAddChatMessage)? То есть, если обычно текст sampAddChatMessage перевышает какой то лимит сообщение отображается до этого лимита, можно увелечить этот лимит?
Нет. Разве что можно добавить префикс, но при этом добавится Несколько символов
Пример:
This Is Prefix: This is Text
 
D

deleted-user-210352

Гость
Нет, вы меня не так поняли. Открывается имгуи меню, и там уже 2 инпут текста.
Посмотреть вложение 69388
Прикрепляю скрины что должен делать скрипт при нажатии кнопочки
Посмотреть вложение 69389
он открывал диалог центрального рынка аризоны
Посмотреть вложение 69381
Чтобы скрипт выбирал покупать товар, дальше
сам вводил название
Посмотреть вложение 69382
после чего выбирал цвет
Посмотреть вложение 69383
потом открывал диалог и нажимал "добавить на покупку"
Посмотреть вложение 69384
и после чего выбирал из этого перечня товар
Посмотреть вложение 69385
и выставлял цену и кол-во которые были введены в imgui.Input text (С СОХРАНЕНИЕМ В ИНИ!!!)
Посмотреть вложение 69386
надеюсь понятно обьяснил, я только учусь, а разобрать действие функции не могу
я тебе могу свой скинуть, если так нужно