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

CaJlaT

Овощ
Модератор
2,806
2,609
Не реагирует,реагирует только на отправленные мной сообщения
Какой текст тебе нужен? Оно реагирует на все СЕРВЕРНЫЕ сообщения. Твои тоже серверные, ибо ты кидаешь сообщение, серв его обрабатывает и отсылает тебе же
Посмотреть вложение 53973


как сделать чтобы lua скрипт вызвал textdraw в котором будут все госки ([10:04:54] Гос. новости: Nick_Name[id]:)
 

McLore

Известный
559
279
Не реагирует,реагирует только на отправленные мной сообщения
Ну так возьми чей то lua и посмотри что и как работает
Посмотреть вложение 53973


как сделать чтобы lua скрипт вызвал textdraw в котором будут все госки ([10:04:54] Гос. новости: Nick_Name[id]:)
Через регулярку берешь что тебе нужно и выводишь текстдравом
 
Последнее редактирование:

danywa

Активный
358
49
А есть ли вообще тема или хоть что-то о взаимодействии луа с иникфг?Если есть можно ссылку пожалуйста
 

Eugene Crabs

Активный
544
30
Ребят, вопрос. Есть текст в стринг формате. Мне нужно взять этот текст и в своем коде вызвать переменную, название которой соответствует этому тексту. Как это сделать?

Lua:
local QWER = "POLAS"
--             /|\
--                        Значение переменной QWER
local POLAS = 1
--     /|\
--    Переменная, соответствующая значению переменной QWER

*Вызываем переменную, которая соответствует значению переменной QWER т.е. в данном случае переменную POLAS* = 2  -- Мне нужно правильное написание этой строчки
sampAddChatMessage(POLAS, -1)

-- Должен выдать в чате 2

p.s. Я уже хрен знает как проще объяснить
 

Eugene Crabs

Активный
544
30
Lua:
local QWER = "POLAS"
--             /|\
--                        Значение переменной QWER
local POLAS = 1
--     /|\
--    Переменная, соответствующая значению переменной QWER

*Вызываем переменную, которая соответствует значению переменной QWER т.е. в данном случае переменную POLAS* = 2  -- Мне нужно правильное написание этой строчки
sampAddChatMessage(QWER"_"..POLAS, -1)

-- Должен выдать в чате 2
такое?
К сожалению, нет. Мне нужно правильное написание строчки выше (Хрень в звездочках), чтобы присвоить переменной значение 2.
 

paulohardy

вы еще постите говно? тогда я иду к вам
Всефорумный модератор
1,891
1,254
К сожалению, нет. Мне нужно правильное написание строчки выше (Хрень в звездочках), чтобы присвоить переменной значение 2.
QWER = POLAS или что тебе надо?
как оно выведет два если там один и нет никаких математических примеров?
 

Kaspersss

Участник
32
1
Приветствую.
Мне нужна /cfind, команда.
Функция:
Прописываешь /cfind [До какого ранга], он тебе в локальный чат выводит всех отсутствующих сотрудников мэрии, то-есть чекает /find, проверяет кто есть в зоне прорисовки(мэрии), их не трогает, а кого не увидел скрипт в зоне прорисовки - пишет - /r Отсутствующие сотрудники:
*/r начинает перечислять всех, каждый сотрудник - новая строка*.
потом в конце - /r Ваше местоположение?

данный скрипт я сделал на АХК, но мне нужно на ЛУА, помогите с ЛУА, вот версия на ахк:

