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

James Hawk

Известный
919
218
Задавал вопрос в отдельной теме, но вопрос всё ещё актуален

Работаю с диалогами и эмуляцией нажатия клавиши
При активации по команде скрипт нажимает клавишу, проходит по диалогам и должен остановиться. При появлении нужной мне строки в чате я вырубаю скрипт. Но флуд клавишей продолжается. Какие есть варианты фикса?
Лишние части убраны
Lua:
while true do
        wait(0)
        if enabled then
           wait(20)
           setGameKeyState(21, 255)
           ...
       end
end
Lua:
function sampev.onServerMessage(color,text)
    if string.find(text,"my string") then
        enabled=false
    end
end
 

lorgon

Известный
656
271
Почему то в imgui при открытие меню, открывается меню debug хотя я не создавал такого.
 

Di3

Участник
432
20
Lua:
for i,k in pairs(listen) do
    if imgui.Button(u8(k),imgui.ImVec2(350,20)) then
  -- code
    end
end
У меня есть большой список кнопок,как можно сделать поиск , чтобы при вводе в InputText начало фразы в окне появлялась только похожая кнопка с текстом
Актуально
 

ImPasha

Software Developer & System Administrator
Друг
1,789
2,141
Почему то в imgui при открытие меню, открывается меню debug хотя я не создавал такого.
Потому что вне Begin'a код.

Сравнивай текст в кнопке с текстом с инпуте через find, и выводи если совпадает.

Задавал вопрос в отдельной теме, но вопрос всё ещё актуален

Работаю с диалогами и эмуляцией нажатия клавиши
При активации по команде скрипт нажимает клавишу, проходит по диалогам и должен остановиться. При появлении нужной мне строки в чате я вырубаю скрипт. Но флуд клавишей продолжается. Какие есть варианты фикса?
Лишние части убраны
Lua:
while true do
        wait(0)
        if enabled then
           wait(20)
           setGameKeyState(21, 255)
           ...
       end
end
Lua:
function sampev.onServerMessage(color,text)
    if string.find(text,"my string") then
        enabled=false
    end
end
Не хочешь клавише статус 0 вернуть при выключении?
 
  • Нравится
Реакции: lorgon

CyberSuslik

Участник
88
12
находил мб кто собейтовский fly на луа?

Вот исходник Fly на CLEO от Деда_Федота, переделать под Мун думаю можно


CLEO:
{$CLEO}
0000: FLY HACK RPC
0662: printstring "Script for 0.3z by DubStep_"
0662: printstring "Script for 0.3.7 by Ded_Fedot"
0662: printstring "Special Prime-Hack.Net and BlastHack.Net"

repeat
wait 400
until 0AFA: is_samp_structures_available

0B34: samp register_client_command "fhk" to_label @Lab_00
0B34: samp register_client_command "fhkw" to_label @Lab_05
0050: gosub @Lab_04
0BE2: raknet setup_outcoming_packet_hook @Lab_01

while true
0001: wait 0 ms
    if 1@ == 1
    then
        00A0: store_actor $PLAYER_ACTOR position_to 3@ 4@ 5@
            0AB1: call_scm_func @Lab_03 3 3@ 4@ 5@
        wait 6@
    end
end

:Lab_00
if 1@ == 0
then
    1@ = 1
    0ACD: show_text_highpriority "Fly Hack ~g~ON" time 1500
else
1@ = 0
    0ACD: show_text_highpriority "Fly Hack ~r~OFF" time 1500
end                                                                      
0B43: samp cmd_ret

:Lab_01
0BE5: raknet 2@ = get_hook_param 1
if
    1@ == 1
004D: jump_if_false @Lab_02
if
    2@ == 207
004D: jump_if_false @Lab_02
0BE0: raknet hook_ret 0

:Lab_02
0BE0: raknet hook_ret 1

:Lab_03
0B2B: samp 3@ = get_player_id_by_actor_handle $PLAYER_ACTOR
0AC8: 4@ = allocate_memory_size 68
0BBA: samp store_player 3@ onfoot_data 4@
0C0D: struct 4@ offset 4 size 2 = 144
0C0D: struct 4@ offset 6 size 4 = 0@
0C0D: struct 4@ offset 10 size 4 = 1@
0C0D: struct 4@ offset 14 size 4 = 2@
0C0D: struct 4@ offset 38 size 4 = 50
0C0D: struct 4@ offset 42 size 4 = 50
0C0D: struct 4@ offset 46 size 4 = 0
0BC0: samp send_onfoot_data 4@
0AC9: free_allocated_memory 4@
0AB2: ret 0

:Lab_04
if 0AAB: file_exists "CLEO\INI\FlyHack.ini"
then
wait 0
else
if 8AE4: not directory_exists "CLEO\INI"
then
0AE5: create_directory "CLEO\INI" //IF and SET
end
0AF1: write_int 250 to_ini_file "CLEO\INI\FlyHack.ini" section "WorldUpdate" key "Wait"
end
0AF0: 6@ = get_int_from_ini_file "CLEO\INI\FlyHack.ini" section "WorldUpdate" key "Wait"
return

:Lab_05
0B35: samp 7@ = get_last_command_params
if
0AD4: 7@ = scan_string 7@ format "%d" 6@
004D: jump_if_false @Lab_06
0AF1: write_int 6@ to_ini_file "CLEO\INI\FlyHack.ini" section "WorldUpdate" key "Wait"
0AF8: samp add_message_to_chat "{FFCD00}WorldUpdate {A5EE8B}[%d] {FFCD00}мс установлена" color -1 6@
0B43: samp cmd_ret

:Lab_06
0AF8: samp add_message_to_chat "{FFCD00}Неверный ввод команды. {FFFFFF}Пример: {FFCD00}/fhkw {A5EE8B}[Задержка] {FFCD00}в мс" color -1
0B43: samp cmd_ret
 

R1pper69

Новичок
5
0
1:21:43.316124] (system) ***.lua: Script terminated. (0942C00C)
[11:21:43.316124] (error) D:\ИГРЫ\САМП\GTA San Andreas\moonloader\***.lua: cannot load incompatible bytecode

Из-за чего скрипт крашается? У других работает нормально. Название заштриховал ***.