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

AnWu

Guardian of Order
Всефорумный модератор
4,683
5,128
Как можно прочитать USERDATA.dat?
 

Mc.Reptar

Известный
33
3
Помогите, пожалуйста. Вот текст: >> ПМ от Nickname_Lubou(94): text

Lua:
local hook = require 'lib.samp.events'
require 'lib.moonloader'

function main()
    if not isSampfuncsLoaded() or not isSampLoaded() then return end
    while not isSampAvailable() do wait(100) end
    sampAddChatMessage("{0090c7}Скрипт успешно загружен.", 0xFFFFFF) 
    wait(10)
end

function hook.onServerMessage(color,text)
                if string.find(text, ">> ПМ от") then
                question1 = string.match(text, ">> ПМ от (%S+)%(")
                sampSendChat("/pm "..question1.." да")
                end
            end
 

BND / PLP

Новичок
84
4
как диалог сделать на команду и его переход на другой диалог когда нажимаешь на вторую кнопку?


UPD: с командой я уже разобрался, осталось только переход на кнопку реализовать
 
Последнее редактирование:

RoffDaniel

Известный
77
20
Ребят, какая причина может быть варна?
Код:
(warn) Memory test "Win32API: ExitProcess" at address 73A13BC0 has failed. Value is 'E9 CB C2 B5 93', expected 'E9 9B 9C 33 F7'.
Заранее, спасибо!
 

Qsany

Потрачен
464
147
Обратите внимание, пользователь заблокирован на форуме. Не рекомендуется проводить сделки.
Обычный рендер текста, рендер хп, а патроны через IEV

-----------

Никто не знает, как XFuscator'ом пользоваться? На забугорном форуме нашел, но чет не работает.
имею ввиду шрифт, понятно что черз IEW но бабки, хп худ, патро имею такой жирный шрифт
как такой тупо который будет всегда на экране отображаться через renderFontDrawText или чета подобное (если есть я прст хз :D)
 

Cutler18

Известный
160
2
Lua:
if message:find("обнаружил перелом {FF6600}| Неудачно") then
Тут можно как то сделать проверку на свой ник
Что бы сработал когда перед этим текстом мой ник а не чей то другой
А то бывает троллят, пишут это сообщение в чат и скрипт начинает работать
 

BND / PLP

Новичок
84
4
Код:
cc_first =
[[a
b
c
d
e
f
]]
function main()
  if not isSampfuncsLoaded() or not isSampLoaded() then return end
  while not isSampAvailable() do wait(100) end
 
  sampRegisterChatCommand('cc', cc)
end

function cc()
    sampShowDialog(1, 'cc', 'Страница 1\nСтраница 2\nСтраница 3\0 ', 'Выбрать', 'Закрыть', 2)
end
local result, button, list, input = sampHasDialogRespond(1)
if result and button == 1 then
   if list == 1 then
      sampShowDialog(2, 'Страница 1', cc_first, 'Закрыть','', 0)
   end
end
почему при нажатии на страницу 1 не переходит на нее?
 

AnWu

Guardian of Order
Всефорумный модератор
4,683
5,128
Есть у меня две строки.
Lua:
string1 = 'SMS: типо сообщение | Отправитель: Aleksandr_Rostov[т.3000]'
string2 = 'Входящий звонок | Номер: 3000 | Вызывает Aleksandr_Rostov'
Так вот, я хочу получить из этих строк номер игрока, но я хз как сделать. Знаю что можно с помощью string.math и регулярных выражений, но я в них не шарю.
p.s nick, номер и сообщение игрока - всегда меняются
Lua:
num1 = string.match(string1, "%[т%.(%d+)%]")
num2 = string.match(string2, "Номер%: (%d+)")
 

штейн

