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

mld

Участник
99
11
Как сделать условие на активность диалогового меню?
Разверну свой вопрос
У меня есть ид диалога,мне нужно поставить условие:
Если этот диалог == актив,то newsredak.v = false
 

kingleonides

Участник
43
28
зачем нужен string.format(x:%s, posX)?
Какая функция записывает передвижение игрока? я помню в каком-то боту можно было самому записывать маршруты?
Я про такую функцию не знаю, насколько мне известно все делается это в определенном цикле с разными временными задержками, например каждые 200МС, твои координаты записываются в массив/таблицу.

string.format форматирует строку по шаблону с заданными аргументами

Код:
local sv1 = "12345"
local sv2 = "test"
local sv3 = "fest31"

local formattedString = string.format("formString = %s %s blablabla %s", sv3, sv1, sv2)

На выходе будет строка = "formString = fest31 12345 blablabla test"
Как сделать условие на активность диалогового меню?
Разверну свой вопрос
У меня есть ид диалога,мне нужно поставить условие:
Если этот диалог == актив,то newsredak.v = false
Если ты пишешь бота для объявлений, это утопия, я лично забил после того как мне прилетело что-то вроде "сельну инфернуЗ за 10кк", или например "продам блэк ричи, 5 лямов", такую семантику распарсить ну тупо не реально как по мне.
Еще после того как ты будешь на протяжении нескольких часов просто отвечать, какой нибудь всратый админ спросит, а тут ли ты, и не дай боже тебя не будет рядом за компом, и никакие звуковые ворнинги не помогут тебе, или как было у меня это всякого рода сборы в лекционной, я тупо забил на эту затею, денег как по мне на этом не поднять.
Потому что нужно файл читать не в цикле, а вне его


А открыть wiki лень?
Гайдов по имгуи нету, изучать можно по исходникам других скриптов.
Ну файл то вроде он правильно считывает, даже по доке файл считывается циклом, дело в том что он устанавливает текст каждую итерацию, ему нужно сначала в переменную все считать, и потом с этой переменной уже брать полный текст.
 
Последнее редактирование:

mld

Участник
99
11
Я про такую функцию не знаю, насколько мне известно все делается это в определенном цикле с разными временными задержками, например каждые 200МС, твои координаты записываются в массив/таблицу.

string.format форматирует строку по шаблону с заданными аргументами

Код:
local sv1 = "12345"
local sv2 = "test"
local sv3 = "fest31"

local formattedString = string.format("formString = %s %s blablabla %s", sv3, sv1, sv2)

На выходе будет строка = "formString = fest31 12345 blablabla test"

Если ты пишешь бота для объявлений, это утопия, я лично забил после того как мне прилетело что-то вроде "сельну инфернуЗ за 10кк", или например "продам блэк ричи, 5 лямов", такую семантику распарсить ну тупо не реально как по мне.
Еще после того как ты будешь на протяжении нескольких часов просто отвечать, какой нибудь всратый админ спросит, а тут ли ты, и не дай боже тебя не будет рядом за компом, и никакие звуковые ворнинги не помогут тебе, или как было у меня это всякого рода сборы в лекционной, я тупо забил на эту затею, денег как по мне на этом не поднять.
Я не хочу хукать,что именно там написано в объяве,мне просто словил объяву,а дальше сам парься и тд.
Мне нужно,чтобы при активном диалоге ловля прекратилась
Это я буду тестировать,тип понравится или нет
 

Drinkins

