Вопросы по 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
 
Последнее редактирование:

xSpiridon

Участник
74
21
Кто может, переведите пожалуйста на Lua.
CLEO:
//0AB1: call_scm_func @getScreenXYFrom3DCoords 3 3D_coords_X 0@ Y 1@ Z 2@ store_screen_X_to 3@ Y_to 4@
:getScreenXYFrom3DCoords
0AC7: 14@ = var 0@ offset
0AC7: 15@ = var 3@ offset
0AC7: 16@ = var 6@ offset
0AC7: 17@ = var 9@ offset
0AA5: call 0x70CE30 num_params 6 pop 6 {18@ 18@} 0 0 17@ 16@ 15@ 14@
0007: 12@ = 640.0
0007: 13@ = 448.0
0A8D: 14@ = read_memory 0xC17044 size 4 virtual_protect 0
0A8D: 15@ = read_memory 0xC17048 size 4 virtual_protect 0
0093: 14@ = integer 14@ to_float
0093: 15@ = integer 15@ to_float
0073: 12@ /= 14@
0073: 13@ /= 15@
006B: 3@ *= 12@
006B: 4@ *= 13@
0AB2: ret 2 3@ 4@
 

P0M61K

Активный
264
54
Можно ли как-то прочитать урон который нанесет игрок своим выстрелом как только он его совершает? Странный вопрос но это надо.
 

Dmitriy Makarov

25.05.2021
Проверенный
2,478
1,113
я имел ввиду работу с серверными диалогами)
не работал еще с серверными диалогами, но я видел что используют эту функцию
Lua:
sampSendDialogResponse(int id, int button, int listitem, zstring input)
а если использовать эту функцию, то тебе понадобится ID диалога
тут поможет events
Lua:
local sampev = require 'lib.samp.events' -- в начало скрипта

-- вне main
    function sampev.onShowDialog(dialogId, title, text, button1, button2, style)
    sampAddChatMessage("ID окна: "..dialogId, -1)
    end
-- в итоге, при открытии любого серверного диалогового окна, тебе в чат пишет "ID окна: *его  ид*"
 

MoonVladik

Активный
114
34
Как получать в переменные урон который нанесут при выстреле именно персу тогда когда игрок начинает стрелять в тебя (ну не ты а другой игрок)?
 

astynk

Известный
Проверенный
742
530
Можно ли как-то прочитать урон который нанесет игрок своим выстрелом как только он его совершает? Странный вопрос но это надо.
Хукать onSendGiveDamage.
Как получать в переменные урон который нанесут при выстреле именно персу тогда когда игрок начинает стрелять в тебя (ну не ты а другой игрок)?
Урон, который нанесли тебе - onSendTakeDamage
А если игрок А нанес урон игроку Б (не тебе), то никак.
 
  • Нравится
Реакции: P0M61K

vova2999

Известный
65
24
не работал еще с серверными диалогами, но я видел что используют эту функцию
Lua:
sampSendDialogResponse(int id, int button, int listitem, zstring input)
а если использовать эту функцию, то тебе понадобится ID диалога
тут поможет events
Lua:
local sampev = require 'lib.samp.events' -- в начало скрипта

-- вне main
    function sampev.onShowDialog(dialogId, title, text, button1, button2, style)
    sampAddChatMessage("ID окна: "..dialogId, -1)
    end
-- в итоге, при открытии любого серверного диалогового окна, тебе в чат пишет "ID окна: *его  ид*"
ты пишешь мне вещи которые я уже знаю, мне нужно именно то, о чем я расписал в своем сообщении
Нужно работать с диалогом имещим список(который кликабельный), на сколько я понял надо каждую строку записывать в таблицу/массив, в теории все понятно, на практике начинается тротлинг головоного мозга, не подскажете ли как реализовать, по возможности с кодом, либо же подскажите другой вариант работы с такими диалогами, заранее благодарен.
актально
 

Fomikus

Известный
Проверенный
474
341
ты пишешь мне вещи которые я уже знаю, мне нужно именно то, о чем я расписал в своем сообщении

актально
Lua:
function samp.onShowDialog(id, style, title, btn, btn, text)
    if title:find('Квесты') then -- Если ли в заголовке "Квесты"
        i = -1 -- List item в диалогах начинается с 0 (Через 1 строчку добавим 1 до нуля)
        for w in text:gmatch("[^\r\n]+") do -- Разбиваем текст на строки
            i = i + 1 -- Добавили 1 чтобы начать с 0
            if w:find("Можно завершить") then -- Если в строчке найдет 'Можно завершить', тогда...
        sampSendDialogResponse(id, 1, i, '') -- Выберет данную строчку
        return false -- Закроет диалог
            else -- Если же не нашло 'Можно завершить'
                if w:find("Доступен") then -- Если нашло 'Доступен'
            sampSendDialogResponse(id, 1, i, '') -- Выбрать данную
        return false -- Закроет диалог
                end
            end
        end
    end
end
Возможно не самый лучший пример, но всеже...
Авто сдача/принятие квеста
 
  • Нравится
  • Влюблен
Реакции: Receiver и vova2999

sdfaw

Активный
718
150
как пользоваться taskGoToCoordWhileAiming, taskGoToCoordWhileShooting, taskGotoCharAiming и taskGotoCharOffset ?
 

Cameron_Bawerman

Участник
99
1
Добрый день, lua в данной кодировке CP1251, а github ставит кодировку utf-8, и после обновления появляются иероглифы в скрипте.
Можете помочь или подсказать как исправить данную проблему?
 

Leatington

Известный
258
71
Добрый день, lua в данной кодировке CP1251, а github ставит кодировку utf-8, и после обновления появляются иероглифы в скрипте.
Можете помочь или подсказать как исправить данную проблему?
Перед залитием на гитхаб вручную поставить нужную кодировку, либо использовать другой хостинг.
 

madrasso

Потрачен
883
324
Обратите внимание, пользователь заблокирован на форуме. Не рекомендуется проводить сделки.

DolgorukovGTA

Известный
Проверенный
652
345
Добрый день, lua в данной кодировке CP1251, а github ставит кодировку utf-8, и после обновления появляются иероглифы в скрипте.
Можете помочь или подсказать как исправить данную проблему?
Lua:
local encoding = require 'encoding'
encoding.default = 'UTF-8'
u8 = encoding.CP1251

К примеру, тебе нужно вывести переменную text в sampAddChatMessage, ты используешь sampAddChatMessage(u8(text), -1).