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

Di3

Участник
432
20
Lua:
if imgui.Button(u8('Редактировать текст'), imgui.ImVec2(200, 0)) then
                cmd_text.v = u8(v.text):gsub("~", "\n")
                imgui.OpenPopup(u8'Редактор текста##second'..k)
end


if imgui.BeginPopupModal(u8'Редактор текста##second'..k, _, imgui.WindowFlags.NoCollapse + imgui.WindowFlags.NoScrollbar + imgui.WindowFlags.AlwaysAutoResize) then

                imgui.BeginChild('##sdaadasdd', imgui.ImVec2(505, 600), true)
                imgui.InputTextMultiline('##FUCKITTIKCUF_2', cmd_text, imgui.ImVec2(498, 300))
             
       
                imgui.SetCursorPos(imgui.ImVec2(1, 575))

                if imgui.Button(u8" Сохранить", imgui.ImVec2(200, 0)) then
                    imgui.CloseCurrentPopup()
                end



                imgui.EndChild()
                imgui.EndPopup()
     end
 

FormatC

Участник
94
29
хелпаните, не могу нормально поставить камеру на игрока.
Получил handle, проверил есть ли на экране,уже почти всё есть, но когда делаю:
Код:

Код:
setCameraPositionUnfixed(wposX, wposY)

то камеру разворачивает куда то вверх, в небо
 

Albertio

Attention! Thanks for your attention.
887
717
хелпаните, не могу нормально поставить камеру на игрока.
Получил handle, проверил есть ли на экране,уже почти всё есть, но когда делаю:
Код:

Код:
setCameraPositionUnfixed(wposX, wposY)

то камеру разворачивает куда то вверх, в небо
Какие значения ты выставляешь в wposX wposY?
 

trefa

3d print
Всефорумный модератор
2,107
1,264
Lua:
if imgui.Button(u8('Редактировать текст'), imgui.ImVec2(200, 0)) then
                cmd_text.v = u8(v.text):gsub("~", "\n")
                imgui.OpenPopup(u8'Редактор текста##second'..k)
end


if imgui.BeginPopupModal(u8'Редактор текста##second'..k, _, imgui.WindowFlags.NoCollapse + imgui.WindowFlags.NoScrollbar + imgui.WindowFlags.AlwaysAutoResize) then

                imgui.BeginChild('##sdaadasdd', imgui.ImVec2(505, 600), true)
                imgui.InputTextMultiline('##FUCKITTIKCUF_2', cmd_text, imgui.ImVec2(498, 300))
            
      
                imgui.SetCursorPos(imgui.ImVec2(1, 575))

                if imgui.Button(u8" Сохранить", imgui.ImVec2(200, 0)) then
                    imgui.CloseCurrentPopup()
                end



                imgui.EndChild()
                imgui.EndPopup()
     end
Значение переменной k откуда?
 

|| NN - NoName ||

Известный
1,049
635
1586289442628.png

Как записывать эту строчку в переменную, значение может быть какое угодно.
 

MaksQ

Известный
967
834
ММ:
 function SbivX()
        while true do
           wait(0)
             if isKeyJustPressed(VK_X) and sbivx.v  and not sampIsChatInputActive() and not sampIsDialogActive() and not sampIsScoreboardOpen() and not isSampfuncsConsoleActive() then
                clearCharTasksImmediately(PLAYER_PED)
             end
        end
    end


Как сделать так чтобы при сбиве сбивалась не только анимка но и например Анимация Падения С Высоты + Чтобы резко тормозить тачку??
+ как сбить на X заморозку сервером?
 
Последнее редактирование:

|| NN - NoName ||

Известный
1,049
635
ММ:
 function SbivX()
        while true do
           wait(0)
             if isKeyJustPressed(VK_X) and sbivx.v  and not sampIsChatInputActive() and not sampIsDialogActive() and not sampIsScoreboardOpen() and not isSampfuncsConsoleActive() then
                clearCharTasksImmediately(PLAYER_PED)
             end
        end
    end