Участник
38
0
Помогите, пожалуйста, как сделать так, чтобы при запуске игры открывался определённый imgui? Т.е. чтобы его нельзя было закрыть или перебить другим. В main if test.v then ... end - не помогает. (Подобное есть в статистике у MVD Helper'a)
 

Eugene Crabs

Активный
544
30
Как узнать если координаты в заданной квадратной зоне? Пока что в функциях и поиске не могу найти
 

Vespan

loneliness
Проверенный
2,105
1,639
Как взять этот звук(из видео ) -
и вставить в плагин?
 

kingleonides

Участник
43
28
Я не хочу хукать,что именно там написано в объяве,мне просто словил объяву,а дальше сам парься и тд.
Мне нужно,чтобы при активном диалоге ловля прекратилась
Это я буду тестировать,тип понравится или нет
А понял тебя, чекать на наличие и открывать обьяву
Без хука не получится, тебе хук нужен чтобы понять, пришло ли соощбение в виде уведомления о объяве.
2 варианта, хук, либо как припадошный чекать окно, тут выбирай, я бы хукал сообщение и делал бы text:find(""). Я собственно так и делал.
Ввиду задержки сервера, очень быстро открыть, просмотреть текст, сохранить не выйдет, только если брать первое попавшееся поэтому.

Lua:
function sampev.onServerMessage(color, text)
    if scriptEnabled then
        if text:find("уведомление об обьявъе") then
           
            if sampIsDialogActive() then
                if sampGetCurrentDialogId() == YouDialogId then
                    newsreadk.v = false
                end
            else
                setVirtualKeyDown(VK_ALT, true)
                wait(0)
                setVirtualKeyDown(VK_ALT, false)
            end
        end
    end
end

либо как припадочному каждый раз открывать диалог

function main()
    while true do
        wait(0)
        if scriptEnabled and newsredak.v then
            if not sampIsDialogActive() then
                setVirtualKeyDown(VK_ALT, true)
                wait(0)
                setVirtualKeyDown(VK_ALT, false)
            else
                  if sampGetCurrentDialogId() == YouDialogId and sampGetListboxItemsCount() > 0 then
                      setVirtualKeyDown(VK_ENTER, true)
                      wait(0)
                      setVirtualKeyDown(VK_ENTER, false)
                      newsredak.v = false
                 else
                      setVirtualKeyDown(VK_ENTER, true)
                      wait(0)
                      setVirtualKeyDown(VK_ENTER, false)
                 end
            end
        end
    end
end

Все писал от руки и по памяти, все равно тебе переписывать придется, но общий принцип должен быть понятен, в первом варианте всё завязано на ивенте
Во втором варианте без ивента, прокликинг в режиме припадка, если срабатывает условие что у нас открылся диалог, мы проверяем айдишник диалога YouDialogId, узнать его можно так, открываешь меню с выбором обьявы, открываешь коносль СФа, пишешь lua print(sampGetCurrentDialogId()), вот этот айдишник - это айдишник твоего окна, т.е YouDialogId. Параллельно с этим проверяем, что кол-во обьяв больше 0, т.е если обьява есть, открываем первую попавшуюся, если их меньше то просто нажимаем энтер, при 0 обьявах окно просто закроется, цикл начнется по новой.
 
Последнее редактирование:
  • Нравится
Реакции: mld

Vespan

loneliness
Проверенный
2,105
1,639
как использовать звук - https://sampwiki.blast.hk/wiki/SoundID в .lua?
 
Последнее редактирование:

kingleonides

Участник
43
28
Последнее редактирование:

Carlos777

Потрачен
227
219
Обратите внимание, пользователь заблокирован на форуме. Не рекомендуется проводить сделки.
не работает ESC, когда активен three_gui.v
function threego(arg)
three_gui.v = not three_gui.v
if imgui.Process then
--not
else
imgui.Process = true
end
end
 

paulohardy

вы еще постите говно? тогда я иду к вам
Всефорумный модератор
1,892
1,256
Что указывать в "NameLength" эмулируя RPC SetPlayerName(11)? "char[] Name" в том же RPC вводить через raknetBitStreamWriteString?
 

Musaigen

abobusnik
Проверенный
1,585
1,309
Что указывать в "NameLength" эмулируя RPC SetPlayerName(11)? "char[] Name" в том же RPC вводить через raknetBitStreamWriteString?
Длина ника, если ты юзаешь RakEmulator нажми ПКМ(или ЛКМ) на (!) возле nameLen, и нажми Get Name Length(или что-такое), он сам тебе подсчитает.