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

CaJlaT

Овощ
Модератор
2,824
2,655
Есть код:
Код:
function sampev.onSendChat(msg) -- Получаем сообщение чата
    if msg == 'q' then
        return
    end
    if accent.v then
        return {u8:decode(text_accent.v)  .. msg} -- Возвращаем сообщение чата + акцент
    end
end
Как сделать, что бы после text_accent.v ставился пробел?
Допустим text_accent имеет текст [Текст]:
И если не ставить пробел, будет такое сообщение:
[Текст]:сообщение, которое ввёл игрок.
А я хочу так:
[Текст]: сообщение, которое ввёл игрок. (то есть пробел после двоеточия)
Lua:
return {u8:decode(text_accent.v)..' '..msg}
 
  • Нравится
Реакции: Immortal-

banan4eg

Известный
47
15
Есть код:
Код:
function sampev.onSendChat(msg) -- Получаем сообщение чата
    if msg == 'q' then
        return
    end
    if accent.v then
        return {u8:decode(text_accent.v)  .. msg} -- Возвращаем сообщение чата + акцент
    end
end
Как сделать, что бы после text_accent.v ставился пробел?
Допустим text_accent имеет текст [Текст]:
И если не ставить пробел, будет такое сообщение:
[Текст]:сообщение, которое ввёл игрок.
А я хочу так:
[Текст]: сообщение, которое ввёл игрок. (то есть пробел после двоеточия)
Lua:
function sampev.onSendChat(msg) -- Получаем сообщение чата
    if msg == 'q' then
        return
    end
    if accent.v then
        return {u8:decode(text_accent.v)..' '..msg} -- Возвращаем сообщение чата + акцент
    end
end
 
  • Нравится
Реакции: Immortal-

damag

Женюсь на официантке в моем любимом баре
Проверенный
1,152
1,199
Как cделать imgui.text, который можно копировать, по типу буффер бара?
 
Последнее редактирование:

zzzzzzzzz

Участник
34
4
в общем когда админ заходит в /sp (слежку) за игроком - пропадает радар, как сделать что бы отображение радара было всегда
 

Biuti

Участник
165
8
как сделать проверку на нахождение игрока в интерьере если значение =true тогда производиться какое-то действие?
 

Immortal-

Участник
67
1
Не работает отыгровка времени (Переменная timer_ot, text_time, function otigrovka)
script_name('[Immortal-] Helper for samp') -- Название Скрипта
script_author('Immortal-') -- Автор
require "lib.moonloader" -- Подключаем библиотеку Moonloader
local imgui = require 'imgui' -- Подключаем Imgui
local encoding = require 'encoding' -- Подключаем кодировку
local inicfg = require 'inicfg' -- Подключаем работу с конфигом
local sampev = require 'lib.samp.events' -- Подключаем работу с самим Сампом
local key = require 'vkeys' -- Подключаем работу с кнопками
encoding.default = 'CP1251' -- Стандартная кодировка
u8 = encoding.UTF8 -- Кодировка для UTF8
-- Стиль
function apply_custom_style()
imgui.SwitchContext()
local style = imgui.GetStyle()
local colors = style.Colors
local clr = imgui.Col
local ImVec4 = imgui.ImVec4
style.Alpha = 1.0
style.ChildWindowRounding = 3
style.WindowRounding = 3
style.GrabRounding = 1
style.GrabMinSize = 20
style.FrameRounding = 3
colors[clr.Text] = ImVec4(0.00, 1.00, 1.00, 1.00)
colors[clr.TextDisabled] = ImVec4(0.00, 0.40, 0.41, 1.00)
colors[clr.WindowBg] = ImVec4(0.00, 0.00, 0.00, 1.00)
colors[clr.ChildWindowBg] = ImVec4(0.00, 0.00, 0.00, 0.00)
colors[clr.Border] = ImVec4(0.00, 1.00, 1.00, 0.65)
colors[clr.BorderShadow] = ImVec4(0.00, 0.00, 0.00, 0.00)
colors[clr.FrameBg] = ImVec4(0.44, 0.80, 0.80, 0.18)
colors[clr.FrameBgHovered] = ImVec4(0.44, 0.80, 0.80, 0.27)
colors[clr.FrameBgActive] = ImVec4(0.44, 0.81, 0.86, 0.66)
colors[clr.TitleBg] = ImVec4(0.14, 0.18, 0.21, 0.73)
colors[clr.TitleBgCollapsed] = ImVec4(0.00, 0.00, 0.00, 0.54)
colors[clr.TitleBgActive] = ImVec4(0.00, 1.00, 1.00, 0.27)
colors[clr.MenuBarBg] = ImVec4(0.00, 0.00, 0.00, 0.20)
colors[clr.ScrollbarBg] = ImVec4(0.22, 0.29, 0.30, 0.71)
colors[clr.ScrollbarGrab] = ImVec4(0.00, 1.00, 1.00, 0.44)
colors[clr.ScrollbarGrabHovered] = ImVec4(0.00, 1.00, 1.00, 0.74)
colors[clr.ScrollbarGrabActive] = ImVec4(0.00, 1.00, 1.00, 1.00)
colors[clr.ComboBg] = ImVec4(0.16, 0.24, 0.22, 0.60)
colors[clr.CheckMark] = ImVec4(0.00, 1.00, 1.00, 0.68)
colors[clr.SliderGrab] = ImVec4(0.00, 1.00, 1.00, 0.36)
colors[clr.SliderGrabActive] = ImVec4(0.00, 1.00, 1.00, 0.76)
colors[clr.Button] = ImVec4(0.00, 0.65, 0.65, 0.46)
colors[clr.ButtonHovered] = ImVec4(0.01, 1.00, 1.00, 0.43)
colors[clr.ButtonActive] = ImVec4(0.00, 1.00, 1.00, 0.62)
colors[clr.Header] = ImVec4(0.00, 1.00, 1.00, 0.33)
colors[clr.HeaderHovered] = ImVec4(0.00, 1.00, 1.00, 0.42)
colors[clr.HeaderActive] = ImVec4(0.00, 1.00, 1.00, 0.54)
colors[clr.ResizeGrip] = ImVec4(0.00, 1.00, 1.00, 0.54)
colors[clr.ResizeGripHovered] = ImVec4(0.00, 1.00, 1.00, 0.74)
colors[clr.ResizeGripActive] = ImVec4(0.00, 1.00, 1.00, 1.00)
colors[clr.CloseButton] = ImVec4(0.00, 0.78, 0.78, 0.35)
colors[clr.CloseButtonHovered] = ImVec4(0.00, 0.78, 0.78, 0.47)
colors[clr.CloseButtonActive] = ImVec4(0.00, 0.78, 0.78, 1.00)
colors[clr.PlotLines] = ImVec4(0.00, 1.00, 1.00, 1.00)
colors[clr.PlotLinesHovered] = ImVec4(0.00, 1.00, 1.00, 1.00)
colors[clr.PlotHistogram] = ImVec4(0.00, 1.00, 1.00, 1.00)
colors[clr.PlotHistogramHovered] = ImVec4(0.00, 1.00, 1.00, 1.00)
colors[clr.TextSelectedBg] = ImVec4(0.00, 1.00, 1.00, 0.22)
colors[clr.ModalWindowDarkening] = ImVec4(0.04, 0.10, 0.09, 0.51)
end
apply_custom_style()
-- Стиль
local delay = imgui.ImInt(31000)
local delay_time = imgui.ImInt(1500)
local main_window_state = imgui.ImBool(false) -- Окно ImGui
-- Ини файл
local mainIni = inicfg.load({ -- создаем конфиг
config =
{
accent = false, -- Сохраняем Акцент
piar = false, -- Сохраняем Пиар
clear_chat = false,
time_ot = false,
text_accent = " ", -- Сохраняем текст Акцента
text_piar = " ", -- Сохраняем текст Пиара
text_time = " "
}
},
"helper")
local accent = imgui.ImBool(mainIni.config.accent) -- Делаем переменную для Акцента
local piar = imgui.ImBool(mainIni.config.piar) -- Делаем переменную для Пиара
local time_ot = imgui.ImBool(mainIni.config.time_ot) -- Делаем переменную для Тайма
local clear_chat = imgui.ImBool(mainIni.config.clear_chat) -- Делаем переменную для Очистки чата
local text_accent = imgui.ImBuffer(''..mainIni.config.text_accent, 500) -- Делаем переменную для текста Акцента
local text_piar = imgui.ImBuffer(''..mainIni.config.text_piar, 500) -- Делаем переменную для текста Пиара
local text_time = imgui.ImBuffer(''..mainIni.config.text_time, 500) -- Делаем переменную для текста Пиара
local status = inicfg.load(mainIni, 'helper.ini') -- подгружаем конфиг
if not doesFileExist('moonloader/config/helper.ini') then -- Проверка, если конфиг существует
inicfg.save(mainIni, 'helper.ini') -- Сохраняем конфиг
end
-- Ини файл
-- Регистрация команды
function cmd_helper(arg) -- Начало функции
main_window_state.v = not main_window_state.v -- Открываем окно main_window_state
imgui.Process = main_window_state.v -- Активируем процесс
end -- Конец функции
-- Регистрация команды
function imgui.OnDrawFrame() -- Вывод ImGui
-- Закрытие процесса
if not main_window_state.v then -- Проверка, если main_window_state не используется
imgui.Process = false -- Отключаем процесс
end -- Конец проверки
-- Закрытие процесса
-- Установка Позиции
if not window_pos then
ScreenX, ScreenY = getScreenResolution()ScreenX, ScreenY = getScreenResolution() -- Получаем разрешение экрана
imgui.SetNextWindowPos(imgui.ImVec2(ScreenX / 2 , ScreenY / 2), imgui.Cond.FirsUseEver, imgui.ImVec2(0.5, 0.5)) -- Установка позиции по центру экрана
end -- Конец проверки
-- Установка Позиции
if main_window_state.v then -- Проверка, если main_window_state используется
imgui.SetNextWindowSize(imgui.ImVec2(1080, 520), imgui.Cond.FirstUseEver) -- Установка разрешения
imgui.Begin('[Хелпер] Окно с настройками', main_window_state) -- Начало ImGUI
imgui.BeginChild("##g_command", imgui.ImVec2(300, 120), true, imgui.WindowFlags.NoScrollbar) -- Подгруппа
imgui.Text('Команды в чат:') -- Текст
imgui.Text('Очисить чат (Команда /cchat)') -- Текст
imgui.Text('Найти дом (Для ArizonaRP) (Команда /fh id)') -- Текст
imgui.Text('Найти бизнес (Для ArizonaRP) (Команда /fbiz id)') -- Текст
imgui.Text('Узнать местоположение (Команда /mycoord)') -- Текст
imgui.EndChild() -- Подгруппа
imgui.BeginChild("##g_checkbox", imgui.ImVec2(300, 120), true, imgui.WindowFlags.NoScrollbar) -- Подгруппа
imgui.Checkbox('Включить Акцент', accent) -- Чекбокс
if accent.v then -- Если чекбокс активен
imgui.InputText('Акцент', text_accent) -- Поле ввода текста
end -- Конец Проверки
imgui.Checkbox('Включить Пиар', piar) -- Чекбокс
if piar.v then-- Если чекбокс активен
imgui.InputText('Пиар', text_piar) -- Поле ввода текста
imgui.InputInt('Задержка в МС', delay) -- Задержка
end -- Конец Проверки
imgui.Checkbox('Включить отыгровку Времени', time_ot) -- Чекбокс
if time_ot.v then -- Если чекбокс активен
imgui.InputTextMultiline('', text_time, imgui.ImVec2(200, 200)) -- Поле вводка текста
imgui.InputInt('Задержка в МС:', delay_time) -- Задержка
imgui.SameLine() -- Линия текста
if wasKeyPressed(key.VK_X) and not sampIsCursorActive() then -- Если кнопка нажата и выключен чат
otigrovka() -- Выполнение функции
end-- Конец Проверки
end-- Конец Проверки
imgui.EndChild() -- Подгруппа
imgui.BeginChild("##g_button", imgui.ImVec2(300, 120), true, imgui.WindowFlags.NoScrollbar) -- Подгруппа
-- Кнопка
if imgui.Button('Сохранить', imgui.ImVec2(135,25)) then -- Создаем кнопку
mainIni.config.accent = accent.v -- Получаем чекбокс Акцента
mainIni.config.text_accent = text_accent.v -- Получаем поле с текстом Акцента
mainIni.config.clear_chat = clear_chat.v -- Получаем поле с очисткой чата
mainIni.config.piar = piar.v -- Получаем чекбокс Пиара
mainIni.config.text_piar = text_piar.v -- Получаем поле с текстом Пиара
inicfg.save(mainIni, 'helper.ini') -- Сохраняем в файл
end
-- Кнопка
imgui.EndChild() -- Подгруппа
imgui.End() -- Конец ImGUI
end -- Конец проверки
end -- Конец функции
-- Функция для отыгровки
function otigrovka()
if time_ot.v then
lua_thread.create(function()
local delay_time = tonumber(delay_time.v)
for str in string.gmatch(text_time.v, "[^\r\n]+") do
sampAddChatMessage(u8:decode(str), -1)
wait(delay_time)
end
end)
end
end
-- Функция для отыгровки
-- Функция Акцента
function sampev.onSendChat(msg) -- Получаем сообщение чата
if msg == 'q' then
return
end
if accent.v then
return {u8:decode(text_accent.v)..' '..msg} -- Возвращаем сообщение чата + акцент
end
end
-- Функция Акцента
-- Функция очистки чата
function ClearChat()
local memory = require "memory"
memory.fill(sampGetChatInfoPtr() + 306, 0x0, 25200)
memory.write(sampGetChatInfoPtr() + 306, 25562, 4, 0x0)
memory.write(sampGetChatInfoPtr() + 0x63DA, 1, 1)
end
-- Функция очистки чата
function cmd_coord(arg)
local X, Y, Z = getCharCoordinates(PLAYER_PED)
local zone = getGxtText(getNameOfZone(X, Y, Z))
sampAddChatMessage(zone, -1)
end
function main()
if not isSampLoaded() or not isSampfuncsLoaded() then
return
end

-- Блок, который выполняеться 1 раз!
sampRegisterChatCommand("ihelp", cmd_helper) -- Ригстрация команды /ihelp в чат

sampRegisterChatCommand('cchat', function() ClearChat() end) -- Регистрация команды /cchat в чат
sampRegisterChatCommand('fh', function(num)
sampSendChat('/findihouse '..num)
end)
sampRegisterChatCommand('fbiz', function(num)
sampSendChat('/findibiz '..num)
end)
sampRegisterChatCommand('mycoord', cmd_coord)
while true do
-- Бесконечный цикл
wait(0)
if piar.v then
local delay = tonumber(delay.v)
sampSendChat(u8:decode(text_piar.v))
wait(delay)
end
end
end
 

banan4eg

Известный
47
15
Не работает отыгровка времени (Переменная timer_ot, text_time, function otigrovka)
script_name('[Immortal-] Helper for samp') -- Название Скрипта
script_author('Immortal-') -- Автор
require "lib.moonloader" -- Подключаем библиотеку Moonloader
local imgui = require 'imgui' -- Подключаем Imgui
local encoding = require 'encoding' -- Подключаем кодировку
local inicfg = require 'inicfg' -- Подключаем работу с конфигом
local sampev = require 'lib.samp.events' -- Подключаем работу с самим Сампом
local key = require 'vkeys' -- Подключаем работу с кнопками
encoding.default = 'CP1251' -- Стандартная кодировка
u8 = encoding.UTF8 -- Кодировка для UTF8
-- Стиль
function apply_custom_style()
imgui.SwitchContext()
local style = imgui.GetStyle()
local colors = style.Colors
local clr = imgui.Col
local ImVec4 = imgui.ImVec4
style.Alpha = 1.0
style.ChildWindowRounding = 3
style.WindowRounding = 3
style.GrabRounding = 1
style.GrabMinSize = 20
style.FrameRounding = 3
colors[clr.Text] = ImVec4(0.00, 1.00, 1.00, 1.00)
colors[clr.TextDisabled] = ImVec4(0.00, 0.40, 0.41, 1.00)
colors[clr.WindowBg] = ImVec4(0.00, 0.00, 0.00, 1.00)
colors[clr.ChildWindowBg] = ImVec4(0.00, 0.00, 0.00, 0.00)
colors[clr.Border] = ImVec4(0.00, 1.00, 1.00, 0.65)
colors[clr.BorderShadow] = ImVec4(0.00, 0.00, 0.00, 0.00)
colors[clr.FrameBg] = ImVec4(0.44, 0.80, 0.80, 0.18)
colors[clr.FrameBgHovered] = ImVec4(0.44, 0.80, 0.80, 0.27)
colors[clr.FrameBgActive] = ImVec4(0.44, 0.81, 0.86, 0.66)
colors[clr.TitleBg] = ImVec4(0.14, 0.18, 0.21, 0.73)
colors[clr.TitleBgCollapsed] = ImVec4(0.00, 0.00, 0.00, 0.54)
colors[clr.TitleBgActive] = ImVec4(0.00, 1.00, 1.00, 0.27)
colors[clr.MenuBarBg] = ImVec4(0.00, 0.00, 0.00, 0.20)
colors[clr.ScrollbarBg] = ImVec4(0.22, 0.29, 0.30, 0.71)
colors[clr.ScrollbarGrab] = ImVec4(0.00, 1.00, 1.00, 0.44)
colors[clr.ScrollbarGrabHovered] = ImVec4(0.00, 1.00, 1.00, 0.74)
colors[clr.ScrollbarGrabActive] = ImVec4(0.00, 1.00, 1.00, 1.00)
colors[clr.ComboBg] = ImVec4(0.16, 0.24, 0.22, 0.60)
colors[clr.CheckMark] = ImVec4(0.00, 1.00, 1.00, 0.68)
colors[clr.SliderGrab] = ImVec4(0.00, 1.00, 1.00, 0.36)
colors[clr.SliderGrabActive] = ImVec4(0.00, 1.00, 1.00, 0.76)
colors[clr.Button] = ImVec4(0.00, 0.65, 0.65, 0.46)
colors[clr.ButtonHovered] = ImVec4(0.01, 1.00, 1.00, 0.43)
colors[clr.ButtonActive] = ImVec4(0.00, 1.00, 1.00, 0.62)
colors[clr.Header] = ImVec4(0.00, 1.00, 1.00, 0.33)
colors[clr.HeaderHovered] = ImVec4(0.00, 1.00, 1.00, 0.42)
colors[clr.HeaderActive] = ImVec4(0.00, 1.00, 1.00, 0.54)
colors[clr.ResizeGrip] = ImVec4(0.00, 1.00, 1.00, 0.54)
colors[clr.ResizeGripHovered] = ImVec4(0.00, 1.00, 1.00, 0.74)
colors[clr.ResizeGripActive] = ImVec4(0.00, 1.00, 1.00, 1.00)
colors[clr.CloseButton] = ImVec4(0.00, 0.78, 0.78, 0.35)
colors[clr.CloseButtonHovered] = ImVec4(0.00, 0.78, 0.78, 0.47)
colors[clr.CloseButtonActive] = ImVec4(0.00, 0.78, 0.78, 1.00)
colors[clr.PlotLines] = ImVec4(0.00, 1.00, 1.00, 1.00)
colors[clr.PlotLinesHovered] = ImVec4(0.00, 1.00, 1.00, 1.00)
colors[clr.PlotHistogram] = ImVec4(0.00, 1.00, 1.00, 1.00)
colors[clr.PlotHistogramHovered] = ImVec4(0.00, 1.00, 1.00, 1.00)
colors[clr.TextSelectedBg] = ImVec4(0.00, 1.00, 1.00, 0.22)
colors[clr.ModalWindowDarkening] = ImVec4(0.04, 0.10, 0.09, 0.51)
end
apply_custom_style()
-- Стиль
local delay = imgui.ImInt(31000)
local delay_time = imgui.ImInt(1500)
local main_window_state = imgui.ImBool(false) -- Окно ImGui
-- Ини файл
local mainIni = inicfg.load({ -- создаем конфиг
config =
{
accent = false, -- Сохраняем Акцент
piar = false, -- Сохраняем Пиар
clear_chat = false,
time_ot = false,
text_accent = " ", -- Сохраняем текст Акцента
text_piar = " ", -- Сохраняем текст Пиара
text_time = " "
}
},
"helper")
local accent = imgui.ImBool(mainIni.config.accent) -- Делаем переменную для Акцента
local piar = imgui.ImBool(mainIni.config.piar) -- Делаем переменную для Пиара
local time_ot = imgui.ImBool(mainIni.config.time_ot) -- Делаем переменную для Тайма
local clear_chat = imgui.ImBool(mainIni.config.clear_chat) -- Делаем переменную для Очистки чата
local text_accent = imgui.ImBuffer(''..mainIni.config.text_accent, 500) -- Делаем переменную для текста Акцента
local text_piar = imgui.ImBuffer(''..mainIni.config.text_piar, 500) -- Делаем переменную для текста Пиара
local text_time = imgui.ImBuffer(''..mainIni.config.text_time, 500) -- Делаем переменную для текста Пиара
local status = inicfg.load(mainIni, 'helper.ini') -- подгружаем конфиг
if not doesFileExist('moonloader/config/helper.ini') then -- Проверка, если конфиг существует
inicfg.save(mainIni, 'helper.ini') -- Сохраняем конфиг
end
-- Ини файл
-- Регистрация команды
function cmd_helper(arg) -- Начало функции
main_window_state.v = not main_window_state.v -- Открываем окно main_window_state
imgui.Process = main_window_state.v -- Активируем процесс
end -- Конец функции
-- Регистрация команды
function imgui.OnDrawFrame() -- Вывод ImGui
-- Закрытие процесса
if not main_window_state.v then -- Проверка, если main_window_state не используется
imgui.Process = false -- Отключаем процесс
end -- Конец проверки
-- Закрытие процесса
-- Установка Позиции
if not window_pos then
ScreenX, ScreenY = getScreenResolution()ScreenX, ScreenY = getScreenResolution() -- Получаем разрешение экрана
imgui.SetNextWindowPos(imgui.ImVec2(ScreenX / 2 , ScreenY / 2), imgui.Cond.FirsUseEver, imgui.ImVec2(0.5, 0.5)) -- Установка позиции по центру экрана
end -- Конец проверки
-- Установка Позиции
if main_window_state.v then -- Проверка, если main_window_state используется
imgui.SetNextWindowSize(imgui.ImVec2(1080, 520), imgui.Cond.FirstUseEver) -- Установка разрешения
imgui.Begin('[Хелпер] Окно с настройками', main_window_state) -- Начало ImGUI
imgui.BeginChild("##g_command", imgui.ImVec2(300, 120), true, imgui.WindowFlags.NoScrollbar) -- Подгруппа
imgui.Text('Команды в чат:') -- Текст
imgui.Text('Очисить чат (Команда /cchat)') -- Текст
imgui.Text('Найти дом (Для ArizonaRP) (Команда /fh id)') -- Текст
imgui.Text('Найти бизнес (Для ArizonaRP) (Команда /fbiz id)') -- Текст
imgui.Text('Узнать местоположение (Команда /mycoord)') -- Текст
imgui.EndChild() -- Подгруппа
imgui.BeginChild("##g_checkbox", imgui.ImVec2(300, 120), true, imgui.WindowFlags.NoScrollbar) -- Подгруппа
imgui.Checkbox('Включить Акцент', accent) -- Чекбокс
if accent.v then -- Если чекбокс активен
imgui.InputText('Акцент', text_accent) -- Поле ввода текста
end -- Конец Проверки
imgui.Checkbox('Включить Пиар', piar) -- Чекбокс
if piar.v then-- Если чекбокс активен
imgui.InputText('Пиар', text_piar) -- Поле ввода текста
imgui.InputInt('Задержка в МС', delay) -- Задержка
end -- Конец Проверки
imgui.Checkbox('Включить отыгровку Времени', time_ot) -- Чекбокс
if time_ot.v then -- Если чекбокс активен
imgui.InputTextMultiline('', text_time, imgui.ImVec2(200, 200)) -- Поле вводка текста
imgui.InputInt('Задержка в МС:', delay_time) -- Задержка
imgui.SameLine() -- Линия текста
if wasKeyPressed(key.VK_X) and not sampIsCursorActive() then -- Если кнопка нажата и выключен чат
otigrovka() -- Выполнение функции
end-- Конец Проверки
end-- Конец Проверки
imgui.EndChild() -- Подгруппа
imgui.BeginChild("##g_button", imgui.ImVec2(300, 120), true, imgui.WindowFlags.NoScrollbar) -- Подгруппа
-- Кнопка
if imgui.Button('Сохранить', imgui.ImVec2(135,25)) then -- Создаем кнопку
mainIni.config.accent = accent.v -- Получаем чекбокс Акцента
mainIni.config.text_accent = text_accent.v -- Получаем поле с текстом Акцента
mainIni.config.clear_chat = clear_chat.v -- Получаем поле с очисткой чата
mainIni.config.piar = piar.v -- Получаем чекбокс Пиара
mainIni.config.text_piar = text_piar.v -- Получаем поле с текстом Пиара
inicfg.save(mainIni, 'helper.ini') -- Сохраняем в файл
end
-- Кнопка
imgui.EndChild() -- Подгруппа
imgui.End() -- Конец ImGUI
end -- Конец проверки
end -- Конец функции
-- Функция для отыгровки
function otigrovka()
if time_ot.v then
lua_thread.create(function()
local delay_time = tonumber(delay_time.v)
for str in string.gmatch(text_time.v, "[^\r\n]+") do
sampAddChatMessage(u8:decode(str), -1)
wait(delay_time)
end
end)
end
end
-- Функция для отыгровки
-- Функция Акцента
function sampev.onSendChat(msg) -- Получаем сообщение чата
if msg == 'q' then
return
end
if accent.v then
return {u8:decode(text_accent.v)..' '..msg} -- Возвращаем сообщение чата + акцент
end
end
-- Функция Акцента
-- Функция очистки чата
function ClearChat()
local memory = require "memory"
memory.fill(sampGetChatInfoPtr() + 306, 0x0, 25200)
memory.write(sampGetChatInfoPtr() + 306, 25562, 4, 0x0)
memory.write(sampGetChatInfoPtr() + 0x63DA, 1, 1)
end
-- Функция очистки чата
function cmd_coord(arg)
local X, Y, Z = getCharCoordinates(PLAYER_PED)
local zone = getGxtText(getNameOfZone(X, Y, Z))
sampAddChatMessage(zone, -1)
end
function main()
if not isSampLoaded() or not isSampfuncsLoaded() then
return
end