Как сделать так чтобы при сбиве сбивалась не только анимка но и например Анимация Падения С Высоты + Чтобы резко тормозить тачку??
+ как сбить на X заморозку сервером?
На счёт чтобы тормазило тачку хз.
Lua:
function main()
    while true do wait(0)
        if isKeyDown(88) and not sampIsChatInputActive() then 
            taskPlayAnimNonInterruptable(PLAYER_PED, 'HANDSUP', 'PED', 4.0, 1, 1, 1, 0, -3)
            clearCharTasks(PLAYER_PED)
        end
    end
end
 
  • Нравится
Реакции: MaksQ

MaksQ

Известный
967
834
На счёт чтобы тормазило тачку хз.
Lua:
function main()
    while true do wait(0)
        if isKeyDown(88) and not sampIsChatInputActive() then
            taskPlayAnimNonInterruptable(PLAYER_PED, 'HANDSUP', 'PED', 4.0, 1, 1, 1, 0, -3)
            clearCharTasks(PLAYER_PED)
        end
    end
end
Не работает сбив падения...
На счёт чтобы тормазило тачку хз.
Lua:
function main()
    while true do wait(0)
        if isKeyDown(88) and not sampIsChatInputActive() then
            taskPlayAnimNonInterruptable(PLAYER_PED, 'HANDSUP', 'PED', 4.0, 1, 1, 1, 0, -3)
            clearCharTasks(PLAYER_PED)
        end
    end
end
Норм сбив:
// 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
:NONAME_00
wait 0
if
0ADC:   test_cheat "X"   //кнопка активации
jf @NONAME_00           //если не нажата - повторять
goto @NONAME_193       //если нажата - продолжать

:NONAME_193
wait 0  // Задержка в 0мсек. что бы не было косяков
Player.CanMove($PLAYER_CHAR) = True                                             //Это все сбив
Actor.StorePos($PLAYER_ACTOR, 0@, 1@, 2@)                                      //Это все сбив
04C4: store_coords_to 0@ 1@ 2@ from_actor $PLAYER_ACTOR with_offset 0 0 -1.0  //Это все сбив
Actor.PutAt($PLAYER_ACTOR, 0@, 1@, 2@)                                       //Это все сбив
Actor.LockInCurrentPosition($PLAYER_ACTOR) = False                          //Это все сбив
wait 200 // Задержка в 200мсек. что бы не было косяков
goto @NONAME_00

Вот в клео таком все идеально работает, а я хотел бы эт на луа сделать
 

FormatC

Участник
94
29
ММ:
 function SbivX()
        while true do
           wait(0)
             if isKeyJustPressed(VK_X) and sbivx.v  and not sampIsChatInputActive() and not sampIsDialogActive() and not sampIsScoreboardOpen() and not isSampfuncsConsoleActive() then
                clearCharTasksImmediately(PLAYER_PED)
             end
        end
    end


Как сделать так чтобы при сбиве сбивалась не только анимка но и например Анимация Падения С Высоты + Чтобы резко тормозить тачку??
+ как сбить на X заморозку сервером?
Что бы резко тормозить тачку - можно использовать резкий сбив её скорости или freeze её:

Код:
car =  storeCarCharIsIn(PLAYER_PED)
freezeCarPosition(car, true)
freezeCarPosition(car, false)

Что бы сбить любую анимку\анимку падения лучше всего использовать так же freeze или сбив анимации (без посредства другой анимации, ибо это палится):

Код:
taskPlayAnim(PLAYER_PED, "camcrch_stay", "CAMERA", 4.0, false, false, true, false, 1)
 
  • Нравится
Реакции: MaksQ

MaksQ

Известный
967
834
Что бы резко тормозить тачку - можно использовать резкий сбив её скорости или freeze её:

Код:
car =  storeCarCharIsIn(PLAYER_PED)
freezeCarPosition(car, true)
freezeCarPosition(car, false)

Что бы сбить любую анимку\анимку падения лучше всего использовать так же freeze или сбив анимации (без посредства другой анимации, ибо это палится):

Код:
taskPlayAnim(PLAYER_PED, "camcrch_stay", "CAMERA", 4.0, false, false, true, false, 1)
Фризить игрока когда он падает пытался не работает.
И это тоже не робит
taskPlayAnim(PLAYER_PED, "camcrch_stay", "CAMERA", 4.0, false, false, true, false, 1)