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

getsdfssdfsdfs

Участник
45
0
Чекаешь сообщения чата и потом sampSendChat('/ban '..ид.." "..время.." "..причина), где ид, время, причина - переменные с данными значениями.
А как сделать чтоб открывалось имгуи окно с клавишами "Ответить"(дать бан) "Пропустить"(ну тут уже логично)
 

FBenz

Активный
328
40
А как сделать чтоб открывалось имгуи окно с клавишами "Ответить"(дать бан) "Пропустить"(ну тут уже логично)
Функции имгуи в помощь. Всю программу за тебя никто писать не будет.
Грубо говоря, надо при условии открыть окно имгуи и там вывести текст + пара кнопок.
Тебе бы с азов начать сначала.
 

Leatington

Известный
258
71
А как сделать чтоб открывалось имгуи окно с клавишами "Ответить"(дать бан) "Пропустить"(ну тут уже логично)
Lua:
imgui.Begin('Ban', ban.v )
    if imgui.Button(u8'Забанить') then
        --Code
    end
    if imgui.Button(u8'Пропустить') then
        ban.v = false
    end
imgui.End()
ban.v - переменная с самим окном
 
  • Нравится
Реакции: getsdfssdfsdfs

Di3

Участник
432
20
[10:17:31.909014] (error) Script: opcode '0BCA' call caused an unhandled exception
stack traceback:
[C]: in function 'sampSendClickTextdraw'
D:\GTA San Andreas\moonloader\test.lua:2352: in function <D:\GTA San Andreas\moonloader\test.lua:2346>

С чем связано? Ошибка только у некоторых. У многих все норм нажимается.
 

Ke4yp

Новичок
34
0
Можно ли в кфг файле не задавать ключей, а сделать как в массиве - по нумерованным ключам. Проще говоря, я хочу сделать кфг файлс базой слов(но я хочу чтобы каждый элемент этого кфг(списка) тупо переносом строки определялся, а не ключом). Ещё - Как можно получить размер(длину, кол-во элементов) этого кфг списка?
 

atizoff

приобретаю кашель за деньги
Проверенный
1,295
1,178
-- wait() лучше лучше юзать внутри lua_thread.create() чтобы не стопить весь скрипт, если тебе это нужно. -- При надобности слово local в регистрации переменной убираешь, то бишь будет глобальная переменная. -- Естественно, что это самый простой вариант, показывающий как это вообще работает. -- При надобности добавляешь проверки/сохранение в ini файл.
на будущее
Lua:
--[
--]
 

DeMoN3D

Известный
366
76
Lua:
function activatecmd()
    if active == 0 then
       active = 1
       sampAddChatMessage("{8B0000}[Bot-AVL]: {FFFFFF}Вы изменили статус скрипта на {8B0000}[Включен]{FFFFFF}.", 0xFFFFFFFF)
    else
       active = 0
       sampAddChatMessage("{8B0000}[Bot-AVL]: {FFFFFF}Вы изменили статус скрипта на {00FF00}[Выключен]{FFFFFF}.", 0xFFFFFFFF)
    end
end

Не получается у меня сделать команду по нику, распиши пожалуйста что к чему, вот эти result, myId = sampGetPlayerIdByCharHandle(playerPed)
и тд тп, куда их вставлять и команду если не сложно настрой.. а то чёт не доганяю, или попросту не выходит реализовать
если всё ещё не помогли, напиши мне в вк https://vk.com/id511553047



на будущее
Lua:
--[
--]
Lua:
--[[
qwe
]]
 
  • Нравится
Реакции: atizoff

Leatington

Известный
258
71
[10:17:31.909014] (error) Script: opcode '0BCA' call caused an unhandled exception
stack traceback:
[C]: in function 'sampSendClickTextdraw'
D:\GTA San Andreas\moonloader\test.lua:2352: in function <D:\GTA San Andreas\moonloader\test.lua:2346>

С чем связано? Ошибка только у некоторых. У многих все норм нажимается.
Код дай
 

Kuharz

Известный
407
154
Screenshot_285.png

Ответьте кто-нибудь, можно ли вообще сделать нажатие кнопки >> со скриншота? Если да, то как?
 

DeMoN3D

Известный
366
76
Посмотреть вложение 29770
Ответьте кто-нибудь, можно ли вообще сделать нажатие кнопки >> со скриншота? Если да, то как?
не знаю даже что это, кнопки как на диалоге, поэтому раз никто тебе не отвечает, то хотя бы проверь является ли это каким-нибудь заурядным диалогом(через событие onShowDialog) , мало ли повезёт и эти на эти кнопки можно будет нажать как на обычный диалог
 

Kuharz

Известный
407
154
не знаю даже что это, кнопки как на диалоге, поэтому раз никто тебе не отвечает, то хотя бы проверь является ли это каким-нибудь заурядным диалогом(через событие onShowDialog) , мало ли повезёт и эти на эти кнопки можно будет нажать как на обычный диалог
Я сделал скрипт себе один, когда персонаж на окне вводе пароля и мне нужно скриптом релогнуться, остается диалог ввода пароля. Я сделал сперва дисконнект (чтобы закрыть диалог, т.к. на эвольве есть либо "войти", либо "сбросить"), потом закрытие диалога. После этого скрипт релогается, но окно ввода пароля уже не появляется, т.к. обязательно нужно кнопку >> нажать. Но она не является кнопкой диалога и текстдравом :c Думал есть какие-то способы.