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

NetyEgo

Участник
164
10
local activrpmod = {
v = {vkeys.VK_F2}
}
вот код и я хочу чтобы клавиша(F2) бралась из конфига, то есть в игре я меняю на свою клавишу и чтоб она появилось вместо F2
короче
вот в конфиге стоит клавиша "VK_Z" и я хочу чтобы
local activrpmod = {
v = {vkeys.mainIni.config.activrpmod} вот где mainIni.config.activrpmod была зарегистрирована Z, если поменяю на V, то функция на которую забиндено активировалась на V
}
local activrpmod = {
v = {vkeys.VK_F2}
}
вот код и я хочу чтобы клавиша(F2) бралась из конфига, то есть в игре я меняю на свою клавишу и чтоб она появилось вместо F2
короче
вот в конфиге стоит клавиша "VK_Z" и я хочу чтобы
local activrpmod = {
v = {vkeys.mainIni.config.activrpmod} вот где mainIni.config.activrpmod была зарегистрирована Z, если поменяю на V, то функция на которую забиндено активировалась на V
}
в конфиге выдаёт это table: 0x171a53f8
 
Последнее редактирование:

NIET

Участник
80
24
Чому ноль реакции на геймтекст с картинки?

Lua:
function sampev.onDisplayGameText(style, time, text)
        if text:find("LOCKED") then
        sampSendChat("РАБОТАЕТ")
    end
end

Нужно ли в функции указывать стиль геймтекста? Очень похоже на номер 4 отсюда.
drisnya.png
 

черный кот

Известный
167
185
Lua:
setSpritesDrawBeforeFade(true)
renderDrawTexture(render, X, Y, 16, 16, 0.0, 0xFFFFFFFF)

Почему текстура не сглаживается?
 

NetyEgo

Участник
164
10
HEEELP, хочу
local activrpmod = {
v = {vkeys.VK_F2}
}
вот код и я хочу чтобы клавиша(F2) бралась из конфига, то есть в игре я меняю на свою клавишу и чтоб она появилось вместо F2
короче
вот в конфиге стоит клавиша "VK_Z" и я хочу чтобы
local activrpmod = {
v = {vkeys.mainIni.config.activrpmod} вот где mainIni.config.activrpmod была зарегистрирована Z, если поменяю на V, то функция на которую забиндено активировалась на V
}
ну хелпаните
 
Последнее редактирование:

no3jour

Участник
55
0
Помогите сделать бесконечный цикл при if gui['activation'].v, тоесть данная функция должна срабатывать через каждые wait(''..u8:decode(wait2.v)..'') и так бесконечно
PHP:
function script()
    if gui['activation'].v then
        if gui['cmd2'].v then
            lua_thread.create(function()
                sampSendChat(''..u8:decode(cmd.v)..'')
                wait(''..u8:decode(wait1.v)..'')
                sampSendChat(''..u8:decode(cmd2.v)..'')
                if gui['screen'].v then
                    wait(200)
                    setVirtualKeyDown(119, true)
                    wait(20)
                    setVirtualKeyDown(119, false)
                end
            end)
        else
            lua_thread.create(function()
                sampSendChat(''..u8:decode(cmd.v)..'')
                if gui['screen'].v then
                    wait(200)
                    setVirtualKeyDown(119, true)
                    wait(20)
                    setVirtualKeyDown(119, false)
                end
            end)
        end
        lua_thread.create(function()
           wait(''..u8:decode(wait2.v)..'')
           script()
        end)
    end
end
 

NetyEgo

Участник
164
10
каким образом сохраняешь?
Смотри могу фулл скрипт кинуть, но скину так
вот скрин настроек
а вот как я сохраняю кнопку
LUA:
local activrpmod = imgui.ImBuffer(mainIni.config.activrpmod, 32)
LUA:
local activrpmod = {
    v = {vkeys, (mainIni.config.activrpmod)}
}
local bindID = 0
LUA:
        if  isKeyJustPressed(mainIni.config.activrpmod) then
            rpmod.v = not rpmod.v
        end
LUA:
            if HotKey("##activrpmod", activrpmod, tLastKeys, 100) then
                rkeys.changeHotKey(bindID, mainIni.config.activrpmod)
                sampAddChatMessage("Успешно! Старое значение: " .. table.concat(rkeys.getKeysName(tLastKeys.v), " + ") .. " | Новое: " .. table.concat(rkeys.getKeysName(activrpmod.v), " + "), -1)
            end
вот что получается в кфг
activrpmod=table: 0x0fe3c2d8
 

Ananasasas

