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

chapo

tg/inst: @moujeek
Всефорумный модератор
9,130
12,263
Нубский вопрос: почему после выполнения этого кода исходная строка не выводится на экран? return {color, text} не помогает. Строки по-прежнему нет.


пример:
function sampev.onServerMessage(color, text)
    if color == 1941201407 and string.find(text, 'Вы успешно создали предмет', nil, true) then
        sampProcessChatInput('/stats')
    end
end
Задержку хотя бы в 1 мс добавь
 
  • Нравится
Реакции: SiarCis

Levandskript

Новичок
29
0
Вопрос скорее всего не по теме, но всё же. Для каких игр можно писать луа скрипты?
 

paulohardy

вы еще постите говно? тогда я иду к вам
Всефорумный модератор
1,986
1,324
  • Нравится
Реакции: Levandskript

Ciske

Новичок
25
7
Народ... просьба глянуть свежим взглядом... ну что тут может быть не так? Не удаляются чекпоинты. То есть, не все удаляются. Которые на отдалении нет, иногда если много времени прошло после установки... Но ведь мунлоадеру по идее всё равно на какой дистанции удалять/ставить чекпоинты, хоть вне зоны стрима.

Что тут не так? Как это вообще отлаживать? deleteCheckpoint ведь не возвращает никакого True/False, не говоря уже о чём-то более информативном.

Чекпоинтов может быть много - сотни. Мб в этом дело? Или я просто не вижу ошибки...


Lua:
-- установка
-- проверяем нет ли уже на этих координатах чекпоинта
local check = false
for _, value in ipairs(checkpoints) do
    if posX == value[2] and posY == value[3] and posZ == value[4] then
        check = true
        break
end

-- устанавливаем и заносим в таблицу
if not check then
    local checkpoint = createCheckpoint(2, posX, posY, posZ, 0, 0, 0, 2)
    table.insert(checkpoints, {checkpoint, posX, posY, posZ})
end


Lua:
-- по команде вызываем удаление:
    while #checkpoints > 0 do
        local subArray = checkpoints[1]
        deleteCheckpoint(subArray[1])
        table.remove(checkpoints, 1)
        wait(50)
    end
 

dmitry.karle

Известный
367
103
Народ... просьба глянуть свежим взглядом... ну что тут может быть не так? Не удаляются чекпоинты. То есть, не все удаляются. Которые на отдалении нет, иногда если много времени прошло после установки... Но ведь мунлоадеру по идее всё равно на какой дистанции удалять/ставить чекпоинты, хоть вне зоны стрима.

Что тут не так? Как это вообще отлаживать? deleteCheckpoint ведь не возвращает никакого True/False, не говоря уже о чём-то более информативном.

Чекпоинтов может быть много - сотни. Мб в этом дело? Или я просто не вижу ошибки...


Lua:
-- установка
-- проверяем нет ли уже на этих координатах чекпоинта
local check = false
for _, value in ipairs(checkpoints) do
    if posX == value[2] and posY == value[3] and posZ == value[4] then
        check = true
        break
end

-- устанавливаем и заносим в таблицу
if not check then
    local checkpoint = createCheckpoint(2, posX, posY, posZ, 0, 0, 0, 2)
    table.insert(checkpoints, {checkpoint, posX, posY, posZ})
end


Lua:
-- по команде вызываем удаление:
    while #checkpoints > 0 do
        local subArray = checkpoints[1]
        deleteCheckpoint(subArray[1])
        table.remove(checkpoints, 1)
        wait(50)
    end
1. Может быть проблема с таблицой (сразу из таблицы удаляешь), добавь проверку перед удалением из таблицы
2. Попробуй удалять не все сразу, а группами с большей задержкой
3. Создай времянку (таблица) для удаления
Lua:
local toDelete = checkpoints
checkpoints = {}
for _, subArray in ipairs(toDelete) do
    deleteCheckpoint(subArray[1])
    wait(50)
end

4. Попробуй удалять чекпоинты в обратном порядке (от последнего к первому)

