Вопросы по 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
как сделать так ?
/pass [указал свой ид] , делает действие и показывает , если указал другого игрока - то другое действие, но проверяет подключен ли другой игрок в игре
Lua:
  sampRegisterChatCommand('pass', function(params)
    local id = tonumber(params:match('(%d+)'))
    if id == nil then
      print('Не указан ID')
      return
    end
    local res, lID = sampGetPlayerIdByCharHandle(PLAYER_PED)
    if res and id == lID then
      sampSendChat('/pass '..id)
    else
      local res = sampIsPlayerConnected(id)
      if res then
        print('Другое действие')
      else
        print('Игрок '..id..' не подключен.')
      end
    end
  end)
 

liwgvnqsok

Потрачен
227
125
Обратите внимание, пользователь заблокирован на форуме. Не рекомендуется проводить сделки.
как сделать, что бы один процесс в имгуи сразу выводился на экран, а второй процесс нет?
Проверку сделай элементарную
if ti_chto_to_sdelal or drugoy_process_neaktiven then
--[[ <<-->> ]]
end
 

#Rewzeisch

Известный
121
10
@#Northn
Привет, Андрей нужна твоя помощь в интеграции чата в скрипт (Mafia Tools)

Можешь объяснить как вообще у тебя эта система работает?
 

tlwsn

Известный
537
85
как проверить, подключен ли локальный игрок к серверу?
 
7
0
Доброго ребята! Кто может помочь с drawbar ? Точнее быть он отрисовуется но не могу добавить на него позиционирования за курсором мышки через lua_thread.create_suspended
 

Tranzit

Известный
269
154
У меня есть вх на конкретнкую фаму. Скрипт видит 3Д Текст с фамой и показывает на человеке, на котором закреплен 3д текст кости. Так же показывает эту фаму. Но почему-то я не могу сделать, чтоб показывался ник. Делал через
Код:
function nameTagOn()
    local pStSet = sampGetServerSettingsPtr();
    NTdist = mem.getfloat(pStSet + 39)
    NTwalls = mem.getint8(pStSet + 47)
    NTshow = mem.getint8(pStSet + 56)
    mem.setfloat(pStSet + 39, 1488.0)
    mem.setint8(pStSet + 47, 0)
    mem.setint8(pStSet + 56, 1)
    nameTag = true
end
но ник показывается у всех. А мне нужно, чтоб скрипт работал по принципу: увидел закрепленный 3дтекст на челе - вх работает конкретно на него
 

Eugene Crabs

Активный
544
30
А можно ли как-то узнать дату последнего изменения txt файла с помощью Lua?
 

mails2k18

Участник
45
0
Приветствую, помогите пожалуйста.
У меня есть две функции, как сделать так, что если выбран чекбокс "Агент", то отыгровка будет автоматически заменена на такую:

Вообщем, суть в том, что функция должна подстраиваться под выбранный чекбокс и выдавать ту отыгровку, согласно какой чекбокс выбран...

Lua:
 sampSendChat ('/do Агент полиции ведёт за собой преступника.')
А если выбран чекбокс "Сотрудник полиции", то отыгровка /do будет такая:
Lua:
 sampSendChat ('/do Офицер полиции ведёт за собой преступника.')

Первая это выбор чекбокса:
Lua:
local one = imgui.ImBool(false)
local two = imgui.ImBool(false)

-- imgui

imgui.Checkbox(u8'Агент', one)
imgui.Checkbox(u8'Сотрудник полиции', two)
if one.v then
    two.v = false
elseif two.v then
    one.v = false
end

Вторая, это функция с отыгровкой:

Lua:
function cmd_follow(param)
local id = string.match(param, '(%d+)') -- Если в команде указано значение
    if #param == 0 then
        sampAddChatMessage('{1288E8}[#Mails scripts]: {ff1200}Системная ошибка: {FFFFFF}введите ID для взаимодействия с игроком [/follow ID]', main_color)
    else
        lua_thread.create(function() -- При использовании WAIT вне потока MAIN
        sampAddChatMessage('{1288E8}[#Mails scripts]: {FFFFFF} Вы потащили за собой преступника [/follow ID]', main_color)
        sampSendChat ('/me заломал руки нарушителю, после повёл его за собой')
        wait(1500)
        sampSendChat ('/follow '..id..'')
        wait(1500)
        sampSendChat ('/do Офицер полиции ведёт за собой преступника.')
        end) -- Конец потока WAIT вне MAIN
    end
end
 

tlwsn

Известный
537
85
пробовал, результат вот
1591529353630.png
 

McLore

Известный
559
279
Приветствую, помогите пожалуйста.
У меня есть две функции, как сделать так, что если выбран чекбокс "Агент", то отыгровка будет автоматически заменена на такую:

Вообщем, суть в том, что функция должна подстраиваться под выбранный чекбокс и выдавать ту отыгровку, согласно какой чекбокс выбран...

Lua:
 sampSendChat ('/do Агент полиции ведёт за собой преступника.')
А если выбран чекбокс "Сотрудник полиции", то отыгровка /do будет такая:
Lua:
 sampSendChat ('/do Офицер полиции ведёт за собой преступника.')

Первая это выбор чекбокса:
Lua:
local one = imgui.ImBool(false)
local two = imgui.ImBool(false)

-- imgui

imgui.Checkbox(u8'Агент', one)
imgui.Checkbox(u8'Сотрудник полиции', two)
if one.v then
    two.v = false
elseif two.v then
    one.v = false
end

Вторая, это функция с отыгровкой:

Lua:
function cmd_follow(param)
local id = string.match(param, '(%d+)') -- Если в команде указано значение
    if #param == 0 then
        sampAddChatMessage('{1288E8}[#Mails scripts]: {ff1200}Системная ошибка: {FFFFFF}введите ID для взаимодействия с игроком [/follow ID]', main_color)
    else
        lua_thread.create(function() -- При использовании WAIT вне потока MAIN
        sampAddChatMessage('{1288E8}[#Mails scripts]: {FFFFFF} Вы потащили за собой преступника [/follow ID]', main_color)
        sampSendChat ('/me заломал руки нарушителю, после повёл его за собой')
        wait(1500)
        sampSendChat ('/follow '..id..'')
        wait(1500)
        sampSendChat ('/do Офицер полиции ведёт за собой преступника.')
        end) -- Конец потока WAIT вне MAIN
    end
end
Код:
function cmd_follow(param)

local id = string.match(param, '(%d+)') -- Если в команде указано значение
    if #param == 0 then
        sampAddChatMessage('{1288E8}[#Mails scripts]: {ff1200}Системная ошибка: {FFFFFF}введите ID для взаимодействия с игроком [/follow ID]', main_color)
    else
        lua_thread.create(function() -- При использовании WAIT вне потока MAIN
        sampAddChatMessage('{1288E8}[#Mails scripts]: {FFFFFF} Вы потащили за собой преступника [/follow ID]', main_color)
        sampSendChat ('/me заломал руки нарушителю, после повёл его за собой')
        wait(1500)
        sampSendChat ('/follow '..id..'')
        wait(1500)
        if one.v then
            sampSendChat ('/do Офицер полиции ведёт за собой преступника.')
        end
        if two.v then
            sampSendChat ('/do Агент полиции ведёт за собой преступника.')
        end
        -- ну или юзай else как тебе удобнее
        end) -- Конец потока WAIT вне MAIN
    end
end
 
  • Нравится
Реакции: mails2k18