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

Shamanije

Известный
Друг
961
920
Нажимаю на F11 и ничего не происходит, а по факту должно написать "Окей"

Lua:
sampAddChatMessage("Нажмите на F11", -1)
        local timen = os.time()
            repeat
                wait(0)
      
                if os.difftime(timen, os.time()) == 15 then
                    return
                end
            until isKeyDown(VK_F11)
sampAddChatMessage("Окей", -1)
Фулл код можно?
 

ARaG0RN

Активный
136
49
Без переменной возвращай
Lua:
return {id, color, position, distance, testLOS, attachedPlayerId, attachedVehicleId, 'test'}
И где какое-либо условие на определение текста? Сделай триггер хотя бы на текст
Lua:
function sampev.onCreate3DText(id, color, position, distance, testLOS, attachedPlayerId, attachedVehicleId, text)
    if text:find('Слово') then
        return {id, color, position, distance, testLOS, attachedPlayerId, attachedVehicleId, 'что-то'}
    end
end
Добавил условие, возвращаю, а 3D текст не меняется.

Пожалуйста, помогите с функцией. Нужно, чтоб она создавала поток, и если уже есть такой поток в работе или он приостановлен, то чтоб второй экземпляр потока не создавался.
 

Bogach

Активный
558
27
Ребят. Есть скрипт, в котором реализована такая система: Не открывая чат, набираешь (например) id игрока на нумпаде и нажимаешь плюсик, после на кнопку x можно открыть меню взаимодействия с тем игроком, чей id ты указал на нумпаде. Как такое реализовывается, не подскажите?
 

ufdhbi

Известный
Проверенный
1,455
861
Ребят. Есть скрипт, в котором реализована такая система: Не открывая чат, набираешь (например) id игрока на нумпаде и нажимаешь плюсик, после на кнопку x можно открыть меню взаимодействия с тем игроком, чей id ты указал на нумпаде. Как такое реализовывается, не подскажите?
testCheat
 

FBenz

Активный
328
40
Мне нужно сохранить значение переменной, чтобы после рестарта скрипта оно оставалось таким, каким его ввели последний раз. Решил сделать через файл, где будет список переменных. Сделал нечто похожее на это:
Lua:
local param = 'авбваыдпвыат'
function main()
 while true do
  if wasKeyPressed(key.VK_Q) then -- Любым способом вызываю функцию
   onSaveTable(param)
  end
 end
end

function onSaveTable(tableparam)

local opentable = io.open(string.format('%s/fbibimages/table.txt', wdirect), "a") -- Открываю файл, wdirect содержит путь к папке со скриптом
io.write(string.format("%s", tableparam)) -- записываю чертову переменную в файл
io.close(opentable) -- закрываю файл

end

Файл удачно создался, но он пустой и значение переменной не записало. Подозреваю, что неправильно юзаю io.write() Что не так?
upd: Спасибо, понял
 
Последнее редактирование:

Petr_Sergeevich

Известный
Проверенный
707
296
Мне нужно сохранить значение переменной, чтобы после рестарта скрипта оно оставалось таким, каким его ввели последний раз. Решил сделать через файл, где будет список переменных. Сделал нечто похожее на это:
Lua:
local param = 'авбваыдпвыат'
function main()
 while true do
  if wasKeyPressed(key.VK_Q) then -- Любым способом вызываю функцию
   onSaveTable(param)
  end
 end
end

function onSaveTable(tableparam)

local opentable = io.open(string.format('%s/fbibimages/table.txt', wdirect), "a") -- Открываю файл, wdirect содержит путь к папке со скриптом
io.write(string.format("%s", tableparam)) -- записываю чертову переменную в файл
io.close(opentable) -- закрываю файл

end

Файл удачно создался, но он пустой и значение переменной не записало. Подозреваю, что неправильно юзаю io.write() Что не так?
Костыль.
https://blast.hk/wiki/lua:inicfg
 
  • Нравится
Реакции: FBenz

FBenz

Активный
328
40
Привет. Как закодировать переменную в U8? У меня переменная содержит текст русский, в imgui надо закодироватьв u8. Однако столкнулся с проблемой. Допустим, мне надо создать текст и впихнуть в него переменную с русским текстом. Пишу:
Lua:
imgui.Text(string.format(u8'%s', peremennaya))
И в итоге текст почему-то не кодируется, отображается все равно в вопросах. Как исправить?
 

штейн

Известный
Проверенный
1,001
687
Привет. Как закодировать переменную в U8? У меня переменная содержит текст русский, в imgui надо закодироватьв u8. Однако столкнулся с проблемой. Допустим, мне надо создать текст и впихнуть в него переменную с русским текстом. Пишу:
Lua:
imgui.Text(string.format(u8'%s', peremennaya))
И в итоге текст почему-то не кодируется, отображается все равно в вопросах. Как исправить?

imgui.Text(u8(peremennaya))
 
  • Нравится
Реакции: FBenz

Petr_Sergeevich

Известный
Проверенный
707
296
как поменять цвет фона окна? ImGui
WindowBg называется, изменяется в стиле
Lua:
function setStyle()
    imgui.SwitchContext()
    style = imgui.GetStyle()
    colors = style.Colors
    clr = imgui.Col
    ImVec4 = imgui.ImVec4

    colors[clr.WindowBg] = ImVec4(12/255, 12/255, 12/255, 1.0)
end
setStyle()
 

VirtuoZZ

Участник
41
19
Как переделать этот код под imgui.Checkbox
Код:
Код:
function main()
  if not isSampfuncsLoaded() or not isSampLoaded() then return end

  while not isSampAvailable()
  do
    wait(400)
  end

  while true do
   wait(0)
   for id = 0, sampGetMaxPlayerId(true)
   do
    if sampIsPlayerConnected(id)
    then
     local exists, handle = sampGetCharHandleBySampPlayerId(id)
     if exists and doesCharExist(handle) then
      if isCharOnScreen(handle) then
        local color = sampGetPlayerColor(id)
        local X, Y, Z = getCharCoordinates(handle)
        local x, y = convert3DCoordsToScreen(X, Y, Z)
        local myX, myY, myZ = getCharCoordinates(playerPed)
        local myx, myy = convert3DCoordsToScreen(myX, myY, myZ)
        local distance = getDistanceBetweenCoords3d(X, Y, Z, myX, myY, myZ)
        if isKeyDown(18) and isKeyJustPressed(51) then -- ПОЛОСКИ (ALT + B)
          enabled2 = not enabled2
        end
        if enabled2 then
          renderDrawLine(myx, myy, x, y, 2, color)
          renderDrawPolygon(x, y, 5, 5, 15, 0, color)
        end
      
      end
     end
    end
   end
end
end





--[[
function GetBodyPartCoordinates(id, handle)
  bones = getCharPointer(id)
  callMethod(0x5E4280, bones, 3, 0, true, handle, ...)
  return
end


:CPed__getBonePosition
0A96: 25@ = actor 0@ struct
0AA6: call_method 0x5E4280 struct 25@ num_params 3 pop 0 true 1@ 25@v
0AB2: ret 3 25@ 26@ 27@
]]