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

stranger_karelli

Потрачен
382
262
Обратите внимание, пользователь заблокирован на форуме. Не рекомендуется проводить сделки.
  • Нравится
Реакции: blessave

ZKelo

Известный
82
25
Как правильно прочитать данные структуры stBulletSyncData?

Пытался сделать так, но игра из-за этого зависает

Lua:
--[[ **************************************
      Вызывается при отправке пакета BULLET_SYNC
     ************************************** ]]--
function sampEvent.onSendBulletSync(stBulletSyncDataPtr) -- OUT
    if isBulletTracerEnabled then
        print(stBulletSyncDataPtr)
        local origin, target = {}
        local offset = 3
        origin[1] = getStructFloatElement(stBulletSyncDataPtr, offset)
        offset = offset + 4
        origin[2] = getStructFloatElement(stBulletSyncDataPtr, offset)
        offset = offset + 8
        target[1] = getStructFloatElement(stBulletSyncDataPtr, offset)
        offset = offset + 4
        target[2] = getStructFloatElement(stBulletSyncDataPtr, offset)
    end
end

Вот сама структура

C++:
struct stBulletData
{
    uint8_t                                    byteType;
    uint16_t                                sTargetID;
    float                                    fOrigin[3];
    float                                    fTarget[3];
    float                                    fCenter[3];
    uint8_t                                    byteWeaponID;
};
 

trefa

Известный
Всефорумный модератор
2,097
1,231
Как правильно прочитать данные структуры stBulletSyncData?

Пытался сделать так, но игра из-за этого зависает

Lua:
--[[ **************************************
      Вызывается при отправке пакета BULLET_SYNC
     ************************************** ]]--
function sampEvent.onSendBulletSync(stBulletSyncDataPtr) -- OUT
    if isBulletTracerEnabled then
        print(stBulletSyncDataPtr)
        local origin, target = {}
        local offset = 3
        origin[1] = getStructFloatElement(stBulletSyncDataPtr, offset)
        offset = offset + 4
        origin[2] = getStructFloatElement(stBulletSyncDataPtr, offset)
        offset = offset + 8
        target[2] = getStructFloatElement(stBulletSyncDataPtr, offset)
        offset = offset + 4
        target[2] = getStructFloatElement(stBulletSyncDataPtr, offset)
    end
end

Вот сама структура

C++:
struct stBulletData
{
    uint8_t                                    byteType;
    uint16_t                                sTargetID;
    float                                    fOrigin[3];
    float                                    fTarget[3];
    float                                    fCenter[3];
    uint8_t                                    byteWeaponID;
};
Чё бля, тут данные все в таблице.
 
  • Нравится
Реакции: ZKelo

lemonager

;)
Всефорумный модератор
809
1,701
Данный имгуй взял из другого скрипта и вставил свой. Все прописал. Мадрассо говорит что нет проблем никаких, но вылетает гта. В логе пусто. Код:
Код:
function imgui.OnDrawFrame()
    -- Main Window
    if window.v then
        local iScreenWidth, iScreenHeight = getScreenResolution()
        imgui.SetNextWindowPos(imgui.ImVec2(iScreenWidth / 2, iScreenHeight / 2), imgui.Cond.FirstUseEver, imgui.ImVec2(0.5, 0.5))
        imgui.SetNextWindowSize(imgui.ImVec2(400, 150), imgui.Cond.FirstUseEver)
        vkid = data.user_id[1]
        imgui.Begin(u8(thisScript().name.. ": Settings   |   Ваш ID: " ..tostring(vkid)), window, imgui.WindowFlags.NoResize + imgui.WindowFlags.NoCollapse + imgui.WindowFlags.NoMove)
        imgui.Text(u8("Оповещения ВКонтакте"))
        imgui.SameLine(370)
        imgui.Checkbox('##vkactive', vkactive)
        imgui.Text(u8("Звуковые оповещения"))
        imgui.SameLine(370)
        imgui.Checkbox('##zvuk', zvuk)
        imgui.Text(u8("Оповещения о репортах"))
        imgui.SameLine(370)
        imgui.Checkbox('##adm', adm)
        imgui.Text(u8("Оповещения о рулетке"))
        imgui.SameLine(370)
        imgui.Checkbox('##rulet', rulet)
        imgui.Text(u8("Оповещения о SMS"))
        imgui.SameLine(370)
        imgui.Checkbox('##sms', sms)
        imgui.End()
    end
end
а где маин? имгуи процесс? конечно вылетит
 

Dmitriy Makarov

25.05.2021
Проверенный
2,478
1,113
как менять местоположение картинки в imgui? (не размер, а местоположение

код сам:
main:
Lua:
img = imgui.CreateTextureFromFile(getGameDirectory() .. '\\moonloader\\image [AHK Mafia]\\pravitelstvo.png')

в imgui.OnDrawFrame()
Lua:
imgui.Image(img, imgui.ImVec2(800, 150))
 

Musaigen

abobusnik
Проверенный
1,583
1,302
как менять местоположение картинки в imgui? (не размер, а местоположение

код сам:
main:
Lua:
img = imgui.CreateTextureFromFile(getGameDirectory() .. '\\moonloader\\image [AHK Mafia]\\pravitelstvo.png')

в imgui.OnDrawFrame()
Lua:
imgui.Image(img, imgui.ImVec2(800, 150))
imgui.SetCursorPosXY(imgui.ImVec2(x, y))
 

Dmitriy Makarov

25.05.2021
Проверенный
2,478
1,113
imgui.SetCursorPosXY(imgui.ImVec2(x, y))
не работает
я в onDrawFrame() вставил и координаты задал, у меня имгуи окно перестало открываться
я конечно не шарю в луа, но что-то мне кажется, что сама функция SetCursorPos никак к картинке не относится, мои догадки
мне нужно именно картинку которая в имгуи окно передвинуть чутка, так как она по умолчанию слева у меня