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

Musaigen

abobusnik
Проверенный
1,583
1,302
аналог опкода 0BE5 в луа какой?
Screenshot_6.png
 

Petr_Sergeevich

Известный
Проверенный
707
296
Почему крашит?

Код:
veh = storeCarCharIsIn(PLAYER_PED)
car = getCarHealth(veh)
carText = string.format("Транспорт: %d", car)
renderFontDrawText(font, carText, 432, 700, -1)
 

checkdasound

Известный
Проверенный
963
406
пример на клео кинь, откуда взял
CLEO:
// This file was decompiled using SASCM.ini published by GTAG (http://gtag.gtagaming.com/opcode-database) on 14.6.2013
{$CLEO .cs}

//-------------MAIN---------------
0000: NOP 
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" 

:Label00006E
wait 400 
   SAMP.Available
jf @Label00006E 
0B34: samp register_client_command "fhk" to_label @Label0000E6 
0B34: samp register_client_command "fhkw" to_label @Label000294 
gosub @Label0001E5 
0BE2: raknet setup_outcoming_packet_hook @Label00013A 

:Label0000A3
wait 0 
if 
  1@ == 1 
jf @Label0000DF 
Actor.StorePos($PLAYER_ACTOR, 3@, 4@, 5@)
call @Label00016E 3 3@ 4@ 5@ 
wait 6@ 

:Label0000DF
goto @Label0000A3 

:Label0000E6
if 
  1@ == 0 
jf @Label00011B 
1@ = 1 
print "Fly Hack ~g~ON" 1500 
goto @Label000138 

:Label00011B
1@ = 0 
print "Fly Hack ~r~OFF" 1500 

:Label000138
SAMP.CmdRet

:Label00013A
0BE5: raknet 2@ = get_hook_param 1 
if 
  1@ == 1 
jf @Label00016A 
if 
  2@ == 207 
jf @Label00016A 
0BE0: raknet hook_ret 0 

:Label00016A
0BE0: raknet hook_ret 1 

:Label00016E
3@ = SAMP.GetSAMPPlayerIDByActorHandle($PLAYER_ACTOR)
alloc 4@ 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@ 
free 4@ 
ret 0 

:Label0001E5
if 
0AAB:   file_exists "CLEO\INI\FlyHack.ini" 
jf @Label000213 
wait 0 
goto @Label000264 

:Label000213
if 
8AE4:   not directory_exists "CLEO\INI" 
jf @Label000236 
0AE5: create_directory "CLEO\INI" // IF and SET 

:Label000236
0AF1: write_int 250 to_ini_file "CLEO\INI\FlyHack.ini" section "WorldUpdate" key "Wait" 

:Label000264
0AF0: 6@ = get_int_from_ini_file "CLEO\INI\FlyHack.ini" section "WorldUpdate" key "Wait" 
return 

:Label000294
   SAMP.IsCommandTyped(7@)
if 
0AD4: 7@ = scan_string 7@ format "%d" 6@ 
jf @Label000325 
0AF1: write_int 6@ to_ini_file "CLEO\INI\FlyHack.ini" section "WorldUpdate" key "Wait" 
chatmsg "{FFCD00}WorldUpdate {A5EE8B}[%d] {FFCD00}мс установлена" -1 6@ 
SAMP.CmdRet

:Label000325
chatmsg "{FFCD00}Неверный ввод команды. {FFFFFF}Пример: {FFCD00}/fhkw {A5EE8B}[Задержка] {FFCD00}в мс" -1 
SAMP.CmdRet
 

ShuffleBoy

Известный
Друг
754
429
CLEO:
// This file was decompiled using SASCM.ini published by GTAG (http://gtag.gtagaming.com/opcode-database) on 14.6.2013
{$CLEO .cs}

//-------------MAIN---------------
0000: NOP
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"

:Label00006E
wait 400
   SAMP.Available
jf @Label00006E
0B34: samp register_client_command "fhk" to_label @Label0000E6
0B34: samp register_client_command "fhkw" to_label @Label000294
gosub @Label0001E5
0BE2: raknet setup_outcoming_packet_hook @Label00013A

:Label0000A3
wait 0
if
  1@ == 1
jf @Label0000DF
Actor.StorePos($PLAYER_ACTOR, 3@, 4@, 5@)
call @Label00016E 3 3@ 4@ 5@
wait 6@

:Label0000DF
goto @Label0000A3

:Label0000E6
if
  1@ == 0
jf @Label00011B
1@ = 1
print "Fly Hack ~g~ON" 1500
goto @Label000138

:Label00011B
1@ = 0
print "Fly Hack ~r~OFF" 1500

:Label000138
SAMP.CmdRet

:Label00013A
0BE5: raknet 2@ = get_hook_param 1
if
  1@ == 1
jf @Label00016A
if
  2@ == 207
jf @Label00016A
0BE0: raknet hook_ret 0

:Label00016A
0BE0: raknet hook_ret 1

:Label00016E
3@ = SAMP.GetSAMPPlayerIDByActorHandle($PLAYER_ACTOR)
alloc 4@ 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@
free 4@
ret 0

:Label0001E5
if
0AAB:   file_exists "CLEO\INI\FlyHack.ini"
jf @Label000213
wait 0
goto @Label000264

:Label000213
if
8AE4:   not directory_exists "CLEO\INI"
jf @Label000236
0AE5: create_directory "CLEO\INI" // IF and SET

:Label000236
0AF1: write_int 250 to_ini_file "CLEO\INI\FlyHack.ini" section "WorldUpdate" key "Wait"

:Label000264
0AF0: 6@ = get_int_from_ini_file "CLEO\INI\FlyHack.ini" section "WorldUpdate" key "Wait"
return

:Label000294
   SAMP.IsCommandTyped(7@)
if
0AD4: 7@ = scan_string 7@ format "%d" 6@
jf @Label000325
0AF1: write_int 6@ to_ini_file "CLEO\INI\FlyHack.ini" section "WorldUpdate" key "Wait"
chatmsg "{FFCD00}WorldUpdate {A5EE8B}[%d] {FFCD00}мс установлена" -1 6@
SAMP.CmdRet

:Label000325
chatmsg "{FFCD00}Неверный ввод команды. {FFFFFF}Пример: {FFCD00}/fhkw {A5EE8B}[Задержка] {FFCD00}в мс" -1
SAMP.CmdRet
Lua:
function onSendPacket()

end
Как вытаскивать из диалога информацию с кодами цветов?
k8BojxS.png
string.match
 

Ken Block

Известный
432
31
Lua:
function SE.onShowDialog(dialogId, style, title, button1, button2, text)
    if dialogId == 176 then
            local time1, time2 = text:match('.+Время в игре за сегодня%:%s+%{FFCC00}(%d+)%s+ч%s+(%d+)%s+мин')
            print(time1, time2)
        end
end

Почему в консоль SF пишет nil nil?

k8BojxS.png
 

Fuexie

Известный
108
30
Lua:
    if settingsWindowFirst.v then
        imgui.Begin(u8'Настройка', settingsWindowFirst)
        -- imgui.InputText(u8'Ваш никнейм (на русском)', newBuffer)
        imgui.Text(u8'Привет')
        imgui.End()   
    end
Находится вне main_window_state, но тем не менее не отображается, если не запустить main_window_state почему