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

Myradov|

Известный
361
106
Зайди в свой кфг файл и пропиши там все данные, ибо ты используешь imint, а там ничего
Или создай проверку на директорию и создание ее, у тебя должно быть хоть какое то там значение
Уже исправил. Проблема была в другом
 

looney_

Участник
48
10
хочу сделать скрипт для того, чтобы когда встану на руду - сам копал, или если я встану на руду и нажму на кнопку чтобы начинал копать. кто может помочь?
Вроде на Аризоне пишет какой то текст на экран когда ты на руде, просто перехвати дисплей текст (samp events)
По идеи код должен выглядеть так, не? Тут у меня чёт не работает
Lua:
weapon = getCurrentCharWeapon(playerPed)
local valid, ped = getCharPlayerIsTargeting(PLAYER_HANDLE)
if weapon == 34 and valid and doesCharExist(ped) then
    -- Code
end
Типо если игрок прицелился с снайпера то...
Эта функция вроде работает с маркером сверху, если со снайперки он работает, то пиши дальше свой код
 

copypaste_scripter

Известный
1,218
225
Вроде на Аризоне пишет какой то текст на экран когда ты на руде, просто перехвати дисплей текст (samp events)

Эта функция вроде работает с маркером сверху, если со снайперки он работает, то пиши дальше свой код
я пробовал, но не получилось(
 

S-Sirius

Известный
353
21
Эта функция вроде работает с маркером сверху, если со снайперки он работает, то пиши дальше свой код
Мне не нужен маркером. Просто, если прицелился хоть в воздух - код должен работать
Наверное самый оптимальный вариант - поставить проверку на оружие + ПКМ
 

tinkoir

Участник
97
33
Мне не нужен маркером. Просто, если прицелился хоть в воздух - код должен работать
Наверное самый оптимальный вариант - поставить проверку на оружие + ПКМ
ещё мб имеет смысл поставить проверки на анимации, диалоги и тд
 

S-Sirius

Известный
353
21
Последний вопрос, как можно поставить проверку на кнопок из настроек типо кнопка атаки, кнопка прицеливания? Ну чтобы если нажат какая то кнопка которая отвечает за прицеливания[LOCKTARGET/ID: 6,] то выполнить код.
 

7jizzle

Участник
238
14
Не могу понять что тут не так.
Код:
[ML] (error) script.lua: D:\Games\ghetto sa style gta1\moonloader\script.lua:323: ')' expected near 'aimRange'
[ML] (error) script.lua: Script died due to an error. (0AAC8E04)

Lua:
if isKeyDown(VK_X) then
    local aimRange = readMemory(0xC8AAB8, 4, true)
    aimRange = aimRange + 0x8
    sampAddChatMessage("aimrange: " aimRange)
end
-- По идее должно отправлять значение адресса в чат, но почему-то выдаёт ошибку.
 

S-Sirius

Известный
353
21
Не могу понять что тут не так.
Код:
[ML] (error) script.lua: D:\Games\ghetto sa style gta1\moonloader\script.lua:323: ')' expected near 'aimRange'
[ML] (error) script.lua: Script died due to an error. (0AAC8E04)

Lua:
if isKeyDown(VK_X) then
    local aimRange = readMemory(0xC8AAB8, 4, true)
    aimRange = aimRange + 0x8
    sampAddChatMessage("aimrange: " aimRange)
end
-- По идее должно отправлять значение адресса в чат, но почему-то выдаёт ошибку.
Lua:
if isKeyDown(VK_X) then
    local aimRange = readMemory(0xC8AAB8, 4, true)
    aimRange = (aimRange + 0x8)
    sampAddChatMessage("aimrange: "..aimRange)
end
Так попробуй
 
Последнее редактирование:

Rei

Известный
Друг
1,593
1,626
Не могу понять что тут не так.
Код:
[ML] (error) script.lua: D:\Games\ghetto sa style gta1\moonloader\script.lua:323: ')' expected near 'aimRange'
[ML] (error) script.lua: Script died due to an error. (0AAC8E04)

Lua:
if isKeyDown(VK_X) then
    local aimRange = readMemory(0xC8AAB8, 4, true)
    aimRange = aimRange + 0x8
    sampAddChatMessage("aimrange: " aimRange)
end
-- По идее должно отправлять значение адресса в чат, но почему-то выдаёт ошибку.
sampAddChatMessage("aimrange: "..aimRange)
 
  • Нравится
Реакции: Vintik

MrBidloKoder

Известный
425
248
unknown-34.png

Как сделать такой чекпоинт? Чтобы был низкий.

Я смог сделать только так:
unknown-41.png
 

Double Tap Inside

Известный
Проверенный
1,899
1,244
Как можно организовать вызов функции string.find в защищённом режиме, чтобы скрипт не крашился, к примеру, если шаблон регулярок был прописал с ошибкой.
Пример: string.find(var, "[") -не закрыта скобка шаблона регулярных выражений. При попытке вызвать, скрипт завершается с ошибкой:

Код:
malformed pattern (missing ']')
stack traceback:
[C]: in function 'find'

Пробовал pcall и assert, особо не получилось, либо что-то неправильно делаю.
Код:
local status, result = pcall(string.find, "pattern")

гайд