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

Terratomorf

Известный
315
58
Lua:
setVirtualKeyDown(keyEmul, true) -- Эмулируем нажатие клавиши
setVirtualKeyDown(keyEmul, false) -- Эмулируем отжатие клавиши
Можешь показать как будет выглядеть готовый то у меня что-то не получается мне нужно чтоб он постоянно жал Numpad1
Пожалуйста
 
  • Нравится
Реакции: Siski

f0rtrix

Известный
208
15
Можно каким-то образом сбрасывать размер определенного окна в ImGui? То есть, там каждый раз, разный текст появляется, он разных размеров, и что бы при нажатии "ok", этот установленный размер сбрасывался и при повторном открытии окна оно автоматически подгонялось под новый текст. Надеюсь нормально объяснил
 

LinkelnAweil

Участник
122
7
Что нужно сделать, чтобы DrawBox показывался до определенного момента, потому, что используя renderDrawBox, бокс появляется на миллисекунды и исчезает?
 

mr.qldu

Известный
46
0
Хочу создать обработчик команды. При вводе команды "/pass id" в чат, программа должна отыграть рп паспорта, а потом показать паспорт. Меня интересует как получить "id" из этой команды.
 

Aniki

🐰
Администратор
1,225
1,506
Хочу создать обработчик команды. При вводе команды "/pass id" в чат, программа должна отыграть рп паспорта, а потом показать паспорт. Меня интересует как получить "id" из этой команды.
С одним аргументом все очень просто
Lua:
sampRegisterChatCommand('pass', pass)

function pass(id)
  if #id == 0 then --проверка на то, был ли введен ID или нет
    return false
  end
  lua_thread.create(function()
    sampSendChat('РП отыгровка')
    wait(1000)
    sampSendChat('/pass ' .. id)
  end)
end

Это самый простой вариант, по-хорошему надо еще делать проверку id, является ли это числом
 

f0rtrix

Известный
208
15
Lua:
   function test(id)
     local gid = string.match(id,"(%d+)")
     local _, id = sampGetPlayerIdByCharHandle(PLAYER_PED)
     if sampIsPlayerConnected(gid) and tonumber(gid) or gid == id then
Что тут не так? Почему когда я указываю свой id он просто отказывается что-то делать?
 

штейн

Известный
Проверенный
1,001
687
Lua:
'%s*(.+)'
В чем смысл %s*? Оно "съедает" твою команду и никуда не сейвает, поэтому флудит не то что нужно
а чем мне её заменить, мне нужно чтобы я мог писать и символы и цифры
 
Последнее редактирование:

f0rtrix

Известный
208
15
Как из строки, которая в чате появляется
Работа: Заместитель мэра | Организация и подразделение: Правительство / Мэрия Лас-Вентураса
Получать значения "Заместитель мэра" и "Правительства", при условии что значения могут меняться. Я знаю, что надо через EV.onServerMessage(color, msg), но как правильно именно значения получать?
Lua:
    if color == -1 and msg:find("Работа: ") then
           lua_thread.create(function()
           wait(1)
           local msg1 = u8:decode(msg)
           local msg2 = string.match(msg,"Работа:%s+(%d+)  |  Организация и подразделение:%s+(%d+) /%s+($d+))")
           -- Работа: Заместитель мэра  |  Организация и подразделение: Правительство / Мэрия Лас-Вентураса
       end)
   end
 

Gromov512

Новичок
85
2
Помогите сделать:

В файле будут лежать слова:
Первый
Второй
Третий
Четвёртый

Нужно взять первое слова, заюзать его и удалить из файла
Как так сделать ?
 

f0rtrix

Известный
208
15
Что тут не так? Суть такая... идет 1 отыгровка, далее спрашивается, была ли нажата кнопка F2, если была, то идет следующее, потом опять проверяет нажата ли F2, если еще раз нажата, то идет еще одна отыгровка. Я насочинял так:
Lua:
  -- тело
