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

FBenz

Активный
328
40
Я имел виду их хэндлы
В дополнение к примеру выше, можно перебрать все айди игроков от 0 до максимального в зоне стрима и взять их хендл. У кого взялся - тот в зоне стрима. Но это считается более говнокодистым способом (не знаю почему, всегда его юзаю, не бейте)
 

paulohardy

Известный
Всефорумный модератор
1,997
1,332
Что тут не так?? Вкладки диалога иногда работают, иногда нет
Lua:
function secondThread()
    local resultMain, buttonMain, listMain = sampHasDialogRespond(154)
    if resultMain == true then
      if buttonMain == 1 then
        if listMain == 0 then
            if chathelper == true then
                chathelper = false
                sampfuncsLog("* ChatIndicator OFF!")
                sampAddChatMessage("* Apollon: {ffffff}Chat Indicator выключён",0x0088ff)
                chathelper_state = '{FF0000} Выключен'
            else
                chathelper = true
                sampfuncsLog("* ChatIndicator ON!")
                sampAddChatMessage("* Apollon: {ffffff}Chat Indicator включён",0x0088ff)
                chathelper_state = '{00FF00} Включен'
            end
        end
        if listMain == 1 then
            if fpsshow == true then
                fpsshow = false
                sampfuncsLog("* FPS Indicator OFF!")
                sampAddChatMessage("* Apollon: {ffffff}FPS Indicator выключён",0x0088ff)
                fps_state = '{FF0000} Выключен'
            else
                fpsshow = true
                sampfuncsLog("* FPS Indicator ON!")
                sampAddChatMessage("* Apollon: {ffffff}FPS Indicator включён",0x0088ff)
                fps_state = '{00FF00} Включен'
            end
        end
        if listMain == 2 then
          if hphud == true then
            hphud = false
            sampfuncsLog("* HP Indicator OFF!")
            sampAddChatMessage("* Apollon: {ffffff}HP Indicator выключён",0x0088ff)
            hphud_state = '{FF0000} Выключен'
          else
            hphud = true
            sampfuncsLog("* HP Indicator ON!")
            sampAddChatMessage("* Apollon: {ffffff}HP Indicator включён",0x0088ff)
            hphud_state = '{00FF00} Включен'
          end
        end
        if listMain == 3 then
          if hp2hud == true then
            hp2hud = false
            sampfuncsLog("* 160 HP Indicator OFF!")
            sampAddChatMessage("* Apollon: {ffffff}160 HP Indicator выключён",0x0088ff)
            hphud_state2 = '{FF0000} Выключен'
          else
            hp2hud = true
            sampfuncsLog("* 160 HP Indicator ON!")
            sampAddChatMessage("* Apollon: {ffffff}160 HP Indicator включён",0x0088ff)
            hphud_state2 = '{00FF00} Включен'
          end
        end
        if listMain == 4 then
         if armhud == true then
            armhud = false
            sampfuncsLog("* Armour Indicator OFF!")
            sampAddChatMessage("* Apollon: {ffffff}Armour Indicator выключён",0x0088ff)
            armhud_state = '{FF0000} Выключен'
         else
            armhud = true
            sampfuncsLog("* Armour Indicator ON!")
            sampAddChatMessage("* Apollon: {ffffff}Armour Indicator включён",0x0088ff)
            armhud_state = '{00FF00} Включен'
         end
        end
        if listMain == 5 then
        sampAddChatMessage("* Apollon: {ffffff}Из за нагрузки диалоговое окно может не запускатся с первого раза. Если окно не запускался, пожалуйста попробуйте снова.",0x0088ff)
            local help = [[
{ffffff}  {0088ff}__________________________________________________________________________________________________________ {ffffff}
{0088ff}
{0088ff}SA:MP Indicators{ffffff} - Скрипт в базе Lua, который даёт возможность посмотреть свой HP, уровень броня так же поиощник чата.
{ffffff}
{ffffff}      •     {0088ff}/igelp{ffffff} - информация.    
{ffffff}      •     {0088ff}/ireload {ffffff} - перезагрузка скрипта.              
{ffffff}      •     {0088ff}/indicators{ffffff} - Меню скрипта                                                
{0088ff}  
{ffffff}  {0088ff}__________________________________________________________________________________________________________ {ffffff}
            ]]
                sampShowDialog(155, "Что я могу делать?", help, "*", "", 0)
        end
     end
    end
end


function toghmenu()
    sampShowDialog(154, "Панель индикаторов", string.format("{00ffd5}Chat Indicator: {cccccc}[ %s {cccccc}]\n{00ffd5}FPS Indicator: {cccccc}[ %s {cccccc}]\n{00ffd5}HP Indicator[100]: {cccccc}[ %s {cccccc}]\n{00ffd5}HP Indicator[160]: {cccccc}[ %s {cccccc}]\n{00ffd5}Armour Indicator: {cccccc}[ %s {cccccc}]\n{000018}Информация(Список команд)", chathelper_state, fps_state, hphud_state, hphud_state2, armhud_state), "Выбрать", "Отмена", 2)
end
 

JustFedot

