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

F L I P S T A R

Участник
62
1
насколько я понял, пикап срабатывает только на вхождение, значит тебе надо отправить синхру выхода из пикапа и отправить подбор пикапа, но со стороны это будет выглядеть как телепорт
Lua:
local samp = require('samp.events')
act = false

function main()
    while not isSampAvailable() do wait(0) end
    sampRegisterChatCommand('123', function ()
        act = not act
    end)
    while true do
        wait(0)
    end
end

function samp.onSendPlayerSync(data)
    if act then
        data.position.x = data.position.x + 10
        sampSendPickedUpPickup(id)
    end
end
Отлично, но можно ли как то убрать этот эффект телепорта, дабы со стороны моего персонажа изменений в передвижении не было от слова совсем?
 

Madeo Capaldi

Участник
42
2
Хочу сделать, чтобы при появлении 3д теста, бот сам начинал движение к координатам текста, подскажите, вот, как я пытался реализовать
Lua:
function ev.onCreate3DText(idObject, _, position, _, _, _, _, textObject)
   
       if textObject:find("Морковь")then
       
        sampAddChatMessage('Выкопано' -1)
       
        runToPoint( position.x , position.y,position.z, true)

      end
    end
 

Dmitriy Makarov

25.05.2021
Проверенный
2,478
1,113
Хочу сделать, чтобы при появлении 3д теста, бот сам начинал движение к координатам текста, подскажите, вот, как я пытался реализовать
Lua:
function ev.onCreate3DText(idObject, _, position, _, _, _, _, textObject)
  
       if textObject:find("Морковь")then
      
        sampAddChatMessage('Выкопано' -1)
      
        runToPoint( position.x , position.y,position.z, true)

      end
    end
Пробовал с задержкой перед runToPoint?
 

tsunamiqq

Участник
429
16
Как сделать подсчет онлайна в течении недели(прописать от пн до вс), дня, всего, и что-бы в 00.00 обновлялось, ну и сохранение в конфиг на mimgui, делал с TimerOnline(imgui) получилось херово, время считает но в 00 не обновляеться, каждый день суммируется время
 

tfornik

Известный
312
223
Как сделать подсчет онлайна в течении недели(прописать от пн до вс), дня, всего, и что-бы в 00.00 обновлялось, ну и сохранение в конфиг на mimgui, делал с TimerOnline(imgui) получилось херово, время считает но в 00 не обновляеться, каждый день суммируется время

Lua:
require('lib.moonloader')
local inicfg = require('inicfg')
local cfg = inicfg.load({
    main = {
        day = os.date("%a"),
        online = 0
    }
}, "onday.lua")
if not doesFileExist(getWorkingDirectory() .. "\\config\\onday.lua") then
    inicfg.save(ini, "onday.lua")
end

function main()
    while not isSampAvailable() do wait(100) end
    sampRegisterChatCommand('get_time', function() sampAddChatMessage('Online in a day: '..get_clock(cfg.main.online), -1) end)
    lua_thread.create(counter_time)
    if cfg.main.day ~= os.date('%a') then
        cfg.main.online = 0
        inicfg.save(ini, "onday.lua")
    end
 
    wait(-1)
end

function get_clock(time)
    local timezone_offset = 86400 - os.date('%H', 0) * 3600
    if tonumber(time) >= 86400 then onDay = true else onDay = false end
    return os.date((onDay and math.floor(time / 86400)..' ' or '')..'%H:%M:%S', time + timezone_offset)
end

function counter_time()
    while true do
        wait(1000)
        cfg.main.online = cfg.main.online + 1
        inicfg.save(ini, "onday.lua")
    end
end
если делать онлайн за неделю, просто сравниваешь сегодняшний день с понедельником и прошлый с воскресеньем => новая неделя.
 
  • Нравится
Реакции: tsunamiqq

tsunamiqq

Участник
429
16
Lua:
require('lib.moonloader')
local inicfg = require('inicfg')
local cfg = inicfg.load({
    main = {
        day = os.date("%a"),
        online = 0
    }
}, "onday.lua")
if not doesFileExist(getWorkingDirectory() .. "\\config\\onday.lua") then
    inicfg.save(ini, "onday.lua")
end

