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

Cod

Участник
117
15
Lua:
local font = require('moonloader').font_flag -- ВОТ ТЕБЕ ПРИМЕРЫ
local fonts = renderCreateFont("Verdana", 10, font.BOLD + font.SHADOW)
local font = renderCreateFont("Impact", 20, 5)
local ex, ey = getScreenResolution()
        if ini.config.admins then
            renderFontDrawText(fonts, "Админы в сети: ", ex / 2 - 650, ey / 2, 0xFFFFFFFF)
        end
        ----
        renderFontDrawText(font, calculateZone(x,y,z), 0.078125 * x1, 0.69444444444 * y1, -1)
Код:
Если уменьшить расширение оно в другое место уйдёт.
 

Lucifer Melton

Активный
164
57
Зачем ему это? Скажи? Ему нужно нормально с диалогом работать а ты бред скинул
сам ты бред кидаешь, там лучше делать диалоги
Если не нравиться, вот:
Lua:
function main()
    while true do
        wait(0)
        if testCheat("MMS") then
            ::dialog::
            sampShowDialog(1111, "caption", "listitem_0\nlistitem_1\nlistitem_2", "{6495ED}Выбрать", "{6495ED}Закрыть", 2)
            repeat
                wait(0)
                local result, button, list, input = sampHasDialogRespond(1111)
                if result then
                    if button == 0 then
                        break
                    else
                        if list == 0 then
                            sampAddChatMessage("listitem_0", -1)
                            goto dialog
                        elseif list == 1 then
                            sampAddChatMessage("listitem_1", -1)
                            goto dialog
                        elseif list == 2 then
                            sampAddChatMessage("listitem_2", -1)
                            goto dialog
                        end
                    end
                end
            until result
        end
    end
end
вещь который ты говоришь бред:
если не понимаешь как оно работает, закинь его в moonloader и зайди в игру введи как чит код MSS
Lua:
local sf = require "sampfuncs"

