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

DolgorukovGTA

Известный
Проверенный
652
345
Код:
function poshelh()
sendOnfootSync(1847.5750,-1871.7260,13.5781)
sampAddChatMessage("sendOnfootSync успешно ",-1)
end


function sendOnfootSync(x, y, z)
local data = samp_create_sync_data('player')
data.position = {x, y, z}
data.keys.unknown_walkSlow = 1
data.send()
end
Патиму синхру отправляет, а вот альт не нажимает?(
Ты отправляешь синхронизацию, что нажата кнопка Alt. Если тебе нужно сделать, чтобы кнопка Alt зажималась, то это делается при помощи setVirtualKeyDown(ID, статус нажатия). Страница функции на WIKI: https://blast.hk/wiki/lua:setvirtualkeydown
 

Сырник

Известный
225
80
Ты отправляешь синхронизацию, что нажата кнопка Alt. Если тебе нужно сделать, чтобы кнопка Alt зажималась, то это делается при помощи setVirtualKeyDown(ID, статус нажатия). Страница функции на WIKI: https://blast.hk/wiki/lua:setvirtualkeydown
Мне нужно что бы с синхрой отправлялась нажатие Alt , setVirtualKeyDown не практично(
 

Double Tap Inside

Известный
Проверенный
1,899
1,254
Всем хай. Есть где-то модуль для воспроизведения звука, который не будет зависеть от громкости "радио" в гта?
 

Сырник

Известный
225
80
Код:
function poshelh()
lua_thread.create(function()
sendOnfootSync(1847.5750,-1871.7260,13.5781)
 setVirtualKeyDown(18,true)
 wait(50)
 setVirtualKeyDown(18, false)
 sampAddChatMessage("успех", -1)
end)
end
Пробовал сделать так - не получилось.


Код:
function sendOnfootSync(x, y, z)
lua_thread.create(function()
local data = samp_create_sync_data('player')
data.position = {x, y, z}
 setVirtualKeyDown(18,true)
 wait(50)
 setVirtualKeyDown(18, false)
data.send()
end)
end
Потом сделать так.. Не полуилось..Хелп
 

vladouubu

Новичок
24
2
Как сделать так, чтобы нужный код выполнялся каждый раз при подключении к серверу? В samp.events не нашел чего-то подобного. Подскажите.
 
D

deleted-user-164854

Гость
Да я знаю, но это слишком просто.
Ну есть варик через спавн
или ловить первый пришедший диалог от сервера (на всех РП серверах это ввод пароля)

ну или ещё последний варик чекать входящее RPC onInitGame на получение название сервера и т.п.
 

.Makarov.

Известный
190
35
Наткнулся на вот такой вот код:
Lua:
function fakePressN()
    local _, id = sampGetPlayerIdByCharHandle(PLAYER_PED)
    local data = allocateMemory(68)
    sampStorePlayerOnfootData(id, data)
    setStructElement(data, 36, 1, 128, false)
    sampSendOnfootData(data)
    freeMemory(data)
end
Он отправляет синхру о нажатой кнопке N. Как изменить кнопку N допустим на альт, или же на Y? Или же за что каждая из строк отвечает? Заранее спасибо.
 

astynk

Известный
Проверенный
742
530
Наткнулся на вот такой вот код:
Lua:
function fakePressN()
    local _, id = sampGetPlayerIdByCharHandle(PLAYER_PED)
    local data = allocateMemory(68)
    sampStorePlayerOnfootData(id, data)
    setStructElement(data, 36, 1, 128, false)
    sampSendOnfootData(data)
    freeMemory(data)
end
Он отправляет синхру о нажатой кнопке N. Как изменить кнопку N допустим на альт, или же на Y? Или же за что каждая из строк отвечает? Заранее спасибо.
Значения для клавиш есть тут: https://sampwiki.blast.hk/wiki/Keys
В сампе есть такая очень странная хрень, клавиши Y/N/H отправляются в data.weapon (оффсет 36 байтов, как у тебя в коде), а другие - в data.keysData (оффсет 4 байта). То есть для отправки альта надо будет написать setStructElement(data, 4, 2, 1024, false).
Все эти штуки удобно смотреть в утилитах вроде raklogger / syncmaster: https://funkyimg.com/i/2Qsag.png
 
  • Нравится
Реакции: .Makarov.

Dmitriy Makarov

25.05.2021
Проверенный
2,478
1,113
есть в скрипте 2 темы которые меняются по нажатию на кнопку, но по умолчанию у меня стоит стандартная тема имгуи
как сменить тему которая стоит по умолчанию?
 

Angr

Известный
291
97
есть в скрипте 2 темы которые меняются по нажатию на кнопку, но по умолчанию у меня стоит стандартная тема имгуи
как сменить тему которая стоит по умолчанию?
Если этот параметр сохраняется в cfg, то найти в коде это значение и изменить