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

штейн

Известный
Проверенный
1,003
688
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

не совсем так, мне нужно чтобы именно из конфига он брал IP
основная задумка такова:
1) Человек указывает командой IP сервера, он сохраняется в конфиге.
2) При входе на сервер, скрипт проверяет на какой IP заходит человек, и если IP совпадает с тем, что указан в конфиге, то скрипт запускается, а если это другой сервер, который не указан в конфиге, то скрипт не запускается.
 

imring

Ride the Lightning
Всефорумный модератор
2,362
2,545
не совсем так, мне нужно чтобы именно из конфига он брал IP
основная задумка такова:
1) Человек указывает командой IP сервера, он сохраняется в конфиге.
2) При входе на сервер, скрипт проверяет на какой IP заходит человек, и если IP совпадает с тем, что указан в конфиге, то скрипт запускается, а если это другой сервер, который не указан в конфиге, то скрипт не запускается.
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()]
    data = LIP.load('moonloader/config/secret.ini')
    ip = data.AL.SERVER
    if not server or server and ip ~= server then
        sampAddChatMessage("{ffffff}Скрипт {808080}GAuth {ffffff}не загружен. {ffffff}Подключённый сервер не является {808080}Pears Project.", 0xC1C1C1) end
        thisScript():unload()
    else sampAddChatMessage("{ffffff}[{808080} GAuth {ffffff}]: Скрипт {808080}GAuth {ffffff}успешно загружен. Вы играете на "..server, 0xC1C1C1) end
end
 
  • Нравится
Реакции: штейн

#Northn

Pears Project — уже запущен!
Всефорумный модератор
2,650
2,535
Ребят, какая причина может быть варна?
Код:
(warn) Memory test "Win32API: ExitProcess" at address 73A13BC0 has failed. Value is 'E9 CB C2 B5 93', expected 'E9 9B 9C 33 F7'.
Заранее, спасибо!
Конфликт каких-то подов.
Как узнать хендл автомобиля, в котором сидит другой игрок за рулём и эта тачка наиближайшая к тебе, чем остальные?
 
Последнее редактирование модератором:

RoffDaniel

Известный
77
20
работает, но иногда выёбывается почему-то
Скажи пожалуйста, почему у меня например работает функция
Lua:
onShowDialog(dialogId, style, title, button1, button2, text)
А у друго-го человека не работает и вылазит варн?
Код:
[23:43:50.675519] (system) Session started.
[23:43:50.676521] (debug) Module handle: 6AD30000

MoonLoader v.026.2-beta loaded.
Developers: FYP, hnnssy, EvgeN 1137

Copyright (c) 2016, BlastHack Team
https://www.blast.hk/moonloader/

[23:43:50.676521] (info) Working directory: E:\Новая папка\moonloader
[23:43:50.676521] (debug) FP Control: 0009001F
[23:43:50.676521] (debug) Game: GTA SA 1.0.0.0 US
[23:43:50.676521] (system) Installing pre-game hooks...
[23:43:50.676521] (system) Hooks installed.
[23:43:50.777417] (warn) Memory test "Win32API: ExitProcess" at address 73A13BC0 has failed. Value is 'E9 CB C2 B5 93', expected 'E9 9B 9C 33 F7'.
[23:43:50.942267] (debug) Initializing opcode handler table
[23:43:50.942267] (debug) package.path = E:\Новая папка\moonloader\lib\?.lua;E:\Новая папка\moonloader\lib\?\init.lua;E:\Новая папка\moonloader\?.lua;E:\Новая папка\moonloader\?\init.lua;.\?.lua;E:\Новая папка\moonloader\lib\?.luac;E:\Новая папка\moonloader\lib\?\init.luac;E:\Новая папка\moonloader\?.luac;E:\Новая папка\moonloader\?\init.luac;.\?.luac
[23:43:50.942267] (debug) package.cpath = E:\Новая папка\moonloader\lib\?.dll;
[23:43:50.942768] (system) Loading script 'E:\Новая папка\moonloader\GOV-Helper (1).luac'...
[23:43:50.942768] (debug) New script: 0DC35B44
[23:43:50.975916] (system) [GOV-Helper]: Loaded successfully.
[23:44:02.205552] (system) Installing post-load hooks...
[23:44:02.206554] (system) Hooks installed.

Заранее, спасибо!
 

imring

Ride the Lightning
Всефорумный модератор
2,362
2,545
Киньте пример пожалуйста как эмулировать приход RPC , буду благодарен.
Lua:
function setPlayerSkin(id, skin)
    local bs = raknetNewBitStream() -- создаём новый BitStream.
    raknetBitStreamWriteInt32(bs, id) -- записуем в BitStream ID игрока.
    raknetBitStreamWriteInt32(bs, skin) -- записуем в BitStream ID скина.
    raknetEmulRpcReceiveBitStream(153 --[[RPC_SCRSETPLAYERSKIN]], bs) -- эмулируем входящий RPC (в данном случае это RPC_SCRSETPLAYERSKIN).
    raknetDeleteBitStream(bs) -- удаляем BitStream.
end
 

RTD

Потужно
Модератор
399
470
  • Нравится
Реакции: #Northn

#Northn

Pears Project — уже запущен!
Всефорумный модератор
2,650
2,535
Скажи пожалуйста, почему у меня например работает функция
Lua:
onShowDialog(dialogId, style, title, button1, button2, text)
А у друго-го человека не работает и вылазит варн?
Код:
[23:43:50.675519] (system) Session started.
[23:43:50.676521] (debug) Module handle: 6AD30000

