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

CatKnight

Известный
148
54
Можно ли визуально скрыть диалог при этом не закрывая его?
Если можно, то покажите, пожалуйста, пример.
Альтернатива: через событие onShowDialog "ловишь" нужный диалог, делая проверку по его ид, например, а после возвращаешь ложное значение. Сервер будет считать, что диалог открыт, но у тебя он не будет отображаться. При этом ты сможешь отправить ответ на этот диалог через sampSendDialogResponse (или другой пакет, не так важно), пока ты не схватил другой серверный диалог. Для всего выше требуется SAMP.lua.

Намного практичнее, ИМХО.

Пример:
Lua:
local sampev = require 'lib.samp.events';
function sampev.onShowDialog(dialogid, style, caption, button1, button2, text)
   if dialogid == 1337 then
      return false;
   end;
end;
 
Последнее редактирование:
  • Нравится
Реакции: SXN7R

Frapsy

Известный
Проверенный
393
226
Такс, допустим я делаю чекер на чс по никам, и делаю загрузку со страницы с чсом на форуме. Вся шняга в том, что итоговый файл содержит в себе много мусора в виде html тегов, чистить которые все гемморно. Как можно более грамотно реализовать? Пример нужной строки с ником ЧСника(независимо от прочего html кода) вот:
HTML:
<b><i><b><i><b><i><b><i><b>Nick_Name</b> - <b>Причина</b></i></b></i></b></i></b></i></b><br />
Нужно чтобы в итоге было "Nickname - Причина"
Я бы мог заменить тупо повырезать все <i>, <br>, да, но есть еще теги смены шрифтов, шрифты разные, размеры разные и под каждый момент чистить это дело - геммор. Варианты?
 

imring

Ride the Lightning
Всефорумный модератор
2,355
2,516
Вся шняга в том, что итоговый файл содержит в себе много мусора в виде html тегов, чистить которые все гемморно
а че
Lua:
a = '<b><i><b><i><b><i><b><i><b>Nick_Name</b> - <b>Причина</b></i></b></i></b></i></b></i></b><br />'
a = a:gsub('<.->', '')
-- теперь текст Nick_Name - Причина
 
  • Нравится
Реакции: Frapsy

SAMP.ASI

Известный
223
53
Как делать что либо при нахождении в начале строки например "Гос. новости" синего цвета?
 

f0rtrix

Известный
208
15
Всем здарова, такой вопрос, как избавиться от того, что если при использовании команды, на пример /test, я оставлю вместо {id}, который нужно указать пробел и у меня идет выполнение следущих действий и в итоге у меня выбирает id 0.
Lua:
function test(pID)
    if pID == nil then
        sampAddChatMessage("{4682B4} Используйте команду {FFFC18}/test {800000}[id]", -1)
    return
    end
    if sampIsPlayerConnected(pID) and pID ~= nil then
            name = sampGetPlayerNickname(pID)
            sampAddChatMessage("{4682B4} Вы выбрали человека с ником{800000} " ..name)
    end
end
При таком коде, если я пишу /test *пробел* и нажимаю enter, то у меня выбирает 0 ID, а не пишет
Lua:
 sampAddChatMessage("{4682B4} Используйте команду {FFFC18}/test {800000}[id]", -1)
как исправить?
 

imring

Ride the Lightning
Всефорумный модератор
2,355
2,516
Как увеличить текущую скорость кара в X раз?
Lua:
applyForceToCar(Vehicle car, float vecX, float vecY, float vecZ, float rotationX, float rotationY, float rotationZ)  -- 07D5
Всем здарова, такой вопрос, как избавиться от того, что если при использовании команды, на пример /test, я оставлю вместо {id}, который нужно указать пробел и у меня идет выполнение следущих действий и в итоге у меня выбирает id 0.
Lua:
function test(pID)
    if pID == nil then
        sampAddChatMessage("{4682B4} Используйте команду {FFFC18}/test {800000}[id]", -1)
    return
    end
    if sampIsPlayerConnected(pID) and pID ~= nil then
            name = sampGetPlayerNickname(pID)
            sampAddChatMessage("{4682B4} Вы выбрали человека с ником{800000} " ..name)
    end
end
При таком коде, если я пишу /test *пробел* и нажимаю enter, то у меня выбирает 0 ID, а не пишет
Lua:
 sampAddChatMessage("{4682B4} Используйте команду {FFFC18}/test {800000}[id]", -1)
как исправить?
Lua:
function test(pID)
    if tonumber(pID) then
        if sampIsPlayerConnected(pID)
            name = sampGetPlayerNickname(pID)
            sampAddChatMessage("{4682B4} Вы выбрали человека с ником{800000} " ..name)
        end
    else sampAddChatMessage("{4682B4} Используйте команду {FFFC18}/test {800000}[id]", -1) end
end
 

Ethan Night

Новичок
27
0
Тег в .ini показывает только для /f. Лекции не запускаются, а там где доклады и "..surnam" - скрипт вылетает. Помогите исправить
 

Вложения

  • MoDHelper.lua
    10.4 KB · Просмотры: 11

imring

Ride the Lightning
Всефорумный модератор
2,355
2,516
Тег в .ini показывает только для /f. Лекции не запускаются, а там где доклады и "..surnam" - скрипт вылетает. Помогите исправить
Lua:
local inicfg = require 'inicfg'
local set = inicfg.load({
tagr = {
tagr = "TAG"
}
})
local inicfg = require 'inicfg'
local set = inicfg.load({
tagf = {
tagf = "TAG"
}
})
замени на:
Lua:
local inicfg = require 'inicfg'
local set = inicfg.load({
    tags = {
        tagf = "TAG",
        tagr = "TAG"
    }
})
 

Frapsy

Известный
Проверенный
393
226
Трабл при очистке файла от мусора в виде html тегов:
Lua:
    downloadUrlToFile('ссылка', getWorkingDirectory() .. '/blacklist.txt', function(id, status, p1, p2)
        if status == dlstatus.STATUS_ENDDOWNLOADDATA then
            lua_thread.create(function()
                wait(500)
                local blackList = io.open(getWorkingDirectory() .. '/blacklist.txt', 'wb')
                local blackF = blackList:read('*a')
                blackF = blackF:gsub('<.->', '')
                blackList:write(blackF)
                blackList:close()
                print("[Blacklist] upd ok")
            end)
        end
    end)

При открытии файла blackList выдает за nil, хотя файлик содержит в себе скачанную страницу.