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

EclipsedFlow

Известный
Проверенный
1,040
464
Ребята,помогите!
Я написал код один,и мне не хватает одного,сам процесс запуска в небо.
И так когда игрок сел в машину и машина улетает,кто может помочь в реализацию скрипта,буду очень благодарен!
Спасибо большое!
 

Kotovasya

Участник
85
13
Как сделать так, что бы таблицу сохраняло в ini в верном порядке? Потому что потом, когда проходишься по ней циклом, выводит значения не в том порядке, котором мне нужно...

Lua:
if not doesDirectoryExist("moonloader/config") then createDirectory("moonloader/config") end
        Data = inicfg.load({
        Set1 = {
                mm9 = 0,
                eagle = 50,
                shot = 0,
                rifle = 0,
                uzi = 0,
                ak47 = 50,
                m4 = 300,
            },
        Set2 = {
                mm9 = 0,
                eagle = 100,
                shot = 0,
                rifle = 0,
                uzi = 0,
                ak47 = 0,
                m4 = 0,
            },
        Set3 = {
                mm9 = 0,
                eagle = 0,
                shot = 0,
                rifle = 0,
                uzi = 0,
                ak47 = 50,
                m4 = 450,
            },
        Set4 = {
                mm9 = 0,
                eagle = 100,
                shot = 100,
                rifle = 100,
                uzi = 0,
                ak47 = 50,
                m4 = 600,
            },
        Set5 = {
                mm9 = 0,
                eagle = 50,
                shot = 0,
                rifle = 100,
                uzi = 0,
                ak47 = 50,
                m4 = 600,
            },
        }, "AutoBuy")
        inicfg.save(Data, "AutoBuy")

[Set4]
rifle=100
m4=600
mm9=0
eagle=100
ak47=50
uzi=0
shot=100
[Set5]
rifle=100
m4=600
mm9=0
eagle=50
ak47=50
uzi=0
shot=0
[Set2]
rifle=0
m4=0
mm9=0
eagle=100
ak47=0
uzi=0
shot=0
[Set3]
rifle=0
m4=450
mm9=0
eagle=0
ak47=50
uzi=0
shot=0
[Set1]
rifle=0
m4=300
mm9=0
eagle=50
ak47=50
uzi=0
shot=0
 

штейн

Известный
Проверенный
1,000
686
Как сделать так, что бы таблицу сохраняло в ini в верном порядке? Потому что потом, когда проходишься по ней циклом, выводит значения не в том порядке, котором мне нужно...

Lua:
if not doesDirectoryExist("moonloader/config") then createDirectory("moonloader/config") end
        Data = inicfg.load({
        Set1 = {
                mm9 = 0,
                eagle = 50,
                shot = 0,
                rifle = 0,
                uzi = 0,
                ak47 = 50,
                m4 = 300,
            },
        Set2 = {
                mm9 = 0,
                eagle = 100,
                shot = 0,
                rifle = 0,
                uzi = 0,
                ak47 = 0,
                m4 = 0,
            },
        Set3 = {
                mm9 = 0,
                eagle = 0,
                shot = 0,
                rifle = 0,
                uzi = 0,
                ak47 = 50,
                m4 = 450,
            },
        Set4 = {
                mm9 = 0,
                eagle = 100,
                shot = 100,
                rifle = 100,
                uzi = 0,
                ak47 = 50,
                m4 = 600,
            },
        Set5 = {
                mm9 = 0,
                eagle = 50,
                shot = 0,
                rifle = 100,
                uzi = 0,
                ak47 = 50,
                m4 = 600,
            },
        }, "AutoBuy")
        inicfg.save(Data, "AutoBuy")

[Set4]
rifle=100
m4=600
mm9=0
eagle=100
ak47=50
uzi=0
shot=100
[Set5]
rifle=100
m4=600
mm9=0
eagle=50
ak47=50
uzi=0
shot=0
[Set2]
rifle=0
m4=0
mm9=0
eagle=100
ak47=0
uzi=0
shot=0
[Set3]
rifle=0
m4=450
mm9=0
eagle=0
ak47=50
uzi=0
shot=0
[Set1]
rifle=0
m4=300
mm9=0
eagle=50
ak47=50
uzi=0
shot=0
никак не исправить, да и разницы нет
 

Kotovasya

Участник
85
13
никак не исправить, да и разницы нет
Как раз таки разница есть, ибо я бы не спрашивал тогда


Lua:
function qet()
     for gun, ammo in pairs(Data.Set1) do
        id1, id2, id3 = textdraws(gun)
        sampAddChatMessage(string.format("%s, %d, %d, %d, %d", gun, ammo, id1, id2, id3), -1)
     end
 end

function textdraws(gun)
    if gun == "mm9" then return 3, 4, 5
    elseif gun == "eagle" then return 7, 8, 9
    elseif gun == "shot" then return 11, 12, 13
    elseif gun == "rifle" then return 15, 16, 17
    elseif gun == "uzi" then return 19, 20, 21
    elseif gun == "ak47" then return 23, 24, 25
    elseif gun == "m4" then return 27, 28, 29
    else return 0, 0, 0
    end
end

[11:09:23] rifle, 0, 15, 16, 17

[11:09:23] m4, 300, 27, 28, 29

[11:09:23] mm9, 0, 3, 4, 5

[11:09:23] eagle, 50, 7, 8, 9

[11:09:23] ak47, 50, 23, 24, 25

[11:09:23] uzi, 0, 19, 20, 21

[11:09:23] shot, 0, 11, 12, 13

У меня получается такая проблема, что такого текстдрава еще нету, но он будет пытаться на него нажать, т.к. функция возвращает не в верной последовательности id текстдравов
 

штейн

Известный
Проверенный
1,000
686
В дополнение, я нарыл клео код который работает с ini файлом и перезаписывает эти значения, и все прекрасно работает... Но все мои попытки перевести его на lua https://blast.hk/wiki/lua:inicfg не увенчались успехом.

Вот вырезка из клео кода:

0AAB: file_exists "GTAVHud_by_DK22Pac\V_HUD_by_DK22Pac.ini"
jf @SPEC2_1830
0AF1: write_int 30@ to_ini_file "GTAVHud_by_DK22Pac\V_HUD_by_DK22Pac.ini" section "CUSTOM_ABILITY" key "bEnable"
0AF1: write_int 31@ to_ini_file "GTAVHud_by_DK22Pac\V_HUD_by_DK22Pac.ini" section "CUSTOM_ABILITY" key "iValue"

При положительной проверке на то, сидит ли пед в машине, открывает ini файл по заданному пути начиная от корневой папки игры, и перезаписывает в нем два значения:
bEnable= (Если проверка положительная записывает туда единицу, если же нет, то записывает туда ноль)
iValue= (Если проверка положительная записывает туда здоровье автомобиля, если же нет, то записывает ноль)

Как можно перевести это в луа?
всё в туторе же понятно

Lua:
if not doesFileExist("moonloader\\config\\simple.ini") then
    local cfg =
    {
        main =
        {
            bEnable = nil,
            iValue = nil
        },
    };
    inicfg.save(cfg, 'simple.ini')
end

чтобы сохранить что-то:

local cfg = inicfg.load(nil, 'moonloader\\config\\simple.ini')
cfg.main.bEnable = 1
inicfg.save(cfg, 'simple.ini')

Как раз таки разница есть, ибо я бы не спрашивал тогда


Lua:
function qet()
     for gun, ammo in pairs(Data.Set1) do
        id1, id2, id3 = textdraws(gun)
        sampAddChatMessage(string.format("%s, %d, %d, %d, %d", gun, ammo, id1, id2, id3), -1)
     end
 end

function textdraws(gun)
    if gun == "mm9" then return 3, 4, 5
    elseif gun == "eagle" then return 7, 8, 9
    elseif gun == "shot" then return 11, 12, 13
    elseif gun == "rifle" then return 15, 16, 17
    elseif gun == "uzi" then return 19, 20, 21
    elseif gun == "ak47" then return 23, 24, 25
    elseif gun == "m4" then return 27, 28, 29
    else return 0, 0, 0
    end
end

[11:09:23] rifle, 0, 15, 16, 17

[11:09:23] m4, 300, 27, 28, 29

[11:09:23] mm9, 0, 3, 4, 5

[11:09:23] eagle, 50, 7, 8, 9

[11:09:23] ak47, 50, 23, 24, 25

[11:09:23] uzi, 0, 19, 20, 21

[11:09:23] shot, 0, 11, 12, 13

У меня получается такая проблема, что такого текстдрава еще нету, но он будет пытаться на него нажать, т.к. функция возвращает не в верной последовательности id текстдравов

один хуй это особенности либы и скорее всего это не исправить
 

EclipsedFlow

Известный
Проверенный
1,040
464
Ребята,помогите!
Я написал код один,и мне не хватает одного,сам процесс запуска в небо.
И так когда игрок сел в машину и машина улетает,кто может помочь в реализацию скрипта,буду очень благодарен!
Спасибо большое!
 

TheDed

Участник
99
14
Какой библиотекой можно загрузить таблицу (.txt , .ini) и читать её, искать в ней значения?
 

biscuitt

Известный
185
14
Как избавиться от переноса на след.строку в текстдраве.
Lua:
sampTextdrawCreate(2290, 'Online: '..hour..':'..min..':'..sec, 480, 360)
Online на одной строке, а вот данные уже перенесены на другую.
 

Frapsy

Известный
Проверенный
393
226
Ребята,помогите!
Я написал код один,и мне не хватает одного,сам процесс запуска в небо.
И так когда игрок сел в машину и машина улетает,кто может помочь в реализацию скрипта,буду очень благодарен!
Спасибо большое!
Никто тебе не будет тут писать чит, не надейся ;D Единственное что - с синхрой шаманить, а там и коорды поменять..
 

Akionka

akionka.lua
Проверенный
742
500
Как избавиться от переноса на след.строку в текстдраве.
Lua:
sampTextdrawCreate(2290, 'Online: '..hour..':'..min..':'..sec, 480, 360)
Online на одной строке, а вот данные уже перенесены на другую.
Не используй зарезервированные слова а-ля min, ок?
А по коду, вроде так:
Lua:
sampTextdrawCreate(2290, string.format('Online: %d:%d:%d', hour, min, sec), 480, 360)