local my_dialog = {
    {
        title = "listitem_0",
        onclick = function()
            sampAddChatMessage('{00FF00}/ds ID - Посмотреть доступы FD | {1E90FF} /ods ID - Посмотреть доступы Основателя', -1)
            return true
        end
    },
    {
        title = "listitem_1",
        onclick = function()
            sampAddChatMessage('{FFFFFF}/jl - Посадить в Джайл | /ps - Посадить в Присон', -1)
            sampAddChatMessage('{FFFFFF}/wrn - Выдать варн | /kk - Выгнать с сервера', -1)
            sampAddChatMessage('{FFFFFF}/mt - Выдать мут', -1)
            return true
        end
    },
    {
        title = "listitem_2",
        onclick = function()
            sampAddChatMessage('{00FF00}/bn - Забанить на 1 день | /bnn - Забанить навсегда', -1)
            sampAddChatMessage('{00FF00}/bni - Забанить ип | /bno - Забанить в оффлайн', -1)
            sampAddChatMessage('{00FF00}/tbn - Забанить на время | /adw id - Выдать Админ варн', -1)
            sampAddChatMessage('{00FF00}/adwo - Снять админ варн | /mkh id - Назначить хелпером', -1)
            sampAddChatMessage('{00FF00}/mkl ID - Назначить Лидером (только себя) | /fg id - Ударить по лицу', -1)
            return true
        end
    },
    {
        title = "listitem_3",
        onclick = function()
            sampAddChatMessage('{0000FF}/sk - Тихо кикнуть | /offl ID - Снять лидера в оффлайн', -1)
            sampAddChatMessage('{0000FF}/mka - Выдать админку (1-12) | /asl - Продать хату (владелец должен быть оффлайн)', -1)
            sampAddChatMessage('{0000FF}/gzc - Красить терру | /sld - Снять с Лидерки', -1)
            sampAddChatMessage('{0000FF}/dr - Забрать кмд у админа | /ow - Выдать варн Основателя', -1)
            sampAddChatMessage('{0000FF}/owo - Снять варн Основателя | /sbn - Выдать тихий бан', -1)
            sampAddChatMessage('{0000FF}/offow - Выдать варн Основателя в оффлайн | /offaw - Выдать варн Администратора в оффлайн', -1)
            sampAddChatMessage('{0000FF}/aj - Посадить в Админ тюрьму  | /acr - Создать {FFFF00}Super Car{FF0000} Admins Team', -1)
            sampAddChatMessage('{0000FF}/offaj - Посадить в Админ тюрьму в оффлайн', -1)
            return true
        end
    },
    {
        title = "listitem_4",
        onclick = function()
            sampAddChatMessage('{FFFF00}/lg - Проверить Админ логи | /alg - Проверить логи выдачи', -1)
            sampAddChatMessage('{FFFF00}/plg - Проверить логи игрока | /stl - Назначить Лидером', -1)
            sampAddChatMessage('{FFFF00}/avz - Секретная Админка | /offad - Снять с Админа в оффлайн', -1)
            sampAddChatMessage('{FFFF00}/psk - Выдать Админку (0-16) | /mku - Выдать Админку (1-10)', -1)
            sampAddChatMessage('{FFFF00}/ipb - Забанить по IP | /ocr - Создать кар {FF0000}Admins Team {0000FF}» ™Создатель™ «', -1)
            return true
        end
    },
    {
        title = "listitem_5",
        onclick = function()
            sampAddChatMessage('{FF0000}/vr - Отправить в виртуальный мир | /cr - крашнуть игрока', -1)
            sampAddChatMessage('{FF0000}/oc - Чат Основателя | /logk - Анти Убийство ', -1)
            return true
        end
    },
    {
        title = "listitem_6",
        onclick = function()
            sampAddChatMessage('{FF69B4}/setpl - Выдать уровень промо-кода | /gn - цветное оружие ', -1)
            sampAddChatMessage('{FF69B4}/sx - Послать на звезду | /vs - Выдать аварн + оварн + аджайл + дроп ', -1)
            sampAddChatMessage('{FF69B4}/gs - Выдать сертификат | /nh - Запретить варны и баны', -1)
            sampAddChatMessage('{FF69B4}/chatc - Сменить цвет чата /a | /k - Скрыться из /adminy', -1)
            sampAddChatMessage('{FF69B4}/t - Писать кмд за другого| /amt - Выдать мут в /a', -1)
            sampAddChatMessage('{FF69B4}/amn - Амниситя (Снятие всех наказаний)', -1)
            return true
        end
    },
    {
        title = "listitem_7",
        onclick = function()
            sampAddChatMessage('Об Создателе: {00FFFF}Скрипт Создан Администратором WoL RPG', -1)
            sampAddChatMessage('Об Создателе: {FFFF00}» ™Создатель™ « | John_Hamilton', -1)
            sampAddChatMessage('Об Создателе: {FF0000}ВК создателя - https://vk.com/rubrikaa', -1)
            return true
        end
    },
    {
        title = "listitem_8",
        submenu = {
            {
                title = "listitem_8_1",
                onclick = function()
                    return true
                end
            },
            {
                title = "listitem_8_2",
                onclick = function()
                    return true
                end
            }
        }
    }
}

function main()
    while true do
        wait(0)
        if testCheat("MSS") then
            submenus_show(my_dialog, "Тут заголовок диалога (caption)", "Выбрать", "Закрыть", "Назад")
        end
    end
end

function submenus_show(menu, caption, select_button, close_button, back_button)
    select_button, close_button, back_button = select_button or 'Select', close_button or 'Close', back_button or 'Back'
    prev_menus = {}
    function display(menu, id, caption)
        local string_list = {}
        for i, v in ipairs(menu) do
            table.insert(string_list, type(v.submenu) == 'table' and v.title .. '  >>' or v.title)
        end
        sampShowDialog(id, caption, table.concat(string_list, '\n'), select_button, (#prev_menus > 0) and back_button or close_button, sf.DIALOG_STYLE_LIST)
        repeat
            wait(0)
            local result, button, list = sampHasDialogRespond(id)
            if result then
                if button == 1 and list ~= -1 then
                    local item = menu[list + 1]
                    if type(item.submenu) == 'table' then -- submenu
                        table.insert(prev_menus, {menu = menu, caption = caption})
                        if type(item.onclick) == 'function' then
                            item.onclick(menu, list + 1, item.submenu)
                        end
                        return display(item.submenu, id + 1, item.submenu.title and item.submenu.title or item.title)
                    elseif type(item.onclick) == 'function' then
                        local result = item.onclick(menu, list + 1)
                        if not result then return result end
                        return display(menu, id, caption)
                    end
                else -- if button == 0
                    if #prev_menus > 0 then
                        local prev_menu = prev_menus[#prev_menus]
                        prev_menus[#prev_menus] = nil
                        return display(prev_menu.menu, id - 1, prev_menu.caption)
                    end
                    return false
                end
            end
        until result
    end
    return display(menu, 31337, caption or menu.title)
end
Ребята помогите сделать диалог list вот сам код впишите туда пж
Код:
script_name("Сокращение команд для админов. Wol  | RPG ")
script_version("1.3")
script_author("Mark")
local samp = require 'samp.events'
local imgui = require 'imgui'
local encoding = require 'encoding' -- загружаем библиотеку
encoding.default = 'CP1251' -- указываем кодировку по умолчанию, она должна совпадать с кодировкой файла. CP1251 - это Windows-1251
u8 = encoding.UTF8 -- и создаём короткий псевдоним для кодировщика UTF-8

local test_text_buffer = imgui.ImBuffer(256)

function main()
repeat wait(0) until isSampAvailable()
wait(0)
sampAddChatMessage('{40E0D0}[FN] {FFFFFF}Скрипт загружен. {40E0D0}Автор: Caxap_Adams Вк автора : https://vk.com/lgbt2006 {40E0D0}', -1)
sampAddChatMessage('{40E0D0}[FN] {FFFFFF}Информация о командах - {40E0D0} Пропиши /infocmd Информация об авторе /infoscript', -1)

sampRegisterChatCommand('atool', cmdhelp)
sampRegisterChatCommand('fastpush', cmdhelps)
sampRegisterChatCommand('rod', rod)
sampRegisterChatCommand('ch', ch)
sampRegisterChatCommand('nosk', nosk)
sampRegisterChatCommand('obman', obman)
sampRegisterChatCommand('dokva', jalob)
sampRegisterChatCommand('rekl', rekl)
sampRegisterChatCommand('prosk', prosk)
sampRegisterChatCommand('pered', pered)
sampRegisterChatCommand('nerab', nerab)
sampRegisterChatCommand('wrc', wr)
sampRegisterChatCommand('js', js)
sampRegisterChatCommand('jsd', jsd)
sampRegisterChatCommand('mth', mt)
sampRegisterChatCommand('kk', kicks)
sampRegisterChatCommand('skk', popo)
sampRegisterChatCommand('sdok', sdok)
sampRegisterChatCommand('nabor', zganabor)
sampRegisterChatCommand('lolkek', lolkek)
sampRegisterChatCommand('atool1', shelp)
sampRegisterChatCommand('vipah', adminhelp)
sampRegisterChatCommand('dokvaw', dokvaw)
sampRegisterChatCommand('dokvaj', dokvaj)
sampRegisterChatCommand('dokwab', dokwab)
sampRegisterChatCommand('sm', smexy)
sampRegisterChatCommand('infocmd', infocmd)
sampRegisterChatCommand('infoscript', infoscript)

while true do
  wait(0)
end
end

function infocmd()
sampShowDialog(228, "Информация", "{40E0D0}Пропишите /atool что бы узнать сокращённые комманды\nПропишите /fastpush что бы узнать комманды с уже готовыми причинами\nПропишите /vipah что бы узнать команды которые стоят дахуя и которые у тебя есть\n", "Закрыть")
end

function cmdhelp()
sampShowDialog(228, "CmdList", "{ffffff}/ow         Выдать оварн\n /aj         выдать ajail\n /aw         выдать аварн\n         /wr      выдать warn\n         /pl         просмотреть логи игрока\n        /dr         выдать дроп\n         /ocr окар\n         /acr         акар\n         /offaj         выдать аджаил в оффе\n         /ipb     дать пизды пидору\n         /aim     аимунка \n         /im     имунка \n         /odost     одоступ\n         /dost      dostup\n         /fk     фраклист \n         /offow     offowarn/n         /offaw         /offawarn\n         /awoff     /awarnoff\n         /owoff     /owarnoff\n         /drop  /dr\n         /makehelper /mkh\n         /setl     /setleader\n         /makeleader     /mkl \n         /makeadmin     /mka\n         /avozvrat     /avz\n         /givegun     /gg\n   ", "Закрыть" )
end

function infoscript()
sampShowDialog(228, "Info Caxap_Adams", "{ffffff}Привет этот скрипт создал Caxap_Adams Это же {ff0000}Caxap {ffffff}Adams\n Вконтакте Caxap_Adams'a https://vk.com/lgbt2006\n Запомните ЭТОТ СКРИПТ БЛЯТЬ СОЗДАЛ САХАРОК\n Для сервера Way Of Life RPG\n  ", "Ok")
end

function adminhelp()
sampShowDialog(228, "ЦЕ САХАР ", "{ff0000}/dokva запросить пруфы по жалобе\n/dokvaw запросить пруфы на варн\n/dokvaj запросить пруфы на jail\n/sm смекси закинуть нахуй сделано для хуй поймни кому\n  ", "Ok")
end

function dokvaw(id)
local nick = sampGetPlayerNickname(id)
sampSendChat('/aj '..id..'  999999 доки на варн ')
end

  function smexy(id)
local nick = sampGetPlayerNickname(id)
  sampSendChat('/smexy '..id..' 99999 доки в вк')
end

function cmdhelps()
sampShowDialog(228, "CmdList", " {ff0000}/dokva ID - {{ff0000}}Потребовать док-ва\n {F0E68C} /dr ID - {FFFFFF}наказать за не работу {F0E68C}\n {40E0D0}/rod ID - {FFFFFF}Заблокировать за оск. род.\n {F0E68C}| {40E0D0}/pered ID - {FFFFFF}Заблокировать за передачу {F0E68C}\n  {40E0D0}/ch ID - {FFFFFF}Заблокировать за  вред читы {F0E68C}\n {40E0D0}/nosk ID - {FFFFFF}Заблокировать за оскорбление в нике\n /rekl ID - {FFFFFF}Заблокировать за рекламу {F0E68C}\n {40E0D0}/prosk ID - {FFFFFF}Заблокировать за оск. проекта\n /wrc ID - {FFFFFF}Выдать варн за читы{F0E68C}\n {40E0D0} /mth ID - {FFFFFF}Выдать мут за оск{F0E68C}\n {40E0D0}/ /kk ID - {FFFFFF}Кик за помеху{F0E68C}\n {40E0D0}/skk ID - {FFFFFF}Тихий кик\n {40E0D0}/sdok - ID у кого не снято ограничение на /ajail {F0E68C}\n {F0E68C}/nabor набор в зга если вы га\n    ", "Закрыть ")
end

function rod(id)
local nick = sampGetPlayerNickname(id)
sampSendChat('/banan '..id..'  Оскорбление родных')
end

function popo(id)
local nick = sampGetPlayerNickname(id)
sampSendChat('/skicked '..id..'  relog')
end

function lolkek(id)
local nick = sampGetPlayerNickname(id)
sampSendChat('/a Скрипт успешно запущен и работает введи /chelp ')
end

function sdok(id)
local nick = sampGetPlayerNickname(id)
sampSendChat('/aj '..id..'  30 жалоба отпиши в вк')
end

function zganabor(id)
local nick = sampGetPlayerNickname(id)
sampSendChat('/a Идёт набор в ЗГА от 16 лвл админки кто желает вступить + в чат')
end

function kicks(id)
local nick = sampGetPlayerNickname(id)
sampSendChat('/kk '..id..'  помеха')
end

function mt(id)
local nick = sampGetPlayerNickname(id)
sampSendChat('/mute '..id..' 10 Оск')
end

function js(id)
local nick = sampGetPlayerNickname(id)
sampSendChat('/jail '..id..' 15 Читы')
end

function jsd(id)
local nick = sampGetPlayerNickname(id)
sampSendChat('/jail '..id..' 15 ДМ')
end

function wrc(id)
local nick = sampGetPlayerNickname(id)
sampSendChat('/warn '..id..'  Читы')
end

function jalobs(id)
local nick = sampGetPlayerNickname(id)
sampSendChat('/ajoff '..id..' 99999  Жалоба отпиши в вк')
end

function jalob(id)
local nick = sampGetPlayerNickname(id)
sampSendChat('/aj '..id..' 99999  Жалоба отпиши в вк')
end

function nerab(id)
local nick = sampGetPlayerNickname(id)
sampSendChat('/dr '..id..' 15 не работаешь')
end
 
function ch(id)
local nick = sampGetPlayerNickname(id)
sampSendChat('/banan '..id..' Вред серверу')
end

function nosk(id)
local nick = sampGetPlayerNickname(id)
sampSendChat('/banan '..id..'  Оскорбление в нике')
end

function rekl(id)
local nick = sampGetPlayerNickname(id)
sampSendChat('/banan '..id..'  Реклама')
end

function prosk(id)
local nick = sampGetPlayerNickname(id)
sampSendChat('/banan '..id..'  Оскорбление проекта')
end

function pered(id)
local nick = sampGetPlayerNickname(id)
sampSendChat('/banan '..id..'  Взломан/Передан/Продан')
end

cmds = {
    ['/owarn'] = '/ow',
    ['/awarn'] = '/aw',
    ['/ajail'] = '/aj',
    ['/mute'] = '/mt',
    ['/warn'] = '/wr',
    ['/plog'] = '/pl',
    ['/drop'] = '/dr',
    ['/ipban'] = '/ipb',
    ['/offajail'] = '/offaj',
    ['/ocar'] = '/ocr',
    ['/acar'] = '/acr',
    ['/aimunka'] = '/aim',
    ['/imunka'] = '/im',
    ['/dostup'] = '/dost',
    ['/odostup'] = '/odost',
    ['/adminy'] = '/admins',
    ['/fraklist'] = '/fk',
    ['/offowarn'] = '/offow',
    ['/offawarn'] = '/offaw',
    ['/awarnoff'] = '/awoff',
    ['/owarnoff'] = '/owoff',
    ['/drop'] = '/dr',
    ['/makehelper'] = '/mkh',
    ['/setleader'] = '/setl',
    ['/makeleader'] = '/mkl',
    ['/makeadmin'] = '/mka',
    ['/avozvrat'] = '/avz',
    ['/givegun'] = '/gg',
}

function samp.onSendCommand(CMD)
    for k, v in pairs(cmds) do
        if CMD:find(v) then
            CMD = CMD:gsub(v, k)
            return {CMD}
        end
    end
end
тут готовый коды не делают, вот тебе пример делай сам:
Lua:
function main()
    while true do
        wait(0)
        if testCheat("MMS") then -- введи в игре как чит код MMS
            sampShowDialog(1111, "caption", "listitem_0\nlistitem_1\nlistitem_2", "{6495ED}Выбрать", "{6495ED}Закрыть", 2)
            repeat
                wait(0)
                local result, button, list, input = sampHasDialogRespond(1111)
                if result then
                    if button == 0 then
                        break
                    else
                        if list == 0 then
                            sampAddChatMessage("listitem_0", -1)
                        elseif list == 1 then
                            sampAddChatMessage("listitem_1", -1)
                        elseif list == 2 then
                            sampAddChatMessage("listitem_2", -1)
                        end
                    end
                end
            until result
        end
    end
end
и у каждого диалога должен быть свой id, а не у всех было 228
 
Последнее редактирование:

MyRaXa229229

Участник
90
0
Как можно обмануть сервер на то что сервер думает что он активен, а его самого нет на серве или он не отображается
 

Oaeaa

Новичок
4
0
Как можно реализовать, что при появлении в чате "1" в sampAddChatMessage давались ответы "ы b г j", а при 2 давались "о w з q" и так далее (чтобы как цифры, так и 2 были заранее заготовленные в текстовом документе, с ответами к ним

1 ы b г j
2 о w з q
И так далее...

А так же, есть ли какой то русскоязычный гайд по этому вопросу?
 
Последнее редактирование:

MyRaXa229229

Участник
90
0
Оно не сработает, если ты находишься дальше 1-5м от него, в зависимости от сервера.
омг, если буду дальше тогда даже персонаж на стенет на пикап, мне нужен ложный вызов поднятие пикапа что б серв понял что пикап подняли но персонаж не взаимодействовал с пикапом вообще никак
боже это все можно более легким способом реализовать, там замудренно, тупость

он это что?
Он - пикап
 

MR_Lua

Участник
41
0
Как в CheckBox запихать функцию? Ну к примеру есть функция work() , как сделать чтобы она работала при CheckBox?

Lua:
if imgui.Checkbox(u8'Маршрут ЛС-СФ',mars1) then
if mars1.v then
  end
 end
 

BARRY BRADLEY

Известный
711
177
Как в CheckBox запихать функцию? Ну к примеру есть функция work() , как сделать чтобы она работала при CheckBox?

Lua:
if imgui.Checkbox(u8'Маршрут ЛС-СФ',mars1) then
   if mars1.v then
  end
 end

Если я тебя правильно понял, то ты хочешь запустить функция если чексбокс true, то:
Lua:
if imgui.Checkbox(u8'Маршрут ЛС-СФ',mars1) then
   if mars1.v then
       work() -- Запуск функции если true 
   end
end
 

.Makarov.

Известный
190
36
Здравствуйте. Вот допустим у меня есть хук на string.find(text,"Привет"), допустим меня бесит данное сообщения. Есть люди которые пишут: "привет","пРивет", "ПРИВЕТ". Как обойти чувствительность к регистру? Есть ли хоть какие-то варианты, кроме как создавать миллионы хуков на одно слово?
 

BARRY BRADLEY

Известный
711
177
Здравствуйте. Вот допустим у меня есть хук на string.find(text,"Привет"), допустим меня бесит данное сообщения. Есть люди которые пишут: "привет","пРивет", "ПРИВЕТ". Как обойти чувствительность к регистру? Есть ли хоть какие-то варианты, кроме как создавать миллионы хуков на одно слово?
Как вариант сделать получаему строку и нужное слово в нижний или верхний регистр и тогда через string.find
Функция которая делает строку в нижнем регистре для русских букв:
Lua:
-- Перевод букв в нижний или верхний регистр на русском
local 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 rusLower(s)
    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 -- upper russian characters
            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

Далее в хуке:
Код:
string.find(rusLower(text), rusLower("Привет")),
 

.Makarov.

Известный
190
36
Как вариант сделать получаему строку и нужное слово в нижний или верхний регистр и тогда через string.find
Функция которая делает строку в нижнем регистре для русских букв:
Lua:
-- Перевод букв в нижний или верхний регистр на русском
local 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 rusLower(s)
    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 -- upper russian characters
            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

Далее в хуке:
Код:
string.find(rusLower(text), rusLower("Привет")),
Да, я уже видел это. Но в данном случае оно будет искать сообщение либо в нижнем регистре, либо в верхнем. Не срабатывая на сообщения в таком формате: "ПрИвЕт" =(