AutoHotKey:
else if RegExMatch(chatInput, "i)^\/cfind\b(.*)", var) {
if RegExMatch(var1,"^(\s+|)$") or !RegExMatch(var1,"^ (?:\s+)?(\d+)(?:\s+)?$" , rang) {
addChatMessageEx("AAAAAA" , "/cfind [До какого ранга]")
Exit
}
lastRang := rang1
ArrayNotStreamPlayer := []
ArrayRangs := ["" , "" , "" , "" , "" , "" , "", "" , "" , ""]
SendChat("/find")
sleep 800
while !(isDialogOpen() && getDialogCaption() = "{ffff00}Члены организации онлайн")
continue
Loop
{
if not (string := getDialogLine(A_Index+3))
break
else RegExMatch(string, "\}(\d{1,3}).*\s(\d{1,2})\s+\d\/😔.*)", value)

if (getPlayerSkin(value1) = -1) and (value1 <> getId()) and (value2 <= lastRang)
{
if RegExMatch(value3,"\s+{ffa800}\[AFK: (.*)\]",timeAfk)
timeAfk := ""
else timeAfk := ""
ArrayNotStreamPlayer.Insert([value1,value2,timeAfk])
}
else if (value1 = getId())
myRang := value2
}
SendInput {Enter}
if (ArrayNotStreamPlayer.Length() = 0)
addChatMessageEx("FFFFFF","• {FFC800}[Подсказка] {FFFFFF}Все сотрудники на месте.")
else
{
addChatMessageEx("FFFFFF" , "Отсутствующие cотрудники:")
ArrayOutputForCfind(ArrayNotStreamPlayer,4)
SendChat("/me орлиным взглядом осмотрел всех сотрудников вокруг себя")
sleep 2200
SendChat("/me произвел расчёты, cопоставил данные")
sleep 1500
SendChat("/r Отсутствующие сотрудники:")
sleep 1500
For v, pair in ArrayNotStreamPlayer
{
ArrayRangsFuction(pair[2],ArrayRangs,position)
nickname := getPlayerName(pair[1])
if nickname
{
SendChat(position "/r " RegExReplace(nickname, "_", " ") pair[3])
sleep 1000
}
}
sleep 1000
SendChat("/r Ваше местоположение?")
}
}

ArrayOutputForCfind(Array,step)
{
stepLoop := 0
lengArray := Array.MaxIndex()
Loop
{
if lengArray > %step%
{
Loop % step
{
id := Array[A_Index + stepLoop][1]
outputlist .= getPlayerName(id) " [" id "]. "
}
lengArray := lengArray - step
addchatmessageEx("B8DBB8" , outputlist)
outputlist := ""
}
else
{
Loop % lengArray
{
id := Array[A_Index + stepLoop][1]
outputlist .= getPlayerName(id) " [" id "]. "
}
addchatmessageEx("B8DBB8" , outputlist)
outputlist := ""
break
}
stepLoop := stepLoop + step
}
}ArrayRangsFuction(rang , ArrayRangs , ByRef position)
{
For n, position in ArrayRangs
{
if (rang = n)
{
position := ArrayRangs[A_Index]
break
}
}
}
 

danywa

Активный
358
49
Приветствую.
Мне нужна /cfind, команда.
Функция:
Прописываешь /cfind [До какого ранга], он тебе в локальный чат выводит всех отсутствующих сотрудников мэрии, то-есть чекает /find, проверяет кто есть в зоне прорисовки(мэрии), их не трогает, а кого не увидел скрипт в зоне прорисовки - пишет - /r Отсутствующие сотрудники:
*/r начинает перечислять всех, каждый сотрудник - новая строка*.
потом в конце - /r Ваше местоположение?

данный скрипт я сделал на АХК, но мне нужно на ЛУА, помогите с ЛУА, вот версия на ахк:

AutoHotKey:
else if RegExMatch(chatInput, "i)^\/cfind\b(.*)", var) {
if RegExMatch(var1,"^(\s+|)$") or !RegExMatch(var1,"^ (?:\s+)?(\d+)(?:\s+)?$" , rang) {
addChatMessageEx("AAAAAA" , "/cfind [До какого ранга]")
Exit
}
lastRang := rang1
ArrayNotStreamPlayer := []
ArrayRangs := ["" , "" , "" , "" , "" , "" , "", "" , "" , ""]
SendChat("/find")
sleep 800
while !(isDialogOpen() && getDialogCaption() = "{ffff00}Члены организации онлайн")
continue
Loop
{
if not (string := getDialogLine(A_Index+3))
break
else RegExMatch(string, "\}(\d{1,3}).*\s(\d{1,2})\s+\d\/😔.*)", value)

if (getPlayerSkin(value1) = -1) and (value1 <> getId()) and (value2 <= lastRang)
{
if RegExMatch(value3,"\s+{ffa800}\[AFK: (.*)\]",timeAfk)
timeAfk := ""
else timeAfk := ""
ArrayNotStreamPlayer.Insert([value1,value2,timeAfk])
}
else if (value1 = getId())
myRang := value2
}
SendInput {Enter}
if (ArrayNotStreamPlayer.Length() = 0)
addChatMessageEx("FFFFFF","• {FFC800}[Подсказка] {FFFFFF}Все сотрудники на месте.")
else
{
addChatMessageEx("FFFFFF" , "Отсутствующие cотрудники:")
ArrayOutputForCfind(ArrayNotStreamPlayer,4)
SendChat("/me орлиным взглядом осмотрел всех сотрудников вокруг себя")
sleep 2200
SendChat("/me произвел расчёты, cопоставил данные")
sleep 1500
SendChat("/r Отсутствующие сотрудники:")
sleep 1500
For v, pair in ArrayNotStreamPlayer
{
ArrayRangsFuction(pair[2],ArrayRangs,position)
nickname := getPlayerName(pair[1])
if nickname
{
SendChat(position "/r " RegExReplace(nickname, "_", " ") pair[3])
sleep 1000
}
}
sleep 1000
SendChat("/r Ваше местоположение?")
}
}

