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

l-m

Новичок
28
1
создавай поток, при повторном вводе команды удаляй его....
Lua:
function main()
    sampRegisterChatCommand('aboba', function()
        if thread then
            thread:terminate()
            thread = nil
            sampAddChatMessage('Флудер остановлен', -1)
            return
        end
        sampAddChatMessage('Флудер запущен', -1)
        thread = lua_thread.create(function()
            while true do
                sampAddChatMessage('ABOBA', -1)
                wait(100)
            end
        end)
    end)
    wait(-1)
end
Посмотреть вложение 185995
Не через main получится? Чтобы вот в этот код))))
Lua:
function sampev.onServerMessage(color--[[Цвет]], text--[[Текст]]) -- Этот хук ловит сообщения в чате
    lua_thread.create(function() -- создаем поток -- позволяет использовать wait
        if status then
            if text:find('[R].*: /driver') then -- если найден текст "test" то
                wait(100) -- отвечает за ожидание в размере секунды БЫЛО 1000 сек
                sampSendChat('/r Вызываю эвакуатор через 10 секунд')
                wait(5000)
                sampSendChat('/r (( /drive 5 sek ))')
                wait(4000)
                sampSendChat('/r Вызываю эвакуатор через 1 секунду, кто не успел тот опоздал')
                wait(1000)
                sampSendChat('/drive') -- если в чате засветится сообщение test, то хук поймает данное сообщение, дальше скрипт подождет 1 секунду и выведет "Не тест"
                wait(2000)
                sampCloseCurrentDialogWithButton(1) --закрывает окно с нажатием кнопки
            elseif text:find('[R].*: /cancel') then
                sampSendChat("/r (( drive disabled ))")
                wait(500)
                thisScript():reload() 
            end    
        end    
    end)-- закрываем поток
end
 

Arseniy_Verteich

Новичок
3
0
Ребят, помогите пожалуйста, в медхелпере при вводе команды /hl (id) отыгрывается рп, и после должно хилить игрока, но после обновлений нужно писать цену хила, изза этого выдает ошибку, в самой аризоне, мол введите цену за лечение , в хелпере есть политика цен, но она не работает. Как сделать так, что бы хелпер работал по команде /hl (id) (цена) и в после выдавал /heal (id) (цена) А не просто /heal (id). Да знаю, это сделать вроде-бы просто, но я новичок, и не разбираюсь в этом.
Нужно сделать перепенную, но как?
 

Julimba

Участник
108
10
Хелпаните пж
<eof>' expected near 'end'

Lua:
function sampev.onPlayerDeathNotification(killerId, killedId, reason)
    if isGameWindowForeground() and not isPauseMenuActive() and not isGamePaused() then
        local nick = sampGetPlayerNickname(killerId)
        sampAddChatMessage(tag.. '{FFFFFF}Игрок {30d5c8}' ..nick.. '[' ..killerId.. '] {FFFFFF}убил другого игрока', -1)
        sampAddChatMessage(tag.. '{FFFFFF}Чтобы объявить в розыск, нажми - {99FF00}End', -1)
        local CLOCK = os.clock()
            lua_thread.create(function()
                while true do wait(1)
                    if isKeyJustPressed(106) then break end
                    if isKeyJustPressed(35) then
                        sampSendChat('/su ' ..killerId.. ' 4 14.1 ')
                        sampAddChatMessage(tag.. '{FFFFFF}Вы выдали розыск игроку{30d5c8}'..nick..'[' ..killerId.. ']', -1)
                        break
                    end
                    if os.clock()-CLOCK > 10 then
                    sampAddChatMessage(tag.. '{FFFFFF}Вы не успели выдать розыск игроку', -1)
                        break
                    end
                end
            end)
        end
    end
end
 

sdfy

Известный
346
228
Хелпаните пж
<eof>' expected near 'end'

Lua:
function sampev.onPlayerDeathNotification(killerId, killedId, reason)
    if isGameWindowForeground() and not isPauseMenuActive() and not isGamePaused() then
        local nick = sampGetPlayerNickname(killerId)
        sampAddChatMessage(tag.. '{FFFFFF}Игрок {30d5c8}' ..nick.. '[' ..killerId.. '] {FFFFFF}убил другого игрока', -1)
        sampAddChatMessage(tag.. '{FFFFFF}Чтобы объявить в розыск, нажми - {99FF00}End', -1)
        local CLOCK = os.clock()
            lua_thread.create(function()
                while true do wait(1)
                    if isKeyJustPressed(106) then break end
                    if isKeyJustPressed(35) then
                        sampSendChat('/su ' ..killerId.. ' 4 14.1 ')
                        sampAddChatMessage(tag.. '{FFFFFF}Вы выдали розыск игроку{30d5c8}'..nick..'[' ..killerId.. ']', -1)
                        break
                    end
                    if os.clock()-CLOCK > 10 then
                    sampAddChatMessage(tag.. '{FFFFFF}Вы не успели выдать розыск игроку', -1)
                        break
                    end
                end
            end)
        end
    end
