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

CAPTA!N

Новичок
220
49
понятно. тут нужно делать как предложил 4el0ve4ik, т.к. в обработчике команды нельзя использовать задержки.
Lua:
function main()
   if not isSampfuncsLoaded() or not isSampLoaded() then return end
   sampRegisterChatCommand("inta", dialog)
  
   while true do
     wait(0)
     if processDialog then
       processDialog = false
       repeat
         wait(0)
         local re, but, list, input = sampHasDialogRespond(13)
       until re
       if list == 0 --[[id элемента диалога]] then
         setCharCoordinates(playerPed, -1398.103515, 937.631164, 1036.479125)
         setInteriorVisible(11)
         setCharInterior(playerPed, 11)
       end
       if list == 1 then
         setCharCoordinates(playerPed, -1398.065307, -217.028900, 1051.115844)
         setInteriorVisible(5)
         setCharInterior(playerPed, 5)
       end
     end
   end
end

function dialog()
   sampShowDialog(13, "стадион 8 \nСтадион Дерби"), "Магия", "Координаты", 2)
   sampSetCurrentDialogListItem(0)
   processDialog = true
end
Ааа, вот как оно... Спасибо огромное за помощь. :) И человечку спасибо. И тиме с хннсси тоже благодарность. Будем эксперементировать. :D

значится попробовал, частично получилось. Но появились две проблемы. Вот код:
Lua:
function main()
    speed = 140.0
    while true do
     wait(0)
        if isKeyDown(87) and isKeyJustPressed(88) and isCharInAnyCar(playerPed) then
            bla = not bla
            if bla then
                printStringNow("ON", 3000)
                car = storeCarCharIsInNoSave(playerPed)
                setCarProofs(car, 1, 1, 1, 1, 1)
            end
            if bla == not bla or not isCharInAnyCar(playerPed) then
                printStringNow("OFF", 3000)
                setCarForwardSpeed(car, 0.0)
                setCarProofs(car, 0, 0, 0, 0, 0)
                wait(1000)
            end
        end
        if bla then
            camX, camY, camZ = getActiveCameraCoordinates()
            pcamX, pcamY, pcamZ = getActiveCameraPointAt()
            resX = pcamX - camX
            resY = pcamY - camY
            angleZ = getHeadingFromVector2d(pcamX, pcamY)
            setCarHeading(car, angleZ)
            if isKeyDown(87) then
                setCarForwardSpeed(car, speed)
            end
            if isKeyDown(32) then
                posX, posY, posZ = getCharCoordinates(playerPed)
                posZ = posZ + 0.5
                setCharCoordinates(playerPed, posX, posY, posZ)
            end
            if isKeyDown(107) then
                speed = speed + 10.0
                 wait(100)
            end
            if isKeyDown(109) then
                speed = speed - 10.0
                 wait(100)
            end
            if isKeyDown(16) then
                setCarForwardSpeed(car, 0.0)
            end  
        end
    end
end
Проблема в том что машина едет только в одном направлении, не зависимо от положения камеры. переменная angleZ всегда приблизительно равна 206 градусов.
Ну и вторая проблема, почему то printStringNow("OFF", 3000) не работает, хотя сам скрипт отключается, а printStringNow("ON", 3000) работает. Все остальное в порядке. В очередной раз прощу вашей помощи. :)
 
Последнее редактирование модератором:
  • Нравится
Реакции: FYP и 4el0ve4ik

applethecandy

Now it's PHP time
Проверенный
253
328
Lua:
isNitroTurnOn = false

function main()
  while not isSampfuncsLoaded() do
      wait(1000)
  end
  sampRegisterChatCommand("setnitro", cmdSetNitro)
  while true do
        wait(0)
        if isNitroTurnOn then
            if isCharInAnyCar(playerPed) then
                local car = storeCarCharIsIn(playerPed)
                giveNonPlayerCarNitro(car)
            end
        end
    end
end

function cmdSetNitro()
    if not isNitroTurnOn then
        isNitroTurnOn = true
    else
        isNitroTurnOn = false
    end
end
Warning(s007): Exception 0xC0000005 at 0x6A3EA3 выдает. Проблема в опкоде 09E9.
 

FYP

Известный
Автор темы
Администратор
1,758
5,722
Lua:
isNitroTurnOn = false

function main()
  while not isSampfuncsLoaded() do
      wait(1000)
  end
  sampRegisterChatCommand("setnitro", cmdSetNitro)
  while true do
        wait(0)
        if isNitroTurnOn then
            if isCharInAnyCar(playerPed) then
                local car = storeCarCharIsIn(playerPed)
                giveNonPlayerCarNitro(car)
            end
        end
    end