ArrayOutputForCfind(Array,step)
{
stepLoop := 0
lengArray := Array.MaxIndex()
Loop
{
if lengArray > %step%
{
Loop % step
{
id := Array[A_Index + stepLoop][1]
outputlist .= getPlayerName(id) " [" id "]. "
}
lengArray := lengArray - step
addchatmessageEx("B8DBB8" , outputlist)
outputlist := ""
}
else
{
Loop % lengArray
{
id := Array[A_Index + stepLoop][1]
outputlist .= getPlayerName(id) " [" id "]. "
}
addchatmessageEx("B8DBB8" , outputlist)
outputlist := ""
break
}
stepLoop := stepLoop + step
}
}ArrayRangsFuction(rang , ArrayRangs , ByRef position)
{
For n, position in ArrayRangs
{
if (rang = n)
{
position := ArrayRangs[A_Index]
break
}
}
}
тебе в заказы/услуги
 

Fott

Простреленный
3,435
2,279
1587384967830.png
1587385004066.png

Чота я туплю и не вкуриваю чё оно берет -1 постоянно

Код:
require "lib.moonloader"
local samp = require 'samp.events'
local keys = require "vkeys"
active = false
 local _, myid = sampGetPlayerIdByCharHandle(PLAYER_PED)
 local  _, id = sampGetPlayerIdByCharHandle(ped)



function main()
    while not isSampAvailable() do wait(100) end

    

 while true do
 wait(0)
end
end
 
  function samp.onServerMessage(color, text)
      if text:find('тест') then
          sampAddChatMessage("Игрок с ID ".. id .." написал запрещенное слово", -1)
  end
end
 

paulohardy

вы еще постите говно? тогда я иду к вам
Всефорумный модератор
1,891
1,254
Посмотреть вложение 54002Посмотреть вложение 54003
Чота я туплю и не вкуриваю чё оно берет -1 постоянно

Код:
require "lib.moonloader"
local samp = require 'samp.events'
local keys = require "vkeys"
active = false
local _, myid = sampGetPlayerIdByCharHandle(PLAYER_PED)
local  _, id = sampGetPlayerIdByCharHandle(ped)



function main()
    while not isSampAvailable() do wait(100) end

   

while true do
wait(0)
end
end

  function samp.onServerMessage(color, text)
      if text:find('тест') then
          sampAddChatMessage("Игрок с ID ".. id .." написал запрещенное слово", -1)
  end
end
получаешь айди до инициализации сампа, вставь в мейн после while not isSampAvailable() do wait(100) end
 

Fott

Простреленный
3,435
2,279
Lua:
require "lib.moonloader"
local samp = require 'samp.events'
local keys = require "vkeys"
active = false
local _, myid = sampGetPlayerIdByCharHandle(PLAYER_PED)
local  _, id = sampGetPlayerIdByCharHandle(ped)



function main()
    while not isSampAvailable() do wait(100) end

   

while true do
     wait(0)
        id = sampGetPlayerIdByCharHandle(ped)
    end
end

  function samp.onServerMessage(color, text)
      if text:find('тест') then
          sampAddChatMessage("Игрок с ID ".. id .." написал запрещенное слово", -1)
  end
end
пробуй
Попытка не обвенчалась успехом
получаешь айди до инициализации сампа, вставь в мейн после while not isSampAvailable() do wait(100) end
Все равно -1