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

Smeruxa

Известный
1,297
682
я сохраняю в файл диолог получается так
nik_nik 0/225
nik_nik 0/131
nik_nik 0/94
nik_nik [{009134}Online{FFFFFF}] 0/11
nik_nik 0/272

как убрать все кроме ников если там все всегда разное
но после ника всегда или пробел или запетая
тоесть надо удалить все после пробела или запетой построчно
научите плиз

сохраняю в файл я вот так

код:
if dialogId == 3114 then
time = os.date("%d.%m.%Y %H:%M:%S")
        FileWrite = io.open(fama,"a")
        FileWrite:write("[" ..time.. "] " ..text.. "\n ======================================================= \n")
        FileWrite:close()
end
Твоя задача проверять каждую строку. ну как пример. мб другие имеют другой способ
Lua:
text = text:gsub("%w+?%w+ (.*)", "")
Вроде так
 
  • Нравится
Реакции: sep

sep

Известный
673
76
Твоя задача проверять каждую строку. ну как пример. мб другие имеют другой способ
Lua:
text = text:gsub("%w+?%w+ (.*)", "")
Вроде так
а куда ее вставить ?
код:
if dialogId == 3114 then
text = text:gsub("%w+?%w+ (.*)", "")
time = os.date("%d.%m.%Y %H:%M:%S")   
        FileWrite = io.open(fama,"a")
        FileWrite:write("[" ..time.. "] " ..text.. "\n ======================================================= \n")
        FileWrite:close()   
end
 

Мира

Участник
455
9
получил цвет строки -1029514497 путём sampAddChatMessage(color, -1), но когда использую его в sampAddChatMessage("текст", -1029514497), то выводится вообще другой текст. с цветом -1347440641 такая же про
Надо ж цвет в hex перевести
Lua:
hexcolor = string.format('%06x', bit.rshift(color, 8))
а как этим воспользоваться? не понимаю
 

elscripts

Участник
61
30
Ребят, я новичок в сфере скриптинга, вопросик возник. Как сделать чтобы тот или иной текст вводился не в чат, как в "sampSendChat", а именно в диалог?
 

sadbones

Известный
375
175
Ребят, я новичок в сфере скриптинга, вопросик возник. Как сделать чтобы тот или иной текст вводился не в чат, как в "sampSendChat", а именно в диалог?
тебе нужно это
примерное использование функции
Lua:
    if dialogid == 99 and style == 1 then
            sampSetCurrentDialogEditboxText('автомобиль')
        end
    end
но лучше используй это
 

elscripts

Участник
61
30
тебе нужно это
примерное использование функции
Lua:
    if dialogid == 99 and style == 1 then
            sampSetCurrentDialogEditboxText('автомобиль')
        end
    end
но лучше используй это
дай бог тебе здоровья)
 
  • Нравится
Реакции: sadbones

elscripts

Участник
61
30
тебе нужно это
примерное использование функции
Lua:
    if dialogid == 99 and style == 1 then
            sampSetCurrentDialogEditboxText('автомобиль')
        end
    end
но лучше используй это
а, тут несостыковочка небольшая, я будучи редактором хочу сделать себе быстрый ввод, например "Цена: Договорная" при нажатии той или иной клавиши, ид диалога редактирования объявлений мне известен "557", но, не особо понимаю как это работает..
 

sadbones

Известный
375
175
а, тут несостыковочка небольшая, я будучи редактором хочу сделать себе быстрый ввод, например "Цена: Договорная" при нажатии той или иной клавиши, ид диалога редактирования объявлений мне известен "557", но, не особо понимаю как это работает..
Имгуи или по кнопке?
 

sadbones

Известный
375
175
попробуй, int keyId поменять надо на VK_key
вполне реально, что это говнокод)
Lua:
function sampev.onShowDialog(id, style, title, button1, button2, text)
    if id == 557 and isKeyDown(int keyId) then
        sampSetCurrentDialogEditboxText('text')
        return false
    end
end
не забудь добавить
Lua:
local sampev = require "lib.samp.events"
 

Corrygаn

Участник
225
6
Никаких ошибок нет, но при нажатии на кнопку тупо ничего не происходит, мб проверку как-то неправильно сделал?
Lua:
if imgui.Button(name1.v, imgui.ImVec2(184, 25)) then
    if otvet1.v == "" then
        sampAddChatMessage("[ATools]{FFFFFF}: Вы не задали значение данной кнопке!", 0xFF0033)
        sampAddChatMessage("[ATools]{FFFFFF}: Откройте репорт заново({FF0033}/ot{FFFFFF}) и введите ответ вручную!", 0xFF0033)
        imgui.Process = false
    else
        sampSendDialogResponse(5, 1, nil, u8:decode(otvet1))
        imgui.Process = false
    end
end
 

elscripts

Участник
61
30
попробуй, int keyId поменять надо на VK_key
вполне реально, что это говнокод)
Lua:
function sampev.onShowDialog(id, style, title, button1, button2, text)
    if id == 557 and isKeyDown(int keyId) then
        sampSetCurrentDialogEditboxText('text')
        return false
    end
end
не забудь добавить
Lua:
local sampev = require "lib.samp.events"
не работет)
 

elscripts

Участник
61
30
потому что нaдо так и все заработает
либо в main(), либо новый поток открывай
Lua:
while true do wait(0)
  if sampIsDialogActive() and sampGetCurrentDialogType() == 557 and isKeyJustPressed(key) then
    sampSetCurrentDialogEditboxText(sampGetCurrentDialogEditboxText()..'text')
  end
end
можно фулл код, я уже запутался)))))