end

function cmdSetNitro()
    if not isNitroTurnOn then
        isNitroTurnOn = true
    else
        isNitroTurnOn = false
    end
end
Warning(s007): Exception 0xC0000005 at 0x6A3EA3 выдает. Проблема в опкоде 09E9.
вместо storeCarCharIsIn используй storeCarCharIsInNoSave, первый почему-то вызывает проблемы (в клео тоже). в остальном всё нормально.
 
  • Нравится
Реакции: applethecandy

FYP

Известный
Автор темы
Администратор
1,758
5,722
значится попробовал, частично получилось. Но появились две проблемы. Вот код:
Lua:
function main()
    speed = 140.0
    while true do
     wait(0)
        if isKeyDown(87) and isKeyJustPressed(88) and isCharInAnyCar(playerPed) then
            bla = not bla
            if bla then
                printStringNow("ON", 3000)
                car = storeCarCharIsInNoSave(playerPed)
                setCarProofs(car, 1, 1, 1, 1, 1)
            end
            if bla == not bla or not isCharInAnyCar(playerPed) then
                printStringNow("OFF", 3000)
                setCarForwardSpeed(car, 0.0)
                setCarProofs(car, 0, 0, 0, 0, 0)
                wait(1000)
            end
        end
        if bla then
            camX, camY, camZ = getActiveCameraCoordinates()
            pcamX, pcamY, pcamZ = getActiveCameraPointAt()
            resX = pcamX - camX
            resY = pcamY - camY
            angleZ = getHeadingFromVector2d(pcamX, pcamY)
            setCarHeading(car, angleZ)
            if isKeyDown(87) then
                setCarForwardSpeed(car, speed)
            end
            if isKeyDown(32) then
                posX, posY, posZ = getCharCoordinates(playerPed)
                posZ = posZ + 0.5
                setCharCoordinates(playerPed, posX, posY, posZ)
            end
            if isKeyDown(107) then
                speed = speed + 10.0
                 wait(100)
            end
            if isKeyDown(109) then
                speed = speed - 10.0
                 wait(100)
            end
            if isKeyDown(16) then
                setCarForwardSpeed(car, 0.0)
            end 
        end
    end
end
Проблема в том что машина едет только в одном направлении, не зависимо от положения камеры. переменная angleZ всегда приблизительно равна 206 градусов.
Ну и вторая проблема, почему то printStringNow("OFF", 3000) не работает, хотя сам скрипт отключается, а printStringNow("ON", 3000) работает. Все остальное в порядке. В очередной раз прощу вашей помощи. :)
много недочётов в логике, проблема не в мл.
1. ты производишь вычисления и сохраняешь результат в отдельных переменных, но используешь pcamX, pcamY
2. printStringNow("OFF", 3000) не работает потому что ты его вообще не выводишь - результат проверки всегда ложный
Lua:
            if bla then
                printStringNow("ON", 3000)
                car = storeCarCharIsInNoSave(playerPed)
                setCarProofs(car, 1, 1, 1, 1, 1)
            else -- проверку not isCharInAnyCar(playerPed) вынести из условия с проверкой нажатия
                printStringNow("OFF", 3000)
                setCarForwardSpeed(car, 0.0)
                setCarProofs(car, 0, 0, 0, 0, 0)
                wait(1000)
            end
3. у функции setCarProofs все аргументы, начиная со второго, булевые (true/false)
 
  • Нравится
Реакции: CAPTA!N

4el0ve4ik