-- Блок, который выполняеться 1 раз!
sampRegisterChatCommand("ihelp", cmd_helper) -- Ригстрация команды /ihelp в чат

sampRegisterChatCommand('cchat', function() ClearChat() end) -- Регистрация команды /cchat в чат
sampRegisterChatCommand('fh', function(num)
sampSendChat('/findihouse '..num)
end)
sampRegisterChatCommand('fbiz', function(num)
sampSendChat('/findibiz '..num)
end)
sampRegisterChatCommand('mycoord', cmd_coord)
while true do
-- Бесконечный цикл
wait(0)
if piar.v then
local delay = tonumber(delay.v)
sampSendChat(u8:decode(text_piar.v))
wait(delay)
end
end
end

Код конечно пиздец у тебя и не обязательно весь код сюда в спойлер лупить, а еще лучше в формате кода вставляй, а не спойлера.
Lua:
script_name('[Immortal-] Helper for samp') -- Название Скрипта
script_author('Immortal-') -- Автор
require "lib.moonloader" -- Подключаем библиотеку Moonloader
local imgui = require 'imgui' -- Подключаем Imgui
local encoding = require 'encoding' -- Подключаем кодировку
local inicfg = require 'inicfg' -- Подключаем работу с конфигом
local sampev = require 'lib.samp.events' -- Подключаем работу с самим Сампом
local key = require 'vkeys' -- Подключаем работу с кнопками
encoding.default = 'CP1251' -- Стандартная кодировка
u8 = encoding.UTF8 -- Кодировка для UTF8
-- Стиль
function apply_custom_style()
imgui.SwitchContext()
local style = imgui.GetStyle()
local colors = style.Colors
local clr = imgui.Col
local ImVec4 = imgui.ImVec4
style.Alpha = 1.0
style.ChildWindowRounding = 3
style.WindowRounding = 3
style.GrabRounding = 1
style.GrabMinSize = 20
style.FrameRounding = 3
colors[clr.Text] = ImVec4(0.00, 1.00, 1.00, 1.00)
colors[clr.TextDisabled] = ImVec4(0.00, 0.40, 0.41, 1.00)
colors[clr.WindowBg] = ImVec4(0.00, 0.00, 0.00, 1.00)
colors[clr.ChildWindowBg] = ImVec4(0.00, 0.00, 0.00, 0.00)
colors[clr.Border] = ImVec4(0.00, 1.00, 1.00, 0.65)
colors[clr.BorderShadow] = ImVec4(0.00, 0.00, 0.00, 0.00)
colors[clr.FrameBg] = ImVec4(0.44, 0.80, 0.80, 0.18)
colors[clr.FrameBgHovered] = ImVec4(0.44, 0.80, 0.80, 0.27)
colors[clr.FrameBgActive] = ImVec4(0.44, 0.81, 0.86, 0.66)
colors[clr.TitleBg] = ImVec4(0.14, 0.18, 0.21, 0.73)
colors[clr.TitleBgCollapsed] = ImVec4(0.00, 0.00, 0.00, 0.54)
colors[clr.TitleBgActive] = ImVec4(0.00, 1.00, 1.00, 0.27)
colors[clr.MenuBarBg] = ImVec4(0.00, 0.00, 0.00, 0.20)
colors[clr.ScrollbarBg] = ImVec4(0.22, 0.29, 0.30, 0.71)
colors[clr.ScrollbarGrab] = ImVec4(0.00, 1.00, 1.00, 0.44)
colors[clr.ScrollbarGrabHovered] = ImVec4(0.00, 1.00, 1.00, 0.74)
colors[clr.ScrollbarGrabActive] = ImVec4(0.00, 1.00, 1.00, 1.00)
colors[clr.ComboBg] = ImVec4(0.16, 0.24, 0.22, 0.60)
colors[clr.CheckMark] = ImVec4(0.00, 1.00, 1.00, 0.68)
colors[clr.SliderGrab] = ImVec4(0.00, 1.00, 1.00, 0.36)
colors[clr.SliderGrabActive] = ImVec4(0.00, 1.00, 1.00, 0.76)
colors[clr.Button] = ImVec4(0.00, 0.65, 0.65, 0.46)
colors[clr.ButtonHovered] = ImVec4(0.01, 1.00, 1.00, 0.43)
colors[clr.ButtonActive] = ImVec4(0.00, 1.00, 1.00, 0.62)
colors[clr.Header] = ImVec4(0.00, 1.00, 1.00, 0.33)
colors[clr.HeaderHovered] = ImVec4(0.00, 1.00, 1.00, 0.42)
colors[clr.HeaderActive] = ImVec4(0.00, 1.00, 1.00, 0.54)
colors[clr.ResizeGrip] = ImVec4(0.00, 1.00, 1.00, 0.54)
colors[clr.ResizeGripHovered] = ImVec4(0.00, 1.00, 1.00, 0.74)
colors[clr.ResizeGripActive] = ImVec4(0.00, 1.00, 1.00, 1.00)
colors[clr.CloseButton] = ImVec4(0.00, 0.78, 0.78, 0.35)
colors[clr.CloseButtonHovered] = ImVec4(0.00, 0.78, 0.78, 0.47)
colors[clr.CloseButtonActive] = ImVec4(0.00, 0.78, 0.78, 1.00)
colors[clr.PlotLines] = ImVec4(0.00, 1.00, 1.00, 1.00)
colors[clr.PlotLinesHovered] = ImVec4(0.00, 1.00, 1.00, 1.00)
colors[clr.PlotHistogram] = ImVec4(0.00, 1.00, 1.00, 1.00)
colors[clr.PlotHistogramHovered] = ImVec4(0.00, 1.00, 1.00, 1.00)
colors[clr.TextSelectedBg] = ImVec4(0.00, 1.00, 1.00, 0.22)
colors[clr.ModalWindowDarkening] = ImVec4(0.04, 0.10, 0.09, 0.51)
end
apply_custom_style()
-- Стиль
local delay = imgui.ImInt(31000)
local delay_time = imgui.ImInt(1500)
local main_window_state = imgui.ImBool(false) -- Окно ImGui
-- Ини файл
local mainIni = inicfg.load({ -- создаем конфиг
config =
{
accent = false, -- Сохраняем Акцент
piar = false, -- Сохраняем Пиар
clear_chat = false,
time_ot = false,
text_accent = " ", -- Сохраняем текст Акцента
text_piar = " ", -- Сохраняем текст Пиара
text_time = " "
}
},
"helper")
local accent = imgui.ImBool(mainIni.config.accent) -- Делаем переменную для Акцента
local piar = imgui.ImBool(mainIni.config.piar) -- Делаем переменную для Пиара
local time_ot = imgui.ImBool(mainIni.config.time_ot) -- Делаем переменную для Тайма
local clear_chat = imgui.ImBool(mainIni.config.clear_chat) -- Делаем переменную для Очистки чата
local text_accent = imgui.ImBuffer(''..mainIni.config.text_accent, 500) -- Делаем переменную для текста Акцента
local text_piar = imgui.ImBuffer(''..mainIni.config.text_piar, 500) -- Делаем переменную для текста Пиара
local text_time = imgui.ImBuffer(''..mainIni.config.text_time, 500) -- Делаем переменную для текста Пиара
local status = inicfg.load(mainIni, 'helper.ini') -- подгружаем конфиг
if not doesFileExist('moonloader/config/helper.ini') then -- Проверка, если конфиг существует
inicfg.save(mainIni, 'helper.ini') -- Сохраняем конфиг
end
-- Ини файл
-- Регистрация команды
function cmd_helper(arg) -- Начало функции
main_window_state.v = not main_window_state.v -- Открываем окно main_window_state
imgui.Process = main_window_state.v -- Активируем процесс
end -- Конец функции
-- Регистрация команды
function imgui.OnDrawFrame() -- Вывод ImGui
-- Закрытие процесса
if not main_window_state.v then -- Проверка, если main_window_state не используется
imgui.Process = false -- Отключаем процесс
end -- Конец проверки
-- Закрытие процесса
-- Установка Позиции
if not window_pos then
ScreenX, ScreenY = getScreenResolution()ScreenX, ScreenY = getScreenResolution() -- Получаем разрешение экрана
imgui.SetNextWindowPos(imgui.ImVec2(ScreenX / 2 , ScreenY / 2), imgui.Cond.FirsUseEver, imgui.ImVec2(0.5, 0.5)) -- Установка позиции по центру экрана
end -- Конец проверки
-- Установка Позиции
if main_window_state.v then -- Проверка, если main_window_state используется
imgui.SetNextWindowSize(imgui.ImVec2(1080, 520), imgui.Cond.FirstUseEver) -- Установка разрешения
imgui.Begin(u8'[Хелпер] Окно с настройками', main_window_state) -- Начало ImGUI
imgui.BeginChild("##g_command", imgui.ImVec2(300, 120), true, imgui.WindowFlags.NoScrollbar) -- Подгруппа
imgui.Text(u8'Команды в чат:') -- Текст
imgui.Text(u8'Очисить чат (Команда /cchat)') -- Текст
imgui.Text(u8'Найти дом (Для ArizonaRP) (Команда /fh id)') -- Текст
imgui.Text(u8'Найти бизнес (Для ArizonaRP) (Команда /fbiz id)') -- Текст
imgui.Text(u8'Узнать местоположение (Команда /mycoord)') -- Текст
imgui.EndChild() -- Подгруппа
imgui.BeginChild("##g_checkbox", imgui.ImVec2(300, 250), true, imgui.WindowFlags.NoScrollbar) -- Подгруппа
imgui.Checkbox(u8'Включить Акцент', accent) -- Чекбокс
if accent.v then -- Если чекбокс активен
imgui.InputText(u8'Акцент', text_accent) -- Поле ввода текста
end -- Конец Проверки
imgui.Checkbox(u8'Включить Пиар', piar) -- Чекбокс
if piar.v then-- Если чекбокс активен
imgui.InputText(u8'Пиар', text_piar) -- Поле ввода текста
imgui.InputInt(u8'Задержка в МС', delay) -- Задержка
end -- Конец Проверки
imgui.Checkbox(u8'Включить отыгровку Времени', time_ot) -- Чекбокс
if time_ot.v then -- Если чекбокс активен
imgui.InputTextMultiline('', text_time, imgui.ImVec2(200, 100)) -- Поле вводка текста
imgui.InputInt(u8'Задержка в МС:', delay_time) -- Задержка
imgui.SameLine() -- Линия текста
end-- Конец Проверки
imgui.EndChild() -- Подгруппа
imgui.BeginChild("##g_button", imgui.ImVec2(300, 120), true, imgui.WindowFlags.NoScrollbar) -- Подгруппа
-- Кнопка
if imgui.Button(u8'Сохранить', imgui.ImVec2(135,25)) then -- Создаем кнопку
mainIni.config.accent = accent.v -- Получаем чекбокс Акцента
mainIni.config.text_accent = text_accent.v -- Получаем поле с текстом Акцента
mainIni.config.clear_chat = clear_chat.v -- Получаем поле с очисткой чата
mainIni.config.piar = piar.v -- Получаем чекбокс Пиара
mainIni.config.text_piar = text_piar.v -- Получаем поле с текстом Пиара
inicfg.save(mainIni, 'helper.ini') -- Сохраняем в файл
end
-- Кнопка
imgui.EndChild() -- Подгруппа
imgui.End() -- Конец ImGUI
end -- Конец проверки
end -- Конец функции
-- Функция для отыгровки
function otigrovka()
    if time_ot.v then
        lua_thread.create(function()
        local delay_time = tonumber(delay_time.v)
            for str in string.gmatch(text_time.v, "[^\r\n]+") do
            sampAddChatMessage(u8:decode(str), -1)
            wait(delay_time)
            end
        end)
    end
end
-- Функция для отыгровки
-- Функция Акцента
function sampev.onSendChat(msg) -- Получаем сообщение чата
if msg == 'q' then
return
end
if accent.v then
return {u8:decode(text_accent.v)..' '..msg} -- Возвращаем сообщение чата + акцент
end
end
-- Функция Акцента
-- Функция очистки чата
function ClearChat()
local memory = require "memory"
memory.fill(sampGetChatInfoPtr() + 306, 0x0, 25200)
memory.write(sampGetChatInfoPtr() + 306, 25562, 4, 0x0)
memory.write(sampGetChatInfoPtr() + 0x63DA, 1, 1)
end
-- Функция очистки чата
function cmd_coord(arg)
local X, Y, Z = getCharCoordinates(PLAYER_PED)
local zone = getGxtText(getNameOfZone(X, Y, Z))
sampAddChatMessage(zone, -1)
end
function main()
if not isSampLoaded() or not isSampfuncsLoaded() then
return
end

-- Блок, который выполняеться 1 раз!
sampRegisterChatCommand("ihelp", cmd_helper) -- Ригстрация команды /ihelp в чат

sampRegisterChatCommand('cchat', function() ClearChat() end) -- Регистрация команды /cchat в чат
sampRegisterChatCommand('fh', function(num)
sampSendChat('/findihouse '..num)
end)
sampRegisterChatCommand('fbiz', function(num)
sampSendChat('/findibiz '..num)
end)
sampRegisterChatCommand('mycoord', cmd_coord)
while true do
-- Бесконечный цикл
wait(0)

if wasKeyPressed(key.VK_X) and not sampIsCursorActive() then -- Если кнопка нажата и выключен чат
    otigrovka() -- Выполнение функции
end-- Конец Проверки

if piar.v then
local delay = tonumber(delay.v)
sampSendChat(u8:decode(text_piar.v))
wait(delay)
end
end
end
 

zzzzzzzzz

Участник
34
4
в общем когда админ заходит в /sp (слежку) за игроком - пропадает радар, как сделать что бы отображение радара было всегда
need lua code
 

CaJlaT

Овощ
Модератор
2,824
2,655
в общем когда админ заходит в /sp (слежку) за игроком - пропадает радар, как сделать что бы отображение радара было всегда
need lua code
Lua:
function main()
    if not isSampLoaded() or not isSampfuncsLoaded() then return end
    while not isSampAvailable() do wait(100) end
    require('memory').write(getModuleHandle("samp.dll") + 0x09D318, 37008, 2, true)
end
 

earthlord

Известный
135
34
Всем привет. Есть функция, которая при отправке сообщения в чат заменяет структуру "#id" на ник игрока. Есть проблема, если писать ид игрока которого в игре нет или слишком большие числа, то игра намертво зависает. проверка на подключение человека к серверу есть.


Lua:
function sampev.onSendChat(text)
    if replaceId(text) ~= text then
        return {
            replaceId(text)
        }
    end           
end

function replaceId(strng)
    while true do
        if strng:find("#%d+") then
            local id = strng:match("#(%d+)")
            if id ~= nil and sampIsPlayerConnected(id) then
                strng = strng:gsub("#" ..id, sampGetPlayerNickname(id):gsub("_", " "))
            end
        else
            break
        end               
    end
    return strng   
end