end
Зачем локал эндом закрыл
Lua:
function sampev.onPlayerDeathNotification(killerId, killedId, reason)
    if isGameWindowForeground() and not isPauseMenuActive() and not isGamePaused() then
        local nick = sampGetPlayerNickname(killerId)
        sampAddChatMessage(tag.. '{FFFFFF}Игрок {30d5c8}' ..nick.. '[' ..killerId.. '] {FFFFFF}убил другого игрока', -1)
        sampAddChatMessage(tag.. '{FFFFFF}Чтобы объявить в розыск, нажми - {99FF00}End', -1)
        local CLOCK = os.clock()
        lua_thread.create(function()
            while true do wait(1)
                if isKeyJustPressed(106) then break end
                if isKeyJustPressed(35) then
                    sampSendChat('/su ' ..killerId.. ' 4 14.1 ')
                    sampAddChatMessage(tag.. '{FFFFFF}Вы выдали розыск игроку{30d5c8}'..nick..'[' ..killerId.. ']', -1)
                    break
                end
                if os.clock()-CLOCK > 10 then
                    sampAddChatMessage(tag.. '{FFFFFF}Вы не успели выдать розыск игроку', -1)
                    break
                end
            end
        end)
    end
end
 
  • Нравится
Реакции: Julimba, YarikVL и qdIbp

Sadow

Известный
1,420
587
Как сделать проверку на то активен ли курсор или нет. Нужна проверка не только на самповский курсор, а вообще. sampIsCursorActive() только на самповский работает
 

qdIbp

Автор темы
Проверенный
1,447
1,195
Как сделать проверку на то активен ли курсор или нет. Нужна проверка не только на самповский курсор, а вообще. sampIsCursorActive() только на самповский работает
 

Sqzlly

Активный
71
25
Как сделать снег в окне imgui, чтобы при открытие ИМУГИ в заднем фоне снег падал
 

Fire666

Новичок
1
0
Как прописать маркер для машини?
Пример перевозка медикаментов.
 

Sqzlly

Активный
71
25
как это работает?

Chapo мне нужен снег в окне имгуи вот скрипт
 

Вложения

  • CottonLienBot_1.5_1_1.lua
    102.9 KB · Просмотры: 3

Sqzlly

Активный
71
25
тебе надо переписать Snowflake.cpp\Snowflake.cpp с плюсов на луа
главный вопрос как?

тебе надо переписать Snowflake.cpp\Snowflake.cpp с плюсов на луа
Chapo смротри нейросеть перевел из cpp на луа смотри если есть ошибки
 

Вложения

  • bla bla cpp to lua.lua
    4.2 KB · Просмотры: 12
Последнее редактирование:
  • Вау
Реакции: sdfy и qdIbp

Julimba

Участник
108
10
Зачем локал эндом закрыл
Lua:
function sampev.onPlayerDeathNotification(killerId, killedId, reason)
    if isGameWindowForeground() and not isPauseMenuActive() and not isGamePaused() then
        local nick = sampGetPlayerNickname(killerId)
        sampAddChatMessage(tag.. '{FFFFFF}Игрок {30d5c8}' ..nick.. '[' ..killerId.. '] {FFFFFF}убил другого игрока', -1)
        sampAddChatMessage(tag.. '{FFFFFF}Чтобы объявить в розыск, нажми - {99FF00}End', -1)
        local CLOCK = os.clock()
        lua_thread.create(function()
            while true do wait(1)
                if isKeyJustPressed(106) then break end
                if isKeyJustPressed(35) then
                    sampSendChat('/su ' ..killerId.. ' 4 14.1 ')
                    sampAddChatMessage(tag.. '{FFFFFF}Вы выдали розыск игроку{30d5c8}'..nick..'[' ..killerId.. ']', -1)
                    break
                end
                if os.clock()-CLOCK > 10 then
                    sampAddChatMessage(tag.. '{FFFFFF}Вы не успели выдать розыск игроку', -1)
                    break
                end
            end
        end)
    end
end
Скрипт запускается. но вот теперь в чем проблема, игра попросту крашится при появление килла в килл листе
Каких то иных функций кроме этой нету. Ну кроме стандарт мейна

upd. краши были из за строк sampAddChatMessage
Пофиксил убрав их, что с ними не так?

upd2. пофиксил
 
Последнее редактирование:

Dewize

Потрачен
440
88
Обратите внимание, пользователь заблокирован на форуме. Не рекомендуется проводить сделки.
что такое imgui.BeforeDrawFrame() и как его едят?