Участник
51
2
Срочно помощь!!! Возможно ли как то сделать так, что бы текст считывался на с чата. а например с экрана, вот увидела игра в чате надпись "казино калигула", и выполнила какую либо команду, скрин ниже
 

NetyEgo

Участник
164
10
Смотри могу фулл скрипт кинуть, но скину так
вот скрин настроек
а вот как я сохраняю кнопку
LUA:
local activrpmod = imgui.ImBuffer(mainIni.config.activrpmod, 32)
LUA:
local activrpmod = {
    v = {vkeys, (mainIni.config.activrpmod)}
}
local bindID = 0
LUA:
        if  isKeyJustPressed(mainIni.config.activrpmod) then
            rpmod.v = not rpmod.v
        end
LUA:
            if HotKey("##activrpmod", activrpmod, tLastKeys, 100) then
                rkeys.changeHotKey(bindID, mainIni.config.activrpmod)
                sampAddChatMessage("Успешно! Старое значение: " .. table.concat(rkeys.getKeysName(tLastKeys.v), " + ") .. " | Новое: " .. table.concat(rkeys.getKeysName(activrpmod.v), " + "), -1)
            end
вот что получается в кфг
activrpmod=table: 0x0fe3c2d8
хелпаните умаляю, вообще не знаю как решить проблему, либо краш в консоле с проблемой HotKey либо не сохраняется, сохраняется только вот акtable: 0x0fe3c2d8
прошу помощи, МАЛЮ
isKeyJustPressed чтобы не нажмал првоерка была а что ты зажмал
 
Последнее редактирование:
  • Нравится
Реакции: .Makarov.

Tak

Известный
178
70
Посмотреть вложение 55623

Посмотреть вложение 55625

как сделать чтобы 3dText был у его над головой выше по Y
За это отвечает 2 nil после -1. Там идет x y z координаты. Вставь туда 10 или 20, любую цифру. Можешь в эти nil ставить любые значения, и смотреть как текст будет менять свое положение (Экспериментировать =) )
хелпаните умаляю, вообще не знаю как решить проблему, либо краш в консоле с проблемой HotKey либо не сохраняется, сохраняется только вот акtable: 0x0fe3c2d8
прошу помощи, МАЛЮ
isKeyJustPressed чтобы не нажмал првоерка была а что ты зажмал
Скинь весь код, мб получится исправить
 

Fott

Простреленный
3,470
2,387
Чё делать если оно не правильно распознает части тела?
Lua:
local weapons = require 'game.weapons'
local samp = require 'samp.events'

 bodypart =
{'спина', 'голова', 'Плечо левой руки', 'Плечо правой руки', 'Левая рука', 'Правая рука', 'Левое бедро', 'Правое бедро', 'Левая нога', 'Правая нога', 'Правая голень', 'Левая голень', 'Левое предплечье', 'Правое предплечье', 'Левая ключица', 'Правая ключица', 'Шея', 'Челюсть'}




--usage: bodypart[1]
--output: торс

function samp.onSendGiveDamage(playerId, damage, weapon, bodypart)

    sampAddChatMessage('Ты нанес '..math.floor(damage)..' урона игроку '..sampGetPlayerNickname(playerId)..'['..playerId..'] сделав выстрел в '..getBodyPartName(bodypart)..' применив '..weapons.get_name(weapon), -1)
    -- P.S math.floor(value) -> округление числа, что бы не писало например 46.674563456346456

end

function getBodyPartName(bodypart)
if bodypart == 1 then
        return 'спина'
    end
    if bodypart == 2 then
        return 'голова'
    end
    if bodypart == 3 then
        return 'Плечо левой руки'
    end
    if bodypart == 4 then
        return 'Плечо правой руки'
    end
    if bodypart == 5 then
        return 'Левая рука'
    end
    if bodypart == 6 then
        return 'Правая рука'
    end
    if bodypart == 7 then
        return 'Левое бедро'
    end
        if bodypart == 8 then
        return 'Правое бедро'
    end
        if bodypart == 9 then
        return 'Левая нога'
    end
        if bodypart == 10 then
        return 'Правая нога'
    end

        if bodypart == 11 then
        return 'Правая голень'
    end
        if bodypart == 12 then
        return 'Левая голень'
    end
        if bodypart == 13 then
        return 'Левое предплечье'
    end
        if bodypart == 14 then
        return 'Правое предплечье'
    end
        if bodypart == 15 then
        return 'Левая ключица'
    end
        if bodypart == 16 then
        return 'Правая ключица'
    end
        if bodypart == 17 then
        return 'Шея'
    end
        if bodypart == 18 then
        return 'Челюсть'
    end
end