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

Hatiko

Известный
Проверенный
1,470
612
bool result = setTargetBlipCoordinates(float x, float y, float z)
Это всё внутри на локальном уровне, просто ставится метка. Вот к примеру когда ставишь метку на карте, ты отправляешь RPC пакет с координатами, где поставил метку. А вот если через функции поставишь placeWaypoint или переместишь, с помощью выше указанной, то пакет не отправляется, вот нужно отправить, чтобы сервер понял, что я поставил метку
 

suouca

Новичок
68
11
https://blast.hk/threads/13380/page-2#post-205858
@suouca у тебя проблемы в клиенте, у меня работает твой скрипт, попробуй сменить серверПосмотреть вложение 22901
мб комп не тянет столько сообщений вывести
Мб, пробовал загрузить скрипт после входа, и он безотказно работал.
 

Terratomorf

Известный
315
58
Дело не в этом, дело в том что гта ломается при использовании onCreateObject


Можешь по корректнее задать вопрос, а то не особо понятно чего ты хочешь.
Как я понял тебе нужно чтобы ты давал ответ на вопрос из чата, который полностью совпадает с вопросом из таблицы ?
Да
 

LuaMaster

Известный
146
17
Как решить проблему, зделал оповещение при капче. При неактивном окне тупо нету звука из гташки, когда нажимаешь на него звук есть... Как решить проблему?
 

ufdhbi

Известный
Проверенный
1,455
861
Это всё внутри на локальном уровне, просто ставится метка. Вот к примеру когда ставишь метку на карте, ты отправляешь RPC пакет с координатами, где поставил метку. А вот если через функции поставишь placeWaypoint или переместишь, с помощью выше указанной, то пакет не отправляется, вот нужно отправить, чтобы сервер понял, что я поставил метку
https://blast.hk/threads/13380/#post-153001
Lua:
OUTCOMING_RPCS[RPC.MAPMARKER]                 = {'onSendMapMarker', {position = 'vector3d'}}
 

Hatiko

Известный
Проверенный
1,470
612
Переделаю вопрос так: есть функция для эмуляции входящих RPC - raknetEmulRpcReceiveBitStream, а есть что-то подобное для эмуляции исходящих RPC?
 

Cesar Ballard

Участник
81
5
есть примеры скрипта с активацией после команды,но не цикличные(типа прекращался после очередного вода команды, а что бы код выполнялся лишь после ввода команды 1 раз? Уже спрашивал просто пару часoв назад, видать, слишком по тупому тогда сформулировал.
 

suouca

Новичок
68
11
есть примеры скрипта с активацией после команды,но не цикличные(типа прекращался после очередного вода команды, а что бы код выполнялся лишь после ввода команды 1 раз? Уже спрашивал просто пару часoв назад, видать, слишком по тупому тогда сформулировал.
ты имеешь ввиду это ?
Lua:
function main()
    if not isSampLoaded() or not isSampfuncsLoaded() then return end
    while not isSampAvailable() do wait(100) end
    sampRegisterChatCommand('cmd', function()
    -- CODE
    sampUnregisterChatCommand('cmd')
    end)
    wait(-1)
end

или ты не хочешь разрегестрировать команду?
если так, то без
Lua:
sampUnregisterChatCommand('cmd')
 
  • Нравится
Реакции: Cesar Ballard

Hatiko

Известный
Проверенный
1,470
612
raknetSendRPC, вроде как-то так.
Да я тоже на этом заострился, только я опять стенку встретил. требуется записать массив из X и Y, а подходящей функции записи нет по тип данных массива, или я ещё не до конца разобрался с типами данных.
 

Musaigen

abobusnik
Проверенный
1,583
1,302
Да я тоже на этом заострился, только я опять стенку встретил. требуется записать массив из X и Y, а подходящей функции записи нет по тип данных массива, или я ещё не до конца разобрался с типами данных.
raknetBitStreamWriteFloat(Bitstream bs, float value)
Это два раза сложно вызвать?
 
  • Нравится
Реакции: Hatiko

Cesar Ballard

Участник
81
5
ты имеешь ввиду это ?
Lua:
function main()
    if not isSampLoaded() or not isSampfuncsLoaded() then return end
    while not isSampAvailable() do wait(100) end
    sampRegisterChatCommand('cmd', function()
    -- CODE
    sampUnregisterChatCommand('cmd')
    end)
    wait(-1)
end

или ты не хочешь разрегестрировать команду?
если так, то без
Lua:
sampUnregisterChatCommand('cmd')

А как узнать ид текстдрава не знаешь?
просто этот скрипт дропается
Код:
cript_name('textdraw')

scron = false

function main()
    font = renderCreateFont('Verdana', 8, 13)
    sampRegisterChatCommand('rtd', rendTextDraw)
    while true do
        wait(0)
        for textdrawid = 0, 3000 do
            if sampTextdrawIsExists(textdrawid) then
                local X, Y = sampTextdrawGetPos(textdrawid)
                posX, posY = convertGameScreenCoordsToWindowScreenCoords(X, Y)
                if scron then renderFontDrawText(font, textdrawid, posX, posY, 0xFFFF0000) end
            end
        end
    end
end

function rendTextDraw()
    scron = not scron
end

и можно ли кликнуть не по иду текстдрава, а по тексту его типа, ну в конечном итоге что бы типа аналог ф-ции sampSendClickTextdraw получился? Или нельзя так?

Мб это надо заюзать ?


Код:
bool result = sampTextdrawIsExists(int id)
string text = sampTextdrawGetString(int id)
 
Последнее редактирование: