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

Дядя Энрик.

Активный
342
82
Есть гайд по подключению бота тг к скрипту?
Ну и в общем создание бота с помощью которого можно будет работать со скриптом
 
  • Нравится
Реакции: tsunamiqq

TSIDEX

Известный
86
8
Как настроить mimgui чтобы можно было вращать камеру и взаимодействовать персонажем при открытом окне, как в виджете?
 

Andrinall

Известный
700
518
Как настроить mimgui чтобы можно было вращать камеру и взаимодействовать персонажем при открытом окне, как в виджете?
"свойство" фрейма с названием HideCursor в значение true
Lua:
local frame = imgui.OnFrame(function() return cond end, function(self)
    self.HideCursor = true -- или так
end).HideCursor = true -- или так
frame.HideCursor = true -- или так
 
  • Нравится
Реакции: whyega52

GusiColor

Новичок
4
0
Mimgui.
Как вообще сохранить комбо в кфг, а то я впервые делаю код в свокй жизни и по примерам не понимаю
Lua:
local imgui = require 'mimgui'
local encoding = require 'encoding'
encoding.default = 'CP1251'
local u8 = encoding.UTF8
local wm = require 'windows.message'
local vkeys = require 'vkeys'
local inicfg = require 'inicfg'
local ffi = require("ffi")
local new = imgui.new
local WinState = imgui.new.bool()
local ComboTest = new.int() -- создаём буфер для комбо
local item_list = {u8"6:00", u8"6:05", u8"6:10", u8"6:15", u8"6:20", u8"6:25", u8"6:30", u8"6:35", u8"6:40", u8"6:45", u8"6:50", u8"6:55", u8"7:00", u8"7:05", u8"7:10", u8"7:15", u8"7:20", u8"7:25", u8"7:30", u8"7:35", u8"7:40", u8"7:45", u8"7:50", u8"7:55", u8"8:00", u8"8:05", u8"8:10", u8"8:15", u8"8:20", u8"8:25", u8"8:30", u8"8:35", u8"8:40", u8"8:45", u8"8:50", u8"8:55", u8"9:00", u8"9:05", u8"9:10", u8"9:15", u8"9:20", u8"9:25", u8"9:30", u8"9:35", u8"9:40", u8"9:45", u8"9:50", u8"9:55", u8"10:00", u8"10:05", u8"10:10", u8"10:15", u8"10:20", u8"10:25", u8"10:30", u8"10:35", u8"10:40", u8"10:45", u8"10:50", u8"10:55", u8"11:00", u8"11:05", u8"11:10", u8"11:15", u8"11:20", u8"11:25", u8"11:30", u8"11:35", u8"11:40", u8"11:45", u8"11:50", u8"11:55", u8"12:00", u8"12:05", u8"12:10", u8"12:15", u8"12:20", u8"12:25", u8"12:30", u8"12:35", u8"12:40", u8"12:45", u8"12:50", u8"12:55", u8"13:00", u8"13:05", u8"13:10", u8"13:15", u8"13:20", u8"13:25", u8"13:30", u8"13:35", u8"13:40", u8"13:45", u8"13:50", u8"13:55", u8"14:00", u8"14:05", u8"14:10", u8"14:15", u8"14:20", u8"14:25", u8"14:30", u8"14:35", u8"14:40", u8"14:45", u8"14:50", u8"14:55", u8"15:00", u8"15:05", u8"15:10", u8"15:15", u8"15:20", u8"15:25", u8"15:30", u8"15:35", u8"15:40", u8"15:45", u8"15:50", u8"15:55", u8"16:00", u8"16:05", u8"16:10", u8"16:15", u8"16:20", u8"16:25", u8"16:30", u8"16:35", u8"16:40", u8"16:45", u8"16:50", u8"16:55", u8"17:00", u8"17:05", u8"17:10", u8"17:15", u8"17:20", u8"17:25", u8"17:30", u8"17:35", u8"17:40", u8"17:45", u8"17:50", u8"17:55", u8"18:00", u8"18:05", u8"18:10", u8"18:15", u8"18:20", u8"18:25", u8"18:30", u8"18:35", u8"18:40", u8"18:45", u8"18:50", u8"18:55", u8"19:00", u8"19:05", u8"19:10", u8"19:15", u8"19:20", u8"19:25", u8"19:30", u8"19:35", u8"19:40", u8"19:45", u8"19:50", u8"19:55", u8"20:00", u8"20:05", u8"20:10", u8"20:15", u8"20:20", u8"20:25", u8"20:30", u8"20:35", u8"20:40", u8"20:45", u8"20:50", u8"20:55", u8"21:00", u8"21:05", u8"21:10", u8"21:15", u8"21:20", u8"21:25", u8"21:30", u8"21:35", u8"21:40", u8"21:45", u8"21:50", u8"21:55", u8"22:00", u8"22:05", u8"22:10", u8"22:15", u8"22:20", u8"22:25", u8"22:30", u8"22:35", u8"22:40", u8"22:45", u8"22:50", u8"22:55", u8"23:00", u8"23:05", u8"23:10", u8"23:15", u8"23:20", u8"23:25", u8"23:30", u8"23:35", u8"23:40", u8"23:45", u8"23:50", u8"23:55", u8"0:00", u8"0:05", u8"0:10", u8"0:15", u8"0:20", u8"0:25", u8"0:30", u8"0:35", u8"0:40", u8"0:45", u8"0:50", u8"0:55", u8"1:00", u8"1:05", u8"1:10", u8"1:15", u8"1:20", u8"1:25", u8"1:30", u8"1:35", u8"1:40", u8"1:45", u8"1:50", u8"1:55", u8"2:00", u8"2:05", u8"2:10", u8"2:15", u8"2:20", u8"2:25", u8"2:30", u8"2:35", u8"2:40", u8"2:45", u8"2:50", u8"2:55", u8"3:00"} -- создаём таблицу с содержимым списка
local ImItems = imgui.new['const char*'][#item_list](item_list)


local ini = inicfg.load({
    main = 
    {
    combotest = '',
    }
}, 'ldcfg.ini')
local status = inicfg.load(ini, 'ldcfg.ini')
if not doesFileExist('moonloader/config/ldcfg.ini') then inicfg.save(settings, 'ldcfg.ini') end

imgui.OnFrame(function() return WinState[0] end, function(player)
    imgui.SetNextWindowPos(imgui.ImVec2(500, 500), imgui.Cond.FirstUseEver, imgui.ImVec2(0.5, 0.5))
    imgui.SetNextWindowSize(imgui.ImVec2(350, 350), imgui.Cond.Always)
    imgui.Begin(u8'LeaderTools', WinState, imgui.WindowFlags.AlwaysAutoResize)
    if imgui.BeginTabBar('Tabs') then
        if imgui.BeginTabItem(u8'Гос.Волна') then
        if imgui.Combo(u8'Гос.Волна свободна на?',ComboTest,,ImItems,#item_list) then
 -- вот тут надо сделать сейв кфг
        end
        imgui.EndTabItem()
    end
 

MLycoris

На вид оружие массового семяизвержения
Проверенный
1,981
2,189
Mimgui.
Как вообще сохранить комбо в кфг, а то я впервые делаю код в свокй жизни и по примерам не понимаю
перенеси local ini... выше места, где ты для комбо выделяешь буфер, короче должно получится так
Lua:
-- вне мимгуи
local ini = inicfg.load({
    main =
    {
    combotest = '',
    }
}, 'ldcfg.ini')
if not doesFileExist('moonloader/config/ldcfg.ini') then inicfg.save(settings, 'ldcfg.ini') end

local ComboTest = new.int(tonumber(ini.main.combotest))
local item_list = {u8"6:00", u8"6:05", u8"6:10", u8"6:15", u8"6:20", u8"6:25", u8"6:30", u8"6:35", u8"6:40", u8"6:45", u8"6:50", u8"6:55", u8"7:00", u8"7:05", u8"7:10", u8"7:15", u8"7:20", u8"7:25", u8"7:30", u8"7:35", u8"7:40", u8"7:45", u8"7:50", u8"7:55", u8"8:00", u8"8:05", u8"8:10", u8"8:15", u8"8:20", u8"8:25", u8"8:30", u8"8:35", u8"8:40", u8"8:45", u8"8:50", u8"8:55", u8"9:00", u8"9:05", u8"9:10", u8"9:15", u8"9:20", u8"9:25", u8"9:30", u8"9:35", u8"9:40", u8"9:45", u8"9:50", u8"9:55", u8"10:00", u8"10:05", u8"10:10", u8"10:15", u8"10:20", u8"10:25", u8"10:30", u8"10:35", u8"10:40", u8"10:45", u8"10:50", u8"10:55", u8"11:00", u8"11:05", u8"11:10", u8"11:15", u8"11:20", u8"11:25", u8"11:30", u8"11:35", u8"11:40", u8"11:45", u8"11:50", u8"11:55", u8"12:00", u8"12:05", u8"12:10", u8"12:15", u8"12:20", u8"12:25", u8"12:30", u8"12:35", u8"12:40", u8"12:45", u8"12:50", u8"12:55", u8"13:00", u8"13:05", u8"13:10", u8"13:15", u8"13:20", u8"13:25", u8"13:30", u8"13:35", u8"13:40", u8"13:45", u8"13:50", u8"13:55", u8"14:00", u8"14:05", u8"14:10", u8"14:15", u8"14:20", u8"14:25", u8"14:30", u8"14:35", u8"14:40", u8"14:45", u8"14:50", u8"14:55", u8"15:00", u8"15:05", u8"15:10", u8"15:15", u8"15:20", u8"15:25", u8"15:30", u8"15:35", u8"15:40", u8"15:45", u8"15:50", u8"15:55", u8"16:00", u8"16:05", u8"16:10", u8"16:15", u8"16:20", u8"16:25", u8"16:30", u8"16:35", u8"16:40", u8"16:45", u8"16:50", u8"16:55", u8"17:00", u8"17:05", u8"17:10", u8"17:15", u8"17:20", u8"17:25", u8"17:30", u8"17:35", u8"17:40", u8"17:45", u8"17:50", u8"17:55", u8"18:00", u8"18:05", u8"18:10", u8"18:15", u8"18:20", u8"18:25", u8"18:30", u8"18:35", u8"18:40", u8"18:45", u8"18:50", u8"18:55", u8"19:00", u8"19:05", u8"19:10", u8"19:15", u8"19:20", u8"19:25", u8"19:30", u8"19:35", u8"19:40", u8"19:45", u8"19:50", u8"19:55", u8"20:00", u8"20:05", u8"20:10", u8"20:15", u8"20:20", u8"20:25", u8"20:30", u8"20:35", u8"20:40", u8"20:45", u8"20:50", u8"20:55", u8"21:00", u8"21:05", u8"21:10", u8"21:15", u8"21:20", u8"21:25", u8"21:30", u8"21:35", u8"21:40", u8"21:45", u8"21:50", u8"21:55", u8"22:00", u8"22:05", u8"22:10", u8"22:15", u8"22:20", u8"22:25", u8"22:30", u8"22:35", u8"22:40", u8"22:45", u8"22:50", u8"22:55", u8"23:00", u8"23:05", u8"23:10", u8"23:15", u8"23:20", u8"23:25", u8"23:30", u8"23:35", u8"23:40", u8"23:45", u8"23:50", u8"23:55", u8"0:00", u8"0:05", u8"0:10", u8"0:15", u8"0:20", u8"0:25", u8"0:30", u8"0:35", u8"0:40", u8"0:45", u8"0:50", u8"0:55", u8"1:00", u8"1:05", u8"1:10", u8"1:15", u8"1:20", u8"1:25", u8"1:30", u8"1:35", u8"1:40", u8"1:45", u8"1:50", u8"1:55", u8"2:00", u8"2:05", u8"2:10", u8"2:15", u8"2:20", u8"2:25", u8"2:30", u8"2:35", u8"2:40", u8"2:45", u8"2:50", u8"2:55", u8"3:00"} -- создаём таблицу с содержимым списка
local ImItems = imgui.new['const char*'][#item_list](item_list)

-- в мимгуи
if imgui.Combo(u8'Гос.Волна свободна на?',ComboTest,,ImItems,#item_list) then
    ini.main.combotest = ComboTest[0]
    inicfg.save(settings, 'ldcfg.ini')
end
 

ChаtGPT

Активный
403
97
Как намутить нажатие на текст DrawList?

Lua:
DL:AddTextFontPtr(nil, 14, imgui.ImVec2(10, 10), 0xFFffffff, 'test')

if imgui.IsItemClicked then print('+') end

Такая тема работает только для imgui.Text()
 

GusiColor

Новичок
4
0
перенеси local ini... выше места, где ты для комбо выделяешь буфер, короче должно получится так
Lua:
-- вне мимгуи
local ini = inicfg.load({
    main =
    {
    combotest = '',
    }
}, 'ldcfg.ini')
if not doesFileExist('moonloader/config/ldcfg.ini') then inicfg.save(settings, 'ldcfg.ini') end

local ComboTest = new.int(tonumber(ini.main.combotest))
local item_list = {u8"6:00", u8"6:05", u8"6:10", u8"6:15", u8"6:20", u8"6:25", u8"6:30", u8"6:35", u8"6:40", u8"6:45", u8"6:50", u8"6:55", u8"7:00", u8"7:05", u8"7:10", u8"7:15", u8"7:20", u8"7:25", u8"7:30", u8"7:35", u8"7:40", u8"7:45", u8"7:50", u8"7:55", u8"8:00", u8"8:05", u8"8:10", u8"8:15", u8"8:20", u8"8:25", u8"8:30", u8"8:35", u8"8:40", u8"8:45", u8"8:50", u8"8:55", u8"9:00", u8"9:05", u8"9:10", u8"9:15", u8"9:20", u8"9:25", u8"9:30", u8"9:35", u8"9:40", u8"9:45", u8"9:50", u8"9:55", u8"10:00", u8"10:05", u8"10:10", u8"10:15", u8"10:20", u8"10:25", u8"10:30", u8"10:35", u8"10:40", u8"10:45", u8"10:50", u8"10:55", u8"11:00", u8"11:05", u8"11:10", u8"11:15", u8"11:20", u8"11:25", u8"11:30", u8"11:35", u8"11:40", u8"11:45", u8"11:50", u8"11:55", u8"12:00", u8"12:05", u8"12:10", u8"12:15", u8"12:20", u8"12:25", u8"12:30", u8"12:35", u8"12:40", u8"12:45", u8"12:50", u8"12:55", u8"13:00", u8"13:05", u8"13:10", u8"13:15", u8"13:20", u8"13:25", u8"13:30", u8"13:35", u8"13:40", u8"13:45", u8"13:50", u8"13:55", u8"14:00", u8"14:05", u8"14:10", u8"14:15", u8"14:20", u8"14:25", u8"14:30", u8"14:35", u8"14:40", u8"14:45", u8"14:50", u8"14:55", u8"15:00", u8"15:05", u8"15:10", u8"15:15", u8"15:20", u8"15:25", u8"15:30", u8"15:35", u8"15:40", u8"15:45", u8"15:50", u8"15:55", u8"16:00", u8"16:05", u8"16:10", u8"16:15", u8"16:20", u8"16:25", u8"16:30", u8"16:35", u8"16:40", u8"16:45", u8"16:50", u8"16:55", u8"17:00", u8"17:05", u8"17:10", u8"17:15", u8"17:20", u8"17:25", u8"17:30", u8"17:35", u8"17:40", u8"17:45", u8"17:50", u8"17:55", u8"18:00", u8"18:05", u8"18:10", u8"18:15", u8"18:20", u8"18:25", u8"18:30", u8"18:35", u8"18:40", u8"18:45", u8"18:50", u8"18:55", u8"19:00", u8"19:05", u8"19:10", u8"19:15", u8"19:20", u8"19:25", u8"19:30", u8"19:35", u8"19:40", u8"19:45", u8"19:50", u8"19:55", u8"20:00", u8"20:05", u8"20:10", u8"20:15", u8"20:20", u8"20:25", u8"20:30", u8"20:35", u8"20:40", u8"20:45", u8"20:50", u8"20:55", u8"21:00", u8"21:05", u8"21:10", u8"21:15", u8"21:20", u8"21:25", u8"21:30", u8"21:35", u8"21:40", u8"21:45", u8"21:50", u8"21:55", u8"22:00", u8"22:05", u8"22:10", u8"22:15", u8"22:20", u8"22:25", u8"22:30", u8"22:35", u8"22:40", u8"22:45", u8"22:50", u8"22:55", u8"23:00", u8"23:05", u8"23:10", u8"23:15", u8"23:20", u8"23:25", u8"23:30", u8"23:35", u8"23:40", u8"23:45", u8"23:50", u8"23:55", u8"0:00", u8"0:05", u8"0:10", u8"0:15", u8"0:20", u8"0:25", u8"0:30", u8"0:35", u8"0:40", u8"0:45", u8"0:50", u8"0:55", u8"1:00", u8"1:05", u8"1:10", u8"1:15", u8"1:20", u8"1:25", u8"1:30", u8"1:35", u8"1:40", u8"1:45", u8"1:50", u8"1:55", u8"2:00", u8"2:05", u8"2:10", u8"2:15", u8"2:20", u8"2:25", u8"2:30", u8"2:35", u8"2:40", u8"2:45", u8"2:50", u8"2:55", u8"3:00"} -- создаём таблицу с содержимым списка
local ImItems = imgui.new['const char*'][#item_list](item_list)

-- в мимгуи
if imgui.Combo(u8'Гос.Волна свободна на?',ComboTest,,ImItems,#item_list) then
    ini.main.combotest = ComboTest[0]
    inicfg.save(settings, 'ldcfg.ini')
end
cannot convert 'nil' to 'int'l
Строка с local ComboTest
 

MLycoris

На вид оружие массового семяизвержения
Проверенный
1,981
2,189
cannot convert 'nil' to 'int'l
Строка с local ComboTest
Lua:
local imgui = require 'mimgui'
local inicfg = require 'inicfg'
local encoding = require 'encoding'
encoding.default = 'CP1251'
local u8 = encoding.UTF8

local ini = inicfg.load({
    main =
    {
    combotest = 0,
    }}, 'ldcfg.ini')
if not doesFileExist('moonloader/config/ldcfg.ini') then inicfg.save(ini, 'ldcfg.ini') end

local ComboTest = imgui.new.int(tonumber(ini.main.combotest))
local item_list = {u8"6:00", u8"6:05", u8"6:10", u8"6:15", u8"6:20", u8"6:25", u8"6:30", u8"6:35", u8"6:40", u8"6:45", u8"6:50", u8"6:55", u8"7:00", u8"7:05", u8"7:10", u8"7:15", u8"7:20", u8"7:25", u8"7:30", u8"7:35", u8"7:40", u8"7:45", u8"7:50", u8"7:55", u8"8:00", u8"8:05", u8"8:10", u8"8:15", u8"8:20", u8"8:25", u8"8:30", u8"8:35", u8"8:40", u8"8:45", u8"8:50", u8"8:55", u8"9:00", u8"9:05", u8"9:10", u8"9:15", u8"9:20", u8"9:25", u8"9:30", u8"9:35", u8"9:40", u8"9:45", u8"9:50", u8"9:55", u8"10:00", u8"10:05", u8"10:10", u8"10:15", u8"10:20", u8"10:25", u8"10:30", u8"10:35", u8"10:40", u8"10:45", u8"10:50", u8"10:55", u8"11:00", u8"11:05", u8"11:10", u8"11:15", u8"11:20", u8"11:25", u8"11:30", u8"11:35", u8"11:40", u8"11:45", u8"11:50", u8"11:55", u8"12:00", u8"12:05", u8"12:10", u8"12:15", u8"12:20", u8"12:25", u8"12:30", u8"12:35", u8"12:40", u8"12:45", u8"12:50", u8"12:55", u8"13:00", u8"13:05", u8"13:10", u8"13:15", u8"13:20", u8"13:25", u8"13:30", u8"13:35", u8"13:40", u8"13:45", u8"13:50", u8"13:55", u8"14:00", u8"14:05", u8"14:10", u8"14:15", u8"14:20", u8"14:25", u8"14:30", u8"14:35", u8"14:40", u8"14:45", u8"14:50", u8"14:55", u8"15:00", u8"15:05", u8"15:10", u8"15:15", u8"15:20", u8"15:25", u8"15:30", u8"15:35", u8"15:40", u8"15:45", u8"15:50", u8"15:55", u8"16:00", u8"16:05", u8"16:10", u8"16:15", u8"16:20", u8"16:25", u8"16:30", u8"16:35", u8"16:40", u8"16:45", u8"16:50", u8"16:55", u8"17:00", u8"17:05", u8"17:10", u8"17:15", u8"17:20", u8"17:25", u8"17:30", u8"17:35", u8"17:40", u8"17:45", u8"17:50", u8"17:55", u8"18:00", u8"18:05", u8"18:10", u8"18:15", u8"18:20", u8"18:25", u8"18:30", u8"18:35", u8"18:40", u8"18:45", u8"18:50", u8"18:55", u8"19:00", u8"19:05", u8"19:10", u8"19:15", u8"19:20", u8"19:25", u8"19:30", u8"19:35", u8"19:40", u8"19:45", u8"19:50", u8"19:55", u8"20:00", u8"20:05", u8"20:10", u8"20:15", u8"20:20", u8"20:25", u8"20:30", u8"20:35", u8"20:40", u8"20:45", u8"20:50", u8"20:55", u8"21:00", u8"21:05", u8"21:10", u8"21:15", u8"21:20", u8"21:25", u8"21:30", u8"21:35", u8"21:40", u8"21:45", u8"21:50", u8"21:55", u8"22:00", u8"22:05", u8"22:10", u8"22:15", u8"22:20", u8"22:25", u8"22:30", u8"22:35", u8"22:40", u8"22:45", u8"22:50", u8"22:55", u8"23:00", u8"23:05", u8"23:10", u8"23:15", u8"23:20", u8"23:25", u8"23:30", u8"23:35", u8"23:40", u8"23:45", u8"23:50", u8"23:55", u8"0:00", u8"0:05", u8"0:10", u8"0:15", u8"0:20", u8"0:25", u8"0:30", u8"0:35", u8"0:40", u8"0:45", u8"0:50", u8"0:55", u8"1:00", u8"1:05", u8"1:10", u8"1:15", u8"1:20", u8"1:25", u8"1:30", u8"1:35", u8"1:40", u8"1:45", u8"1:50", u8"1:55", u8"2:00", u8"2:05", u8"2:10", u8"2:15", u8"2:20", u8"2:25", u8"2:30", u8"2:35", u8"2:40", u8"2:45", u8"2:50", u8"2:55", u8"3:00"} -- создаём таблицу с содержимым списка
local ImItems = imgui.new['const char*'][#item_list](item_list)

imgui.OnFrame(function() return true end, function(player)
    imgui.SetNextWindowPos(imgui.ImVec2(500,500), imgui.Cond.FirstUseEver, imgui.ImVec2(0.5, 0.5))
    imgui.SetNextWindowSize(imgui.ImVec2(245, 270), imgui.Cond.Always)
    imgui.Begin('##Window', _, imgui.WindowFlags.NoResize)
    if imgui.Combo(u8'Гос.Волна свободна на?',ComboTest,ImItems,#item_list) then
        ini.main.combotest = ComboTest[0]
        inicfg.save(ini, 'ldcfg.ini')
    end
    imgui.End()
end)
 

Rvmsitow

Новичок
11
1
Когда мой игрок нажимает клавишу M, курсор включается или выключается.

Когда он наводит указатель мыши на игрока, я бы хотел, чтобы он светился.

Мой текущий код:

Lua:
local key = require 'vkeys'
local encoding = require 'encoding'
encoding.default        = 'CP1251'
u8                      = encoding.UTF8

local actors = {
    {id = 1, name = "acteur1", x = 2034.5314, y = -1908.1639, z = 13.5547},
    {id = 2, name = "acteur2", x = 2050.1234, y = -1910.4567, z = 14.5678},
    {id = 3, name = "acteur3", x = 2010.9876, y = -1895.4321, z = 12.3456}
}

function distance(x1, y1, x2, y2)
    return math.sqrt((x2 - x1)^2 + (y2 - y1)^2)
end

local distanceThreshold = 100.0

local function isWithinThreshold(x1, y1, x2, y2, threshold)
    return distance(x1, y1, x2, y2) <= threshold
end

local font = renderCreateFont("Arial", 10, 9)
local text = "Clique droit pour interagir"

function main()
    repeat wait(0) until isSampAvailable()
    while true do
        wait(0)
        for i, actor in ipairs(actors) do
            local x1, y1, z1 = getCharCoordinates(PLAYER_PED)
            local wposX, wposY = convert3DCoordsToScreen(actor.x, actor.y, actor.z)
            local posX, posY = getCursorPos()
            if sampIsCursorActive() then
                if isWithinThreshold(posX, posY, wposX, wposY, distanceThreshold) then
                    renderDrawBox(posX - (renderGetFontDrawTextLength(font, text) / 2), posY - 15, renderGetFontDrawTextLength(font, text) + 10, 15, 0xFF323232)
                    renderFontDrawText(font, text, posX - (renderGetFontDrawTextLength(font, text) / 2) + 5, posY - 15, 0xFFCCCCCC)
                    -- код поиска
                    if isKeyJustPressed(key.VK_RBUTTON) then
                        -- ...
                    end
                end
            end
        end
        if isKeyJustPressed(key.VK_M) then
            sampToggleCursor(not sampIsCursorActive())
        end
    end
end

СПАСИБО !
 

whyega52

Eblang головного мозга
Модератор
2,838
2,784
Посмотреть вложение 232704

Как на Rodina RP проверить открыто или закрыто такое диалоговое окно?
Lua:
addEventHandler("onReceivePacket", function(id, bs)
    if id == 220 then
        -- local bytes = {}
        -- for i = 1, raknetBitStreamGetNumberOfBytesUsed(bs) do
        --     table.insert(bytes, raknetBitStreamReadInt8(bs))
        -- end
        -- print(table.concat(bytes, ", "))
        raknetBitStreamIgnoreBits(bs, 8)
        local eventId = raknetBitStreamReadInt8(bs)
        if eventId == 17 then
            raknetBitStreamIgnoreBits(bs, 32)
            local data = raknetBitStreamReadString(bs, raknetBitStreamReadInt32(bs))
            if data:find("header:'%{BE433D%}Репорт'") then
                print("REPORT SHOW", data)
            end
        end
    end
end)
 

Мандрагора

Участник
77
4
Lua:
addEventHandler("onReceivePacket", function(id, bs)
    if id == 220 then
        -- local bytes = {}
        -- for i = 1, raknetBitStreamGetNumberOfBytesUsed(bs) do
        --     table.insert(bytes, raknetBitStreamReadInt8(bs))
        -- end
        -- print(table.concat(bytes, ", "))
        raknetBitStreamIgnoreBits(bs, 8)
        local eventId = raknetBitStreamReadInt8(bs)
        if eventId == 17 then
            raknetBitStreamIgnoreBits(bs, 32)
            local data = raknetBitStreamReadString(bs, raknetBitStreamReadInt32(bs))
            if data:find("header:'%{BE433D%}Репорт'") then
                print("REPORT SHOW", data)
            end
        end
    end
end)
Я имею ввиду вообще такие окна, а не конкретно это.
Они отличаются от стандартных самповских окон.
Есть что-то на подобии sampIsDialogActive()?
 

whyega52

Eblang головного мозга
Модератор
2,838
2,784
Есть что-то на подобии sampIsDialogActive()?
нет, это можно реализовать, но для этого придется покопаться в устройстве цефа. самым простым вариантом, будет, отслеживать диалог подобным образом, как это показал я (например, по тексту заголовка).
 

Мандрагора

Участник
77
4
нет, это можно реализовать, но для этого придется покопаться в устройстве цефа. самым простым вариантом, будет, отслеживать диалог подобным образом, как это показал я (например, по тексту заголовка).
Накладно будет. Это нужно алгоритмом проверять все диалоги, а перед этим самому их все просмотреть и добавить.