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

Refraktor

Известный
136
73
Как проверить целится ли игрок? Неважно куда, просто целюсь ли я.
Пробовал isPlayerTargettingAnything(PLAYER_PED) - ошибка. Если PLAYER_HANDLE, то ошибок нет, просто не работает.
 

astynk

Известный
Проверенный
741
533
почему код не работает?

Lua:
function main()
    if not isSampfuncsLoaded() or not isSampLoaded() then return end
  sampRegisterChatCommand("bannan", test)
end


function test(args)
    local a, b = args:match('(.+) (.+)')
    result, ped = sampGetCharHandleBySampPlayerId(a)
    hendel = sampGetCarHandleBySampVehicleId(b)
    taskCarDriveToCoord(ped, hendel, -68.6675, 1315.1215, 11.5458, 50.00, 2, 520, 2)
end
1. Нельзя регистрировать команды, если самп не загружен.
while not isSampAvailable() do wait(100) end в начало main.
2. wait(-1) все-таки нужен, даже в .026
Как проверить целится ли игрок? Неважно куда, просто целюсь ли я.
Пробовал isPlayerTargettingAnything(PLAYER_PED) - ошибка. Если PLAYER_HANDLE, то ошибок нет, просто не работает.
PLAYER_HANDLE там нужен. И проверять все в цикле.
Lua:
while true do
    wait(1)
    sampAddChatMessage(getCharPlayerIsTargeting(0), -1)
end
 

Refraktor

Известный
136
73
PLAYER_HANDLE там нужен. И проверять все в цикле.
Lua:
while true do
    wait(1)
    sampAddChatMessage(getCharPlayerIsTargeting(0), -1)
end
Это не работает и не должно. https://blast.hk/wiki/lua:getcharplayeristargeting. Она два параметра возвращает, и проверяет целюсь ли я в другого персонажа. А мне надо просто (в небо целюсь, в землю, в стену, может и в игрока).
А ещё лучше, проверять есть ли прицел на экране. Он появляется спустя небольшое время после начала прицеливания.
 

KoJIбасА

Известный
107
4
1. Нельзя регистрировать команды, если самп не загружен.

2. wait(-1) все-таки нужен, даже в .026

PLAYER_HANDLE там нужен. И проверять все в цикле.
Lua:
while true do
    wait(1)
    sampAddChatMessage(getCharPlayerIsTargeting(0), -1)
end

получилось такое и всеровно не робит
Lua:
function main()
    while not isSampAvailable() do wait(100) end
  sampRegisterChatCommand("bannan", test)
    wait(-1)
end


function test(args)
    local a, b = args:match('(.+) (.+)')
    result, ped = sampGetCharHandleBySampPlayerId(a)
    hendel = sampGetCarHandleBySampVehicleId(b)
    taskCarDriveToCoord(ped, hendel, -68.6675, 1315.1215, 11.5458, 50.00, 2, 525, 2)
end

taskCarDriveToCoord(Ped ped, Vehicle car, float toX, float toY, float toZ, float speed, int int7, int model, int int9)
 
Последнее редактирование:

Refraktor

Известный
136
73
получилось такое и всеровно не робит
Lua:
function main()
    while not isSampAvailable() do wait(100) end
  sampRegisterChatCommand("bannan", test)
    wait(-1)
end


function test(args)
    local a, b = args:match('(.+) (.+)')
    result, ped = sampGetCharHandleBySampPlayerId(a)
    hendel = sampGetCarHandleBySampVehicleId(b)
    taskCarDriveToCoord(ped, hendel, -68.6675, 1315.1215, 11.5458, 50.00, 2, 525, 2)
end
Lua:
function main()
    if not isSampLoaded() or not isSampfuncsLoaded() then return end
    sampRegisterChatCommand("bannan", function(arg)
        if #arg ~= 0 and arg:find("%d+ %d+") then
            local playerid, carid = string.match(arg, "(%d+) (%d+)")
            local _, player = sampGetCharHandleBySampPlayerId(playerid)
            local _, car = sampGetCarHandleBySampVehicleId(carid)
            taskCarDriveToCoord(player, car, -68.6675, 1315.1215, 11.5458, 50.00, 2, 520, 2)
        end
    end)
    wait(0)
end
 
  • Нравится
Реакции: KoJIбасА

KoJIбасА

Известный
107
4
Lua:
function main()
    if not isSampLoaded() or not isSampfuncsLoaded() then return end
    sampRegisterChatCommand("bannan", function(arg)
        if #arg ~= 0 and arg:find("%d+ %d+") then
            local playerid, carid = string.match(arg, "(%d+) (%d+)")
            local _, player = sampGetCharHandleBySampPlayerId(playerid)
            local _, car = sampGetCarHandleBySampVehicleId(carid)
            taskCarDriveToCoord(player, car, -68.6675, 1315.1215, 11.5458, 50.00, 2, 520, 2)
        end
    end)
    wait(0)
end
не работает

taskCarDriveToCoord(Ped ped, Vehicle car, float toX, float toY, float toZ, float speed, int int7, int model, int int9)
 