Известный
Проверенный
1,001
687
помогите плс
Lua:
function setserver(param) -- установка сервера IP
  local data = LIP.load('moonloader\\config\\secret.ini')
  local str = string.match(param, '%s*(.+)')
    if str ~= nil then
        data.AL.SERVER = str
        ip = data.AL.SERVER
        local ip = data.AL.SERVER:gsub(':7777', '')
        sampAddChatMessage("[ {808080}GAuth {ffffff}]: IP сервера был успешно изменён на {808080}"..ip, 0xFFFFFF)
        LIP.save('moonloader\\config\\secret.ini', data);
    else sampAddChatMessage("[ {808080}GAuth {ffffff}]: Изменить IP сервера - [ {808080}/setserver {ffffff}].", -1)
    end
end
нужно сделать так, чтобы в конфиг IP сервера записывался тоже без :7777, а выписывается он без :7777 только в чат, не догоняю как сделать чтобы без :7777 выписывалось в конфиг.
 

штейн

Известный
Проверенный
1,001
687
Lua:
function main()
    if not isSampfuncsLoaded() or not isSampLoaded() then return end
    while not isSampAvailable() do wait(0) end
    while sampGetCurrentServerAddress() == nil do wait(0) end
    local server = serversPP[sampGetCurrentServerAddress()]
    data = LIP.load('moonloader/config/secret.ini')
  ip = data.AL.SERVER
    if server == nil then
    if boolmsg and ip == not data.AL.SERVER then sampAddChatMessage("{ffffff}Скрипт {808080}GAuth {ffffff}не загружен. {ffffff}Подключённый сервер не является {808080}Pears Project.", 0xC1C1C1) end
  thisScript():unload()
else if ip == '176.32.37.62' or '176.32.39.34' or '176.32.37.63' and data.AL.SERVER == ip then
    sampAddChatMessage("{ffffff}[{808080} GAuth {ffffff}]: Скрипт {808080}GAuth {ffffff}успешно загружен. Вы играете на "..server, 0xC1C1C1) end end

мне нужно сделать так, чтобы он не запускался на серверах которые не указаны в конфиге вообще
 

imring

Ride the Lightning
Всефорумный модератор
2,353
2,512
Lua:
function main()
    if not isSampfuncsLoaded() or not isSampLoaded() then return end
    while not isSampAvailable() do wait(0) end
    while sampGetCurrentServerAddress() == nil do wait(0) end
    local server = serversPP[sampGetCurrentServerAddress()]
    data = LIP.load('moonloader/config/secret.ini')
  ip = data.AL.SERVER
    if server == nil then
    if boolmsg and ip == not data.AL.SERVER then sampAddChatMessage("{ffffff}Скрипт {808080}GAuth {ffffff}не загружен. {ffffff}Подключённый сервер не является {808080}Pears Project.", 0xC1C1C1) end
  thisScript():unload()
else if ip == '176.32.37.62' or '176.32.39.34' or '176.32.37.63' and data.AL.SERVER == ip then
    sampAddChatMessage("{ffffff}[{808080} GAuth {ffffff}]: Скрипт {808080}GAuth {ffffff}успешно загружен. Вы играете на "..server, 0xC1C1C1) end end

мне нужно сделать так, чтобы он не запускался на серверах которые не указаны в конфиге вообще
Lua:
servers = {
    ['176.32.37.62'] = '1',
    ['176.32.39.34'] = '2',
    ['176.32.37.63'] = '3'
}

function main()
    while not isSampAvailable() and not sampGetCurrentServerAddress() do wait(0) end
    local server = servers[sampGetCurrentServerAddress()]
    if server then sampAddChatMessage('{ffffff}[{808080} GAuth {ffffff}]: Скрипт {808080}GAuth {ffffff}успешно загружен. Вы играете на '..server, 0xC1C1C1)
    else
        sampAddChatMessage('{ffffff}Скрипт {808080}GAuth {ffffff}не загружен. {ffffff}Подключённый сервер не является {808080}Pears Project.', 0xC1C1C1)
        thisScript():unload()
    end
    -- code
end
 
  • Нравится
Реакции: штейн