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

Domino

Участник
326
15
Как сделать, чтобы после этого ....

Lua:
sampSendChat("/prestige")
wait(5)
sampSendDialogResponse(32700, 1, 1, "")
sampSendDialogResponse(32700, 1, 0, "")
sampSendDialogResponse(32700, 1, 2, "")
закрывалось серверное диалоговое окно
 

dmitri4

Известный
452
79
Как сделать, чтобы после этого ....

Lua:
sampSendChat("/prestige")
wait(5)
sampSendDialogResponse(32700, 1, 1, "")
sampSendDialogResponse(32700, 1, 0, "")
sampSendDialogResponse(32700, 1, 2, "")
закрывалось серверное диалоговое окно
лучше проверяй существование диалога через onShowDialog ибо с твоей задержкой окно даже не успевает появится а ты уже что то с ним делаешь
 

#RCoffiano

Участник
19
2
Пацаны,кто шарит,возможно как-то сделать чтоб луа смотрел чат лог и после определённой строчки вводило команду,сделал такое в ахк(т.к шарю,а как сделать в lua не знаю,но нужно в ЛУА)
Код:
way = %A_MyDocuments%\GTA San Andreas User Files\SAMP\chatlog.txt
FileDelete, %way%
Loop
{
FileRead, file, %way%
IfInString, file, Одобрить Y (/y), отказать N (/n)
{
AddChatMessage("{FF0000}[AutoHotKey bo RCoffiano]:{FFFFFF}Наказание выдано!  ")
Send, {F6}/y{Enter}
FileDelete, %way%
Только в данном случае,оно вводит само в чат,так сказать,нажимает на клавиши и вводит.А SendChat который сам вставляет и не перебивает если пишу,не будет работать,крашит.
 

FYS

Потрачен
982
236
Обратите внимание, пользователь заблокирован на форуме. Не рекомендуется проводить сделки.
Пацаны,кто шарит,возможно как-то сделать чтоб луа смотрел чат лог и после определённой строчки вводило команду,сделал такое в ахк(т.к шарю,а как сделать в lua не знаю,но нужно в ЛУА)
Код:
way = %A_MyDocuments%\GTA San Andreas User Files\SAMP\chatlog.txt
FileDelete, %way%
Loop
{
FileRead, file, %way%
IfInString, file, Одобрить Y (/y), отказать N (/n)
{
AddChatMessage("{FF0000}[AutoHotKey bo RCoffiano]:{FFFFFF}Наказание выдано!  ")
Send, {F6}/y{Enter}
FileDelete, %way%
Только в данном случае,оно вводит само в чат,так сказать,нажимает на клавиши и вводит.А SendChat который сам вставляет и не перебивает если пишу,не будет работать,крашит.
хукать сообщения чата
 

BIG BOG

Известный
654
141
Как мне разделить значения записанные в переменную?например у меня n == "a b c", как мне a b c записать в три переменные?
 

qwertttwerew

Новичок
1
0
Пацаны, как сделать, чтобы в чат писало "Добро пожаловать в наш гей клуб! Располагайтесь по удобнее". Куда код этот вставлять?
 

trefa

Известный
Всефорумный модератор
2,097
1,231
Пацаны, как сделать, чтобы в чат писало "Добро пожаловать в наш гей клуб! Располагайтесь по удобнее". Куда код этот вставлять?
Текст когда должен появляться? Я тебе ванга чтоль?

Как мне разделить значения записанные в переменную?например у меня n == "a b c", как мне a b c записать в три переменные?
Код:
print("1 2 3":match("(%d+)%s+(%d+)%s+(%d+)"))

Как получить цвет ника(nametag)?
Учись искать через вики, ибо каждому тут не будут скидывать функции.

У нас нас тринити, если не сделаешь закрытие диалога через sampCloseCurrentDialogWithButton(0) будет писать на подобии "закройте диалоговые окна". Особенно это заметно, когда несколько диалогов перебираешь. Поэтому всегда его использую при нопе диалога (не знаю, как обстоит с этим на других серверах).
Зачем закрывать физически диалог, если можно отправить RPC о том что ты закрыл уже диалог, а не делать костыли.
 
Последнее редактирование:

DolgorukovGTA

Известный
Проверенный
652
345
Зачем закрывать физически диалог, если можно отправить RPC о том что ты закрыл уже диалог, а не делать костыли.
Это не костыль, а способ решения. Со стороны сервера какая-то система на проверку диалога стоит. Если как-то невалидно закрыть диалог - тебе будет появляться это сообщение, а то и вообще кикнет. Поэтому закрывать нужно респонсом, закрытием и отклонением пакета (если не хочешь, чтобы диалог показывался). Если не играл на тринити, то ты не поймешь, о чём я тебе говорю.
 

astynk

Известный
Проверенный
742
530
Это не костыль, а способ решения. Со стороны сервера какая-то система на проверку диалога стоит. Если как-то невалидно закрыть диалог - тебе будет появляться это сообщение, а то и вообще кикнет. Поэтому закрывать нужно респонсом, закрытием и отклонением пакета (если не хочешь, чтобы диалог показывался). Если не играл на тринити, то ты не поймешь, о чём я тебе говорю.
При return false сервер все равно будет считать, что диалог открыт.
Кикает за попытки отправить несуществующий item/button/слишком длинный инпут.
 

savvin

Известный
407
140
пацаны вопрос как в этом диалоговом окне сервера оставить только дом слетит через столько,а чтобы эти надписи 1054 слетел убрать?Посмотреть вложение 38103
Перехватить RPC входящего диалога и не показывать его, а вместо него можно изменить текст в нем текст и отправить уже свой диалог
Не знаю как точно будет работать, дальше не продумывал

Lua:
local sampev = require 'lib.samp.events'

function sampev.onShowDialog(dialogId, style, title, button1, button2, text)
    if dialogId == --[[напишешь свой ид]] and string.find('Дом') then
        text = string.gsub(text, '%d+.%sID:%s%{......%}%d+%s%[%{......%}Слетел{......}]', '')
        sampShowDialog(dialogId, title, text, button1, button2, style)
    end
end
 

TheRuthArbiter

Неповторимый РПшер
Проверенный
523
305
Перехватить RPC входящего диалога и не показывать его, а вместо него можно изменить текст в нем текст и отправить уже свой диалог
Не знаю как точно будет работать, дальше не продумывал

Lua:
local sampev = require 'lib.samp.events'

function sampev.onShowDialog(dialogId, style, title, button1, button2, text)
    if dialogId == --[[напишешь свой ид]] and string.find('Дом') then
        text = string.gsub(text, '%d+.%sID:%s%{......%}%d+%s%[%{......%}Слетел{......}]', '')
        sampShowDialog(dialogId, title, text, button1, button2, style)
    end
end
Вот это перезапись диалога. Зачем создавать диалог, когда можно через return?
 
  • Нравится
Реакции: ГОХА | GoxaShow

ГОХА | GoxaShow

В АРМИИ С 12.12,ЗАКАЗЫ НЕ ДЕЛАЮ,ТУПЫЕ ВОПРОСЫ-НАХУ
Проверенный
1,866
1,866
привет, подскажите, как из этого диалога !серверного! убрать ебучие новые дома дно зоны, они заебали просто уже, убрать нужно 1054 слетел и так далее
38105

кому нужен текст диалога
Код:
{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} домов!