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

Double Tap Inside

Известный
Проверенный
1,916
1,255
Ситуация такая: я чекаю шо игрок завспавнился таким способом - если его LVL не ноль, то мы заспавнены.
Проблема: При реконекте ТАБ не обновляется, и остается мой старый айдишник. И он теперь sampGetPlayerScore() меня обманывает.

Предполагаемые способы решения:
1. Очищать ТАБ (лвл) игрока если не подключен к серверу. Как это сделать?
2. Перехватить RPC когда сервер выдает мне LVL, и какой LVL. Как это сделать?

3. Найти другое решение, как 100 процентов чекнуть, шо игрок заспавнился. Какое?
isPlayerPlaying() не то.
isPlayerSpawned() не подходит, так как меня могут заспавнить уже на диалоге логина
Какой-то уникальный пакет или rpc при спавне после логина - мною не найден.

--

Пожалуйста, подскажите как в if сделать так чтобы, если в чате есть сообщение к примеру "[Информация] {FFFFFF}Вы вылечили Leroy_Sabo за $1000." и т.д то chatstring определял это без ника и позволял выполнится IF'у.
Пытался с %s что то проделать но хз как.


Lua:
local chatstring = sampGetChatString(99)
            if chatstring == "[Информация] {FFFFFF}Вы вылечили Leroy_Sabo за $1000." then
                sampSendChat("/time")
                wait(10)
                setVirtualKeyDown(119, true)
                wait(500)
                setVirtualKeyDown(119, false)
                screen = 0
            end
Lua:
local chatstring = sampGetChatString(99)
            if chatstring:match("%[Информация%] {FFFFFF}Вы вылечили .- за %$1000%.") then
                sampSendChat("/time")
                wait(10)
                setVirtualKeyDown(119, true)
                wait(500)
                setVirtualKeyDown(119, false)
                screen = 0
            end
--

Какой код для того чтобы воспроизвести mp3 файл, который находится в moonloader?

--

Что не так? Почему он не жмет на диалог? Пс, евольв рп.

Lua:
local sampev = require('lib.samp.events')

function sampev.onShowDialog(dialogId, style, title, button1, button2, text)
    if title:find('Лифт | Beach House ; Парковка | Beach House', 1, true) then
        lua_thread.create(function()
            setVirtualKeyDown(vkeys.VK_RETURN, true)
            wait(100)
            setVirtualKeyDown(vkeys.VK_RETURN, false)
            wait(10)
            setVirtualKeyDown(vkeys.VK_RETURN, true)
            wait(100)
            setVirtualKeyDown(vkeys.VK_RETURN, false)
            wait(10)
        end)
    end
end

Так на какую строчку надо нажать? + (скрины еще раз приложи)
 
Последнее редактирование:
  • Нравится
Реакции: Firus20016

paulohardy

вы еще постите говно? тогда я иду к вам
Всефорумный модератор
1,907
1,283
1. Очищать ТАБ (лвл) игрока если не подключен к серверу. Как это сделать?
в бесконечном потоке чекать gamestate, если он не равен нужному значению то эмулировать 155 RPC и устанавливать себе 0 лвл
2. Перехватить RPC когда сервер выдает мне LVL, и какой LVL. Как это сделать?
onReceiveRpc и снова 155 RPC
 

Double Tap Inside

Известный
Проверенный
1,916
1,255
в бесконечном потоке чекать gamestate, если он не равен нужному значению то эмулировать 155 RPC и устанавливать себе 0 лвл
Тут такое дело, когда GameState равен CONNECTED, то в табе еще висят старые айдишники, лвл, и пинг. Они обновляются через секунду где-то. По этому я gamestate для чека ЛВЛ не могу использовать.

Я вроде его проверял, он шлет РПЦ только с открытым табом. Я ошибаюсь?
эмулировать 155 RPC и устанавливать себе 0 лвл
А что значит эмулировать? (кодом)
 
Последнее редактирование:

paulohardy

вы еще постите говно? тогда я иду к вам
Всефорумный модератор
1,907
1,283
Я вроде его проверял, он шлет РПЦ только с открытым табом. Я ошибаюсь?
Не знаю, возможно таб обновляется только когда ты его открываешь.
Тут такое дело, когда GameState равен CONNECTED, то в табе еще висят старые айдишники, лвл, и пинг. Они обновляются через секунду где-то. По этому я gamestate для чека ЛВЛ не могу использовать.
Можно попробовать записывать последний пинг и при коннекте ждать нового RPC, если пинг не равен записанному ранее, то активировать что нужно
А что значит эмулировать? (кодом)
Lua:
--153 RPC Parameters: UINT32 dPlayerID, UINT32 dSkinID
function set_player_skin(id, skin)
local BS = raknetNewBitStream()
raknetBitStreamWriteInt32(BS, id)
raknetBitStreamWriteInt32(BS, skin)
raknetEmulRpcReceiveBitStream(153, BS)
raknetDeleteBitStream(BS)
end
 
  • Влюблен
Реакции: Double Tap Inside

Double Tap Inside

Известный
Проверенный
1,916
1,255
Не знаю, возможно таб обновляется только когда ты его открываешь.

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

Lua:
--153 RPC Parameters: UINT32 dPlayerID, UINT32 dSkinID
function set_player_skin(id, skin)
local BS = raknetNewBitStream()
raknetBitStreamWriteInt32(BS, id)
raknetBitStreamWriteInt32(BS, skin)
raknetEmulRpcReceiveBitStream(153, BS)
raknetDeleteBitStream(BS)
end


Моя ты радость, это помогло ❤
Lua:
RPC_UPDATESCORESPINGSIPS = 155

--155 RPC Parameters: UINT16 wPlayerID, INT32 score, UINT32 ping
function clear_player_scoreping(id)

    local BS = raknetNewBitStream()
    raknetBitStreamWriteInt32(BS, id)
    raknetBitStreamWriteInt32(BS, 0)
    raknetBitStreamWriteInt32(BS, 0)
   
    raknetEmulRpcReceiveBitStream(RPC_UPDATESCORESPINGSIPS, BS)  
    raknetDeleteBitStream(BS)
end
 
  • Нравится
Реакции: paulohardy

Thief

Участник
108
12
есть ли какие-то другие библиотеки, типа имгуи? уровня менюшек читов кс го, типа фаталити, скита и т. д.
 

Derre

Новичок
1
0
Хелп ми, занимаюсь луа один день. Попробовал написать скрипт, к сожалению даже очень простой не получился. Кто поможет найти ошибку?
Долго искал, так и не нашёл.
Буду очень благодарен.



Lua:
function main()
if not isSampLoaded() or not isSampfuncsLoaded () then return end
while not isSampAvailable() do wait(100) end

wait (12000)
SampAddChatMessage('Вы зашли в игру!', -1)

SampRegisterChatCommand('test', function()
SampAddChatMessage('1', -1)
SampSendChat('2')
print('NICE')
end)

SampRegisterChatCommand('test2', cmd_test2)
SampRegisterChatCommand('test3', cmd_test3)

wait( -1)
end

function cmd_test2()
SampAddChatMessage('231231245145125', -1)
end

function cmd_test3(arg)
if arg == 0 then SampAddChatMessage('{FF3000}Ошибка**', -1) return end
SampSendChat(arg)
end
 

atomlin

Известный
587
446
У меня есть скрипт, где нужно юзать ТП так вот

ТП у меня есть и я вызываю его команду через sampSendChat('/tpc').. Но как я запускаю скрипт всё вроде идёт нормально но как дело доходит до ТП в чат пишет что данной команды не существует.. (хотя сам ТП работает) как же вызывать команды скриптов?
 

Sargon

Известный
Проверенный
172
418
У меня есть скрипт, где нужно юзать ТП так вот

ТП у меня есть и я вызываю его команду через sampSendChat('/tpc').. Но как я запускаю скрипт всё вроде идёт нормально но как дело доходит до ТП в чат пишет что данной команды не существует.. (хотя сам ТП работает) как же вызывать команды скриптов?
Lua:
sampProcessChatInput("/tpc")
 
  • Нравится
Реакции: atomlin

wintreist

Активный
308
71
sampGet3dTextInfoById(id) возвращает в одном из параметров ignoreWalls виден ли через стены. Как бы мне изменить этот параметер, чтобы видеть текст через стены?
 

Firus20016

Участник
148
15
Как в диалоге найти номер строчки, в которой название "{B0E73A}Вперед >>>"?
47122

Lua:
function sampev.onShowDialog(dialogId, style, title, button1, button2, text)

    local index = 0

    for line in text:gmatch("[^\n]*\n?") do -- line будет включать также "\n" вконце строки
        if title:match("123") then
            if line:match("Ищем это") then
                sampSendDialogResponse(dialogid, 1, index , -1)
                break
            end
            index = index+1
        end

    end
end
Не совсем понял, что тут под "123" подразумевается.
 
Последнее редактирование:

atomlin

Известный
587
446
Как можно засунуть персонажа в машину? (если он стоит рядом с ней, но нету возможности эмулировать F)