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

Rei

Известный
Друг
1,599
1,635
привет, подскажите, как из этого диалога !серверного! убрать ебучие новые дома дно зоны, они заебали просто уже, убрать нужно 1054 слетел и так далее
текст:
{FFFFFF}
1. Дом        Слетит через: {C9B931}1{FFFFFF} Payday.
2. Дом        Слетит через: {C9B931}1{FFFFFF} Payday.
3. Дом        Слетит через: {C9B931}3{FFFFFF} Payday.
4. Дом        Слетит через: {C9B931}6{FFFFFF} Payday.
5. Дом        ID: {C9B931}1054{FFFFFF}    [{A9FF14}Слетел{FFFFFF}]
6. Дом        ID: {C9B931}1055{FFFFFF}    [{A9FF14}Слетел{FFFFFF}]
7. Дом        ID: {C9B931}1056{FFFFFF}    [{A9FF14}Слетел{FFFFFF}]
8. Дом        ID: {C9B931}1057{FFFFFF}    [{A9FF14}Слетел{FFFFFF}]
9. Дом        ID: {C9B931}1058{FFFFFF}    [{A9FF14}Слетел{FFFFFF}]
10. Дом        ID: {C9B931}1059{FFFFFF}    [{A9FF14}Слетел{FFFFFF}]
11. Дом        ID: {C9B931}1060{FFFFFF}    [{A9FF14}Слетел{FFFFFF}]
12. Дом        ID: {C9B931}1061{FFFFFF}    [{A9FF14}Слетел{FFFFFF}]
13. Дом        ID: {C9B931}1062{FFFFFF}    [{A9FF14}Слетел{FFFFFF}]
14. Дом        ID: {C9B931}1063{FFFFFF}    [{A9FF14}Слетел{FFFFFF}]
15. Дом        ID: {C9B931}1064{FFFFFF}    [{A9FF14}Слетел{FFFFFF}]
16. Дом        ID: {C9B931}1065{FFFFFF}    [{A9FF14}Слетел{FFFFFF}]
17. Дом        ID: {C9B931}1066{FFFFFF}    [{A9FF14}Слетел{FFFFFF}]
18. Дом        ID: {C9B931}1067{FFFFFF}    [{A9FF14}Слетел{FFFFFF}]
19. Дом        ID: {C9B931}1068{FFFFFF}    [{A9FF14}Слетел{FFFFFF}]
Эта информация может быть {1EA3CC}ошибочной.{FFFFFF}

Используйте {1EA3CC}/findihouse ID{FFFFFF}, чтобы найти нужный вам дом. Стоимость {1EA3CC}1500$.{FFFFFF}
{FF5B14}ID{FFFFFF} дома отображается только у {FF5B14}слетевших{FFFFFF} домов!
Посмотреть вложение 62707
что-то типа этого
Lua:
for S in text:gmatch('[^\r\n]+') do
   if S:find('Слетел') then
      text = text:gsub(S, '')
   end
end
return text
 

Dmitriy Makarov

25.05.2021
Проверенный
2,486
1,117
Да "Ответ от Nick...."
Ну как варинт можно сделать типа "счётчик" и каждый раз при таком сообщении, прибавлять +1
Lua:
local answer = 0
local sampev= require 'lib.samp.events'


function sampev.onServerMessage(color, text)
    lua_thread.create(function() wait(10)
        if text:find("Ответ от (.+)") then
            answer = answer + 1
        end
    end)
end
Далее можно сохранять это в .txt файлик, но там гемор для тех, кто не знает inicfg (меня)
 

Rezistence

Участник
67
1
Ну как варинт можно сделать типа "счётчик" и каждый раз при таком сообщении, прибавлять +1
Lua:
local answer = 0
local sampev= require 'lib.samp.events'


function sampev.onServerMessage(color, text)
    lua_thread.create(function() wait(10)
        if text:find("Ответ от (.+)") then
            answer = answer + 1
        end
    end)
end
Далее можно сохранять это в .txt файлик, но там гемор для тех, кто не знает inicfg (меня)
Сохранение сделаю, но там пишет всех админов что они ответили, как сделать чтобы именно на юзера работало?
 
34
0
как сделать взаимодействие с пользователями этого же скрипта. Например сделать что-то типо рации которую видят только те у кого есть скрипт. Или например команду, написав которую у всех пользователей этого скрипта вылазит уведомление, например о каком-нибудь конкурсе.

В тот же пример можно взять МВДхелпер когда ты ставишь код патруля, и его видят все у кого есть скрипт.
Актуально
 

Dmitriy Makarov

25.05.2021
Проверенный
2,486
1,117
Сохранение сделаю, но там пишет всех админов что они ответили, как сделать чтобы именно на юзера работало?
Сделать проверку на ник?
Не уверен, конечно, но попробуй все-же
Lua:
if text:find("Ответ от "..sampGetPlayerNickname(select(2, sampGetPlayerIdByCharHandle(1)))) then
Там если не ошибаюсь нужен свой сервер и оплачивать его, чтобы провернуть такое
Тут чувак пытался библиотеку такую сделать
 

Dmitriy Makarov

25.05.2021
Проверенный
2,486
1,117
и как отправлять сообщения к себе в вк через группу. пробовал https://www.blast.hk/threads/13380/post-525379 но она у меня не работает. Скорей всего copas не та или что то в этой части.
Пробуй это.
Там конечно кода больше)
 

HpP

Известный
368
118
Если не прописан imgui.WindowFlags.NoMove, но я все равно не могу двигать imgui, с чем это может быть связано?
 

VyacheslavUA

Новичок
7
0
помоему делаешь что-то неправильно. какая у тебя задача?
Lua:
local height = getGroundZFor3dCoord(getCharCoordinates(PLAYER_PED))
    if height <= 350 then
        return "Минимальная"
    elseif height <= 450 and height >=351 then
        return "Ниже средней"
    elseif height <= 550 and height >= 451 then
        return "Средняя"
    elseif height <= 650 and height >= 551 then
        return "Выше среднее"
    else
        return "Максимальная"
    end
Задача считать высоту по dl машини и если она меншьше или равно 350 вертнуть то то, тоже самое если меньше или равно 450 и больше или равно 351 И ТД.
Проблема в том что считивает не то что нужно.Какая бы высота не была возвращает "Минимальная"
Возможно считивает не правльно.
Смею предположить что вместо cPos сщитивает sPos, но как пофиксить не знаю.
висота.jpg
 

Akionka

akionka.lua
Проверенный
742
500
Lua:
local height = getGroundZFor3dCoord(getCharCoordinates(PLAYER_PED))
    if height <= 350 then
        return "Минимальная"
    elseif height <= 450 and height >=351 then
        return "Ниже средней"
    elseif height <= 550 and height >= 451 then
        return "Средняя"
    elseif height <= 650 and height >= 551 then
        return "Выше среднее"
    else
        return "Максимальная"
    end
Задача считать высоту по dl машини и если она меншьше или равно 350 вертнуть то то, тоже самое если меньше или равно 450 и больше или равно 351 И ТД.
Проблема в том что считивает не то что нужно.Какая бы высота не была возвращает "Минимальная"
Возможно считивает не правльно.
Смею предположить что вместо cPos сщитивает sPos, но как пофиксить не знаю.
Посмотреть вложение 62714
функция, которую ты используешь, возвращает ближайшую координату Z земли для заданных координат XYZ.
чтобы получить координаты транспортного средства нужно воспользоваться функцией https://blast.hk/wiki/lua:getcarcoordinates
кстати, 350 это достаточно высоко, поэтому едва ли это можно назвать порогом минимальной высоты
 
У

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

Гость
как сделать проверку на сервер?
Lua:
function main()
--проверка на загрузку сампа
    local ip, port = sampGetCurrentServerAddress()
    if ip ~= 'ip без порта' then -- если ИП не равен ИП который ты введешь то
        thisScript():unload() -- выгружаем скрипт
    end
    while true do
        wait(0)
    end
end