function main()
    while not isSampAvailable() do wait(100) end
    sampRegisterChatCommand('get_time', function() sampAddChatMessage('Online in a day: '..get_clock(cfg.main.online), -1) end)
    lua_thread.create(counter_time)
    if cfg.main.day ~= os.date('%a') then
        cfg.main.online = 0
        inicfg.save(ini, "onday.lua")
    end
 
    wait(-1)
end

function get_clock(time)
    local timezone_offset = 86400 - os.date('%H', 0) * 3600
    if tonumber(time) >= 86400 then onDay = true else onDay = false end
    return os.date((onDay and math.floor(time / 86400)..' ' or '')..'%H:%M:%S', time + timezone_offset)
end

function counter_time()
    while true do
        wait(1000)
        cfg.main.online = cfg.main.online + 1
        inicfg.save(ini, "onday.lua")
    end
end
если делать онлайн за неделю, просто сравниваешь сегодняшний день с понедельником и прошлый с воскресеньем => новая неделя.
У меня сделано типу так:

Lua:
script_name("Testik")
script_version("test")
script_properties("Testik")
 
---------------------------------------------------------------
require 'lib.moonloader'
require 'sampfuncs'
---------------------------------------------------------------
local imgui = require('mimgui')
local encoding = require('encoding')
local samp = require('lib.samp.events')
local memory = require('memory')
local monet = require("MoonMonet")
local vkeys = require('vkeys')
local rkeys = require('rkeys')
local faicons = require('fAwesome6')
local ffi = require('ffi')
encoding.default = 'CP1251'
u8 = encoding.UTF8
ffi.cdef[[
    intptr_t LoadKeyboardLayoutA(const char* pwszKLID, unsigned int Flags);
    int PostMessageA(intptr_t hWnd, unsigned int Msg, unsigned int wParam, long lParam);
    intptr_t GetActiveWindow();
]]
do
    local buffer = {}
    function setKeyboardLanguage(lang)
        if buffer[lang] == nil then
            buffer[lang] = ffi.C.LoadKeyboardLayoutA(lang, 1);
        end
        ffi.C.PostMessageA(ffi.C.GetActiveWindow(), 0x50, 1, buffer[lang]);
    end
end
local inicfg = require('inicfg')
local directIni = 'Testik.ini'
local mainIni = inicfg.load({
    settings = {
        onlineDay = 0,
        day = 0,
    },
    onDay = {
        today = os.date("%a"),
        online = 0,
        afk = 0,
        full = 0
    },
    onWeek = {
        week = 1,
        online = 0,
        afk = 0,
        full = 0
    },
    myWeekOnline = {
        [0] = 0,
        [1] = 0,
        [2] = 0,
        [3] = 0,
        [4] = 0,
        [5] = 0,
        [6] = 0
    }
}, directIni)
inicfg.save(mainIni, directIni)
local new, str = imgui.new, ffi.string
local renderWindow = new.bool()
local sesOnline = new.int(0)
local sesAfk = new.int(0)
local sesFull = new.int(0)
local dayFull = new.int(mainIni.onDay.full or 0)
local weekFull = new.int(mainIni.onWeek.full or 0)
local tWeekdays = {
    [0] = 'Воскресенье',
    [1] = 'Понедельник', 
    [2] = 'Вторник', 
    [3] = 'Среда', 
    [4] = 'Четверг', 
    [5] = 'Пятница', 
    [6] = 'Суббота'
}
local menuFrame = imgui.OnFrame(
    function() return renderWindow[0] end,
    function(player)
        local resX, resY = getScreenResolution()
        local sizeX, sizeY = 1100, 600
        imgui.SetNextWindowPos(imgui.ImVec2(resX / 2, resY / 2), imgui.Cond.FirstUseEver, imgui.ImVec2(0.5, 0.5))
        imgui.SetNextWindowSize(imgui.ImVec2(sizeX, sizeY))
        imgui.Begin(u8'Testik', renderWindow, imgui.WindowFlags.NoCollapse + imgui.WindowFlags.NoResize + imgui.WindowFlags.NoTitleBar)
            for day = 1, 6 do -- ПН -> СБ
                imgui.Text(u8(tWeekdays[day])); imgui.SameLine(150)
                imgui.Text(u8(get_clock(mainIni.myWeekOnline[day])))
            end
            --> ВС
            imgui.Text(u8(tWeekdays[0])); imgui.SameLine(150)
            imgui.Text(get_clock(mainIni.myWeekOnline[0]))
        imgui.End()
    end
)
function get_clock(time)
    local timezone_offset = 86400 - os.date('%H', 0) * 3600
    if tonumber(time) >= 86400 then onDay = true else onDay = false end
    return os.date((onDay and math.floor(time / 86400)..'д ' or '')..'%H:%M:%S', time + timezone_offset)
end
function number_week() -- получение номера недели в году
    local current_time = os.date'*t'
    local start_year = os.time{ year = current_time.year, day = 1, month = 1 }
    local week_day = ( os.date('%w', start_year) - 1 ) % 7
    return math.ceil((current_time.yday + week_day) / 7)
end
function main()
    while not isSampAvailable() do wait(0) end
    sampRegisterChatCommand('testik', function()
        renderWindow[0] = not renderWindow[0]
    end)
    if mainIni.settings.day ~= os.date("%a") then
        mainIni.settings.day = os.date("%a")
        mainIni.settings.onlineDay = 0
        inicfg.save(mainIni, directIni)
    end
    
    if mainIni.onWeek.week ~= number_week() then
        mainIni.onWeek.week = number_week()
        mainIni.onWeek.online = 0
        mainIni.onWeek.full = 0
        mainIni.onWeek.afk = 0
        mainIni.onDay = {
            today = os.date("%a"),
            online = 0,
            afk = 0,
            full = 0
        }
        for day = 0, 6 do -- ПН -> СБ
            mainIni.myWeekOnline[day] = 0
        end
        inicfg.save(mainIni, directIni)
    end
end
function time()
    startTime = os.time()
    while true do
        wait(1000)
        if sampGetGamestate() == 3 and not return_time then
            sesOnline[0] = sesOnline[0] + 1                                 -- Онлайн за сессию без учёта АФК
            sesFull[0] = os.time() - startTime                          -- Общий онлайн за сессию
            sesAfk[0] = sesFull[0] - sesOnline[0]                           -- АФК за сессию
            mainIni.onDay.online = mainIni.onDay.online + 1                     -- Онлайн за день без учёта АФК
            mainIni.onDay.full = dayFull[0] + sesFull[0]                        -- Общий онлайн за день
            mainIni.onDay.afk = mainIni.onDay.full - mainIni.onDay.online           -- АФК за день
            mainIni.onWeek.online = mainIni.onWeek.online + 1                   -- Онлайн за неделю без учёта АФК
            mainIni.onWeek.full = weekFull[0] + sesFull[0]                  -- Общий онлайн за неделю
            mainIni.onWeek.afk = mainIni.onWeek.full - mainIni.onWeek.online        -- АФК за неделю
            local today = tonumber(os.date('%w', os.time()))
            mainIni.myWeekOnline[today] = mainIni.onDay.full
        end
    end
end
function getStrDate(unixTime)
    local tMonths = {'января', 'февраля', 'марта', 'апреля', 'мая', 'июня', 'июля', 'августа', 'сентября', 'октября', 'ноября', 'декабря'}
    local day = tonumber(os.date('%d', unixTime))
    local month = tMonths[tonumber(os.date('%m', unixTime))]
    local weekday = tWeekdays[tonumber(os.date('%w', unixTime))]
    return string.format('%s, %s %s', weekday, day, month)
