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

Mr_Incognito

Активный
331
50
-1 - это первый параметр сообщения, цвет. Символы могут быть перекрашены в самой строке при помощи цвета, но подается он в шестнадцатеричном формате, к примеру, FFFFFF - белый цвет. В первый параметр можно было бы подавать цвет, но в uint-формат некогда было переводить.
Я уже голову сломал, скажи, что я не так делаю? Не меняет нихрена цвет.
Lua:
local sampev = require "lib.samp.events"

function sampev.onServerMessage(color, text)
    print(color)
    if color == -1178486529 then
        return {FFFFFF, "{5A90CE}" .. text}
    end
end
 

savvin

Известный
407
140
Я уже голову сломал, скажи, что я не так делаю? Не меняет нихрена цвет.
Lua:
local sampev = require "lib.samp.events"

function sampev.onServerMessage(color, text)
    print(color)
    if color == -1178486529 then
        return {FFFFFF, "{5A90CE}" .. text}
    end
end
Цвета в сампе используют RGB. return {0xFFFFFF, "{5A90CE}" .. text}
 

Mr_Incognito

Активный
331
50
0xFFFFFFFF попробуй
либо у тебя не правильный цвет указан в проверке
Попробовал - не работает.
Цвет правильный, я проверял вот так:
Lua:
if color == -1178486529 then
    sampSendChat("Fam message!")
end
Плюс еще добавлял цвет объявлений, каждый раз срабатывало, значит цвета правильные.

Я может глупость скажу, но вот return типа возвращает значение и выводит? Или только возвращает? Может вывод где то прописать надо?
 

Vespan

loneliness
Проверенный
2,105
1,639
Как вывести всех id(которые на сервере),и через id получить ники(всех игроков на сервере) в sampAddChatMessage?
 

Kalgon

Новичок
9
1
Почему-то не работает :(
Lua:
function main()
        if text:find("Лол Кек") then
        return false
        sampAddChatMessage("Lol Kek", 0xa9c4e4)
    end
end
 

BARRY BRADLEY

Известный
711
176
Lua:
   for i = 0, sampGetMaxPlayerId(true) do
        if sampIsPlayerConnected(i) and not sampIsPlayerNpc(i) then
            sampAddChatMessage(sampGetPlayerNickname(i), -1)
        end
    end
А чтоб получить всех сразу, то заноси в массив и выводи его.
Как вывести всех id(которые на сервере),и через id получить ники(всех игроков на сервере) в sampAddChatMessage?
 
  • Нравится
Реакции: Vespan

Dmitriy Makarov

25.05.2021
Проверенный
2,481
1,113
Почему-то не работает :(
Lua:
function main()
        if text:find("Лол Кек") then
        return false
        sampAddChatMessage("Lol Kek", 0xa9c4e4)
    end
end
Lua:
local sampev = require 'lib.samp.events' -- В начало скрипта

-- Отдельная функция
function sampev.onServerMessage(color, text)
    if text:find("Твой текст") then
    -- code
    end
end
 

Vespan

loneliness
Проверенный
2,105
1,639
Не закрываеться TAB
Lua:
   if wasKeyPressed(key.VK_TAB) then
            sampToggleScoreboard(false)
                tab.v = true
    end
 

CaptainAsmonel

Потрачен
18
54
Обратите внимание, пользователь заблокирован на форуме. Не рекомендуется проводить сделки.
Не закрываеться TAB
Lua:
   if wasKeyPressed(key.VK_TAB) then
            sampToggleScoreboard(false)
                tab.v = true
    end
а в чем как бы нахуй прикол кодом через таб закрывать таб когда он и так закрывается через таб?????
 
  • Нравится
Реакции: atizoff
D

deleted-user-164854

Гость
Нужна помощь с фиксом ChatID`a. Данная ошибка имеется во всех подобных скриптах. Вот код:
Lua:
local _, playerID = sampGetPlayerIdByCharHandle(PLAYER_PED)
for i = 0, sampGetMaxPlayerId(false) do
  if sampIsPlayerConnected(i) or i == playerID then
     local pNickForChatID = sampGetPlayerNickname(i)
     SERVER_MESSAGE = SERVER_MESSAGE:gsub(pNickForChatID, pNickForChatID.."["..i.."]")
  end
end
Как сделать, что бы замена происходила только тогда, когда после pNickForChatID нет других англ букв, так как бывают ситуации по типу Player_Nick - с идом на сервере 1 и Player_Nickname со 2м идом и в итоге оба заменяются на Player_Nick[1] и Player_Nick[2]name
 

Sorok

Новичок
19
3
Здравствуйте, я решил с AHK пересесть на moonloader и тут у меня образовалась проблемка.
У меня есть строка:
" Вы перевезли 9 тонн груза на сумму 12000 вирт". Из этой строки мне нужно достать 9 и 12000, а так же закинуть их в две разные переменные. Кто знает как сделать? Просьба написать код для чайников, дабы я со своими знаниями понял что к чему.

Как было сделано на AHK.
RegExMatch(line, "Вы разгрузили(.*)тонн(.*)за(.*)рублей", vsego):
"line" - строка из чата.
"Вы разгрузили(.*)тонн(.*)за(.*)рублей" - регулярное выражение.
"vsego" - переменная в которой находится кол-во тонн.
 
D

deleted-user-164854

Гость
Здравствуйте, я решил с AHK пересесть на moonloader и тут у меня образовалась проблемка.
У меня есть строка:
" Вы перевезли 9 тонн груза на сумму 12000 вирт". Из этой строки мне нужно достать 9 и 12000, а так же закинуть их в две разные переменные. Кто знает как сделать? Просьба написать код для чайников, дабы я со своими знаниями понял что к чему.

Как было сделано на AHK.
RegExMatch(line, "Вы разгрузили(.*)тонн(.*)за(.*)рублей", vsego)"Вы разгрузили(.*)тонн(.*)за(.*)рублей", vsego):
"line" - строка из чата.
"Вы разгрузили(.*)тонн(.*)за(.*)рублей" - регулярное выражение.
"vsego" - переменная в которой находится кол-во тонн.

Lua:
vsego, money = line:match("Вы перевезли (%d+) тонн груза на сумму (%d+) вирт")