464
827
Как ты можешь ждать чего-то, если ничего нету. я про wait(-1)

Вот так пиши:
Lua:
function main()
    if not isSampLoaded() or not isSampfuncsLoaded() then return end
    while not isSampAvailable() do wait(100) end
    -- здесь ты можешь писать сообщения типа "я загрузился", или делать новые команды
    while true do
        -- основной код работающий в цикле
        wait(-1)
    end
end

И еще, проверяй пустой ли аргумент в test(args)
што за хуйню ты сделал
 
Последнее редактирование:
  • Нравится
Реакции: astynk

EugeneSubVerteicha

Новичок
1
0
Хелп, что я делаю не так?
Lua:
require "lib.moonloader"

function main()
    if not isSampfuncsLoaded() or not isSampLoaded() then return end
    while not isSampAvailable() do wait(100) end
    while true do
    wait(0)
      local result, playerid = sampGetPlayerIdByCharHandle(PLAYER_PED)
    if result then
    local health = sampGetPlayerHealth(playerid)
    if health and health < 1 then
    AudioStream handle = loadAudioStream(lib/fiascobro/fbro.mp3)
    end
    end
    end
    end
 

Refraktor

Известный
136
73
Как проверить целится ли игрок? Неважно куда, просто целюсь ли я.
Пробовал isPlayerTargettingAnything(PLAYER_PED) - ошибка. Если PLAYER_HANDLE, то ошибок нет, просто не работает.
Актуально. И ещё как проверить, заспавнен ли игрок?
 

DeniPolis

Участник
114
12
не работает

taskCarDriveToCoord(Ped ped, Vehicle car, float toX, float toY, float toZ, float speed, int int7, int model, int int9)
А делать то что должно?
што за хуйню ты сделал
Не нравиться, не смотри. Эту хуйню я видел в многих скриптах...
Актуально. И ещё как проверить, заспавнен ли игрок?
Что-то из этого, не помню что точно, но что-то я юзал для своего авто-хила:
if not isCharDead() then
end

if sampIsLocalPlayerSpawned() then
end
 
Последнее редактирование:

FBenz

Активный
328
40
Как я понял, тебе надо проиграть звук при хп меньше 1 (офигенный код, мое уважение).
1. Видимо, у тебя файл аудио в папке lib, которая в мунлоадере. Ты же указываешь диск lib. Правильно: getWorkingDirectory()..'lib/fiascobro/fbro.mp3'
2. У тебя loadAudioStream(lib/fiascobro/fbro.mp3) приравнивается к AudioStream handle. Это че? Если хочешь взять хендл, то его пишут в переменную. Переменная не может быть с пробелами. Советую начать с азов и основ, иначе быстро потеряешь интерес, ибо нифига не будет работать без знаний.
В следующий раз формулируй вопрос нормально, а не просто "ЧО НЕ ТАК". Никто в твоем коде (ТЕМ БОЛЕЕ в нечитаемом виде) копаться не захочет, если нет описания проблемы.

P.S. На страничке с функциями на БХ, AudioStream handle - это тип переменной. А не сама переменная. Потому нельзя тупо вот так скопировать и все. Если есть пример использования - смотри там. Если же только сверху указана функция, то там указаны лишь аргументы и возвращаемые значения. А там не переменные, а типы переменных. В данном случае AudioStream handle значит, что в переменную на этом месте будет записан хендл аудио стрима.

(Не бейте, объяснил простыми словами, как мог, преподаватель из меня гомно)
 
Последнее редактирование:

paulohardy

вы еще постите говно? тогда я иду к вам
Всефорумный модератор
1,956
1,309
Как я понял, тебе надо проиграть звук при хп меньше 1 (офигенный код, мое уважение).
1. Видимо, у тебя файл аудио в папке lib, которая в мунлоадере. Ты же указываешь диск lib. Правильно: getWorkingDirectory()..'lib/fiascobro/fbro.mp3'
2. У тебя loadAudioStream(lib/fiascobro/fbro.mp3) приравнивается к AudioStream handle. Это че? Если хочешь взять хендл, то его пишут в переменную. Переменная не может быть с пробелами. Советую начать с азов и основ, иначе быстро потеряешь интерес, ибо нифига не будет работать без знаний.
В следующий раз формулируй вопрос нормально, а не просто "ЧО НЕ ТАК". Никто в твоем коде (ТЕМ БОЛЕЕ в нечитаемом виде) копаться не захочет, если нет описания проблемы.
P.S. На страничке с функциями на БХ, AudioStream handle - это тип переменной. А не сама переменная. Потому нельзя тупо вот так скопировать и все. Если есть пример использования - смотри там. Если же только сверху указана функция, то там указаны лишь аргументы и возвращаемые значения. А там не переменные, а типы переменных. В данном случае AudioStream handle значит, что в переменную на этом месте будет записан хендл аудио стрима.
(Не бейте, объяснил простыми словами, как мог, преподаватель из меня гомно)
Все верно
Посмотри эту страницу, снизу есть пример правильного использования этих функций
 

Legal_Space

Новичок
12
17
Есть скрипт который отображает последний RPC?