end
function red_theme()
    local vec2, vec4 = imgui.ImVec2, imgui.ImVec4
    imgui.SwitchContext()
    local style = imgui.GetStyle()
    local colors = style.Colors
    local flags = imgui.Col
 
    do -- style
        --==[ STYLE ]==--
        imgui.GetStyle().WindowPadding = imgui.ImVec2(5, 5)
        imgui.GetStyle().FramePadding = imgui.ImVec2(5, 5)
        imgui.GetStyle().ItemSpacing = imgui.ImVec2(5, 5)
        imgui.GetStyle().ItemInnerSpacing = imgui.ImVec2(2, 2)
        imgui.GetStyle().TouchExtraPadding = imgui.ImVec2(0, 0)
        imgui.GetStyle().IndentSpacing = 0
        imgui.GetStyle().ScrollbarSize = 10
        imgui.GetStyle().GrabMinSize = 10
        --==[ ROUNDING ]==--
        imgui.GetStyle().WindowRounding = 8
        imgui.GetStyle().ChildRounding = 8
        imgui.GetStyle().FrameRounding = 5
        imgui.GetStyle().PopupRounding = 8
        imgui.GetStyle().ScrollbarRounding = 8
        imgui.GetStyle().GrabRounding = 8
        imgui.GetStyle().TabRounding = 8
        --==[ ALIGN ]==--
        imgui.GetStyle().WindowTitleAlign = imgui.ImVec2(0.5, 0.5)
        imgui.GetStyle().ButtonTextAlign = imgui.ImVec2(0.5, 0.5)
        imgui.GetStyle().SelectableTextAlign = imgui.ImVec2(0.5, 0.5)
    end
        colors[imgui.Col.WindowBg] = imgui.ImVec4(0.14, 0.12, 0.16, 1.00)
        colors[imgui.Col.ChildBg] = imgui.ImVec4(0.30, 0.20, 0.39, 0.00)
        colors[imgui.Col.PopupBg] = imgui.ImVec4(0.14, 0.12, 0.16, 1)
        colors[imgui.Col.Border] = imgui.ImVec4(0.14, 0.12, 0.16, 1)
        colors[imgui.Col.BorderShadow] = imgui.ImVec4(0.00, 0.00, 0.00, 0.00)
        colors[imgui.Col.FrameBg] = imgui.ImVec4(0.28, 0.27, 0.27, 0.28)
        colors[imgui.Col.FrameBgHovered] = imgui.ImVec4(0.84, 0.01, 0.06, 0.84)
        colors[imgui.Col.FrameBgActive] = imgui.ImVec4(0.41, 0.19, 0.63, 1.00)
        colors[imgui.Col.TitleBg] = imgui.ImVec4(0.84, 0.01, 0.06, 0.84)
        colors[imgui.Col.TitleBgCollapsed] = imgui.ImVec4(0.84, 0.01, 0.06, 0.84)
        colors[imgui.Col.TitleBgActive] = imgui.ImVec4(0.84, 0.01, 0.06, 0.84)
        colors[imgui.Col.MenuBarBg] = imgui.ImVec4(0.30, 0.20, 0.39, 0.57)
        colors[imgui.Col.ScrollbarBg] = imgui.ImVec4(0.84, 0.01, 0.06, 0.84)
        colors[imgui.Col.ScrollbarGrab] = imgui.ImVec4(0.84, 0.01, 0.06, 0.84)
        colors[imgui.Col.ScrollbarGrabHovered] = imgui.ImVec4(0.84, 0.01, 0.06, 0.84)
        colors[imgui.Col.ScrollbarGrabActive] = imgui.ImVec4(0.84, 0.01, 0.06, 0.84)
        colors[imgui.Col.CheckMark] = imgui.ImVec4(0.84, 0.01, 0.06, 0.84)
        colors[imgui.Col.SliderGrab] = imgui.ImVec4(0.84, 0.01, 0.06, 0.84)
        colors[imgui.Col.SliderGrabActive] = imgui.ImVec4(0.84, 0.01, 0.06, 0.84)
        colors[imgui.Col.Button] = imgui.ImVec4(0.84, 0.01, 0.06, 0.84)
        colors[imgui.Col.ButtonHovered] = imgui.ImVec4(1, 0, 0.07, 1)
        colors[imgui.Col.ButtonActive] = imgui.ImVec4(0.84, 0.01, 0.06, 0.8)
        colors[imgui.Col.Header] = imgui.ImVec4(0, 0, 0, 0)
        colors[imgui.Col.HeaderHovered] = imgui.ImVec4(0.84, 0.01, 0.06, 0.84)
        colors[imgui.Col.HeaderActive] = imgui.ImVec4(0.84, 0.01, 0.06, 0.84)
        colors[imgui.Col.ResizeGrip] = imgui.ImVec4(0.84, 0.01, 0.06, 0.84)
        colors[imgui.Col.ResizeGripHovered] = imgui.ImVec4(0.84, 0.01, 0.06, 0.84)
        colors[imgui.Col.ResizeGripActive] = imgui.ImVec4(0.84, 0.01, 0.06, 0.84)
        colors[imgui.Col.PlotLines] = imgui.ImVec4(0.89, 0.85, 0.92, 0.63)
        colors[imgui.Col.PlotLinesHovered] = imgui.ImVec4(0.84, 0.01, 0.06, 0.84)
        colors[imgui.Col.PlotHistogram] = imgui.ImVec4(0.89, 0.85, 0.92, 0.63)
        colors[imgui.Col.PlotHistogramHovered] = imgui.ImVec4(0.84, 0.01, 0.06, 0.84)
        colors[imgui.Col.TextSelectedBg] = imgui.ImVec4(0.84, 0.01, 0.06, 0.84)
end
function to_vec4(u32)
    local a = bit.band(bit.rshift(u32, 24), 0xFF) / 0xFF
    local r = bit.band(bit.rshift(u32, 16), 0xFF) / 0xFF
    local g = bit.band(bit.rshift(u32, 8), 0xFF) / 0xFF
    local b = bit.band(u32, 0xFF) / 0xFF
    return imgui.ImVec4(b, g, r, a)
end
Оно обновляется в 12ч, и продолжает суммироваться на след дни, к примеру в понедельник отыграл 2ч, во вторник начнет отчет с 2ч
 

halfastrc

Участник
33
4
I remember a time ago I downloaded a auto complete to VSCode in Lua, I look in the forum but I don't found it, where I can found this auto complete? Thank's
 

nanobrick

Участник
77
48
I remember a time ago I downloaded a auto complete to VSCode in Lua, I look in the forum but I don't found it, where I can found this auto complete? Thank's
 
  • Нравится
Реакции: halfastrc

7 СМЕРТНЫХ ГРЕХОВ

Известный
515
159
Как сделать эти функции лучше ?
Что бы оно лучше скипало табличку
1
LUA:
local bytes = { 2, 0, 0, 0, 0, 0, 16, 0, 0, 0, 79, 110, 68, 105, 97, 108, 111, 103, 82, 101, 115, 112, 111, 110, 115, 101, 8, 0, 0, 0, 100, 0, 0, 0, 0, 100 }
function onReceivePacket(id, bs)
    if id == 215 then
        raknetBitStreamIgnoreBits(bs, 8)
        if raknetBitStreamReadInt16(bs) == 2 then
            raknetBitStreamReadInt32(bs)
            local e = {}
            for i = 1, raknetBitStreamReadInt8(bs) do
                local l = raknetBitStreamReadInt32(bs)
                table.insert(e, raknetBitStreamReadString(bs, l))
            end
            if table.getn(e) > 0 then
                local text = e[1]
                if text:find("Вы действительно хотите начать захват этого бизнеса") or ("Вы действительно хотите начать захват этой территории") then
                    sendDialogResponse(1,0,'by 7sg')
                    return false
                end
            end
        end
    end
end

2
LUA:
function onReceivePacket(id, bs)
    lua_thread.create(function()
        if id == 215 and skipalqa[0] then
            raknetBitStreamIgnoreBits(bs, 8)
            if raknetBitStreamReadInt16(bs) == 2 then
                raknetBitStreamReadInt32(bs)
                local e = {}
                for i = 1, raknetBitStreamReadInt8(bs) do
                    local l = raknetBitStreamReadInt32(bs)
                    table.insert(e, raknetBitStreamReadString(bs, l))
                end
                if table.getn(e) > 0 then
                    local text = e[1]      
                    if text:find("window.addDialogInQueue.+Захват бизнеса.+Вы действительно хотите начать захват этого бизнеса?.+Захват территории.+Вы действительно хотите начать захват этой территории?.+") then
                        local bs = raknetNewBitStream()
                        local bytes = { 2, 0, 0, 0, 0, 0, 16, 0, 0, 0, 79, 110, 68, 105, 97, 108, 111, 103, 82, 101, 115, 112, 111, 110, 115, 101, 8, 0, 0, 0, 100, 0, 0, 0, 0, 100 }
                        raknetBitStreamWriteInt8(bs, 215)
                        for i = 1, #bytes do
                            raknetBitStreamWriteInt8(bs, bytes[i])
                        end
                        raknetBitStreamWriteInt32(bs, 1)
                        raknetBitStreamWriteInt8(bs, 100)
                        raknetBitStreamWriteInt32(bs, 0)
                        raknetBitStreamWriteInt8(bs, 115)
                        raknetBitStreamWriteInt32(bs, 8)
                        raknetSendBitStreamEx(bs, 1, 7, 1)
                        raknetDeleteBitStream(bs)
                    end
                end
            end
        end
    end)
