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

Roger Camillo

Известный
51
7
Ребят, помогите, как сделать такую фишку

Типо, чтобы из файла брало ник-неймы если я залью его на пастебин к примеру.
и типо if myNick == 'тут бы брались ники с пастебина' then и скрипт тогда работал
 

DeMoN3D

Известный
366
76
Я сделал скрипт себе один, когда персонаж на окне вводе пароля и мне нужно скриптом релогнуться, остается диалог ввода пароля. Я сделал сперва дисконнект (чтобы закрыть диалог, т.к. на эвольве есть либо "войти", либо "сбросить"), потом закрытие диалога. После этого скрипт релогается, но окно ввода пароля уже не появляется, т.к. обязательно нужно кнопку >> нажать. Но она не является кнопкой диалога и текстдравом :c Думал есть какие-то способы.
ну если ничего не скажут, то единственный способ - нажимать лкм по координатам xd
 

lemonager

;)
Всефорумный модератор
809
1,701
Обычное нажатие на sampSendClickTextdraw(tonumber(rInfo.id+1))

Ид точно получается.

Там у всех жмется норм,только у некоторых людей такая херня
А ты проверяешь текстдрав на существование? Если нет, то добавь.
bool result = sampTextdrawIsExists(int id)
 

Leatington

Известный
258
71
Ребят, помогите, как сделать такую фишку

Типо, чтобы из файла брало ник-неймы если я залью его на пастебин к примеру.
и типо if myNick == 'тут бы брались ники с пастебина' then и скрипт тогда работал
Лучше делать через базу данных, + по нику можно обойти защиту за 1 минуту. Ну если ты так хочешь, то качаешь txt файл с пастебина, и с помощью find ищешь там myNick.
 

Ke4yp

Новичок
34
0
Как перевести все элементы строки в нижний регистр? string.lower(s) работает только с латиницей, а с кириллицей - нет
 

Roger Camillo

Известный
51
7
Лучше делать через базу данных, + по нику можно обойти защиту за 1 минуту. Ну если ты так хочешь, то качаешь txt файл с пастебина, и с помощью find ищешь там myNick.

А где то есть нормальный пример с как реализовать через базу данных?
 

HOG

Известный
48
16
Допустим, я получил текст из этого 3d-текста, как вывести в чат только определенный текст, например, мне нужна строка " Владелец: Wille_Nelson"?
 

Вложения

  • фтшь.png
    фтшь.png
    7.3 KB · Просмотры: 152

hiplice

Активный
105
59
Допустим, я получил текст из этого 3d-текста, как вывести в чат только определенный текст, например, мне нужна строка " Владелец: Wille_Nelson"?
Lua:
name, surname = text:match("Владелец: (%a+)_(%a+)")
 
Последнее редактирование:

Frapsy

Известный
Проверенный
393
226
А где то есть нормальный пример с как реализовать через базу данных?
Такого примера не будет, ибо человечек выше сказал тебе про БД лишь потому-что каждый вдох и выдох делает через нее, даже когда в ней нет необходимости. В реализации по никам тебе нужна такая штука как io.lines
Вбей по форуму и найдешь примеры, как с этим работать.

Учиcь работать с mysql и учи sql запросы
Что ты сморозил? Какой смысл ему что либо учить от мускула, когда в его реализации без обработчика все это бессмысленно? Какие запросы учить? UPDATE, SELECT, INSERT, DELETE? Мдемс

Как перевести все элементы строки в нижний регистр? string.lower(s) работает только с латиницей, а с кириллицей - нет
Lua:
russian_characters                = { [168] = 'Ё', [184] = 'ё', [192] = 'А', [193] = 'Б', [194] = 'В', [195] = 'Г', [196] = 'Д', [197] = 'Е', [198] = 'Ж', [199] = 'З', [200] = 'И', [201] = 'Й', [202] = 'К', [203] = 'Л', [204] = 'М', [205] = 'Н', [206] = 'О', [207] = 'П', [208] = 'Р', [209] = 'С', [210] = 'Т', [211] = 'У', [212] = 'Ф', [213] = 'Х', [214] = 'Ц', [215] = 'Ч', [216] = 'Ш', [217] = 'Щ', [218] = 'Ъ', [219] = 'Ы', [220] = 'Ь', [221] = 'Э', [222] = 'Ю', [223] = 'Я', [224] = 'а', [225] = 'б', [226] = 'в', [227] = 'г', [228] = 'д', [229] = 'е', [230] = 'ж', [231] = 'з', [232] = 'и', [233] = 'й', [234] = 'к', [235] = 'л', [236] = 'м', [237] = 'н', [238] = 'о', [239] = 'п', [240] = 'р', [241] = 'с', [242] = 'т', [243] = 'у', [244] = 'ф', [245] = 'х', [246] = 'ц', [247] = 'ч', [248] = 'ш', [249] = 'щ', [250] = 'ъ', [251] = 'ы', [252] = 'ь', [253] = 'э', [254] = 'ю', [255] = 'я' }

function string.rlower(s) -- нижний
    s = s:lower()
    local strlen = s:len()
    if strlen == 0 then return s end
    s = s:lower()
    local output = ''
    for i = 1, strlen do
        local ch = s:byte(i)
        if ch >= 192 and ch <= 223 then
            output = output .. russian_characters[ch + 32]
        elseif ch == 168 then
            output = output .. russian_characters[184]
        else
            output = output .. string.char(ch)
        end
    end
    return output
end

function string.rupper(s) -- верхний
    s = s:upper()
    local strlen = s:len()
    if strlen == 0 then return s end
    s = s:upper()
    local output = ''
    for i = 1, strlen do
        local ch = s:byte(i)
        if ch >= 224 and ch <= 255 then
            output = output .. russian_characters[ch - 32]
        elseif ch == 184 then
            output = output .. russian_characters[168]
        else
            output = output .. string.char(ch)
        end
    end
    return output
end
 
Последнее редактирование:

штейн

Известный
Проверенный
1,001
687
Lua:
function string.rlower(s) -- нижний
    s = s:lower()
    local strlen = s:len()
    if strlen == 0 then return s end
    s = s:lower()
    local output = ''
    for i = 1, strlen do
        local ch = s:byte(i)
        if ch >= 192 and ch <= 223 then
            output = output .. russian_characters[ch + 32]
        elseif ch == 168 then
            output = output .. russian_characters[184]
        else
            output = output .. string.char(ch)
        end
    end
    return output
end

function string.rupper(s) -- верхний
    s = s:upper()
    local strlen = s:len()
    if strlen == 0 then return s end
    s = s:upper()
    local output = ''
    for i = 1, strlen do
        local ch = s:byte(i)
        if ch >= 224 and ch <= 255 then
            output = output .. russian_characters[ch - 32]
        elseif ch == 184 then
            output = output .. russian_characters[168]
        else
            output = output .. string.char(ch)
        end
    end
    return output
end
проебал таблицу, лучше просто давай ссылку на пост:
https://blast.hk/threads/13380/#post-170330
 
  • Нравится
Реакции: Frapsy

Frapsy

Известный
Проверенный
393
226
imgui окно перестает открываться
лан забей
Перед imgui.image
Lua:
imgui.SetCursorPos(imgui.ImVec2(X, Y))

проебал таблицу, лучше просто давай ссылку на пост:
https://blast.hk/threads/13380/#post-170330
Позабыл про нее, пост лень искать было хД Поправил