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

Jarik123321

Новичок
5
0
Проблема в том, что скрипт не получил данные в какой ты организации. (FBI, LSPD, SFPD, LVPD)
Заспавни персонажа, потом подожди 30 секунд, можешь с запасом дольше подождать. Потом если сообщения: "Не удалось определить статистику персонажа. Повторить попытку?" не будет должно работать.
Если это не поможет, то можно указать фракцию в скрипте:
Lua:
--GLOBALS--
ctag = " FBI Tools {ffffff}|"
oopdelnick = 'none'
mcheckb = false
rabden = false
frak = 'FBI' -- вот здесь, строка 22, это пример как нужно, если ты в FBI
Не помогает это, поменял, теперь скрипт хоть не вылетает, но /ft и шпоры не работают всё равно)
 

Belo4ka_belka

Известный
191
7
Конечно можно.
https://blast.hk/wiki/lua:getcurrentcharweapon - оружие
С помощью функции в сниппетах от Pakulichev получаешь ID по хендлу, и:
https://blast.hk/wiki/lua:sampgetplayerscore - уровень
https://blast.hk/wiki/lua:sampgetplayerping - пинг
С оружием видимо я невнимательным был. А вот уровень и пинг в требованиях написано SAMPFUNC - мне этот метод не подходит. Так же интересуют ХП и броня цели без СФ.
 
Последнее редактирование:

S-Sirius

Известный
351
21
Как сделать 2 параметра для param? Чтобы был например sampSendChat("Nick "..var0.." Text "..var1) Где var0 и var1 части param-а
 

biscuitt

Известный
186
14
Lua:
local hud_main = imgui.ImBool(false)

function imgui.OnDrawFrame() 
if hud_main.v then
imgui.SetNextWindowSize(imgui.ImVec2(160, 160), imgui.Cond.FirstUseEver)
imgui.Begin(u8'Худ типo', hud_main)
imgui.Text('123')
imgui.End()
end
end

--В main:
if wasKeyPressed(key.VK_Z) then
hud_main.v = not hud_main.v
end
imgui.Process = main_window_state.v or hud_main.v
Почему крашит?
 

Вложения

  • photo_2019-04-12_11-46-12.jpg
    photo_2019-04-12_11-46-12.jpg
    21.7 KB · Просмотры: 150

S-Sirius

Известный
351
21
Можете помощ исправить код?
Lua:
function skok(param) skok:run(param) end
function goskok(param)
local _, id = sampGetPlayerIdByCharHandle(playerPed)
local var0 = string.match(var0, '%d*(.+)')
local var1 = string.match(var1, '%s*(.+)')
    if var0 ~= nil or var1 ~= nil then
    nick = string.gsub(sampGetPlayerNickname(var0), '_', ' ')
    sampSendChat(""..var0.." сдал "..var1.." г. порошка!")
    wait(1500)
    sampSendChat("/b /time + F8")
end
 

TopKitten

Участник
86
3
Можете помощ исправить код?
Lua:
function skok(param) skok:run(param) end
function goskok(param)
local _, id = sampGetPlayerIdByCharHandle(playerPed)
local var0 = string.match(var0, '%d*(.+)')
local var1 = string.match(var1, '%s*(.+)')
    if var0 ~= nil or var1 ~= nil then
    nick = string.gsub(sampGetPlayerNickname(var0), '_', ' ')
    sampSendChat(""..var0.." сдал "..var1.." г. порошка!")
    wait(1500)
    sampSendChat("/b /time + F8")
end
у тебя там wait стоит, а оно работает только в main

Код:
function skok(param) skok:run(param) end
function goskok(param)
lua_thread.create(function()
local _, id = sampGetPlayerIdByCharHandle(playerPed)
local var0 = string.match(var0, '%d*(.+)')
local var1 = string.match(var1, '%s*(.+)')
    if var0 ~= nil or var1 ~= nil then
    nick = string.gsub(sampGetPlayerNickname(var0), '_', ' ')
    sampSendChat(""..var0.." сдал "..var1.." г. порошка!")
    wait(1500)
    sampSendChat("/b /time + F8")
end)
end
попробуй так, мб поможет
 

MrCold

Активный
364
118
Пацаны, тема такая. Нужно мне сделать ВХ на объекты, и на объектах пишется 3D текст, но прорисовка 3D текста и самого объекта происходит только, когда персонаж подходит ближе, чем на 20 метров к объекту. Можно как-нибудь обойти эту систему? Подскажите пожалуйста

Можете помощ исправить код?
Lua:
function skok(param) skok:run(param) end
function goskok(param)
local _, id = sampGetPlayerIdByCharHandle(playerPed)
local var0 = string.match(var0, '%d*(.+)')
local var1 = string.match(var1, '%s*(.+)')
    if var0 ~= nil or var1 ~= nil then
    nick = string.gsub(sampGetPlayerNickname(var0), '_', ' ')
    sampSendChat(""..var0.." сдал "..var1.." г. порошка!")
    wait(1500)
    sampSendChat("/b /time + F8")
end
Lua:
function goskok(param)
    lua_thread.create(function()
        local _, id = sampGetPlayerIdByCharHandle(playerPed)
        local var0 = string.match(var0, '%d*(.+)')
        local var1 = string.match(var1, '%s*(.+)')
      if var0 ~= nil or var1 ~= nil then
             nick = string.gsub(sampGetPlayerNickname(var0), '_', ' ')
             sampSendChat(""..var0.." сдал "..var1.." г. порошка!")
          wait(1500)
          sampSendChat("/b /time + F8")
        end
    end)
end
 

S-Sirius

Известный
351
21
Lua:
function goskok(param)
    lua_thread.create(function()
        local _, id = sampGetPlayerIdByCharHandle(playerPed)
        local var0 = string.match(var0, '%d*(.+)')
        local var1 = string.match(var1, '%s*(.+)')
      if var0 ~= nil or var1 ~= nil then
             nick = string.gsub(sampGetPlayerNickname(var0), '_', ' ')
             sampSendChat(""..var0.." сдал "..var1.." г. порошка!")
          wait(1500)
          sampSendChat("/b /time + F8")
        end
    end)
end
[/QUOTE]
[ML] (error) arab: D:\Games\GTA San Andreas\moonloader\moi_arab.lua:473: bad argument #1 to 'match' (string expected, got nil)
stack traceback:
[C]: in function 'match'
D:\Games\GTA San Andreas\moonloader\moi_arab.lua:473: in function <D:\Games\GTA San Andreas\moonloader\moi_arab.lua:471>
stack traceback:
[C]: in function 'create'
D:\Games\GTA San Andreas\moonloader\moi_arab.lua:471: in function <D:\Games\GTA San Andreas\moonloader\moi_arab.lua:470>
stack traceback:
[C]: in function 'run'
D:\Games\GTA San Andreas\moonloader\moi_arab.lua:469: in function <D:\Games\GTA San Andreas\moonloader\moi_arab.lua:469>
[ML] (error) arab: Script died due to an error. (112F14C4)
 

MrCold

Активный
364
118
Lua:
function goskok(param)
    lua_thread.create(function()
        local _, id = sampGetPlayerIdByCharHandle(playerPed)
        local var0 = string.match(var0, '%d*(.+)')
        local var1 = string.match(var1, '%s*(.+)')
      if var0 ~= nil or var1 ~= nil then
             nick = string.gsub(sampGetPlayerNickname(var0), '_', ' ')
             sampSendChat(""..var0.." сдал "..var1.." г. порошка!")
          wait(1500)
          sampSendChat("/b /time + F8")
        end
    end)
end



Если ты декриптанул скрипт, и хочешь такой же, то у тебя ничего не получиться. Скинь полностью скрипт, а не функцию, тогда помогу.
 

S-Sirius

Известный
351
21
у тебя там wait стоит, а оно работает только в main

Код:
function skok(param) skok:run(param) end
function goskok(param)
lua_thread.create(function()
local _, id = sampGetPlayerIdByCharHandle(playerPed)
local var0 = string.match(var0, '%d*(.+)')
local var1 = string.match(var1, '%s*(.+)')
    if var0 ~= nil or var1 ~= nil then
    nick = string.gsub(sampGetPlayerNickname(var0), '_', ' ')
    sampSendChat(""..var0.." сдал "..var1.." г. порошка!")
    wait(1500)
    sampSendChat("/b /time + F8")
end)
end
попробуй так, мб поможет
Неа в lua_thread писал
 

biscuitt

Известный
186
14
Lua:
zones =
{
    ['PER1'] = u8"Площадь Першинг",
    ['SAN_AND'] = u8"Сан Андреас",
    ['COM'] = u8"Коммерческий район",
    ['BLUF'] = u8"Вердант Блаффс",
    ['LMEX'] = u8"Литл Мехико",
    ['ELCO'] = u8"Эль Корона",
    ['CONF'] = u8"Конференц Центр",
    ['VERO'] = u8"Пляж Верона",
    ['MAR'] = u8"Каз",
    ['SMB'] = u8"Пляж Санта-Мария",
    ['ROD'] = u8"Родео Драйв",
    ['LA'] = u8"Лос-Сантос",
    ['LAIR'] = u8"Аэропорт Лос-Сантоса",
    ['LDT'] = u8"Центральный Лос-Сантос",
    ['MULINT'] = u8"Перекресток Маллхоланд",
    ['GLN'] = u8"Глен Парк",
    ['CHC'] = u8"Лас Колинас",
    ['JEF'] = u8"Джефферсон",
    ['ELS'] = u8"Восточный Лос-Сантос",
    ['LFL'] = u8"Лас Флорес",
    ['EBE'] = u8"Восточный пляж",
    ['LIND'] = u8"Уиллоуфилд",
    ['PLS'] = u8"Бульвар Севилии",
    ['LDOC'] = u8"Порт Лос-Сантоса",
    ['MKT'] = u8"Маркет",
    ['CauseKST'] = u8"Каз Маркет",
    ['VIN'] = u8"Улица Вайнвуд",
    ['SUN'] = u8"Темпл Драйв",
    ['MUL'] = u8"Маллхоланд",
    ['ROBAD'] = u8"Тьерра Робада",
    ['ARCO'] = u8"Арко Дель Уэсте",
    ['BONE'] = u8"Округ Боун",
    ['MEAD'] = u8"Вердант Медоу"
}
Где можно найти полный список этих зон с переводом на русский (Или хотя бы англ)? Уже задолбался ручками ТПхаться по карте и выписывать каждую зону.