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

Lucengen

Участник
52
0
Lua:
local text_buffer1 = imgui.ImBuffer(256)
local text_buffer2 = imgui.ImBuffer(256)

imgui.Text("Текст 1")
imgui.InputText(" ", text_buffer1)
imgui.Text("Текст 2")
imgui.InputText(" ", text_buffer2)
Я так и сделал, но не пашет, вот весь код
Lua:
require "lib.moonloader"
local imgui = require 'imgui'
local encoding = require 'encoding'
encoding.default = 'CP1251'
u8 = encoding.UTF8

local main_window_state = imgui.ImBool(false)
local text_buffer1 = imgui.ImBuffer(256)
local text_buffer2 = imgui.ImBuffer(256)

function main()
  while not isSampAvailable() do wait(100) end
  sampRegisterChatCommand('imgui', cmd_imgui)
wait(-1)
end

function cmd_imgui(arg)
main_window_state.v = not main_window_state.v
  imgui.Process = main_window_state.v
end

function imgui.OnDrawFrame()
  if main_window_state.v then
    imgui.SetNextWindowSize(imgui.ImVec2(250, 300), imgui.Cond.FirstUseEver) -- размер
  imgui.Begin("Заголовок", main_window_state)
  imgui.Text("Текст 1")
  imgui.InputText(" ", text_buffer1)
  imgui.Text("Текст 2")
  imgui.InputText(" ", text_buffer2)
  imgui.End()
  end
end
 

sakovnv

Участник
72
0
stack index 2, expected userdata, received sol.ImVec4: value at this index does not properly reflect the desired type (bad argument into 'bool(const char*, ImArray<float,3>*, sol::optional<int>)')
stack traceback:
local admcheckername = imgui.ImColor(4280887807)
строка: if imgui.ColorEdit3("##Color",admcheckername.v, imgui.ColorEditFlags.NoInputs + imgui.ColorEditFlags.NoLabel + imgui.ColorEditFlags.NoAlpha)

Что не так?
 

Nagenbl4

Новичок
107
2
Okey, при вводе /sgiveitem 1 ничего не происходит. В чём трабл?
Lua:
local abcd = {
[1] = "Тарелка",
[2] = "Чайник",
[3] = "Вилка",
[4] = "Ложка"
}

function main()
    if not isSampLoaded() or not isSampfuncsLoaded() then return end
    while not isSampAvailable() do wait(100) end
    
    sampRegisterChatCommand("sgiveitem", cmd_sear)
    
    while true do wait(0)
    --беск цикл
    end
end

function cmd_sear(aggr)
    if aggr ~= nil then
        for k, v in ipairs(abcd) do
            if v == aggr then
                sampAddChatMessage("" .. k, -1)
            end
        end
    end
end
HELP.
 

pwned

Участник
142
5
Я так и сделал, но не пашет, вот весь код
Lua:
require "lib.moonloader"
local imgui = require 'imgui'
local encoding = require 'encoding'
encoding.default = 'CP1251'
u8 = encoding.UTF8

local main_window_state = imgui.ImBool(false)
local text_buffer1 = imgui.ImBuffer(256)
local text_buffer2 = imgui.ImBuffer(256)

function main()
  while not isSampAvailable() do wait(100) end
  sampRegisterChatCommand('imgui', cmd_imgui)
wait(-1)
end

function cmd_imgui(arg)
main_window_state.v = not main_window_state.v
  imgui.Process = main_window_state.v
end

function imgui.OnDrawFrame()
  if main_window_state.v then
    imgui.SetNextWindowSize(imgui.ImVec2(250, 300), imgui.Cond.FirstUseEver) -- размер
  imgui.Begin("Заголовок", main_window_state)
  imgui.Text("Текст 1")
  imgui.InputText(" ", text_buffer1)
  imgui.Text("Текст 2")
  imgui.InputText(" ", text_buffer2)
  imgui.End()
  end
end
Lua:
require "lib.moonloader"
local imgui = require 'imgui'
local encoding = require 'encoding'
encoding.default = 'CP1251'
u8 = encoding.UTF8

local main_window_state = imgui.ImBool(false)
local text_buffer1 = imgui.ImBuffer(256)
local text_buffer2 = imgui.ImBuffer(256)

function main()
  while not isSampAvailable() do wait(100) end
  sampRegisterChatCommand('imgui', cmd_imgui)
wait(-1)
end

function cmd_imgui(arg)
main_window_state.v = not main_window_state.v
  imgui.Process = main_window_state.v
end

function imgui.OnDrawFrame()
  if main_window_state.v then
    imgui.SetNextWindowSize(imgui.ImVec2(250, 300), imgui.Cond.FirstUseEver) -- размер
  imgui.Begin("Заголовок", main_window_state)
  imgui.Text("Текст 1")
  imgui.InputText("##text_buffer1", text_buffer1)
  imgui.Text("Текст 2")
  imgui.InputText("##text_buffer2", text_buffer2)
  imgui.End()
  end
end
 
  • Нравится
Реакции: Lucengen

pwned

Участник
142
5
Как можно уменьшить поле ввода текста в imgui.InputText ?
imgui.PushItemWidth(400)

Как в имгуи сделать подсказку выплывающую?
Lua:
hint("тест.") -- сама подсказка

function hint(text) -- код
  lua_thread.create(
    function()
      imgui.TextDisabled("(?)")
      if imgui.IsItemHovered() then
        imgui.BeginTooltip()
        imgui.TextUnformatted(u8(text))
        imgui.EndTooltip()
      end
  end)
end
 
  • Нравится
Реакции: Lucengen и dhhh

The Spark

Известный
656
688
Как юзать scm как в cleo. Например:
CLEO:
call @2 0 to 1@
   
:2
0B2B: samp 2@ = get_player_id_by_actor_handle 1@
ret 1 2@
Также и с gosub
CLEO:
gosub @Enter

:Enter
wait 100
0C72: set_virtual_key 13 down true // Enter
0C72: set_virtual_key 13 down false // Enter
return
 

Neon3333

Известный
181
71
Привет всем, до обновы на аризоне можно было без проблем телепортнуть кар к себе, тепрь, похоже что сервер запретил менять позицию авто, какие есть пути реализации этого на замену setCarCoordinates() ?
Я не прошу готовый код, я прошу озвучить хотябы какие-то способы решения :)
 

Lil Xean

о да моя госпожа
214
225
Как юзать scm как в cleo. Например:
CLEO:
call @2 0 to 1@
  
:2
0B2B: samp 2@ = get_player_id_by_actor_handle 1@
ret 1 2@
Также и с gosub
CLEO:
gosub @Enter

:Enter
wait 100
0C72: set_virtual_key 13 down true // Enter
0C72: set_virtual_key 13 down false // Enter
return
@ "Как юзать scm как в cleo. Например:"
@
Lua:
 local _, playerID = sampGetPlayerIdByCharHandle(PLAYER_PED) -- получение своего ида. 
print(playerID)
@Также и с gosub
@
Lua:
 local key = require "vkeys"
setVirtualKeyDown(key.VK_RETURN, true)
wait(100)
setVirtualKeyDown(key.VK_RETURN, false)
p.s. поиска "опкодов": тык

Привет всем, до обновы на аризоне можно было без проблем телепортнуть кар к себе, тепрь, похоже что сервер запретил менять позицию авто, какие есть пути реализации этого на замену setCarCoordinates() ?
Я не прошу готовый код, я прошу озвучить хотябы какие-то способы решения :)
может тебе ещё готовый скрипт для разноса дать? ищи способы обхода.
 

Di3

Участник
432
20
Посмотреть вложение 27259
Хотел сделать изменение координат килл-листа,игрался игрался и в итоге получается гавно.
@imring ты мб шаришь,иды ты делал.


Lua:
function SE.onPlayerDeathNotification(killerId, killedId, reason)
    local kill = ffi.cast('struct stKillInfo*', sampGetKillInfoPtr())
    local _, myid = sampGetPlayerIdByCharHandle(playerPed)
    local n_killer = ( sampIsPlayerConnected(killerId) or killerId == myid ) and sampGetPlayerNickname(killerId) or nil
    local n_killed = ( sampIsPlayerConnected(killedId) or killedId == myid ) and sampGetPlayerNickname(killedId) or nil
    lua_thread.create(function()
        wait(0)
        if n_killer then kill.killEntry[4].szKiller = ffi.new('char[25]', ( n_killer .. '[' .. killerId .. ']' ):sub(1, 24) ) end
        if n_killed then kill.killEntry[4].szVictim = ffi.new('char[25]', ( n_killed .. '[' .. killedId .. ']' ):sub(1, 24) ) end
                 kill.iOffsetX = ffi.new('int', 500 )
                              kill.iOffsetY = ffi.new('int', 100 )
    end)
end
Актуально
 

Neon3333

Известный
181
71
@ "Как юзать scm как в cleo. Например:"
@
Lua:
 local _, playerID = sampGetPlayerIdByCharHandle(PLAYER_PED) -- получение своего ида.
print(playerID)
@Также и с gosub
@
Lua:
 local key = require "vkeys"
setVirtualKeyDown(key.VK_RETURN, true)
wait(100)
setVirtualKeyDown(key.VK_RETURN, false)
p.s. поиска "опкодов": тык


может тебе ещё готовый скрипт для разноса дать? ищи способы обхода.

Я не просил никаких скриптов для разноса, да и разносить мне ничего не нужно c: