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

Patrickkk

Участник
162
19
Lua:
function getAllInStream()
    lua_thread.create(function()
        local players = 0
        for id = 0, sampGetMaxPlayerId(true) do
            if sampIsPlayerConnected(id) and sampGetCharHandleBySampPlayerId(id) then
                wait(250)
                sampAddChatMessage(id, -1)
            end
        end
    end)
end
как ею пользоваться? попробовал вот так
Lua:
function te()
    keks = getAllInStream
    print(keks)
end

Вот что выводит
[ML] (script) testik: function: 0x06734828
 

штейн

Известный
Проверенный
1,001
687
как ею пользоваться? попробовал вот так
Lua:
function te()
    keks = getAllInStream
    print(keks)
end

Вот что выводит
[ML] (script) testik: function: 0x06734828

так и используй getAllInStream как функцию, зачем всё усложнять

возможно как-то сделать так, типа если сервер отбирает у тебя оружие (допустим как в анти +с), чтобы ган не забирало
 
Последнее редактирование модератором:

Bogach

Активный
558
27
Здравствуйте товарищи. Нужна помощь ваша.
Хочу сделать очистику данных по дате. Т.е, к примеру, вчера я наработал некую статистику, при спавне у меня должна произойти проверка на дату, если дата не совпадает с датой в конфиге, то происходит очистка данных.
Надеюсь понятно объяснил.
Lua:
function main()
    lua_thread.create(TimeExam)
    lua_thread.create(systemtime)
    while not isSampfuncsLoaded() or not isSampAvailable() do wait(1000) end
    repeat
    wait(0)
    until sampIsLocalPlayerSpawned()
    local _,myid = sampGetPlayerIdByCharHandle(PLAYER_PED)
   local Data = inicfg.load(Data,"Autoschool\\Autoschool.ini")
   local DateClearStats = Data.Settings.DateClear
   if DateClearStats == "" then
      DateClearStats = string.format("%s.%s.%s",Den,Mesyac,God)
      Data.Settings.DateClear = DateClearStats
      inicfg.save(Data,"Autoschool\\Autoschool.ini")
   else
      local NewDateClearStats = string.format("%s.%s.%s",Den,Mesyac,God)
      if DateClearStats ~= NewDateClearStats then
         DateClearStats = NewDateClearStats
         Data.Settings.Ekzamens = 0
         inicfg.save(Data,"Autoschool\\Autoschool.ini")
      end
   end
    sampRegisterChatCommand("as", ASMainMenu)
Но в игре появляется ошибка связанная с этой строчкой "Data.Settings.DateClear = DateClearStats", мол Data является nil, перенеся этот код в команду - все работает, но по команде мне не надо. Буду благодарен, если поможете.
 

Данекк

Известный
39
0
Добрый день, возник такой вопросик, можно ли как то сделать так что бы после смерти игрока его ник записывался в блокнот, а потом когда понадобиться что бы он искал такой ник в блакноте и если нашёл его делал какое либо действие.И так же, не помешало бы очищение этого блокнота после выключения скрипта
 

trefa

Известный
Всефорумный модератор
2,097
1,231
Добрый день, возник такой вопросик, можно ли как то сделать так что бы после смерти игрока его ник записывался в блокнот, а потом когда понадобиться что бы он искал такой ник в блакноте и если нашёл его делал какое либо действие.И так же, не помешало бы очищение этого блокнота после выключения скрипта
Можно

Здравствуйте товарищи. Нужна помощь ваша.
Хочу сделать очистику данных по дате. Т.е, к примеру, вчера я наработал некую статистику, при спавне у меня должна произойти проверка на дату, если дата не совпадает с датой в конфиге, то происходит очистка данных.
Надеюсь понятно объяснил.
Lua:
function main()
    lua_thread.create(TimeExam)
    lua_thread.create(systemtime)
    while not isSampfuncsLoaded() or not isSampAvailable() do wait(1000) end
    repeat
    wait(0)
    until sampIsLocalPlayerSpawned()
    local _,myid = sampGetPlayerIdByCharHandle(PLAYER_PED)
   local Data = inicfg.load(Data,"Autoschool\\Autoschool.ini")
   local DateClearStats = Data.Settings.DateClear
   if DateClearStats == "" then
      DateClearStats = string.format("%s.%s.%s",Den,Mesyac,God)
      Data.Settings.DateClear = DateClearStats
      inicfg.save(Data,"Autoschool\\Autoschool.ini")
   else
      local NewDateClearStats = string.format("%s.%s.%s",Den,Mesyac,God)
      if DateClearStats ~= NewDateClearStats then
         DateClearStats = NewDateClearStats
         Data.Settings.Ekzamens = 0
         inicfg.save(Data,"Autoschool\\Autoschool.ini")
      end
   end
    sampRegisterChatCommand("as", ASMainMenu)
