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

Akionka

akionka.lua
Проверенный
742
500
Там должно быть ac вместо autoAccept, это я криво сюда залил, все равно не работает.
Lua:
ac = imgui.ImBool(mainIni.auto.ac)
Во-первых, у тебя по дефолту false и нет привязки к ini, а во-вторых, у тебя было ImInt, а надо ImBool -_-

почему то не работает
Lua:
setCharSwimSpeed(ped, speed)
И которое ты скинул тоже на работает(
Значит не работают функции, цикл все правильно обрабатывает. Либо ты не видишь эффекта.
upd: проверил setCharSwimSpeed на тестовом сервере, даже при 10.0 никакого эффекта нет.
upd2: твой код будет работать в цикле while. Проверил.
 
Последнее редактирование:

|| NN - NoName ||

Известный
1,049
628
Lua:
ac = imgui.ImBool(mainIni.auto.ac)
Во-первых, у тебя по дефолту false и нет привязки к ini, а во-вторых, у тебя было ImInt, а надо ImBool -_-


Значит не работают функции, цикл все правильно обрабатывает. Либо ты не видишь эффекта.
upd: проверил setCharSwimSpeed на тестовом сервере, даже при 10.0 никакого эффекта нет.
upd2: твой код будет работать в цикле while. Проверил.
Я о том же, эффекта ноль, и где all_anims у меня тоже 0 эффекта.
 

Akionka

akionka.lua
Проверенный
742
500
Lua:
while true do
    wait(0)
    -- setCharSwimSpeed(PLAYER_PED, 100.0)
    for k, v in pairs(all_anims) do setCharAnimSpeed(PLAYER_PED, v, 30.0) end
end
У меня так работает. Думаю не трудно сделать активацию по команде и проверке в while true или как-нибудь ещё.
 

|| NN - NoName ||

Известный
1,049
628
Lua:
while true do
    wait(0)
    -- setCharSwimSpeed(PLAYER_PED, 100.0)
    for k, v in pairs(all_anims) do setCharAnimSpeed(PLAYER_PED, v, 30.0) end
end
У меня так работает. Думаю не трудно сделать активацию по команде и проверке в while true или как-нибудь ещё.
Думаешь не делал?
 

FBenz

Активный
328
40
Есть код:
Lua:
     if imgui.CollapsingHeader(u8(fracinvname .. '[' .. i .. ']')) then
      if imgui.Button(u8'Принять себя') then
       lua_thread.create(onClickPlaySound, 'buttonsound')
       sampSendChat('/ainvite ' .. i)
      end
     end
Надо, чтобы при нажатии на хеддер что-то отправлялось в чат. Однако, если хеддер включен, то в чат будет флудить сообщением. Как сделать, чтобы писало 1 раз? imgui.IsItemClicked() не помог, ибо тогда срабатывает еще и при нажатии на кнопку. Доп переменные тоже вводил - не помогло.

Можно ли сделать, чтобы imgui.IsItemClicked() срабатывал только на хеддер?
 

wD.D159

Известный
Друг
446
479
Не могу понять, почему крашит? Адрес размера текстдравов.
Lua:
writeMemory(0x718D14, 4, representFloatAsInt(40.0), true)
 

|| NN - NoName ||

Известный
1,049
628
Где взять все memory address? Кто знает, ну если кто может помочь то мне нужен memory speed swim

Lua:
function main()
all_anims = {'SWIM_CRAWL',}
anims = {'SWIM_BREAST'}
while true do
wait(10)
result = isCharSwimming(PLAYER_PED)
if result then
quic = 1
mem = 1
lol = getCharSpeed(PLAYER_PED)
repeat quic = quic + 0.5 until lol <= 7.5
repeat quic = quic - 0.5 until lol >= 8.5
if lol > 7.4 and lol < 8.6 then
for k, v in pairs(all_anims) do setCharAnimSpeed(PLAYER_PED, v, quic) end
for b, d in pairs(anims) do setCharAnimSpeed(PLAYER_PED, d, mem) end
sampAddChatMessage("Speed " ..lol.."", -1)
end
end
end
end
Почему краш?
 

DeMoN3D

Известный
366
76
Где взять все memory address? Кто знает, ну если кто может помочь то мне нужен memory speed swim

Lua:
function main()
all_anims = {'SWIM_CRAWL',}
anims = {'SWIM_BREAST'}
while true do
wait(10)
result = isCharSwimming(PLAYER_PED)
if result then
quic = 1
mem = 1
lol = getCharSpeed(PLAYER_PED)
repeat quic = quic + 0.5 until lol <= 7.5
repeat quic = quic - 0.5 until lol >= 8.5
if lol > 7.4 and lol < 8.6 then
for k, v in pairs(all_anims) do setCharAnimSpeed(PLAYER_PED, v, quic) end
for b, d in pairs(anims) do setCharAnimSpeed(PLAYER_PED, d, mem) end
sampAddChatMessage("Speed " ..lol.."", -1)
end
end
end
end
Почему краш?
http://gtamodding.ru/wiki/Адреса_Памяти_(SA)
 

ARaG0RN

Активный
136
49
Можно ли отследить на lua в сампе зашел ли игрок в меню паузы, свернул ли игру?
 

Quasper

Известный
834
354
Разницы нет.

Может у тебя в строчке есть какие-то цвета, поэтому. Либо кодировка файла.
есть, isKeyDown будет выполняться пока зажата клавиша и isKeyJustPressed будет выполняться если была нажата клавиша

Опять я со своим кодом.
Проблема такая, если я ставлю галочку в чекбоксе "ac", все ок, в конфиге сохраняется, перепроверял, но после перезахода все равно галочка убрана.

Как я понимаю, это из-за строчки
Lua:
ac = imgui.ImInt(false)
Типо при запуске скрипт ставит false, но если я делаю в коде так:
Lua:
ac = imgui.ImInt(mainIni.Auto.ac)
То нихрена скрипт не работает)

Фулл код
Lua:
require 'lib.moonloader'
require 'lib.sampfuncs'

--REQUESTS--
local sf = require 'sampfuncs'
local sampev = require 'lib.samp.events'
local vkeys = require "vkeys"
encoding = require 'encoding'
local rx, ry = getScreenResolution()
local wx, wy = rx-500, ry-390
local inicfg = require 'inicfg'
imgui = require 'imgui'
encoding.default = 'CP1251'
u8 = encoding.UTF8

local directIni = "moonloader\\config\\clist.ini"

local mainIni = inicfg.load(nil, directIni)
--local stateIni = inicfg.save(nil, directIni)

local main_window_state = imgui.ImBool(false)
local text_buffer = imgui.ImBuffer(256)


function main()
    if not isSampLoaded() or not isSampfuncsLoaded() then return end
    while not isSampAvailable() do wait(100) end

    sampRegisterChatCommand("imgui", cmd_imgui)
        sampRegisterChatCommand("getInfo", cmd_getInfo)

    imgui.Process = false

    while true do
        wait(0)
            if main_window_state.v == false then
                imgui.Process = false
            end
    end
end


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

autoClist = imgui.ImBool(false)
ac = imgui.ImInt(false)
clistId = imgui.ImInt(mainIni.Auto.clist)

function imgui.OnDrawFrame()
    imgui.SetNextWindowSize(imgui.ImVec2(400, 200))
    imgui.SetNextWindowPos(imgui.ImVec2(rx/2-wx/4, ry/2-wy/5))
    imgui.Begin(u8"Заголовок", main_window_state, imgui.WindowFlags.NoCollapse + imgui.WindowFlags.NoResize)
    if imgui.Checkbox(u8"Включить AutoClist", autoClist) then
        sampAddChatMessage(autoClist.v and "AutoClist включен" or "AutoClist выключен", -1)
    end
        if autoClist.v == true then
        imgui.Text(u8"Текущий клист "..mainIni.Auto.clist)
    else
            imgui.Text(u8"AutoClist выключен")
    end
    if imgui.Checkbox(u8"ac", ac) then
            sampAddChatMessage(ac.v and "acon" or "acoff", -1)
    end
  imgui.SliderInt("Clist", clistId, 0, 33)
        imgui.Separator()
    if imgui.Button(u8"Сохранить настройки") then
                mainIni.Auto.clist = clistId.v
                mainIni.Auto.ac = autoAccept.v
        inicfg.save(mainIni, directIni)
        sampAddChatMessage("Настройки сохранены", 0xFF0000)
    end
    imgui.End()
end

function cmd_getInfo(arg)
    sampAddChatMessage("Clist: "..mainIni.Auto.clist, -1)
end

function sampev.onServerMessage(color, text)
    if mainIni.Auto.ac == true then
             --code
            end
end
imgui.ImInt(int) - imInt принимает целочисленное значение а у тебя там булевое

Можно ли отследить на lua в сампе зашел ли игрок в меню паузы, свернул ли игру?
https://blast.hk/wiki/lua:sampisplayerpaused
Будет всегда возвращать false если игрок вне стрима
 
  • Нравится
Реакции: ARaG0RN

.Makarov.

Известный
190
35
Здравствуйте! Есть два вопросика:
1) Как написать условие: Если игрок в зоне стрима, то...
P.S: Пробовал по ответу выше, вышло что-то вроде этого:
Lua:
function finder()
    local isStreamed = sampGetCharHandleBySampPlayerId(playerfinder)
    while true do
        wait(0)
        if isStreamed then
            sampAddChatMessage("Игрок под ид: "..playerfinder.." в зоне стрима",-1)
        end
    end
end
Но увы, не пашет(
2) Как написать условие: Если игрок в радиусе 20 метров (например) от другого игрока, то...
P.S: Просто хочу сделать луа прослушку. Как дальний чат, но будет писать текст лишь в радиусе выбранного мною игрока.
Заранее спасибо за помощь.
 

Musaigen

abobusnik
Проверенный
1,583
1,302
Где взять все memory address? Кто знает, ну если кто может помочь то мне нужен memory speed swim

Lua:
function main()
all_anims = {'SWIM_CRAWL',}
anims = {'SWIM_BREAST'}
while true do
wait(10)
result = isCharSwimming(PLAYER_PED)
if result then
quic = 1
mem = 1
lol = getCharSpeed(PLAYER_PED)
repeat quic = quic + 0.5 until lol <= 7.5
repeat quic = quic - 0.5 until lol >= 8.5
if lol > 7.4 and lol < 8.6 then
for k, v in pairs(all_anims) do setCharAnimSpeed(PLAYER_PED, v, quic) end
for b, d in pairs(anims) do setCharAnimSpeed(PLAYER_PED, d, mem) end
sampAddChatMessage("Speed " ..lol.."", -1)
end
end
end
end
Почему краш?
Потому что ты не догоняешь, что анимация воспроизводится каждый кадр, следовательно ее скорость сбрасывается на стандартную. А так же, твой код, это не код, а пиздец.
Lua:
local anims = {'SWIM_CRAWL', 'SWIM_BREAST'}
local speed = 30.0

function main()
    while true do wait(0)
        for k,v in pairs(anims) do
            setCharAnimSpeed(playerPed, v, speed)
        end
    end
end
 
  • Нравится
Реакции: atizoff и xsilv

chikibamboni95

Известный
58
2
В AHK есть вот такая вещица: IsPlayerInRangeOfPoint(2275, 2459, 10.3, 100) x,y,z,радиус
Есть ли в lua замена ей?