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

ШPEK

Известный
1,474
526
как можно считать скорость машины в которой ты едишь и как узнать расстояние до твоего какра по его id
1.float speed = getCarSpeed(Vehicle car)
2.
Lua:
local res, veh = sampGetCarHandleBySampVehicleId(228)
if res then
  local x1, y1, z1 = getCarCoordinates(veh)
  local x2, y2, z2 = getCharCoordinates(PLAYER_PED)
  local dist = getDistanceBetweenCoords3d(x1, y1, z1, x2, y2, z2)
  sampAddChatMessage(tostring(dist), -1)
end

Как узнать ник игрока? Что бы высвечивало в sampAddChatMessage
Lua:
local res, id = sampGetPlayerIdByCharHandle(PLAYER_PED)
  if res then
    local name = sampGetPlayerNickname(id)
    sampAddChatMessage(name, -1)
  end

как узнать позицию текстдрава?
float posX, float posY = sampTextdrawGetPos(int id)
 
  • Нравится
Реакции: asocial demon

Danil_Hades

Новичок
131
3
Как получить хэндл транспорта по id?
Lua:
bool result, Vehicle car = sampGetCarHandleBySampVehicleId(int id)

Lua:
  while true do
    wait(0)
    if (isCharInAnyCar(playerPed) == true and isKeyJustPressed(VK_F) and speed<1) then
      local veh = storeCarCharIsInNoSave(PLAYER_PED)
      local speed = getCarSpeed(veh)
      print(speed)
    end
  end
скрипт перестает работать когда выхожу из машины. что не так?
 
  • Нравится
Реакции: asocial demon

Petr_Sergeevich

Известный
Проверенный
707
298
Lua:
bool result, Vehicle car = sampGetCarHandleBySampVehicleId(int id)

Lua:
  while true do
    wait(0)
    if (isCharInAnyCar(playerPed) == true and isKeyJustPressed(VK_F) and speed<1) then
      local veh = storeCarCharIsInNoSave(PLAYER_PED)
      local speed = getCarSpeed(veh)
      print(speed)
    end
  end
скрипт перестает работать когда выхожу из машины. что не так?

Попробуй так, кстати, что в логе пишет?

Lua:
  while true do
    wait(0)
    if isCharInAnyCar(PLAYER_PED) then
        if isKeyJustPressed(0x46) and speed < 1 then
            local veh = storeCarCharIsInNoSave(PLAYER_PED)
            local speed = getCarSpeed(veh)
            print(speed)
        end
    end
  end
 
  • Нравится
Реакции: Danil_Hades

lorgon

Известный
656
273
Что делать?
Lua:
function sampev.onServerMessage(clr, msg)
    sampAddChatMessage(clr .." "..msg, -1)
    print(msg)
end
В msg не отображается цвет, к примеру есть сообщение "{10FFFF}Привет как дела? {10F441}Я играю в самп", мне отображается "Привет как дела? {10F441}Я играю в самп", как получить цвет сообщение первого (Этого - Привет как дела? {10F441}Я играю в самп)
 

asocial demon

Потрачен
175
14
Обратите внимание, пользователь заблокирован на форуме. Не рекомендуется проводить сделки.
Напишите пожалуйста код, чтобы получить кол-во денег с персонажа.
Lua:
require 'lib.moonloader'
local key = require ("vkeys")
function money()
while true do wait(0)
local money = getPlayerMoney(PLAYER_PED)
if isKeyDown(key.VK_J)
print(money)
end
end
 

Petr_Sergeevich

Известный
Проверенный
707
298
Что делать?
Lua:
function sampev.onServerMessage(clr, msg)
    sampAddChatMessage(clr .." "..msg, -1)
    print(msg)
end
В msg не отображается цвет, к примеру есть сообщение "{10FFFF}Привет как дела? {10F441}Я играю в самп", мне отображается "Привет как дела? {10F441}Я играю в самп", как получить цвет сообщение первого (Этого - Привет как дела? {10F441}Я играю в самп)


Lua:
function sampev.onServerMessage(color, message)
    print(("{%06X}%s"):format(bit.rshift(color, 8), message))
end
 

asocial demon

Потрачен
175
14
Обратите внимание, пользователь заблокирован на форуме. Не рекомендуется проводить сделки.
Дайте ссылку на полный список ивентов samp.lua
 

asocial demon

Потрачен
175
14
Обратите внимание, пользователь заблокирован на форуме. Не рекомендуется проводить сделки.

TheDed

Участник
99
14
Всё равно бежит, хотя переменная Run меняется на false. Как можно пофиксить?
Lua:
if Run then
Run = false
reboot = true
end
sampCloseCurrentDialogWithButton(0)
runTo(****)
wait(3000)
flat = flat + 1
runType = 7
elseif runType == 7 then
runTo(****)
runTo(****)
wait(3000)
if newdata == 0 then
runTo(****)
runTo(****)
wait(3000)
end
elseif runType == 8 then
if reboot then
Run = true
reboot = false
end
runTo(****)
wait(3000)
--------------------
function MovePlayer(move_code, Run, dis)
    if Run then
    setGameKeyState(1, move_code)
    setGameKeyState(16, 255)
    else
    setGameKeyState(1, move_code)
end
end

Риали нихто не знает?
1.0
 

Danil_Hades

Новичок
131
3
Помогите! пишет
Код:
[ML] (error) leaders.lua: D:\Games\GTA San Andreas\moonloader\leaders.lua:18: attempt to compare nil with number
stack traceback:
    D:\Games\GTA San Andreas\moonloader\leaders.lua: in function <D:\Games\GTA San Andreas\moonloader\leaders.lua:3>
[ML] (error) leaders.lua: Script died due to an error. (01B4BB1C)
из за этого
Lua:
  while true do
    wait(0)
    if isCharInAnyCar(PLAYER_PED) then
        if isKeyJustPressed(0x46) and speed < 1 then
            local veh = storeCarCharIsInNoSave(PLAYER_PED)
            local speed = getCarSpeed(veh)
            print(speed)
        end
    end
  end
что не так, хелпаните плз
 

Petr_Sergeevich

Известный
Проверенный
707
298
Всё равно бежит, хотя переменная Run меняется на false. Как можно пофиксить?
Lua:
if Run then
Run = false
reboot = true
end
sampCloseCurrentDialogWithButton(0)
runTo(****)
wait(3000)
flat = flat + 1
runType = 7
elseif runType == 7 then
runTo(****)
runTo(****)
wait(3000)
if newdata == 0 then
runTo(****)
runTo(****)
wait(3000)
end
elseif runType == 8 then
if reboot then
Run = true
reboot = false
end
runTo(****)
wait(3000)
--------------------
function MovePlayer(move_code, Run, dis)
    if Run then
    setGameKeyState(1, move_code)
    setGameKeyState(16, 255)
    else
    setGameKeyState(1, move_code)
end
end

Риали нихто не знает?
1.0

Сорян, конечно, но этот кал не читаемый, даже с расставленной табуляцией. Как это вообще работает? :D
Lua:
if Run then
    Run = false
    reboot = true
end

sampCloseCurrentDialogWithButton(0)

runTo(****)
wait(3000)
flat = flat + 1
runType = 7

elseif runType == 7 then
   
runTo(****)
runTo(****)
wait(3000)

if newdata == 0 then
    runTo(****)
    runTo(****)
    wait(3000)
end

elseif runType == 8 then
   
if reboot then
    Run = true
    reboot = false
end

runTo(****)
wait(3000)
--------------------
function MovePlayer(move_code, Run, dis)
    if Run then
        setGameKeyState(1, move_code)
        setGameKeyState(16, 255)
    else
        setGameKeyState(1, move_code)
    end
end
 

asocial demon

Потрачен
175
14
Обратите внимание, пользователь заблокирован на форуме. Не рекомендуется проводить сделки.
Помогите! пишет
Код:
[ML] (error) leaders.lua: D:\Games\GTA San Andreas\moonloader\leaders.lua:18: attempt to compare nil with number
stack traceback:
    D:\Games\GTA San Andreas\moonloader\leaders.lua: in function <D:\Games\GTA San Andreas\moonloader\leaders.lua:3>
[ML] (error) leaders.lua: Script died due to an error. (01B4BB1C)
из за этого
Lua:
  while true do
    wait(0)
    if isCharInAnyCar(PLAYER_PED) then
        if isKeyJustPressed(0x46) and speed < 1 then
            local veh = storeCarCharIsInNoSave(PLAYER_PED)
            local speed = getCarSpeed(veh)
            print(speed)
        end
    end
  end
что не так, хелпаните плз
почему ты юзаешь if внутри if приэтом его не закрыв? Если тебе нужно 2 условия то используй if and