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

zir

Участник
47
0
Как сделать чтобы после того как персонаж доезжал до одних координат, то сразу же ехал к другим и т.д?
(Как ехать к одной координате уже сделал, но ко второй и т.д не едет), если не трудно то дайте пример кода пожалуйста
 

вайега52

cache miss
Модератор
3,084
3,415
как можно обратиться к методу 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

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

вайега52

cache miss
Модератор
3,084
3,415
Lua:
local nigger = thisScript

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

sosnov

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

Dmitriy Makarov

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

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

everlight

Известный
289
57
Может это.
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,511
1,139
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

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