Добавь лог
Lua:
print("Удаляю чекпоинт ID:", subArray[1], "Всего осталось:", #checkpoints)

Проверка возврата значения

Lua:
local success = deleteCheckpoint(subArray[1])
if not success then
    print("Ошибка удаления чекпоинта:", subArray[1])
end
 
  • Нравится
Реакции: SiarCis

Oki_Bern

Участник
291
7
tFZRcuQGmWk.jpg

Можно ли сделать как-то, чтоб верхние углы кнопки остались закругленный, а нижние квадратные стали?
DL:AddRectFilled(imgui.ImVec2(p1.x, p1.y), imgui.ImVec2(p1.x + 240, p1.y + 35), ToU32(imgui.ImVec4(col.x, col.y, col.z, 0.6)), 15, 15)
 

chromiusj

fullstack eblan
Модератор
5,819
4,124
Посмотреть вложение 272693
Можно ли сделать как-то, чтоб верхние углы кнопки остались закругленный, а нижние квадратные стали?
DL:AddRectFilled(imgui.ImVec2(p1.x, p1.y), imgui.ImVec2(p1.x + 240, p1.y + 35), ToU32(imgui.ImVec4(col.x, col.y, col.z, 0.6)), 15, 15)
Lua:
DL:AddRectFilled(
    imgui.ImVec2(p1.x, p1.y),
    imgui.ImVec2(p1.x + 240, p1.y + 35),
    ToU32(imgui.ImVec4(col.x, col.y, col.z, 0.6)),
    15,
    1 + 2
)
Подсмотреть можно отсюда:

Lua:
enum ImDrawCornerFlags_
{
    ImDrawCornerFlags_None = 0,
    ImDrawCornerFlags_TopLeft = 1 << 0,
    ImDrawCornerFlags_TopRight = 1 << 1,
    ImDrawCornerFlags_BotLeft = 1 << 2,
    ImDrawCornerFlags_BotRight = 1 << 3,
    ImDrawCornerFlags_Top = ImDrawCornerFlags_TopLeft | ImDrawCornerFlags_TopRight,
    ImDrawCornerFlags_Bot = ImDrawCornerFlags_BotLeft | ImDrawCornerFlags_BotRight,
    ImDrawCornerFlags_Left = ImDrawCornerFlags_TopLeft | ImDrawCornerFlags_BotLeft,
    ImDrawCornerFlags_Right = ImDrawCornerFlags_TopRight | ImDrawCornerFlags_BotRight,
    ImDrawCornerFlags_All = 0xF
};
 
  • Влюблен
Реакции: Oki_Bern

Oki_Bern

Участник
291
7
Почему иконка не увеличивается?
local status_fa, fa = pcall(require, 'fAwesome6_solid')

fontpage2 = imgui.GetIO().Fonts:AddFontFromFileTTF(getFolderPath(0x14)..'\\trebucbd.ttf', 22, _, imgui.GetIO().Fonts:GetGlyphRangesCyrillic())

imgui.PushFont(fontpage2)
imgui.Text(fa["HOUSE"])
imgui.PopFont()
 

[SA ARZ]

Известный
394
8
1750531457347.png
при запуске скрипта выдает такое, кто-то сталкивался? в чём проблема
 

NeverStu

Известный
522
163
всем хай луа хацкеры такой вопрос Как прикрепить Обьект через ракнетбитстрим Я через Asc logger от chapo выгрузил себе обьекты снизу прикреплю

--[NEW ATTACHED OBJECT: 18977]------------------------------------------------------------
local bs = raknetNewBitStream()
raknetBitStreamWriteInt16(bs, 318) -- playerId
raknetBitStreamWriteInt32(bs, 0) -- index
raknetBitStreamWriteBool(bs, true) -- create
raknetBitStreamWriteInt32(bs, 18977) -- modelId
raknetBitStreamWriteInt32(bs, 10) -- bone
raknetBitStreamWriteFloat(bs, 0.055900000035763) -- offset x
raknetBitStreamWriteFloat(bs, 0.24690000712872) -- offset y
raknetBitStreamWriteFloat(bs, -0.016000000759959) -- offset z
raknetBitStreamWriteFloat(bs, 86.400001525879) -- rotation x
raknetBitStreamWriteFloat(bs, 170.5) -- rotation y
raknetBitStreamWriteFloat(bs, 177.5) -- rotation z
raknetBitStreamWriteFloat(bs, 0.841000020504) -- scale x
raknetBitStreamWriteFloat(bs, 1) -- scale y
raknetBitStreamWriteFloat(bs, 1.1050000190735) -- scale z
raknetBitStreamWriteInt32(bs, -1) -- color1
raknetBitStreamWriteInt32(bs, -1) -- color2
raknetEmulRpcReceiveBitStream(113, bs)
raknetDeleteBitStream(bs)
--------------------------------------------------------------------------------------
--[NEW ATTACHED OBJECT: 19578]------------------------------------------------------------
local bs = raknetNewBitStream()
raknetBitStreamWriteInt16(bs, 318) -- playerId
raknetBitStreamWriteInt32(bs, 1) -- index
raknetBitStreamWriteBool(bs, true) -- create
raknetBitStreamWriteInt32(bs, 19578) -- modelId
raknetBitStreamWriteInt32(bs, 10) -- bone
raknetBitStreamWriteFloat(bs, 0.0049000000581145) -- offset x
raknetBitStreamWriteFloat(bs, 0.14900000393391) -- offset y
raknetBitStreamWriteFloat(bs, -0.008899999782443) -- offset z
raknetBitStreamWriteFloat(bs, 0) -- rotation x
raknetBitStreamWriteFloat(bs, 0) -- rotation y
raknetBitStreamWriteFloat(bs, 68.499900817871) -- rotation z
raknetBitStreamWriteFloat(bs, 0.7989000082016) -- scale x
raknetBitStreamWriteFloat(bs, 1.3999999761581) -- scale y
raknetBitStreamWriteFloat(bs, 2.7690000534058) -- scale z
raknetBitStreamWriteInt32(bs, -1) -- color1
raknetBitStreamWriteInt32(bs, -1) -- color2
raknetEmulRpcReceiveBitStream(113, bs)
raknetDeleteBitStream(bs)
--------------------------------------------------------------------------------------
--[NEW ATTACHED OBJECT: 18977]------------------------------------------------------------
local bs = raknetNewBitStream()
raknetBitStreamWriteInt16(bs, 318) -- playerId
raknetBitStreamWriteInt32(bs, 2) -- index
raknetBitStreamWriteBool(bs, true) -- create
raknetBitStreamWriteInt32(bs, 18977) -- modelId
raknetBitStreamWriteInt32(bs, 9) -- bone
raknetBitStreamWriteFloat(bs, 0.055900000035763) -- offset x
raknetBitStreamWriteFloat(bs, 0.24690000712872) -- offset y
raknetBitStreamWriteFloat(bs, -0.016000000759959) -- offset z
raknetBitStreamWriteFloat(bs, 86.400001525879) -- rotation x
raknetBitStreamWriteFloat(bs, 170.5) -- rotation y
raknetBitStreamWriteFloat(bs, 177.5) -- rotation z
raknetBitStreamWriteFloat(bs, 0.841000020504) -- scale x
raknetBitStreamWriteFloat(bs, 1) -- scale y
raknetBitStreamWriteFloat(bs, 1.1050000190735) -- scale z
raknetBitStreamWriteInt32(bs, -1) -- color1
raknetBitStreamWriteInt32(bs, -1) -- color2
raknetEmulRpcReceiveBitStream(113, bs)
raknetDeleteBitStream(bs)
--------------------------------------------------------------------------------------
--[NEW ATTACHED OBJECT: 19578]------------------------------------------------------------
local bs = raknetNewBitStream()
raknetBitStreamWriteInt16(bs, 318) -- playerId
raknetBitStreamWriteInt32(bs, 3) -- index
raknetBitStreamWriteBool(bs, true) -- create
raknetBitStreamWriteInt32(bs, 19578) -- modelId
raknetBitStreamWriteInt32(bs, 9) -- bone
raknetBitStreamWriteFloat(bs, 0.0049000000581145) -- offset x
raknetBitStreamWriteFloat(bs, 0.14900000393391) -- offset y
raknetBitStreamWriteFloat(bs, -0.008899999782443) -- offset z
raknetBitStreamWriteFloat(bs, 0) -- rotation x
raknetBitStreamWriteFloat(bs, 0) -- rotation y
raknetBitStreamWriteFloat(bs, 68.499900817871) -- rotation z
raknetBitStreamWriteFloat(bs, 0.7989000082016) -- scale x
raknetBitStreamWriteFloat(bs, 1.3999999761581) -- scale y
raknetBitStreamWriteFloat(bs, 2.7690000534058) -- scale z
raknetBitStreamWriteInt32(bs, -1) -- color1
raknetBitStreamWriteInt32(bs, -1) -- color2
raknetEmulRpcReceiveBitStream(113, bs)
raknetDeleteBitStream(bs)
--------------------------------------------------------------------------------------
--[NEW ATTACHED OBJECT: 19577]------------------------------------------------------------
local bs = raknetNewBitStream()
raknetBitStreamWriteInt16(bs, 318) -- playerId
raknetBitStreamWriteInt32(bs, 4) -- index
raknetBitStreamWriteBool(bs, true) -- create
raknetBitStreamWriteInt32(bs, 19577) -- modelId
raknetBitStreamWriteInt32(bs, 2) -- bone
raknetBitStreamWriteFloat(bs, 0.060899998992682) -- offset x
raknetBitStreamWriteFloat(bs, 0.14589999616146) -- offset y
raknetBitStreamWriteFloat(bs, 0) -- offset z
raknetBitStreamWriteFloat(bs, -99.999900817871) -- rotation x
raknetBitStreamWriteFloat(bs, 0) -- rotation y
raknetBitStreamWriteFloat(bs, 0) -- rotation z
raknetBitStreamWriteFloat(bs, 0.88800001144409) -- scale x
raknetBitStreamWriteFloat(bs, 0.82090002298355) -- scale y
raknetBitStreamWriteFloat(bs, 0.88800001144409) -- scale z
raknetBitStreamWriteInt32(bs, -1) -- color1
raknetBitStreamWriteInt32(bs, -1) -- color2
raknetEmulRpcReceiveBitStream(113, bs)
raknetDeleteBitStream(bs)
--------------------------------------------------------------------------------------
--[NEW ATTACHED OBJECT: 19274]------------------------------------------------------------
local bs = raknetNewBitStream()
raknetBitStreamWriteInt16(bs, 318) -- playerId
raknetBitStreamWriteInt32(bs, 5) -- index
raknetBitStreamWriteBool(bs, true) -- create
raknetBitStreamWriteInt32(bs, 19274) -- modelId
raknetBitStreamWriteInt32(bs, 2) -- bone
raknetBitStreamWriteFloat(bs, 0.099899999797344) -- offset x
raknetBitStreamWriteFloat(bs, -0.010900000110269) -- offset y
raknetBitStreamWriteFloat(bs, 0) -- offset z
raknetBitStreamWriteFloat(bs, 0) -- rotation x
raknetBitStreamWriteFloat(bs, 0) -- rotation y
raknetBitStreamWriteFloat(bs, 0) -- rotation z
raknetBitStreamWriteFloat(bs, 1) -- scale x
raknetBitStreamWriteFloat(bs, 0.97790002822876) -- scale y
raknetBitStreamWriteFloat(bs, 0.68800002336502) -- scale z
raknetBitStreamWriteInt32(bs, -1) -- color1
raknetBitStreamWriteInt32(bs, -1) -- color2
raknetEmulRpcReceiveBitStream(113, bs)
raknetDeleteBitStream(bs)
--------------------------------------------------------------------------------------
--[NEW ATTACHED OBJECT: 19518]------------------------------------------------------------
local bs = raknetNewBitStream()
raknetBitStreamWriteInt16(bs, 318) -- playerId
raknetBitStreamWriteInt32(bs, 6) -- index
raknetBitStreamWriteBool(bs, true) -- create
raknetBitStreamWriteInt32(bs, 19518) -- modelId
raknetBitStreamWriteInt32(bs, 2) -- bone
raknetBitStreamWriteFloat(bs, 0.093900002539158) -- offset x
raknetBitStreamWriteFloat(bs, -0.010900000110269) -- offset y
raknetBitStreamWriteFloat(bs, 0) -- offset z
raknetBitStreamWriteFloat(bs, 0) -- rotation x
raknetBitStreamWriteFloat(bs, 0) -- rotation y
raknetBitStreamWriteFloat(bs, 0) -- rotation z
raknetBitStreamWriteFloat(bs, 0.93190002441406) -- scale x
raknetBitStreamWriteFloat(bs, 0.85790002346039) -- scale y
raknetBitStreamWriteFloat(bs, 0.94489997625351) -- scale z
raknetBitStreamWriteInt32(bs, -1) -- color1
raknetBitStreamWriteInt32(bs, -1) -- color2
raknetEmulRpcReceiveBitStream(113, bs)
raknetDeleteBitStream(bs)
--------------------------------------------------------------------------------------


МОДИФИКАЯ СВЕРХУ КЛОУН С НИЗУ ГРИНЧ

--[NEW ATTACHED OBJECT: 19576]------------------------------------------------------------
local bs = raknetNewBitStream()
raknetBitStreamWriteInt16(bs, 318) -- playerId
raknetBitStreamWriteInt32(bs, 0) -- index
raknetBitStreamWriteBool(bs, true) -- create
raknetBitStreamWriteInt32(bs, 19576) -- modelId
raknetBitStreamWriteInt32(bs, 2) -- bone
raknetBitStreamWriteFloat(bs, 0.15389999747276) -- offset x
raknetBitStreamWriteFloat(bs, 0.008899999782443) -- offset y
raknetBitStreamWriteFloat(bs, 0.0080000003799796) -- offset z
raknetBitStreamWriteFloat(bs, 0) -- rotation x
raknetBitStreamWriteFloat(bs, -89.299896240234) -- rotation y
raknetBitStreamWriteFloat(bs, 176.60000610352) -- rotation z
raknetBitStreamWriteFloat(bs, 2.4858999252319) -- scale x
raknetBitStreamWriteFloat(bs, 2.7650001049042) -- scale y
raknetBitStreamWriteFloat(bs, 3.7630000114441) -- scale z
raknetBitStreamWriteInt32(bs, -1) -- color1
raknetBitStreamWriteInt32(bs, -1) -- color2
raknetEmulRpcReceiveBitStream(113, bs)
raknetDeleteBitStream(bs)
--------------------------------------------------------------------------------------
--[NEW ATTACHED OBJECT: 19570]------------------------------------------------------------
local bs = raknetNewBitStream()
raknetBitStreamWriteInt16(bs, 318) -- playerId
raknetBitStreamWriteInt32(bs, 1) -- index
raknetBitStreamWriteBool(bs, true) -- create
raknetBitStreamWriteInt32(bs, 19570) -- modelId
raknetBitStreamWriteInt32(bs, 2) -- bone
raknetBitStreamWriteFloat(bs, 0.20100000500679) -- offset x
raknetBitStreamWriteFloat(bs, 0.1009000018239) -- offset y
raknetBitStreamWriteFloat(bs, 0.030899999663234) -- offset z
raknetBitStreamWriteFloat(bs, -89.399803161621) -- rotation x
raknetBitStreamWriteFloat(bs, 13.5) -- rotation y
raknetBitStreamWriteFloat(bs, 7.8998999595642) -- rotation z
raknetBitStreamWriteFloat(bs, 0.26489999890327) -- scale x
raknetBitStreamWriteFloat(bs, 0.49790000915527) -- scale y
raknetBitStreamWriteFloat(bs, 0.061900001019239) -- scale z
raknetBitStreamWriteInt32(bs, -1) -- color1
raknetBitStreamWriteInt32(bs, -1) -- color2
raknetEmulRpcReceiveBitStream(113, bs)
raknetDeleteBitStream(bs)
--------------------------------------------------------------------------------------
--[NEW ATTACHED OBJECT: 19570]------------------------------------------------------------
local bs = raknetNewBitStream()
raknetBitStreamWriteInt16(bs, 318) -- playerId
raknetBitStreamWriteInt32(bs, 2) -- index
raknetBitStreamWriteBool(bs, true) -- create
raknetBitStreamWriteInt32(bs, 19570) -- modelId
raknetBitStreamWriteInt32(bs, 2) -- bone
raknetBitStreamWriteFloat(bs, 0.20290000736713) -- offset x
raknetBitStreamWriteFloat(bs, 0.096900001168251) -- offset y
raknetBitStreamWriteFloat(bs, -0.016000000759959) -- offset z
raknetBitStreamWriteFloat(bs, -103.5) -- rotation x
raknetBitStreamWriteFloat(bs, 14.399900436401) -- rotation y
raknetBitStreamWriteFloat(bs, -11.800000190735) -- rotation z
raknetBitStreamWriteFloat(bs, 0.26800000667572) -- scale x
raknetBitStreamWriteFloat(bs, 0.51389998197556) -- scale y
raknetBitStreamWriteFloat(bs, 0.061900001019239) -- scale z
raknetBitStreamWriteInt32(bs, -1) -- color1
raknetBitStreamWriteInt32(bs, -1) -- color2
raknetEmulRpcReceiveBitStream(113, bs)
raknetDeleteBitStream(bs)
--------------------------------------------------------------------------------------
--[NEW ATTACHED OBJECT: 19576]------------------------------------------------------------
local bs = raknetNewBitStream()
raknetBitStreamWriteInt16(bs, 318) -- playerId
raknetBitStreamWriteInt32(bs, 3) -- index
raknetBitStreamWriteBool(bs, true) -- create
raknetBitStreamWriteInt32(bs, 19576) -- modelId
raknetBitStreamWriteInt32(bs, 2) -- bone
raknetBitStreamWriteFloat(bs, 0.099899999797344) -- offset x
raknetBitStreamWriteFloat(bs, 0.035900000482798) -- offset y
raknetBitStreamWriteFloat(bs, 0.0049000000581145) -- offset z
raknetBitStreamWriteFloat(bs, 79.599998474121) -- rotation x
raknetBitStreamWriteFloat(bs, -144.2998046875) -- rotation y
raknetBitStreamWriteFloat(bs, -85.499900817871) -- rotation z
raknetBitStreamWriteFloat(bs, 3.5090000629425) -- scale x
raknetBitStreamWriteFloat(bs, 3.0060000419617) -- scale y
raknetBitStreamWriteFloat(bs, 2.914999961853) -- scale z
raknetBitStreamWriteInt32(bs, -1) -- color1
raknetBitStreamWriteInt32(bs, -1) -- color2
raknetEmulRpcReceiveBitStream(113, bs)
raknetDeleteBitStream(bs)
--------------------------------------------------------------------------------------
--[NEW ATTACHED OBJECT: 19078]------------------------------------------------------------
local bs = raknetNewBitStream()
raknetBitStreamWriteInt16(bs, 318) -- playerId
raknetBitStreamWriteInt32(bs, 4) -- index
raknetBitStreamWriteBool(bs, true) -- create
raknetBitStreamWriteInt32(bs, 19078) -- modelId
raknetBitStreamWriteInt32(bs, 2) -- bone
raknetBitStreamWriteFloat(bs, 0.29690000414848) -- offset x
raknetBitStreamWriteFloat(bs, 0) -- offset y
raknetBitStreamWriteFloat(bs, 0.0049000000581145) -- offset z
raknetBitStreamWriteFloat(bs, 176.39999389648) -- rotation x
raknetBitStreamWriteFloat(bs, -176.19990539551) -- rotation y
raknetBitStreamWriteFloat(bs, -51.799900054932) -- rotation z
raknetBitStreamWriteFloat(bs, 0.5048999786377) -- scale x
raknetBitStreamWriteFloat(bs, 0.55290001630783) -- scale y
raknetBitStreamWriteFloat(bs, 0.55900001525879) -- scale z
raknetBitStreamWriteInt32(bs, -1) -- color1
raknetBitStreamWriteInt32(bs, -1) -- color2
raknetEmulRpcReceiveBitStream(113, bs)
raknetDeleteBitStream(bs)
--------------------------------------------------------------------------------------
--[NEW ATTACHED OBJECT: 19576]------------------------------------------------------------
local bs = raknetNewBitStream()
raknetBitStreamWriteInt16(bs, 318) -- playerId
raknetBitStreamWriteInt32(bs, 5) -- index
raknetBitStreamWriteBool(bs, true) -- create
raknetBitStreamWriteInt32(bs, 19576) -- modelId
raknetBitStreamWriteInt32(bs, 1) -- bone
raknetBitStreamWriteFloat(bs, 0.040899999439716) -- offset x
raknetBitStreamWriteFloat(bs, 0.0098999999463558) -- offset y
raknetBitStreamWriteFloat(bs, -0.010900000110269) -- offset z
raknetBitStreamWriteFloat(bs, 13.900099754333) -- rotation x
raknetBitStreamWriteFloat(bs, -91.999702453613) -- rotation y
raknetBitStreamWriteFloat(bs, -160.69979858398) -- rotation z
raknetBitStreamWriteFloat(bs, 5.0939002037048) -- scale x
raknetBitStreamWriteFloat(bs, 4.4000000953674) -- scale y
raknetBitStreamWriteFloat(bs, 7.5529999732971) -- scale z
raknetBitStreamWriteInt32(bs, -1) -- color1
raknetBitStreamWriteInt32(bs, -1) -- color2
raknetEmulRpcReceiveBitStream(113, bs)
raknetDeleteBitStream(bs)
--------------------------------------------------------------------------------------
--[NEW ATTACHED OBJECT: 2788]------------------------------------------------------------
local bs = raknetNewBitStream()
raknetBitStreamWriteInt16(bs, 318) -- playerId
raknetBitStreamWriteInt32(bs, 6) -- index
raknetBitStreamWriteBool(bs, true) -- create
raknetBitStreamWriteInt32(bs, 2788) -- modelId
raknetBitStreamWriteInt32(bs, 1) -- bone
raknetBitStreamWriteFloat(bs, 0.31090000271797) -- offset x
raknetBitStreamWriteFloat(bs, 0.030899999663234) -- offset y
raknetBitStreamWriteFloat(bs, -0.024900000542402) -- offset z
raknetBitStreamWriteFloat(bs, 84.799896240234) -- rotation x
raknetBitStreamWriteFloat(bs, -88.199996948242) -- rotation y
raknetBitStreamWriteFloat(bs, -89.5) -- rotation z
raknetBitStreamWriteFloat(bs, 0.58600002527237) -- scale x
raknetBitStreamWriteFloat(bs, 0.54900002479553) -- scale y
raknetBitStreamWriteFloat(bs, 1.7079000473022) -- scale z
raknetBitStreamWriteInt32(bs, -1) -- color1
raknetBitStreamWriteInt32(bs, -1) -- color2
raknetEmulRpcReceiveBitStream(113, bs)
raknetDeleteBitStream(bs)

так вот я пробивал через нейронку она меня отшила надеюсь тут помогут
 
  • Клоун
Реакции: MLycoris и Andrinall

abnomegd

Известный
349
37

не работает автологин при входе на сервер или переподключении

autologinAutoRec:
require 'lib.moonloader'
local lsampev, sp = pcall(require, 'lib.samp.events')
local inicfg = require 'inicfg'

local directini = "moonloader\\config\\AdvanceConnect.ini"
local mainini = inicfg.load(nil, directini)

local parol = (mainini.config.parol)
local pinkod = (mainini.config.pinkod)
 
function check()
    local names = {
        'First_Name',
        'Second_Name',
        'Third_Name',
    }
    for i = 1, #names do
        if sampGetPlayerNickname(select(2, sampGetPlayerIdByCharHandle(PLAYER_PED))) == names[i] then
            name = true
            break
        end
    end
    if sampGetCurrentServerAddress() == '194.26.141.246' then srv = true end
    if name and srv then return true end
    return false
end

function main()
    repeat wait(0) until isSampAvailable()
    if check() then
        sampAddChatMessage("[AdvanceConnect]: {FFFFFF}Скрипт загружен.", 0x5CBCFF)
    else
        sampAddChatMessage("[AdvanceConnect]: {FFFFFF}Проверка не пройдена, скрипт выгружен!", 0x5CBCFF)
        thisScript().unload()
    end
 
    sampRegisterChatCommand("rec", function(arg)
        if arg ~= nil then
            time = tonumber(arg)
            res = true
        end
    end)
    while true do
        wait(0)
        local chatstring = sampGetChatString(99)
        if chatstring == "Server closed the connection." or chatstring == "You are banned from this server." then
            sampDisconnectWithReason(false)
            sampAddChatMessage("Wait reconnecting...", 0xa9c4e4)
            wait(5000)
            sampSetGamestate(1)
        end

        if res and time ~= nil then
            sampDisconnectWithReason(quit)
            wait(time*1000)
            sampSetGamestate(1)
            res = false
        elseif res and time == nil then
            sampDisconnectWithReason(quit)
            wait(15500)
            sampSetGamestate(1)
            res = false
        end
    end
end

function sp.onShowDialog(id, style, title, button1, button2, text)
    if id == 1 or id == 2 or id == 10 then
        sampSendDialogResponse(id, 1, 0, parol)
        return false
    end
    if id == 199 then
        sampSendDialogResponse(id, 1, 0, pinkod)
        return false
    end
end
 
Последнее редактирование:

Dmitriy Makarov

25.05.2021
Проверенный
2,515
1,142
не работает автологин при входе на сервер или переподключении
Advance?
sampSendDialogResponse(id, 1, 0, parol)
sampSendDialogResponse(id, 1, 0, pinkod)
Если да, то 0 измени на 65535. У OpenMP какая-то фигня с input диалогами.
 
  • Нравится
Реакции: abnomegd

abnomegd

Известный
349
37
Advance?


Если да, то 0 измени на 65535. У OpenMP какая-то фигня с input диалогами.
да адванс, хотя без опенмп так-же было, работает спасибо

При сканировании сообщения из /id скрываются из чата чтобы не засорять чат. Мне нужно чтобы при сканировании номеров и ников, информациия из /id анализировалась и сканировалась, сохранялась в конфиг прежде чем сообщение из /id будет скрыто, хоть это и моментально это возможно сделать?
вот сам код

code:
script_name("CollectorNumberAndNick")
script_version("version 1")
script_authors("collectSms")

require "lib.moonloader"
local inicfg = require "inicfg"
local sampev = require 'lib.samp.events'
local samputils = require 'lib.sampfuncs'

local config_path = getWorkingDirectory() .. "\\config\\sms_config.ini"
if not doesDirectoryExist(getWorkingDirectory() .. "\\config") then
    createDirectory(getWorkingDirectory() .. "\\config")
end

local config = inicfg.load({ sms = { list = "", players = "" } }, config_path)

-- Переменные для сбора SMS
local existingNumbers = {}
local existingPlayers = {}
local collecting = false
local scanning = false

-- Таблица для отслеживания отправленных ID
local sentIds = {}

local function loadExistingData()
    existingNumbers = {}
    existingPlayers = {}
 
    if config.sms.list ~= nil and config.sms.list ~= "" then
        for num in string.gmatch(config.sms.list, "[^,]+") do
            existingNumbers[num] = true
        end
    end
 
    if config.sms.players ~= nil and config.sms.players ~= "" then
        for pair in string.gmatch(config.sms.players, "[^,]+") do
            local number, name = pair:match("([^=]+)=(.+)")
            if number and name then
                existingPlayers[number] = name
            end
        end
    end
end

local function saveData()
    local allNumbers = {}
    for num in pairs(existingNumbers) do
        table.insert(allNumbers, num)
    end
    config.sms.list = table.concat(allNumbers, ",")
 
    local allPlayers = {}
    for num, name in pairs(existingPlayers) do
        table.insert(allPlayers, num .. "=" .. name)
    end
    config.sms.players = table.concat(allPlayers, ",")
 
    inicfg.save(config, config_path)
end

local function addPlayer(number, name)
    if existingNumbers[number] then
        print("[SMS Collector] Номер уже в конфиге: " .. number)
        return false
    else
        existingNumbers[number] = true
        existingPlayers[number] = name
        saveData()
        print("[SMS Collector] Добавлен: " .. number .. " (" .. name .. ")")
        return true
    end
end

local function removeColorCodes(text)
    return text:gsub("{[%x]+}", "")
end

local function extractNickFromAd(text)
    local senderNick = text:match("Отправил%s+([%w_]+)")
    if senderNick then
        return senderNick
    end
 
    senderNick = text:match("от%s+([%w_]+)")
    if senderNick then
        return senderNick
    end
 
    local nick = text:match("^([%w_]+)")
    if nick then
        return nick
    end
 
    return "Объявление"
end

-- Функция для обработки ответов на /id
local function processAndAddPlayer(cleanText)
    -- Паттерны для разных форматов ответов
    local patterns = {
        {pattern = "(.+) id (%d+) %- тел%. (%d+)",
         extract = function(p, id, num) return p, num end},
        {pattern = "(.+) id (%d+) %- ren%. (%d+)",
         extract = function(p, id, num) return p, num end},
        {pattern = "(.+) id (%d+) %(.-%) %- тел%. (%d+)",
         extract = function(p, id, num) return p, num end},
        {pattern = "(.+) id (%d+) %(.-%) %- ren%. (%d+)",
         extract = function(p, id, num) return p, num end},
        {pattern = "(.+) id (%d+)",
         extract = function(p, id) return p, nil end}
    }
 
    for _, p in ipairs(patterns) do
        local playerName, id, number = cleanText:match(p.pattern)
        if playerName then
            playerName, number = p.extract(playerName, id, number)
            playerName = playerName:gsub("%s+$", ""):gsub("^%s+", "")
         
            if number then
                if addPlayer(number, playerName) then
                    print("[Сканирование] Добавлено: ID "..id.." | "..number.." | "..playerName)
                end
                return true
            else
                print("[Сканирование] Найден ID "..id..": "..playerName.." (номер не обнаружен)")
                return true
            end
        end
    end
 
    return false
end

-- Блокировка отображения команд /id в чате
function sampev.onSendCommand(cmd)
    if scanning then
        local id = cmd:match("^/id%s+(%d+)")
        if id then
            return false -- Блокируем вывод команды
        end
    end
end

-- Обработка серверных сообщений
function sampev.onServerMessage(color, text)
    local cleanText = removeColorCodes(text)
 
    if scanning then
        -- Обработка ответов на /id
        if processAndAddPlayer(cleanText) then
            return true -- Скрываем сообщение
        end
    end
 
    if collecting then
        -- Обработка объявлений
        local found = false
        for number in cleanText:gmatch("тел%.%s*(%d+)") or cleanText:gmatch("ren%.%s*(%d+)") do
            found = true
            local playerName = extractNickFromAd(cleanText)
            addPlayer(number, playerName)
        end
     
        if found then
            print("[SMS Collector] Найдено в объявлении: " .. cleanText)
        end
    end
end

-- Обработка сообщений чата
function sampev.onChatMessage(color, text, playerId)
    local cleanText = removeColorCodes(text)
 
    if scanning then
        -- Обработка ответов на /id
        if processAndAddPlayer(cleanText) then
            return false -- Скрываем сообщение
        end
    end
 
    if collecting then
        local playerName = sampGetPlayerNickname(playerId) or "Неизвестно"
        local found = false
     
        for number in cleanText:gmatch("тел%.%s*(%d+)") or cleanText:gmatch("ren%.%s*(%d+)") do
            found = true
            addPlayer(number, playerName)
        end
     
        if found then
            print("[SMS Collector] Найдено в чате: " .. cleanText)
        end
    end
 
    return true
end

-- Функция сканирования ID
local function scanIDs()
    if scanning then
        print("[SMS Collector] Сканирование уже запущено!")
        return
    end

    scanning = true
    sentIds = {}
 
    print("[SMS Collector] Начинаем сканирование ID 0-1000...")
    print("Все найденные номера будут мгновенно сохраняться")

    lua_thread.create(function()
        for i = 0, 1000 do
            if not scanning then break end
            if sampIsPlayerConnected(i) then
                table.insert(sentIds, i)
                sampSendChat("/id " .. i)
                wait(100)
            end
        end
     
        -- Ждем завершения обработки
        wait(3000)
        scanning = false
        sampAddChatMessage("Сканирование завершено.", 0x00FF00)
        print("[SMS Collector] Сканирование завершено")
    end)
end

function main()
    while not isSampAvailable() do wait(100) end

    loadExistingData()
    sampAddChatMessage("SMS Collector Pro v21 загружен. Команды:", 0x00FFAA)
    sampAddChatMessage("/collectsms - начать сбор", 0x00FFAA)
    sampAddChatMessage("/collectstop - остановить сбор", 0x00FFAA)

    sampRegisterChatCommand("collectsms", function()
        if collecting then
            sampAddChatMessage("Сбор уже активен.", 0xFFFF00)
            return
        end
        collecting = true
        sampAddChatMessage("Сбор номеров и ников активирован!", 0x00FF00)
        print("[SMS Collector] Запущено сканирование ID")
        scanIDs()
    end)

    sampRegisterChatCommand("collectstop", function()
        if not collecting then
            sampAddChatMessage("Сбор не активен.", 0xFFFF00)
            return
        end
        collecting = false
        scanning = false
        sampAddChatMessage("Сбор остановлен.", 0xFF9900)
        print("[SMS Collector] Сканирование остановлено")
    end)

    wait(-1)
end
 
Последнее редактирование: