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

ufdhbi

Известный
Проверенный
1,456
861
  • как сделать


  • чтоб нажал на кнопку


  • отправилось сообщение


  • еще раз нажал на нее


  • отправилось другое


  • и так до 10 сообщений?
 

DarkP1xel

Сила воли наше всё.
BH Team
3,635
4,953
  • как сделать


  • чтоб нажал на кнопку


  • отправилось сообщение


  • еще раз нажал на нее


  • отправилось другое


  • и так до 10 сообщений?
Lua:
function main()
{
    if not isSampLoaded() then return end
    while not isSampAvailable() do wait(0) end

    while true do
        wait(0)   
        if isKeyJustPressed(0x30) [[ Клавиша: 0 ]]
        then sampSendChat("Текст: 1")
        end
       
        if isKeyJustPressed(0x31) [[ Клавиша: 1 ]]
        then sampSendChat("Текст: 2")
        end
       
        if isKeyJustPressed(0x32) [[ Клавиша: 2 ]]
        then sampSendChat("Текст: 4")
        end
       
        if isKeyJustPressed(0x33) [[ Клавиша: 3 ]]
        then sampSendChat("Текст: 5")
        end
       
        if isKeyJustPressed(0x34) [[ Клавиша: 4 ]]
        then sampSendChat("Текст: 6")
        end
       
        if isKeyJustPressed(0x35) [[ Клавиша: 5 ]]
        then sampSendChat("Текст: 7")
        end
       
        if isKeyJustPressed(0x36) [[ Клавиша: 6 ]]
        then sampSendChat("Текст: 8")
        end
       
        if isKeyJustPressed(0x37) [[ Клавиша: 7 ]]
        then sampSendChat("Текст: 9")
        end
       
        if isKeyJustPressed(0x38) [[ Клавиша: 8 ]]
        then sampSendChat("Текст: 10")
        end
       
        if isKeyJustPressed(0x39) [[ Клавиша: 9 ]]
        then sampSendChat("Текст: 11")
        end       
    end
}
 

ufdhbi

Известный
Проверенный
1,456
861
Lua:
function main()
{
    if not isSampLoaded() then return end
    while not isSampAvailable() do wait(0) end

    while true do
        wait(0)  
        if isKeyJustPressed(0x30) [[ Клавиша: 0 ]]
        then sampSendChat("Текст: 1")
        end
      
        if isKeyJustPressed(0x31) [[ Клавиша: 1 ]]
        then sampSendChat("Текст: 2")
        end
      
        if isKeyJustPressed(0x32) [[ Клавиша: 2 ]]
        then sampSendChat("Текст: 4")
        end
      
        if isKeyJustPressed(0x33) [[ Клавиша: 3 ]]
        then sampSendChat("Текст: 5")
        end
      
        if isKeyJustPressed(0x34) [[ Клавиша: 4 ]]
        then sampSendChat("Текст: 6")
        end
      
        if isKeyJustPressed(0x35) [[ Клавиша: 5 ]]
        then sampSendChat("Текст: 7")
        end
      
        if isKeyJustPressed(0x36) [[ Клавиша: 6 ]]
        then sampSendChat("Текст: 8")
        end
      
        if isKeyJustPressed(0x37) [[ Клавиша: 7 ]]
        then sampSendChat("Текст: 9")
        end
      
        if isKeyJustPressed(0x38) [[ Клавиша: 8 ]]
        then sampSendChat("Текст: 10")
        end
      
        if isKeyJustPressed(0x39) [[ Клавиша: 9 ]]
        then sampSendChat("Текст: 11")
        end      
    end
}
Мне нужно эти 10 текстов отправить не с 10 кнопок а с 1, 10 раз нажав)
 

Dark_Knight

Me, me and me.
Друг
4,056
2,074
Вот теперь пример с векторами с плюсов. В луа, кажется, это называются таблицы.
Код:
std::vector <std::string> vec = {"A0", "A1", "A2", "A3", "A4", "A5", "A6", "A7", "A8" };
int i = 0, size = vec.size() //Автоматическое получение размера вектора. В луа, кажется, это таблицы.

void sendZalypa(){
    if(IsKeyJustPressed(VK_NUMPAD1){
        sampSendChat(vec[i].c_str());
        i >= size ? i = 0 : i = i + 1;
       
    }
}
 

ufdhbi

Известный
Проверенный
1,456
861
Как получить ники всех игроков в зоне стрима?
 

Garrus

Известный
159
20
Ребзя, хелпуйте. Использую для шифрования данных библиотеку "aeslua" (https://github.com/bighil/aeslua/). По стандарту, шифрует по методу AES-128-CBC. В игре все нормально шифрует-расшифровывает. Проблема возникла при попытке расшифровать хэш на веб-сайте. Посылаю обычным get-запросом хэш, закодированный в base64, пробую расшифровать с помощью стандартной функции openssl_decrypt, но что-то никак не выходит - в результате либо вообще не расшифровывает, либо в результате выходит какой-то бред. В чем трабла?
Lua:
Lua:
require "aeslua"

hash = aeslua.encrypt("123456", "lolkek")
hash_in_base64 = enc(hash) // строка с конечным хэшем
print(hash_in_base64)

function enc(data)
    return ((data:gsub('.', function(x)
        local r,b='',x:byte()
        for i=8,1,-1 do r=r..(b%2^i-b%2^(i-1)>0 and '1' or '0') end
        return r;
    end)..'0000'):gsub('%d%d%d?%d?%d?%d?', function(x)
        if (#x < 6) then return '' end
        local c=0
        for i=1,6 do c=c+(x:sub(i,i)=='1' and 2^(6-i) or 0) end
        return b:sub(c+1,c+1)
    end)..({ '', '==', '=' })[#data%3+1])
end
PHP код:

PHP:
$string = openssl_decrypt ($_GET['hash_in_base64'], "AES-128-CBC", "123456");
echo $string;
 

applethecandy

Now it's PHP time
Проверенный
253
328
Допустим, на карте есть объект, и его хэндл 14568. Чтобы взять его координаты - есть функция getObjectCoordinates(14568). Но у объектов помимо X, Y, Z есть еще поворот по этим же трем осям. Вопрос: как этот поворот считать у объекта?
 

FYP

Известный
Автор темы
Администратор
1,757
5,684
Как создать диалог style 1 с ОДНОЙ кнопкой?
задать пустую строку в качестве текста второй кнопки
Ребзя, хелпуйте. Использую для шифрования данных библиотеку "aeslua" (https://github.com/bighil/aeslua/). По стандарту, шифрует по методу AES-128-CBC. В игре все нормально шифрует-расшифровывает. Проблема возникла при попытке расшифровать хэш на веб-сайте. Посылаю обычным get-запросом хэш, закодированный в base64, пробую расшифровать с помощью стандартной функции openssl_decrypt, но что-то никак не выходит - в результате либо вообще не расшифровывает, либо в результате выходит какой-то бред. В чем трабла?
Lua:
Lua:
require "aeslua"

hash = aeslua.encrypt("123456", "lolkek")
hash_in_base64 = enc(hash) // строка с конечным хэшем
print(hash_in_base64)

function enc(data)
    return ((data:gsub('.', function(x)
        local r,b='',x:byte()
        for i=8,1,-1 do r=r..(b%2^i-b%2^(i-1)>0 and '1' or '0') end
        return r;
    end)..'0000'):gsub('%d%d%d?%d?%d?%d?', function(x)
        if (#x < 6) then return '' end
        local c=0
        for i=1,6 do c=c+(x:sub(i,i)=='1' and 2^(6-i) or 0) end
        return b:sub(c+1,c+1)
    end)..({ '', '==', '=' })[#data%3+1])
end
PHP код:

PHP:
$string = openssl_decrypt ($_GET['hash_in_base64'], "AES-128-CBC", "123456");
echo $string;
если проблема не в кодировке и не в функции enc, то скорее всего проблема в самой либе
Допустим, на карте есть объект, и его хэндл 14568. Чтобы взять его координаты - есть функция getObjectCoordinates(14568). Но у объектов помимо X, Y, Z есть еще поворот по этим же трем осям. Вопрос: как этот поворот считать у объекта?
есть функция float x, float y, float z, float w = getObjectQuaternion(Object object), возвращает вращение объекта в кватернионе. если нужно перевести в углы эйлера, думаю, будет не сложно найти готовую функцию для этого в сети
 

ufdhbi

Известный
Проверенный
1,456
861
задать пустую строку в качестве текста второй кнопки

если проблема не в кодировке и не в функции enc, то скорее всего проблема в самой либе

есть функция float x, float y, float z, float w = getObjectQuaternion(Object object), возвращает вращение объекта в кватернионе. если нужно перевести в углы эйлера, думаю, будет не сложно найти готовую функцию для этого в сети
Будет 2 кнопки, одна без текста...
 

applethecandy

Now it's PHP time
Проверенный
253
328