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

McLore

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


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

danywa

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

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,932
1,303
К сожалению, нет. Мне нужно правильное написание строчки выше (Хрень в звездочках), чтобы присвоить переменной значение 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
50
Приветствую.
Мне нужна /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,466
2,383
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,932
1,303
Посмотреть вложение 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,466
2,383
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
 
У

Удалённый пользователь 405536

Гость
Попытка не обвенчалась успехом

Все равно -1
Держи пример
Lua:
require 'lib.moonloader'
function main()
    if not isSampfuncsLoaded() or not isSampLoaded() then return end
    while not isSampAvailable() do wait(100) end
    res, id = sampGetPlayerIdByCharHandle(playerPed)
    if res then
        nick = sampGetPlayerNickname(id)
        nick = nick:gsub('_', ' ')
        sampAddChatMessage('{FF0000}[SH] {FF8C00}Добро пожаловать '..nick..'['..id..']', 0xFFFF0000)
    end
    while true do
        wait(0)
    end
end
 
  • Ха-ха
Реакции: Shinodaaa

Bernardoooo!

Известный
98
13
Lua:
function main()
    repeat wait(0) until isSampAvailable()
    wait(2000)
    sampRegisterChatCommand('/dsign', newfuncs)
    wait(-1)
end

function newfuncs()
        local veh = storeCarCharIsInNoSave(PLAYER_PED)
        local _, vehid = sampGetVehicleIdByCarHandle(veh)
         sampAddChatMessage('{CEC0CC}[{FF00D6}AUTO DSIGN:{CEC0CC}]{00DD00}CALLSIGN удалён с автомобиля: {D9D4D9}..veh..', -1)
         sampSendChat("/dsign '..veh..'")
end
В чём проблема сего говнокода? Почему в dsign не вводится айди транспорта?