Но в игре появляется ошибка связанная с этой строчкой "Data.Settings.DateClear = DateClearStats", мол Data является nil, перенеся этот код в команду - все работает, но по команде мне не надо. Буду благодарен, если поможете.
Lua:
local cfg = inicfg.load(nil,"Autoschool\\Autoschool.ini") -- загружаем конфиг
if cfg.Settings.DateClear ~= nil then -- проверяем есть ли вообще там дата
if cfg.Settings.DateClear ~= os.date('%x',os.time()) then -- если дата не равна той которая в конфиге
cfg.Settings.DateClear = os.date('%x',os.time())
cfg.Settings.Ekzamens = 0
inicfg.save(cfg,"Autoschool\\Autoschool.ini")
end
else -- если нету
cfg.Settings.DateClear = os.date('%x',os.time())
inicfg.save(cfg,"Autoschool\\Autoschool.ini")
end
 
Последнее редактирование:

Данекк

Известный
39
0
Добрый день, возник такой вопросик, можно ли как то сделать так что бы после смерти игрока его ник записывался в блокнот, а потом когда понадобиться что бы он искал такой ник в блакноте и если нашёл его делал какое либо действие.И так же, не помешало бы очищение этого блокнота после выключения скрипта
и если не сложно можно пример кода?
 

trefa

Известный
Всефорумный модератор
2,097
1,231
и если не сложно можно пример кода?
Нужен SAMP.lua
Lua:
local sampev = require 'lib.samp.events' -- в самое начало
player_death={} -- это тоже

function sampev.onPlayerDeath(id)
table.insert(player_death, sampGetPlayerNickname(id))
end
Все ники будут в таблице
Lua:
for _, val in ipairs(player_death) do
if string.find(val,find_name) then print("Успешно") -- Если в таблице нашёлся ник схожий с ником в переменной "find_name"
break
end
end
 
Последнее редактирование:
  • Нравится
Реакции: WebDim

checkdasound

Известный
Проверенный
963
406
Как я понял нельзя использовать в качестве чит-кода те, которые уже есть в игре, например HESOYAM, да?
 

Fomikus

Известный
Проверенный
472
341
Нужно вывести в чат координаты своего перса,
Lua:
--CODE--
local posX, posY, posZ = GetCoordinates()
        sampAddChatMessage(string.format(posX, posY, posZ), 0x40FF40)
enabled = true
--/CODE--
Как разделить переменные чтобы вывелись все три? (Выводит только X)
GetCoordinates работает, координаты переменные получают.
P.S. Буду рад скрипту/коду скрипта на lua, где при вводе команды будет выводить в чат 3 координаты своего перса
 

imring

Ride the Lightning
Всефорумный модератор
2,355
2,516
Нужно вывести в чат координаты своего перса,
Lua:
--CODE--
local posX, posY, posZ = GetCoordinates()
        sampAddChatMessage(string.format(posX, posY, posZ), 0x40FF40)
enabled = true
--/CODE--
Как разделить переменные чтобы вывелись все три? (Выводит только X)
GetCoordinates работает, координаты переменные получают.
P.S. Буду рад скрипту/коду скрипта на lua, где при вводе команды будет выводить в чат 3 координаты своего перса
1-ый вариант:
Lua:
sampAddChatMessage(tostring(posX)..' '..tostring(posY)..' '..tostring(posZ)), 0x40FF40)
2-ой вариант:
Lua:
sampAddChatMessage(('%.2f %.2f %.2f'):format(posX, posY, posZ), 0x40FF40)
 

checkdasound

Известный
Проверенный
963
406
Взял адреса памяти из Mix Sets (Junior_Djjr).
Lua:
function main()
    DisaCheatsInSAMP()
    while true do
        wait(0)
        if testCheat('LXGIWYL') then
            sampAddChatMessage('Ну юзнул ты читкод, и что с того?', 0xFFFFFF)
        end
    end
end

function DisaCheatsInSAMP()
    local memory = require 'memory'
    memory.write(0x4384D0, 2, 37008, true)
    memory.write(0x4384D2, 1, 144, true)
    memory.write(0x4384D3, 1, 233, true)
    memory.write(0x4384D4, 4, 20, true)
end
Это выключает вообще все встроенные читы?
 

Fomikus

Известный
Проверенный
472
341
1-ый вариант:
Lua:
sampAddChatMessage(tostring(posX)..' '..tostring(posY)..' '..tostring(posZ)), 0x40FF40)
2-ой вариант:
Lua:
sampAddChatMessage(('%.2f %.2f %.2f'):format(posX, posY, posZ), 0x40FF40)
Еще 1 глупый вопрос, как активацию по нажатию кнопки сделать? (В луа слаб очень)