legends never die 🕊️
357
378
Доброй ночи, вы бы не могли мне подсказать код функции генератора случайных чисел от N до N числа?
Буду благодарен)
 

S4ress

Новичок
5
0
Форматирование кода
local ustav_read_file1 = string.format("moonloader\\BankHelper\\Settings\\ustav1.txt")
local ustav1 = io.open(ustav_read_file1, "r")
local ustav_text1 = ustav1:read("*a")
local ustav_read_file2 = string.format("moonloader\\BankHelper\\Settings\\ustav2.txt")
local ustav2 = io.open(ustav_read_file2, "r")
local ustav_text2 = ustav2:read("*a")
local ustav_read_file3 = string.format("moonloader\\BankHelper\\Settings\\ustav3.txt")
local ustav3 = io.open(ustav_read_file3, "r")
local ustav_text3 = ustav3:read("*a")
local ustav_read_file4 = string.format("moonloader\\BankHelper\\Settings\\ustav4.txt")
local ustav4 = io.open(ustav_read_file4, "r")
local ustav_text4 = ustav4:read("*a")

Помогите зациклить пж (сделать читабельным). Можно через любой цикл
Доброй ночи, вы бы не могли мне подсказать код функции генератора случайных чисел от N до N числа?
Буду благодарен)
math.random(min, max)
 

astynk

Известный
Проверенный
740
533
local ustav_read_file1 = string.format("moonloader\\BankHelper\\Settings\\ustav1.txt")
local ustav1 = io.open(ustav_read_file1, "r")
local ustav_text1 = ustav1:read("*a")
local ustav_read_file2 = string.format("moonloader\\BankHelper\\Settings\\ustav2.txt")
local ustav2 = io.open(ustav_read_file2, "r")
local ustav_text2 = ustav2:read("*a")
local ustav_read_file3 = string.format("moonloader\\BankHelper\\Settings\\ustav3.txt")
local ustav3 = io.open(ustav_read_file3, "r")
local ustav_text3 = ustav3:read("*a")
local ustav_read_file4 = string.format("moonloader\\BankHelper\\Settings\\ustav4.txt")
local ustav4 = io.open(ustav_read_file4, "r")
local ustav_text4 = ustav4:read("*a")

Помогите зациклить пж (сделать читабельным). Можно через любой цикл

math.random(min, max)
Lua:
local texts = {}
for i = 1, 4 do
    local file = io.open('moonloader\\BankHelper\\Settings\\ustav' .. i .. '.txt', 'r')
    texts[i] = file:read('*a')
    file:close()
end
 

S4ress

Новичок
5
0
Форматирование кода
Lua:
local texts = {}
for i = 1, 4 do
    local file = io.open('moonloader\\BankHelper\\Settings\\ustav' .. i .. '.txt', 'r')
    texts[i] = file:read('*a')
    file:close()
end
СПАСИБО, я делал так же, только забыл local texts = {}
Здрасте, может кто подсказать как сделать луа скрипт который в нужное место отыгровки будет вставлять ник игрока взятый из его id?
Пример:
[Прописываю команду активации]: /komanda id игрока с которым отыгрываешь.
[идёт отыгровка]: /do Пока ...Ник игрока... отвлекся, ...Свой ник... быстро достал пистолет из-за спины и...
[идёт отыгровка]: /do bla bla bla bla bla...

Или вот так:

[Прописываю команду активации]: /komanda id игрока с которым отыгрываешь.
[идёт отыгровка]: /do Пока ...Ник игрока... отвлекся, человек стоящий сзади него выхватил пистолет из-за спины и...
[идёт отыгровка]: /do bla bla bla bla bla...
В мейне пропиши
_, id = sampGetPlayerIdByCharHandle(PLAYER_PED)
nick = sampGetPlayerNickname(id)
sampRegisterChatCommand("komanda", cmd_komanda)
А позже вне мейна
function cmd_komanda(arg)
if type(tonumber(arg)) ~= 'number' then
sampAddChatMessage("Используйте {00FF00}/komanda [id]", -1)
else
lua_thread.create(function()
sampSendChat("/do Пока "..sampGetPlayerNickname(arg).." отвлекся, "..nick.." быстро достал пистолет из-за спины и..")
wait(2000) -- 2000 = 2 секунды
sampSendChat("/do бла бла бла")
end

Табуляцию сам поставишь
 
Последнее редактирование:

Double Tap Inside

Известный
Проверенный
1,916
1,267
Ну я думаю он сам поймёт, когда увидит Vasya_Pupkin[228][228].
для дрп я уже сделал отображение айди в чате (там где не хватает) в скрипте Big-Pig
Доброй ночи, вы бы не могли мне подсказать код функции генератора случайных чисел от N до N числа?
Буду благодарен)
math.random(A, B)

Дополнительно импортить math не надо, он вроде как встроен был.
 

tlwsn

Известный
537
86
Итак, нужна функа бесконечно бега.
Lua:
memory.setint8(0xB7CEE4, 1)
Как узнать ид игроков?
 

Dmitriy Makarov

25.05.2021
Проверенный
2,516
1,142
Можете кинуть код диалогового окна на ImgUi с выборами пунктов?
такое? они вниз открываются
38615