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

whyega52

Гений, миллионер, плейбой, долбаеб
Модератор
2,802
2,675
как можно обратиться к методу thisScript()'а через переменную?
if gm then -- в бесконечном цикле setCharProofs(playerPed, true, true, true, true, true); writeMemory(0x96916E, 1, 1, false) else setCharProofs(playerPed, false, false, false, false, false); writeMemory(0x96916E, 1, 0, false) end
if gm then setCharProofs(playerPed, true, true, true, true, true); writeMemory(0x96916E, 1, 1, false) else setCharProofs(playerPed, false, false, false, false, false); writeMemory(0x96916E, 1, 0, false) end
более локанчиная запись
Lua:
setCharProofs(playerPed, gm, gm, gm, gm, gm); writeMemory(0x96916E, 1, gm and 1 or 0, false)
 
  • Нравится
Реакции: Dmitriy Makarov и MLycoris

MLycoris

На вид оружие массового семяизвержения
Проверенный
1,990
2,191
сам скрипт то работает,но гм нет,это странно,пишет гм он,но сам гм не работает:(
на сервере без античита он нормально работает, не знаю возможно ли в наше время найти полноценно рабочий гм с ног
 

whyega52

Гений, миллионер, плейбой, долбаеб
Модератор
2,802
2,675
Lua:
local nigger = thisScript

nigger():unload()
Случайно вставил этот текст (забыл очистить инпут на форуме перед тем, как ответить). Да и я уже решил проблему и ты не совсем так понял вопрос, тк. это ток отрывок от него)
 

sosnov

Известный
329
115
есть ли что то типо этого?:
Lua:
setCharAnimSpeed(PLAYER_PED, 1500)
делающее скорость анимок/персонажа быстрей?
эта шняга не работает так как вероятней всего ее не существует...
 

Dmitriy Makarov

25.05.2021
Проверенный
2,505
1,134
есть ли что то типо этого?:
Lua:
setCharAnimSpeed(PLAYER_PED, 1500)
делающее скорость анимок/персонажа быстрей?
эта шняга не работает так как вероятней всего ее не существует...
Может это.
4-й параметр.

UPD: Или вообще через events делай.
 
Последнее редактирование:

uvie

Известный
269
54
Может это.
4-й параметр.

UPD: Или вообще через events делай.
script doesnt work why? maybe you know the solution?


Lua:
script_properties("work-in-pause")
require("lib.samp.events").onTextDrawSetString = function (slot0, slot1)
    if slot1:find("CONVERSATION_YES") then
        lua_thread.create(function ()
            setVirtualKeyDown(89, true)
            wait(4000)
            setVirtualKeyDown(89, false)
        end)
    end

    if slot1:find("Zuveles nera") then
        sampSendChat("/zvejoti")
    end

    if slot1:find("Kabliukas tuscias") then
        sampSendChat("/zvejoti")
    end

    if slot1:find("Istraukei zuvi") then
        sampSendChat("/zvejoti")
    end

    if slot1:find("Niekas nekimba") then
        sampSendChat("/zvejoti")
    end

    if slot1:find("koks laimikis") then
        sampSendChat("/zvejoti")
    end

    if slot1:find("Siandien tau gerai sekasi") then
        sampSendChat("/zvejoti")
    end

    if slot1:find("niekas nebuvo uzkibe") then
        sampSendChat("/zvejoti")
    end

    if slot1:find("Zuvis tavo rankose") then
        sampSendChat("/zvejoti")
    end

    if slot1:find("Kur gi tos zuvys") then
        sampSendChat("/zvejoti")
    end

    if slot1:find("Kokia zuvis") then
        sampSendChat("/zvejoti")
    end

    if slot1:find("Tu tikras zvejys") then
        sampSendChat("/zvejoti")
    end

    if slot1:find("Siandien nesiseka") then
        sampSendChat("/zvejoti")
    end

    if slot1:find("Bandymas sekmingas") then
        sampSendChat("/zvejoti")
    end

    if slot1:find("Bandymas nesekmingas") then
        sampSendChat("/zvejoti")
    end

    if slot1:find("Neblogas grobis") then
        sampSendChat("/zvejoti")
    end
end
 

Dmitriy Makarov

25.05.2021
Проверенный
2,505
1,134
script doesnt work why? maybe you know the solution?
Doesn't work only on pause or does not work at all?
Are you sure this is the event you need? Can you try with the onShowTextDraw event?
Lua:
INCOMING_RPCS[RPC.SHOWTEXTDRAW]               = {'onShowTextDraw',
  {textdrawId = 'uint16'},
  {textdraw = {
    {flags = 'uint8'},
    {letterWidth = 'float'},
    {letterHeight = 'float'},
    {letterColor = 'int32'},
    {lineWidth = 'float'},
    {lineHeight = 'float'},
    {boxColor = 'int32'},
    {shadow = 'uint8'},
    {outline = 'uint8'},
    {backgroundColor = 'int32'},
    {style = 'uint8'},
    {selectable = 'uint8'},
    {position = 'vector2d'},
    {modelId = 'uint16'},
    {rotation = 'vector3d'},
    {zoom = 'float'},
    {color1 = 'int16'},
    {color2 = 'int16'},
    {text = 'string16'}
  }}
}
 

sosnov

Известный
329
115
Lua:
setCharCanBeKnockedOffBike(PLAYER_PED, false)
это должно действовать как ноубайк,но нихуа
какая функция должна спасать от падений с велика?
 

uvie

Известный
269
54
Doesn't work only on pause or does not work at all?
Are you sure this is the event you need? Can you try with the onShowTextDraw event?
Lua:
INCOMING_RPCS[RPC.SHOWTEXTDRAW]               = {'onShowTextDraw',
  {textdrawId = 'uint16'},
  {textdraw = {
    {flags = 'uint8'},
    {letterWidth = 'float'},
    {letterHeight = 'float'},
    {letterColor = 'int32'},
    {lineWidth = 'float'},
    {lineHeight = 'float'},
    {boxColor = 'int32'},
    {shadow = 'uint8'},
    {outline = 'uint8'},
    {backgroundColor = 'int32'},
    {style = 'uint8'},
    {selectable = 'uint8'},
    {position = 'vector2d'},
    {modelId = 'uint16'},
    {rotation = 'vector3d'},
    {zoom = 'float'},
    {color1 = 'int16'},
    {color2 = 'int16'},
    {text = 'string16'}
  }}
}
fish bot works when im in game, every 4 seconds it writes /zvejoti (/fish)
but if im gonna alt+tab fish bot will stop working and not gonna type /zvejoti
 

Dmitriy Makarov

25.05.2021
Проверенный
2,505
1,134
fish bot works when im in game, every 4 seconds it writes /zvejoti (/fish)
but if im gonna alt+tab fish bot will stop working and not gonna type /zvejoti
Specifies that the script will continue executing while the game is paused (assuming the game is maximized and in the foreground).
Try with this.
 

joumey

Активный
194
44
У меня проект есть minergame, там должна быть огромная сума денег ( что бы улучшить игру и баланс после 2ккк с чем то не уходил в минус, ведь это стает концом игры), и вот мне нужно сохраять это в иникфг и использовать в имгуи
как пользоваться ffi.new и как сохранить его значение в файл и использовать в имгуи, если можно?
up