Известный
Всефорумный модератор
1,548
1,338
Как получить координаты игрока?
Как проверить наличие чего-либо в сфере?
Как проверить наличие объекта или игрока в зоне видимости камеры игрока (игнорируя стены, просто в пределах камеры)
1.
float positionX, float positionY, float positionZ = getCharCoordinates(int actor) -- 00A0
2.
bool result = isCharInArea2d(int actor, float cornerAX, float cornerAY, float cornerBX, float cornerBY, bool sphere) -- 00A3
bool result = isCarInArea2d(int car, float cornerAX, float cornerAY, float cornerBX, float cornerBY, bool sphere) -- 00B0
bool result = isCarInArea3d(int car, float cornerAX, float cornerAY, float cornerAZ, float cornerBX, float cornerBY, float cornerBZ, bool sphere) -- 00B1
bool result = isPointOnScreen(float sphereX, float sphereY, float sphereZ, float radius) -- 00C2
bool result = locateCharAnyMeans2d(int actor, float pointX, float pointY, float radiusX, float radiusY, bool sphere) -- 00EC
bool result = locateCharOnFoot2d(int actor, float pointX, float pointY, float radiusX, float radiusY, bool sphere) -- 00ED
bool result = locateCharInCar2d(int actor, float pointX, float pointY, float radiusX, float radiusY, bool sphere) -- 00EE
bool result = locateStoppedCharAnyMeans2d(int actor, float pointX, float pointY, float radiusX, float radiusY, bool sphere) -- 00EF
bool result = locateStoppedCharOnFoot2d(int actor, float pointX, float pointY, float radiusX, float radiusY, bool sphere) -- 00F0
bool result = locateStoppedCharInCar2d(int actor, float pointX, float pointY, float radiusX, float radiusY, bool sphere) -- 00F1
bool result = locateCharAnyMeansChar2d(int actor, int nearActor, float radiusX, float radiusY, bool sphere) -- 00F2
locateCharOnFootChar2d(int actor, int nearActor, float radiusX, float radiusY, bool sphere) -- 00F3
bool result = locateCharInCarChar2d(int actor, int nearActor, float radiusX, float radiusY, bool sphere) -- 00F4
bool result = locateCharAnyMeans3d(int actor, float sphereX, float sphereY, float sphereZ, float radiusX, float radiusY, float radiusZ, bool sphere) -- 00FE
bool result = locateCharOnFoot3d(int actor, float sphereX, float sphereY, float sphereZ, float radiusX, float radiusY, float radiusZ, bool sphere) -- 00FF
bool result = locateCharInCar3d(int actor, float sphereX, float sphereY, float sphereZ, float radiusX, float radiusY, float radiusZ, bool sphere) -- 0100
bool result = locateStoppedCharAnyMeans3d(int actor, float sphereX, float sphereY, float sphereZ, float radiusX, float radiusY, float radiusZ, bool sphere) -- 0101
bool result = locateStoppedCharOnFoot3d(int actor, float sphereX, float sphereY, float sphereZ, float radiusX, float radiusY, float radiusZ, bool sphere) -- 0102
bool result = locateStoppedCharInCar3d(int actor, float sphereX, float sphereY, float sphereZ, float radiusX, float radiusY, float radiusZ, bool sphere) -- 0103
bool result = locateCharAnyMeansChar3d(int actor, int nearActor, float radiusX, float radiusY, float radiusZ, bool sphere) -- 0104
bool result = locateCharOnFootChar3d(int actor, int nearActor, float radiusX, float radiusY, float radiusZ, bool sphere) -- 0105
bool result = locateCharInCarChar3d(int actor, int nearActor, float radiusX, float radiusY, float radiusZ, bool sphere) -- 0106
bool result = isCharInAreaOnFoot2d(int actor, int cornerAX, float cornerAY, float cornerBX, float cornerBY, bool sphere) -- 01A1
bool result = isCharInAreaInCar2d(int actor, float cornerAX, float cornerAY, float cornerBX, float cornerBY, bool sphere) -- 01A2
bool result = isCharStoppedInArea2d(int actor, float cornerAX, float cornerAY, float cornerBX, float cornerBY, bool sphere) -- 01A3
bool result = isCharStoppedInAreaOnFoot2d(int actor, int cornerAX, float cornerAY, float cornerBX, float cornerBY, bool sphere) -- 01A4
bool result = isCharStoppedInAreaInCar2d(int actor, float cornerAX, float cornerAY, float cornerBX, float cornerBY, bool sphere) -- 01A5
bool result = isCharInAreaOnFoot3d(int actor, float cornerAX, float cornerAY, float cornerAZ, float cornerBX, float cornerBY, float cornerBZ, bool sphere) -- 01A6
bool result = isCharInAreaInCar3d(int actor, float cornerAX, float cornerAY, float cornerAZ, float cornerBX, float cornerBY, float cornerBZ, bool sphere) -- 01A7
bool result = isCharStoppedInArea3d(int actor, float cornerAX, float cornerAY, float cornerAZ, float cornerBX, float cornerBY, float cornerBZ, bool sphere) -- 01A8
bool result = isCharStoppedInAreaOnFoot3d(int actor, float cornerAX, float cornerAY, float cornerAZ, float cornerBX, float cornerBY, float cornerBZ, bool sphere) -- 01A9
bool result = isCharStoppedInAreaInCar3d(int actor, float cornerAX, float cornerAY, float cornerAZ, float cornerBX, float cornerBY, float cornerBZ, bool sphere) -- 01AA
bool result = isCarStoppedInArea2d(int car, float cornerAX, float cornerAY, float cornerBX, float cornerBY, bool sphere) -- 01AB
bool result = isCarStoppedInArea3d(int car, float cornerAX, float cornerAY, float cornerAZ, float cornerBX, float cornerBY, float cornerBZ, bool sphere) -- 01AC
bool result = locateCar2d(int car, float pointX, float pointY, float radiusX, float radiusY, bool sphere) -- 01AD
bool result = locateStoppedCar2d(int car, float pointX, float pointY, float radiusX, float radiusY, bool sphere) -- 01AE
bool result = locateCar3d(int car, float sphereX, float sphereY, float sphereZ, float radiusX, float radiusY, float radiusZ, bool sphere) -- 01AF
bool result = locateStoppedCar3d(int car, float sphereX, float sphereY, float sphereZ, float radiusX, float radiusY, float radiusZ, bool sphere) -- 01B0
bool result = locateCharAnyMeansCar2d(int actor, int car, float radiusX, float radiusY, bool sphere) -- 0202
bool result = locateCharInCarCar2d(int actor, int car, float radiusX, float radiusY, bool sphere) -- 0204
int sphere = addSphere(float atX, float atY, float atZ, float radius) -- 03BC
bool result = locateCharAnyMeansObject2d(int actor, int object, float radiusX, float radiusY, bool sphere) -- 0471
bool result = locateCharOnFootObject2d(int actor, int object, float radiusX, float radiusY, bool sphere) -- 0472
bool result = locateCharInCarObject2d(int actor, int object, float radiusX, float radiusY, bool sphere) -- 0473
bool result = locateCharAnyMeansObject3d(int actor, int object, float radiusX, float radiusY, float radiusZ, bool sphere) -- 0474
bool result = locateCharOnFootObject3d(int actor, int object, float radiusX, float radiusY, float radiusZ, bool sphere) -- 0475
bool result = locateCharInCarObject3d(int actor, int object, float radiusX, float radiusY, float radiusZ, bool sphere) -- 0476
bool result = locateObject2d(int object, float X, float Y, float radiusX, float radiusY, bool sphere) -- 04E5
bool result = isObjectInArea2d(int object, float cornerAX, float cornerAY, float cornerBX, float cornerBY, bool sphere) -- 04E9
bool result = isFlameInAngledArea2d(float x1, float y1, float x2, float y2, float angle, bool sphere) -- 072D
bool result = isFlameInAngledArea3d(float x1, float y1, float z1, float x2, float y2, float z2, float angle, bool sphere) -- 072E
3. не сталкивался с такой нуждой, но на клео вроде функция была
 

CAPTA!N

Новичок
220
49
Lua:
taskPlayAnimNonInterruptable(playerPed, "LOU_IN", "INT_HOUSE", 4.0, false, false, false, true, 1)
Насколько я понимаю, анимка должна вырубаться через 1 миллисекунду, но она этого не делает. Во всяком случае в scm так и было.
 

applethecandy

Now it's PHP time
Проверенный
253
328
Я пробовал getCharCoordinates, указывал в нём хендл игрока,, но у меня вылетал варн. Там нужен хендл, или ид?
posX, posY, posZ = getCharCoordinates(playerPed)
Это не третий тип. Их изначально было два - playerPed и playerHandle
 
  • Нравится
Реакции: ishi и 4el0ve4ik

RedBoxWhite

Известный
337
27
Как бегать коордам? Есть ли тот же баг с бегом по коордам, как в клео (скольжение)?
 

4el0ve4ik

Известный
Всефорумный модератор
1,548
1,338
Код:
function Check()
sampAddChatMessage("Meow", 000000)
  while true do
  wait(0)
  while not sampIsLocalPlayerSpawned() do wait(100) end
  while isCharOnFoot(playerPed) do wait(100) end
  if getCarSpeed(playerPed) > 0 then
   StoredCharCar = storeCarCharIsIn(playerPed)
  CarSpeedVectorX,CarSpeedVectorY,CarSpeedVectorZ = getCarSpeedVector(StoredCharCar)
  sampAddChatMessage("Wow, are we moving",000000)
  end
  end
end
При посадке в машину, должно выжидать пока скорость возрастёт выше нуля и выдавать сообщение, а выдаёт варнинг при посадке ._.
local result = isCharInAnyCar(playerPed)
а варнит потому что у StoredCharCar = storeCarCharIsIn(playerPed) два входящих значения
 

DarkP1xel

Сила воли наше всё.
BH Team
3,635
4,961
Lua:
function main()
    while true do wait(0)
        if isCharInAnyCar(playerPed) then
            if getCarSpeed(storeCarCharIsInNoSave(playerPed)) > 0.0 then sampAddChatMessage("Speed...", 0xFFFFFF)
            end
        end
    end
end

на скорую руку но попробуй