MoonLoader v.026.2-beta loaded.
Developers: FYP, hnnssy, EvgeN 1137

Copyright (c) 2016, BlastHack Team
https://www.blast.hk/moonloader/

[23:43:50.676521] (info) Working directory: E:\Новая папка\moonloader
[23:43:50.676521] (debug) FP Control: 0009001F
[23:43:50.676521] (debug) Game: GTA SA 1.0.0.0 US
[23:43:50.676521] (system) Installing pre-game hooks...
[23:43:50.676521] (system) Hooks installed.
[23:43:50.777417] (warn) Memory test "Win32API: ExitProcess" at address 73A13BC0 has failed. Value is 'E9 CB C2 B5 93', expected 'E9 9B 9C 33 F7'.
[23:43:50.942267] (debug) Initializing opcode handler table
[23:43:50.942267] (debug) package.path = E:\Новая папка\moonloader\lib\?.lua;E:\Новая папка\moonloader\lib\?\init.lua;E:\Новая папка\moonloader\?.lua;E:\Новая папка\moonloader\?\init.lua;.\?.lua;E:\Новая папка\moonloader\lib\?.luac;E:\Новая папка\moonloader\lib\?\init.luac;E:\Новая папка\moonloader\?.luac;E:\Новая папка\moonloader\?\init.luac;.\?.luac
[23:43:50.942267] (debug) package.cpath = E:\Новая папка\moonloader\lib\?.dll;
[23:43:50.942768] (system) Loading script 'E:\Новая папка\moonloader\GOV-Helper (1).luac'...
[23:43:50.942768] (debug) New script: 0DC35B44
[23:43:50.975916] (system) [GOV-Helper]: Loaded successfully.
[23:44:02.205552] (system) Installing post-load hooks...
[23:44:02.206554] (system) Hooks installed.

Заранее, спасибо!
sampCloseCurrentDialogWithButton(номер кнопки)
 

ShuffleBoy

Известный
Друг
753
425
Ты не понял, onShowDialog - функция которая скрывает диалог... И почему-то и другого игрока не работает и выдает в логе варн
OnShowDialog это коллбэк, которой идет с либой samp.lua и вызывается при высвечивании диалога, кинь свой код, что да как там юзаешь
 

Salvatore_Ferrari

Известный
427
239
Lua:
function setPlayerSkin(id, skin)
    local bs = raknetNewBitStream() -- создаём новый BitStream.
    raknetBitStreamWriteInt32(bs, id) -- записуем в BitStream ID игрока.
    raknetBitStreamWriteInt32(bs, skin) -- записуем в BitStream ID скина.
    raknetEmulRpcReceiveBitStream(153 --[[RPC_SCRSETPLAYERSKIN]], bs) -- эмулируем входящий RPC (в данном случае это RPC_SCRSETPLAYERSKIN).
    raknetDeleteBitStream(bs) -- удаляем BitStream.
end
Почему скин не хочет менять?(

Lua:
function main()
     sampRegisterChatCommand("cmd", setPlayerSkin)
     wait (-1)
end

function setPlayerSkin(id, skin)
    local bs = raknetNewBitStream() -- создаём новый BitStream.
    raknetBitStreamWriteInt32(bs, id) -- записуем в BitStream ID игрока.
    raknetBitStreamWriteInt32(bs, skin) -- записуем в BitStream ID скина.
    raknetEmulRpcReceiveBitStream(153 --[[RPC_SCRSETPLAYERSKIN]], bs) -- эмулируем входящий RPC (в данном случае это RPC_SCRSETPLAYERSKIN).
    raknetDeleteBitStream(bs) -- удаляем BitStream.
end
 

AnWu

https://t.me/anwublog
Всефорумный модератор
4,761
5,369
шо за дичь, что тут не так?
Lua:
--knopka v imgui
if imgui.Button(u8'sozdat', imgui.ImVec2(108, 0)) then
            file = io.open(string.format('moonloader/ts/%s.ini', t_add_bind.v), 'r+')
            file:close()
        end
В другом скрипте идеально работает, никаких проблем.
Lua:
--log

[ML] (error) test: D:\Games\GTASAMP\moonloader\test.lua:30: attempt to index global 'file' (a nil value)
stack traceback:
    D:\Games\GTASAMP\moonloader\test.lua:30: in function 'OnDrawFrame'
    D:\Games\GTASAMP\moonloader\lib\imgui.lua:1377: in function <D:\Games\GTASAMP\moonloader\lib\imgui.lua:1366>
[ML] (error) test: Script died due to an error. (0ED2A6F4)
где проверка что файл успешно открыт?
Lua:
if file then


Почему скин не хочет менять?(

Lua:
function main()
     sampRegisterChatCommand("cmd", setPlayerSkin)
     wait (-1)
end

function setPlayerSkin(id, skin)
    local bs = raknetNewBitStream() -- создаём новый BitStream.
    raknetBitStreamWriteInt32(bs, id) -- записуем в BitStream ID игрока.
    raknetBitStreamWriteInt32(bs, skin) -- записуем в BitStream ID скина.
    raknetEmulRpcReceiveBitStream(153 --[[RPC_SCRSETPLAYERSKIN]], bs) -- эмулируем входящий RPC (в данном случае это RPC_SCRSETPLAYERSKIN).
    raknetDeleteBitStream(bs) -- удаляем BitStream.
end
где ты получаешь параметры команды то? сама логика неправильная.
 
  • Нравится
Реакции: #kerosin