lua_thread.create(function()
  sampSendChat("Тест")
  wait(800)
  sampSendChat("Тес1т")
  wait(800)
  sampAddChatMessage("Подсказка! Нажмите F2 когда нада")
  if isKeyDown(VK_F2) then
    sampSendChat("Ты успешно нажал на F2")
    wait(800)
    sampSendChat("Ты успешно нажал на F2")
    wait(800)
    sampAddChatMessage("Подсказка! Нажмите F2 когда нада")
    if isKeyDown(VK_F2) then
      sampSendChat("Ты успешно повторно нажал на F2")
      wait(800)
      sampSendChat("Ты успешно повторно нажал на F2")
    end
  end
end)
  -- тело
Ну вот как то так... у меня ничего не работает.
 

#Northn

Police Helper «Reborn» — уже ШЕСТЬ лет!
Всефорумный модератор
2,634
2,482
Что тут не так? Суть такая... идет 1 отыгровка, далее спрашивается, была ли нажата кнопка F2, если была, то идет следующее, потом опять проверяет нажата ли F2, если еще раз нажата, то идет еще одна отыгровка. Я насочинял так:
Lua:
  -- тело
lua_thread.create(function()
  sampSendChat("Тест")
  wait(800)
  sampSendChat("Тес1т")
  wait(800)
  sampAddChatMessage("Подсказка! Нажмите F2 когда нада")
  if isKeyDown(VK_F2) then
    sampSendChat("Ты успешно нажал на F2")
    wait(800)
    sampSendChat("Ты успешно нажал на F2")
    wait(800)
    sampAddChatMessage("Подсказка! Нажмите F2 когда нада")
    if isKeyDown(VK_F2) then
      sampSendChat("Ты успешно повторно нажал на F2")
      wait(800)
      sampSendChat("Ты успешно повторно нажал на F2")
    end
  end
end)
  -- тело
Ну вот как то так... у меня ничего не работает.

Lua:
lua_thread.create(function()
  sampSendChat("Тест")
  wait(800)
  sampSendChat("Тес1т")
  wait(800)
  sampAddChatMessage("Подсказка! Нажмите F2 когда нада")
  while not isKeyDown(VK_F2) do wait(0) end
  sampSendChat("Ты успешно нажал на F2")
  wait(800)
  sampSendChat("Ты успешно нажал на F2")
  wait(800)
  sampAddChatMessage("Подсказка! Нажмите F2 когда нада")
  while not isKeyDown(VK_F2) do wait(0) end
  sampSendChat("Ты успешно повторно нажал на F2")
  wait(800)
  sampSendChat("Ты успешно повторно нажал на F2")
end)

-------------------------

Как из строки, которая в чате появляется
Работа: Заместитель мэра | Организация и подразделение: Правительство / Мэрия Лас-Вентураса
Получать значения "Заместитель мэра" и "Правительства", при условии что значения могут меняться. Я знаю, что надо через EV.onServerMessage(color, msg), но как правильно именно значения получать?
Lua:
    if color == -1 and msg:find("Работа: ") then
           lua_thread.create(function()
           wait(1)
           local msg1 = u8:decode(msg)
           local msg2 = string.match(msg,"Работа:%s+(%d+)  |  Организация и подразделение:%s+(%d+) /%s+($d+))")
           -- Работа: Заместитель мэра  |  Организация и подразделение: Правительство / Мэрия Лас-Вентураса
       end)
   end
Lua:
local sampev = require 'lib.samp.events'

function sampev.onServerMessage(color, text)
  if text:find('Работа: .+ | Организация и подразделение: .+') then
    local rank, fraction = text:match('Работа: (.+) | Организация и подразделение: (.+)')
    print(rank)
    print(fraction)
  end
end

Если не поможет - кидай строку ПРЯМО ИЗ ЧАТЛОГА
 
Последнее редактирование:
  • Нравится
Реакции: f0rtrix