end
 
D

deleted-user-521122

Гость
Как сделать эти функции лучше ?
Что бы оно лучше скипало табличку
1
LUA:
local bytes = { 2, 0, 0, 0, 0, 0, 16, 0, 0, 0, 79, 110, 68, 105, 97, 108, 111, 103, 82, 101, 115, 112, 111, 110, 115, 101, 8, 0, 0, 0, 100, 0, 0, 0, 0, 100 }
function onReceivePacket(id, bs)
    if id == 215 then
        raknetBitStreamIgnoreBits(bs, 8)
        if raknetBitStreamReadInt16(bs) == 2 then
            raknetBitStreamReadInt32(bs)
            local e = {}
            for i = 1, raknetBitStreamReadInt8(bs) do
                local l = raknetBitStreamReadInt32(bs)
                table.insert(e, raknetBitStreamReadString(bs, l))
            end
            if table.getn(e) > 0 then
                local text = e[1]
                if text:find("Вы действительно хотите начать захват этого бизнеса") or ("Вы действительно хотите начать захват этой территории") then
                    sendDialogResponse(1,0,'by 7sg')
                    return false
                end
            end
        end
    end
end

2
LUA:
function onReceivePacket(id, bs)
    lua_thread.create(function()
        if id == 215 and skipalqa[0] then
            raknetBitStreamIgnoreBits(bs, 8)
            if raknetBitStreamReadInt16(bs) == 2 then
                raknetBitStreamReadInt32(bs)
                local e = {}
                for i = 1, raknetBitStreamReadInt8(bs) do
                    local l = raknetBitStreamReadInt32(bs)
                    table.insert(e, raknetBitStreamReadString(bs, l))
                end
                if table.getn(e) > 0 then
                    local text = e[1]  
                    if text:find("window.addDialogInQueue.+Захват бизнеса.+Вы действительно хотите начать захват этого бизнеса?.+Захват территории.+Вы действительно хотите начать захват этой территории?.+") then
                        local bs = raknetNewBitStream()
                        local bytes = { 2, 0, 0, 0, 0, 0, 16, 0, 0, 0, 79, 110, 68, 105, 97, 108, 111, 103, 82, 101, 115, 112, 111, 110, 115, 101, 8, 0, 0, 0, 100, 0, 0, 0, 0, 100 }
                        raknetBitStreamWriteInt8(bs, 215)
                        for i = 1, #bytes do
                            raknetBitStreamWriteInt8(bs, bytes[i])
                        end
                        raknetBitStreamWriteInt32(bs, 1)
                        raknetBitStreamWriteInt8(bs, 100)
                        raknetBitStreamWriteInt32(bs, 0)
                        raknetBitStreamWriteInt8(bs, 115)
                        raknetBitStreamWriteInt32(bs, 8)
                        raknetSendBitStreamEx(bs, 1, 7, 1)
                        raknetDeleteBitStream(bs)
                    end
                end
            end
        end
    end)
end
Для ррп лучше сделать энтер спамер возьми тот же пример у акегги
Lua:
local vk = require('vkeys')
local enterFlood = false

function main()
    repeat wait(0) until isSampAvailable()
    sampRegisterChatCommand('capturwik_enter', function()
        enterFlood = not enterFlood
        printStringNow(enterFlood and 'enabled, press f6 to disable flood' or 'disabled', 1000)
    end)

while true do
        wait(0)
        if not sampIsChatInputActive() or not isCursorActive() then
            if enterFlood then
                setVirtualKeyDown(vk.VK_RETURN, true)
                wait(0)
                setVirtualKeyDown(vk.VK_RETURN, false)
            end
        end
        if enterFlood and isKeyJustPressed(0x75) then
            thisScript():reload()
        end
 
Последнее редактирование модератором: