Вопросы по 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,205
12,541
Как выйти из машины и сесть обратно, нашел только опкод на сф 072A: put_actor $PLAYER_ACTOR into_car 0@ driverseat
Lua:
taskWarpCharIntoCarAsDriver(Ped ped, Vehicle car)  -- 072A
можешь открыть эту страницу, нажать ctrl + f и ввести опкод

эмуляция кнопки Enter
нахуя ты это высираешь...
 
  • Нравится
Реакции: IT clown и moreveal

IT clown

Участник
45
2
Где можно посмотреть номер клавиши "2" для того что отправить по синхре?

Lua:
local sampev = require 'lib.samp.events'



function sampev.onShowTextDraw(tID, data)

    if tID == 2057 and data.text == "N" then

        lua_thread.create(function() wait(20)

            sendKey(128) -- key N

        end)

    elseif tID == 2056 and data.text == "Y" then

        lua_thread.create(function() wait(350)

            sendKey(64) -- key Y

        end)

    end

end



function sendKey(key)

    local data = allocateMemory(68)

    sampStorePlayerOnfootData(select(2, sampGetPlayerIdByCharHandle(PLAYER_PED)), data)

    setStructElement(data, 36, 1, key, false)

    sampSendOnfootData(data)

    freeMemory(data)

end
 

ARMOR

Я креветка
Модератор
5,067
7,381
При сохранении текста из imgui.InputText() в Json сохраняется не тот текст который я ввел в инпут, а какие-то цифры.

Код сохранения:
Lua:
--В начале кода
function jsonSave(t)
    local jsonFilePath = list_file
    file = io.open(jsonFilePath, "w")
    file:write(encodeJson(t))
    file:flush()
    file:close()
end

--В imgui.onDraw
imgui.InputText('##presetname', preset_add_name, 128)
imgui.PopItemWidth()

if imgui.Button(u8'Сохранить пресет', imgui.ImVec2(190, 20)) then
    table.insert(list, {name = u8:decode(preset_add_name[0])})
    preset_add_name = imgui.new.char[128](u8'Пресет #'..tostring(#list + 1))
    jsonSave(list)
    imgui.CloseCurrentPopup()
end
 
Последнее редактирование:

moreveal

Известный
980
712
Где можно посмотреть номер клавиши "2" для того что отправить по синхре?

Lua:
local sampev = require 'lib.samp.events'



function sampev.onShowTextDraw(tID, data)

    if tID == 2057 and data.text == "N" then

        lua_thread.create(function() wait(20)

            sendKey(128) -- key N

        end)

    elseif tID == 2056 and data.text == "Y" then

        lua_thread.create(function() wait(350)

            sendKey(64) -- key Y

        end)

    end

end



function sendKey(key)

    local data = allocateMemory(68)

    sampStorePlayerOnfootData(select(2, sampGetPlayerIdByCharHandle(PLAYER_PED)), data)

    setStructElement(data, 36, 1, key, false)

    sampSendOnfootData(data)

    freeMemory(data)

end
320 (только авто), вот список кнопок
 

chapo

tg/inst: @moujeek
Всефорумный модератор
9,205
12,541
При сохранении текста из imgui.InputText() в Json сохраняется не тот текст который я ввел в инпут, а какие-то цифры.

Код сохранения:
Lua:
--В начале кода
function jsonSave(t)
    local jsonFilePath = list_file
    file = io.open(jsonFilePath, "w")
    file:write(encodeJson(t))
    file:flush()
    file:close()
end

--В imgui.onDraw
imgui.InputText('##presetname', preset_add_name, 128)
imgui.PopItemWidth()

if imgui.Button(u8'Сохранить пресет', imgui.ImVec2(190, 20)) then
    table.insert(list, {name = u8:decode(preset_add_name[0])})
    preset_add_name = imgui.new.char[128](u8'Пресет #'..tostring(#list + 1))
    jsonSave(list)
    imgui.CloseCurrentPopup()
end
покажи отрисовку пресетов
 

ARMOR

Я креветка
Модератор
5,067
7,381
покажи отрисовку пресетов
Lua:
for i = 1, #list do
if imgui.Selectable(tostring(list[i].name), preset_selected == i) then
    preset_selected = i
    cfg.config.HEALTH = list[i].HEALTH
    cfg.config.MONEY = list[i].MONEY
    cfg.config.ARMOUR = list[i].ARMOUR
    cfg.config.OXYGEN = list[i].OXYGEN
    cfg.config.WANTED = list[i].WANTED
    cfg.config.CHARHP = list[i].CHARHP
    cfg.config.CHARARM = list[i].CHARARM
    cfg.config.RADAR = list[i].RADAR
    cfg.config.MARKER = list[i].MARKER
    cfg.config.HEADLIGHT = list[i].HEADLIGHT
    cfg.config.LOGOARIZONA = list[i].LOGOARIZONA
    cfg.config.HUNGERARIZONA = list[i].HUNGERARIZONA
    cfg.config.CROSSHAIR = list[i].CROSSHAIR
    cfg.config.MONEYBORDER = list[i].MONEYBORDER
    cfg.config.TRIANGLECOLOR = list[i].TRIANGLECOLOR
    cfg.colorimgui.HEALTHR = list[i].HEALTHR
    cfg.colorimgui.HEALTHG = list[i].HEALTHG
    cfg.colorimgui.HEALTHB = list[i].HEALTHB
    cfg.colorimgui.MONEYR = list[i].MONEYR
    cfg.colorimgui.MONEYG = list[i].MONEYG
    cfg.colorimgui.MONEYB = list[i].MONEYB
    cfg.colorimgui.ARMOURR = list[i].ARMOURR
    cfg.colorimgui.ARMOURG = list[i].ARMOURG
    cfg.colorimgui.ARMOURB = list[i].ARMOURB
    cfg.colorimgui.OXYGENR = list[i].OXYGENR
    cfg.colorimgui.OXYGENG = list[i].OXYGENG
    cfg.colorimgui.OXYGENB = list[i].OXYGENB
    cfg.colorimgui.WANTEDR = list[i].WANTEDR
    cfg.colorimgui.WANTEDG = list[i].WANTEDG
    cfg.colorimgui.WANTEDB = list[i].WANTEDB
    cfg.colorimgui.CHARHPR = list[i].CHARHPR
    cfg.colorimgui.CHARHPG = list[i].CHARHPG
    cfg.colorimgui.CHARHPB = list[i].CHARHPB
    cfg.colorimgui.CHARARMR = list[i].CHARARMR
    cfg.colorimgui.CHARARMG = list[i].CHARARMG
    cfg.colorimgui.CHARARMB = list[i].CHARARMB
    cfg.colorimgui.RADARR = list[i].RADARR
    cfg.colorimgui.RADARG = list[i].RADARG
    cfg.colorimgui.RADARB = list[i].RADARB
    cfg.colorimgui.MARKERR = list[i].MARKERR
    cfg.colorimgui.MARKERG = list[i].MARKERG
    cfg.colorimgui.MARKERB = list[i].MARKERB
    cfg.colorimgui.HEADLIGHTR = list[i].HEADLIGHTR
    cfg.colorimgui.HEADLIGHTG = list[i].HEADLIGHTG
    cfg.colorimgui.HEADLIGHTB = list[i].HEADLIGHTB
    cfg.colorimgui.LOGOARIZONAR = list[i].LOGOARIZONAR
    cfg.colorimgui.LOGOARIZONAG = list[i].LOGOARIZONAG
    cfg.colorimgui.LOGOARIZONAB = list[i].LOGOARIZONAB
    cfg.colorimgui.HUNGERARIZONAR = list[i].HUNGERARIZONAR
    cfg.colorimgui.HUNGERARIZONAG = list[i].HUNGERARIZONAG
    cfg.colorimgui.HUNGERARIZONAB = list[i].HUNGERARIZONAB
    cfg.colorimgui.CROSSHAIRR = list[i].CROSSHAIRR
    cfg.colorimgui.CROSSHAIRG = list[i].CROSSHAIRG
    cfg.colorimgui.CROSSHAIRB = list[i].CROSSHAIRB
    cfg.colorimgui.CHECKBOXBORDER = list[i].CHECKBOXBORDER
    cfg.colorimgui.CHECKBOXFIX = list[i].CHECKBOXFIX
    cfg.colorimgui.TRIANGLECOLORR = list[i].TRIANGLECOLORR
    cfg.colorimgui.TRIANGLECOLORG = list[i].TRIANGLECOLORG
    cfg.colorimgui.TRIANGLECOLORB = list[i].TRIANGLECOLORB
    cfg.hudpos.HealthX = list[i].HealthX
    cfg.hudpos.HealthY = list[i].HealthY
    cfg.hudpos.HealthW = list[i].HealthW
    cfg.hudpos.HealthH = list[i].HealthH
    cfg.hudpos.ArmorX = list[i].ArmorX
    cfg.hudpos.ArmorY = list[i].ArmorY
    cfg.hudpos.ArmorW = list[i].ArmorW
    cfg.hudpos.ArmorH = list[i].ArmorH
    cfg.hudpos.BreathX = list[i].BreathX
    cfg.hudpos.BreathY = list[i].BreathY
    cfg.hudpos.BreathW = list[i].BreathW
    cfg.hudpos.BreathH = list[i].BreathH
    cfg.hudpos.MoneyX = list[i].MoneyX
    cfg.hudpos.MoneyY = list[i].MoneyY
    cfg.hudpos.MoneyW = list[i].MoneyW
    cfg.hudpos.MoneyH = list[i].MoneyH
    cfg.hudpos.WeaponIconX = list[i].WeaponIconX
    cfg.hudpos.WeaponIconY = list[i].WeaponIconY
    cfg.hudpos.WeaponAmmoX = list[i].WeaponAmmoX
    cfg.hudpos.WeaponAmmoY = list[i].WeaponAmmoY
    cfg.hudpos.WeaponAmmoW = list[i].WeaponAmmoW
    cfg.hudpos.WeaponAmmoH = list[i].WeaponAmmoH
    cfg.hudpos.WantedX = list[i].WantedX
    cfg.hudpos.WantedY = list[i].WantedY
    cfg.hudpos.WantedW = list[i].WantedW
    cfg.hudpos.WantedH = list[i].WantedH
    cfg.hudpos.RadarX = list[i].RadarX
    cfg.hudpos.RadarY = list[i].RadarY
    cfg.hudpos.RadarW = list[i].RadarW
    cfg.hudpos.RadarH = list[i].RadarH
    inicfg.save(cfg, "GameEditor.ini")
    memory.setint32(0xBAB230, cfg.config.MONEY, true)
    memory.setint32(0xBAB22C, cfg.config.HEALTH, true)
    memory.setint32(0xBAB23C, cfg.config.ARMOUR, true)
    memory.setint32(0xBAB238, cfg.config.OXYGEN, true)
    memory.setint32(0xBAB244, cfg.config.WANTED, true)
    memory.setint8(0x58F58D, cfg.config.MONEYBORDER, true)
    changeRadarColor(cfg.config.RADAR)
    Markercolor(cfg.config.MARKER)
    editVehicleLightsColor(cfg.config.HEADLIGHT)        
    changeCrosshairColor(cfg.config.CROSSHAIR)
    set_triangle_color(cfg.config.TRIANGLECOLOR)
    if cfg.config.CHECKBOXFIX == true then
        memory.fill(0x058E280, 0xEB, 1, true)
    else
        memory.fill(0x058E280, 0x7A, 1, true)
    end
end
Прикол в том что оно сохраняется, и в самом Json'е отображается тем же числом, а не тем что я ввел в Input
 

chapo

tg/inst: @moujeek
Всефорумный модератор
9,205
12,541
Lua:
for i = 1, #list do
if imgui.Selectable(tostring(list[i].name), preset_selected == i) then
    preset_selected = i
    cfg.config.HEALTH = list[i].HEALTH
    cfg.config.MONEY = list[i].MONEY
    cfg.config.ARMOUR = list[i].ARMOUR
    cfg.config.OXYGEN = list[i].OXYGEN
    cfg.config.WANTED = list[i].WANTED
    cfg.config.CHARHP = list[i].CHARHP
    cfg.config.CHARARM = list[i].CHARARM
    cfg.config.RADAR = list[i].RADAR
    cfg.config.MARKER = list[i].MARKER
    cfg.config.HEADLIGHT = list[i].HEADLIGHT
    cfg.config.LOGOARIZONA = list[i].LOGOARIZONA
    cfg.config.HUNGERARIZONA = list[i].HUNGERARIZONA
    cfg.config.CROSSHAIR = list[i].CROSSHAIR
    cfg.config.MONEYBORDER = list[i].MONEYBORDER
    cfg.config.TRIANGLECOLOR = list[i].TRIANGLECOLOR
    cfg.colorimgui.HEALTHR = list[i].HEALTHR
    cfg.colorimgui.HEALTHG = list[i].HEALTHG
    cfg.colorimgui.HEALTHB = list[i].HEALTHB
    cfg.colorimgui.MONEYR = list[i].MONEYR
    cfg.colorimgui.MONEYG = list[i].MONEYG
    cfg.colorimgui.MONEYB = list[i].MONEYB
    cfg.colorimgui.ARMOURR = list[i].ARMOURR
    cfg.colorimgui.ARMOURG = list[i].ARMOURG
    cfg.colorimgui.ARMOURB = list[i].ARMOURB
    cfg.colorimgui.OXYGENR = list[i].OXYGENR
    cfg.colorimgui.OXYGENG = list[i].OXYGENG
    cfg.colorimgui.OXYGENB = list[i].OXYGENB
    cfg.colorimgui.WANTEDR = list[i].WANTEDR
    cfg.colorimgui.WANTEDG = list[i].WANTEDG
    cfg.colorimgui.WANTEDB = list[i].WANTEDB
    cfg.colorimgui.CHARHPR = list[i].CHARHPR
    cfg.colorimgui.CHARHPG = list[i].CHARHPG
    cfg.colorimgui.CHARHPB = list[i].CHARHPB
    cfg.colorimgui.CHARARMR = list[i].CHARARMR
    cfg.colorimgui.CHARARMG = list[i].CHARARMG
    cfg.colorimgui.CHARARMB = list[i].CHARARMB
    cfg.colorimgui.RADARR = list[i].RADARR
    cfg.colorimgui.RADARG = list[i].RADARG
    cfg.colorimgui.RADARB = list[i].RADARB
    cfg.colorimgui.MARKERR = list[i].MARKERR
    cfg.colorimgui.MARKERG = list[i].MARKERG
    cfg.colorimgui.MARKERB = list[i].MARKERB
    cfg.colorimgui.HEADLIGHTR = list[i].HEADLIGHTR
    cfg.colorimgui.HEADLIGHTG = list[i].HEADLIGHTG
    cfg.colorimgui.HEADLIGHTB = list[i].HEADLIGHTB
    cfg.colorimgui.LOGOARIZONAR = list[i].LOGOARIZONAR
    cfg.colorimgui.LOGOARIZONAG = list[i].LOGOARIZONAG
    cfg.colorimgui.LOGOARIZONAB = list[i].LOGOARIZONAB
    cfg.colorimgui.HUNGERARIZONAR = list[i].HUNGERARIZONAR
    cfg.colorimgui.HUNGERARIZONAG = list[i].HUNGERARIZONAG
    cfg.colorimgui.HUNGERARIZONAB = list[i].HUNGERARIZONAB
    cfg.colorimgui.CROSSHAIRR = list[i].CROSSHAIRR
    cfg.colorimgui.CROSSHAIRG = list[i].CROSSHAIRG
    cfg.colorimgui.CROSSHAIRB = list[i].CROSSHAIRB
    cfg.colorimgui.CHECKBOXBORDER = list[i].CHECKBOXBORDER
    cfg.colorimgui.CHECKBOXFIX = list[i].CHECKBOXFIX
    cfg.colorimgui.TRIANGLECOLORR = list[i].TRIANGLECOLORR
    cfg.colorimgui.TRIANGLECOLORG = list[i].TRIANGLECOLORG
    cfg.colorimgui.TRIANGLECOLORB = list[i].TRIANGLECOLORB
    cfg.hudpos.HealthX = list[i].HealthX
    cfg.hudpos.HealthY = list[i].HealthY
    cfg.hudpos.HealthW = list[i].HealthW
    cfg.hudpos.HealthH = list[i].HealthH
    cfg.hudpos.ArmorX = list[i].ArmorX
    cfg.hudpos.ArmorY = list[i].ArmorY
    cfg.hudpos.ArmorW = list[i].ArmorW
    cfg.hudpos.ArmorH = list[i].ArmorH
    cfg.hudpos.BreathX = list[i].BreathX
    cfg.hudpos.BreathY = list[i].BreathY
    cfg.hudpos.BreathW = list[i].BreathW
    cfg.hudpos.BreathH = list[i].BreathH
    cfg.hudpos.MoneyX = list[i].MoneyX
    cfg.hudpos.MoneyY = list[i].MoneyY
    cfg.hudpos.MoneyW = list[i].MoneyW
    cfg.hudpos.MoneyH = list[i].MoneyH
    cfg.hudpos.WeaponIconX = list[i].WeaponIconX
    cfg.hudpos.WeaponIconY = list[i].WeaponIconY
    cfg.hudpos.WeaponAmmoX = list[i].WeaponAmmoX
    cfg.hudpos.WeaponAmmoY = list[i].WeaponAmmoY
    cfg.hudpos.WeaponAmmoW = list[i].WeaponAmmoW
    cfg.hudpos.WeaponAmmoH = list[i].WeaponAmmoH
    cfg.hudpos.WantedX = list[i].WantedX
    cfg.hudpos.WantedY = list[i].WantedY
    cfg.hudpos.WantedW = list[i].WantedW
    cfg.hudpos.WantedH = list[i].WantedH
    cfg.hudpos.RadarX = list[i].RadarX
    cfg.hudpos.RadarY = list[i].RadarY
    cfg.hudpos.RadarW = list[i].RadarW
    cfg.hudpos.RadarH = list[i].RadarH
    inicfg.save(cfg, "GameEditor.ini")
    memory.setint32(0xBAB230, cfg.config.MONEY, true)
    memory.setint32(0xBAB22C, cfg.config.HEALTH, true)
    memory.setint32(0xBAB23C, cfg.config.ARMOUR, true)
    memory.setint32(0xBAB238, cfg.config.OXYGEN, true)
    memory.setint32(0xBAB244, cfg.config.WANTED, true)
    memory.setint8(0x58F58D, cfg.config.MONEYBORDER, true)
    changeRadarColor(cfg.config.RADAR)
    Markercolor(cfg.config.MARKER)
    editVehicleLightsColor(cfg.config.HEADLIGHT)       
    changeCrosshairColor(cfg.config.CROSSHAIR)
    set_triangle_color(cfg.config.TRIANGLECOLOR)
    if cfg.config.CHECKBOXFIX == true then
        memory.fill(0x058E280, 0xEB, 1, true)
    else
        memory.fill(0x058E280, 0x7A, 1, true)
    end
end
Прикол в том что оно сохраняется, и в самом Json'е отображается тем же числом, а не тем что я ввел в Input
а, в мимгуи для получения текста из imgui.new.char нужно использовать не [0], а ffi.string
замени
Lua:
table.insert(list, {name = u8:decode(preset_add_name[0])})
на
Lua:
table.insert(list, {name = u8:decode(ffi.string(preset_add_name))})
 

ARMOR

Я креветка
Модератор
5,067
7,381
а, в мимгуи для получения текста из imgui.new.char нужно использовать не [0], а ffi.string
замени
Lua:
table.insert(list, {name = u8:decode(preset_add_name[0])})
на
Lua:
table.insert(list, {name = u8:decode(ffi.string(preset_add_name))})
Заменял, так скрипт вообще не запускается и выдает такую ошибку:
Код:
[15:54:47.332896] (error)    GameEditor.lua: D:\SAMP R1\GTA San Andreas\moonloader\GameEditor.lua:1540: function at line 787 has more than 60 upvalues
О каких оно значениях я не ебу

787:
Lua:
function(self) -- Начало mimgui типо

1540:
Lua:
if imgui.CloseButton(10, 3, ColorFloatToVec(COLORS.elements), ColorFloatToVec(COLORS.elements), ColorFloatToVec(COLORS.elements), ColorFloatToVec(COLORS.elements)) then
 

chapo

tg/inst: @moujeek
Всефорумный модератор
9,205
12,541
Заменял, так скрипт вообще не запускается и выдает такую ошибку:
Код:
[15:54:47.332896] (error)    GameEditor.lua: D:\SAMP R1\GTA San Andreas\moonloader\GameEditor.lua:1540: function at line 787 has more than 60 upvalues
О каких оно значениях я не ебу

787:
Lua:
function(self) -- Начало mimgui типо

1540:
Lua:
if imgui.CloseButton(10, 3, ColorFloatToVec(COLORS.elements), ColorFloatToVec(COLORS.elements), ColorFloatToVec(COLORS.elements), ColorFloatToVec(COLORS.elements)) then

Фулл код:
Lua:
local imgui = require('imgui')
local encoding = require 'encoding'
encoding.default = 'CP1251'
u8 = encoding.UTF8
local memory = require 'memory'

local window = imgui.ImBool(false)

local inicfg = require 'inicfg'
local directIni = 'UltimateWeatherChanger.ini'
local ini = inicfg.load(inicfg.load({
    main = {
        time = 12,
        weather = 0,
        preset = 0,
    },
}, directIni))
inicfg.save(ini, directIni)

local preset_selected = ini.main.preset
local no_preset_time = ini.main.time
local no_preset_weather = ini.main.weather

local list_file = getWorkingDirectory()..'\\config\\UltimateWeatherChangerPresets.json'
local list = {}

function save()
    ini.main.preset = preset_selected
    ini.main.time = no_preset_time
    ini.main.weather = no_preset_weather
    inicfg.save(ini, directIni)
end

function jsonSave(t)
    local jsonFilePath = list_file
    file = io.open(jsonFilePath, "w")
    file:write(encodeJson(t))
    file:flush()
    file:close()
    save()
end


local slider = {
    time = imgui.ImInt(0),
    weather = imgui.ImInt(0),
}

function jsonRead()
    local jsonFilePath = list_file
    local file = io.open(jsonFilePath, "r+")
    local jsonInString = file:read("*a")
    file:close()
    local jsonTable = decodeJson(jsonInString)
    return jsonTable
end

function main()
    while not isSampAvailable() do wait(200) end
    sampRegisterChatCommand('wnt', function()
        window.v = not window.v
    end)
    sampRegisterChatCommand('/time', function(arg)
        local time = tonumber(arg)
        if time then
            slider.time.v = time
            setTime(slider.time.v)
        end
    end)
    sampRegisterChatCommand('/weather', function(arg)
        local id = tonumber(arg)
        if id then
            slider.weather.v = id
            setWeather(slider.weather.v)
        end
    end)
    if not doesDirectoryExist(getWorkingDirectory()..'\\config') then createDirectory(getWorkingDirectory()..'\\config') end
    if not doesFileExist(list_file) then
        jsonSave({{name = 'Sunny day', time = 12, weather = 0}})
    end
    list = jsonRead()
    if preset_selected == 0 then
        slider = {time = imgui.ImInt(ini.main.time), weather = imgui.ImInt(ini.main.weather),}
    else
        slider = {time = imgui.ImInt(list[preset_selected].time), weather = imgui.ImInt(list[preset_selected].weather)}
    end

    imgui.Process = false
    window.v = false  --show window
    while true do
        wait(0)
        imgui.Process = window.v
        setTime(slider.time.v)
        setWeather(slider.weather.v)
    end
end

local preset_add_name = imgui.ImBuffer(u8'Пресет #'..tostring(#list + 1), 256)


function imgui.OnDrawFrame()
    if window.v then
        local resX, resY = getScreenResolution()
        local sizeX, sizeY = 200, 280
        imgui.SetNextWindowPos(imgui.ImVec2(resX / 2 - sizeX / 2, resY / 2 - sizeY / 2), imgui.Cond.FirstUseEver)
        imgui.SetNextWindowSize(imgui.ImVec2(sizeX, sizeY), imgui.Cond.FirstUseEver)
        imgui.Begin('Unltimate Weather Changer', window, imgui.WindowFlags.NoResize)

        imgui.PushItemWidth(imgui.GetWindowSize().x - 10)
        imgui.CenterText('Time')
        imgui.SetCursorPosX(5)
        if imgui.SliderInt('##slider.time', slider.time, 0, 24) then
            setTime(slider.time.v)
            if preset_selected == 0 then
                no_preset_time = slider.time.v
                no_preset_weather = slider.weather.v
            end
        end
        imgui.Spacing()
        imgui.CenterText('Weather')
        imgui.SetCursorPosX(5)
        if imgui.SliderInt('##slider.weather', slider.weather, 0, 45) then
            setWeather(slider.weather.v)
            if preset_selected == 0 then
                no_preset_time = slider.time.v
                no_preset_weather = slider.weather.v
            end
        end
        imgui.PopItemWidth()

        imgui.Spacing()
        imgui.Separator()
        imgui.Spacing()

        imgui.SetCursorPosX(5)
        imgui.BeginChild('list', imgui.ImVec2(sizeX - 10, 100), true)
            if imgui.Selectable(u8'Без пресета', preset_selected == 0) then
                preset_selected = i
                slider.time.v = no_preset_time
                slider.weather.v = no_preset_weather
                save()

            end
            for i = 1, #list do
                if imgui.Selectable(list[i].name, preset_selected == i) then
                    preset_selected = i
                    slider.time.v = list[i].time
                    slider.weather.v = list[i].weather
                    save()
                end
            end
        imgui.EndChild()

        imgui.SetCursorPosX(5)
        if imgui.Button(u8'Сохранить пресет', imgui.ImVec2(sizeX - 10, 20)) then
            imgui.OpenPopup(u8'Сохранение пресета')
        end
        imgui.SetCursorPosX(5)
        if imgui.Button(u8'Удалить пресет', imgui.ImVec2(sizeX - 10, 20)) then
            table.remove(list, preset_selected)
            jsonSave(list)
        end

        if imgui.BeginPopupModal(u8'Сохранение пресета', true, imgui.WindowFlags.NoTitleBar + imgui.WindowFlags.NoResize) then
            imgui.SetWindowSize(imgui.ImVec2(200, 95))

            imgui.CenterText(u8'Название пресета')
            imgui.SetCursorPosX(5)
            imgui.PushItemWidth(190)
            imgui.InputText('##presetname', preset_add_name)
            imgui.PopItemWidth()

            imgui.SetCursorPosX(5)
            if imgui.Button(u8'Сохранить пресет', imgui.ImVec2(sizeX - 10, 20)) then
                table.insert(list, {name = preset_add_name.v, time = slider.time.v, weather = slider.weather.v})
                preset_add_name.v = u8'Пресет #'..tostring(#list + 1)
                jsonSave(list)
                imgui.CloseCurrentPopup()
            end
            if imgui.Button(u8'Закрыть', imgui.ImVec2(sizeX - 10, 20)) then
                preset_add_name.v = u8'Пресет #'..tostring(#list + 1)
                jsonSave(list)
                imgui.CloseCurrentPopup()
            end

            imgui.EndPopup()
        end

        imgui.End()
    end
end

function imgui.CenterText(text)
    imgui.SetCursorPosX(imgui.GetWindowSize().x / 2 - imgui.CalcTextSize(text).x / 2)
    imgui.Text(text)
end

function patch_samp_time_set(enable)
    if enable and default == nil then
        default = readMemory(sampGetBase() + 0x9C0A0, 4, true)
        writeMemory(sampGetBase() + 0x9C0A0, 4, 0x000008C2, true)
    elseif enable == false and default ~= nil then
        writeMemory(sampGetBase() + 0x9C0A0, 4, default, true)
        default = nil
    end
end

function setTime(time)
   
    patch_samp_time_set(false)
    memory.write(0xB70153, time, 1, false)
    patch_samp_time_set(true)
    --[[
    local bs = raknetNewBitStream()
    raknetBitStreamWriteInt8(bs, time)
    raknetBitStreamWriteInt8(bs, 0)
    raknetEmulRpcReceiveBitStream(29, bs)
    raknetDeleteBitStream(bs)
    ]]
end

function setWeather(weatherId)
    memory.write(0xC81320, weatherId, 2, false)
    --[[
        SetPlayerWeather - ID: 152
        Parameters: UINT8 bWeatherID
    ]]
    --local bs = raknetNewBitStream()
    --raknetBitStreamWriteInt8(bs, weatherId)
    --raknetEmulRpcReceiveBitStream(152, bs)
    --raknetDeleteBitStream(bs)
end

function BH_theme()
    imgui.SwitchContext()
    local style = imgui.GetStyle()
    local colors = style.Colors
    local clr = imgui.Col
    local ImVec4 = imgui.ImVec4
    local ImVec2 = imgui.ImVec2
 
    style.WindowPadding = ImVec2(6, 4)
    style.WindowRounding = 5.0
    style.ChildWindowRounding = 5.0
    style.FramePadding = ImVec2(5, 2)
    style.FrameRounding = 5.0
    style.ItemSpacing = ImVec2(7, 5)
    style.ItemInnerSpacing = ImVec2(1, 1)
    style.TouchExtraPadding = ImVec2(0, 0)
    style.IndentSpacing = 6.0
    style.ScrollbarSize = 12.0
    style.ScrollbarRounding = 5.0
    style.GrabMinSize = 20.0
    style.GrabRounding = 2.0
    style.WindowTitleAlign = ImVec2(0.5, 0.5)

    colors[clr.Text]                   = ImVec4(1.00, 1.00, 1.00, 1.00)
    colors[clr.TextDisabled]           = ImVec4(0.28, 0.30, 0.35, 1.00)
    colors[clr.WindowBg]               = ImVec4(0.16, 0.18, 0.22, 1.00)
    colors[clr.ChildWindowBg]          = ImVec4(0.19, 0.22, 0.26, 1)
    colors[clr.PopupBg]                = ImVec4(0.05, 0.05, 0.10, 0.90)
    colors[clr.Border]                 = ImVec4(0.19, 0.22, 0.26, 1.00)
    colors[clr.BorderShadow]           = ImVec4(0.00, 0.00, 0.00, 0.00)
    colors[clr.FrameBg]                = ImVec4(0.19, 0.22, 0.26, 1.00)
    colors[clr.FrameBgHovered]         = ImVec4(0.22, 0.25, 0.30, 1.00)
    colors[clr.FrameBgActive]          = ImVec4(0.22, 0.25, 0.29, 1.00)
    colors[clr.TitleBg]                = ImVec4(0.19, 0.22, 0.26, 1.00)
    colors[clr.TitleBgActive]          = ImVec4(0.19, 0.22, 0.26, 1.00)
    colors[clr.TitleBgCollapsed]       = ImVec4(0.19, 0.22, 0.26, 0.59)
    colors[clr.MenuBarBg]              = ImVec4(0.19, 0.22, 0.26, 1.00)
    colors[clr.ScrollbarBg]            = ImVec4(0.20, 0.25, 0.30, 0.60)
    colors[clr.ScrollbarGrab]          = ImVec4(0.41, 0.55, 0.78, 1.00)
    colors[clr.ScrollbarGrabHovered]   = ImVec4(0.49, 0.63, 0.86, 1.00)
    colors[clr.ScrollbarGrabActive]    = ImVec4(0.49, 0.63, 0.86, 1.00)
    colors[clr.ComboBg]                = ImVec4(0.20, 0.20, 0.20, 0.99)
    colors[clr.CheckMark]              = ImVec4(0.90, 0.90, 0.90, 0.50)
    colors[clr.SliderGrab]             = ImVec4(1.00, 1.00, 1.00, 0.30)
    colors[clr.SliderGrabActive]       = ImVec4(0.80, 0.50, 0.50, 1.00)
    colors[clr.Button]                 = ImVec4(0.41, 0.55, 0.78, 1.00)
    colors[clr.ButtonHovered]          = ImVec4(0.49, 0.62, 0.85, 1.00)
    colors[clr.ButtonActive]           = ImVec4(0.49, 0.62, 0.85, 1.00)
    colors[clr.Header]                 = ImVec4(0.41, 0.55, 0.78, 1.00)
    colors[clr.HeaderHovered]          = ImVec4(0.43, 0.57, 0.80, 1.00)
    colors[clr.HeaderActive]           = ImVec4(0.43, 0.57, 0.80, 1.00)
    colors[clr.Separator]              = ImVec4(0.41, 0.55, 0.78, 1.00)
    colors[clr.SeparatorHovered]       = ImVec4(0.41, 0.55, 0.78, 1.00)
    colors[clr.SeparatorActive]        = ImVec4(0.41, 0.55, 0.78, 1.00)
    colors[clr.ResizeGrip]             = ImVec4(0.41, 0.55, 0.78, 1.00)
    colors[clr.ResizeGripHovered]      = ImVec4(0.49, 0.61, 0.83, 1.00)
    colors[clr.ResizeGripActive]       = ImVec4(0.49, 0.62, 0.83, 1.00)
    colors[clr.CloseButton]            = ImVec4(0.41, 0.55, 0.78, 1.00)
    colors[clr.CloseButtonHovered]     = ImVec4(0.50, 0.63, 0.84, 1.00)
    colors[clr.CloseButtonActive]      = ImVec4(0.41, 0.55, 0.78, 1.00)
    colors[clr.PlotLines]              = ImVec4(1.00, 1.00, 1.00, 1.00)
    colors[clr.PlotLinesHovered]       = ImVec4(0.90, 0.70, 0.00, 1.00)
    colors[clr.PlotHistogram]          = ImVec4(0.90, 0.70, 0.00, 1.00)
    colors[clr.PlotHistogramHovered]   = ImVec4(1.00, 0.60, 0.00, 1.00)
    colors[clr.TextSelectedBg]         = ImVec4(0.41, 0.55, 0.78, 1.00)
    colors[clr.ModalWindowDarkening]   = ImVec4(0.16, 0.18, 0.22, 0.76)
end
BH_theme()
это не тот код, тут даже 700 строки нет брух
 
  • Нравится
Реакции: ARMOR

chapo

tg/inst: @moujeek
Всефорумный модератор
9,205
12,541
Тоже заметил. ( не тот код кинул )

Код сюда не поместился, кинул файлом
засунь эти переменные в таблицу
Lua:
local s = {
    HealthXSlider = imgui.new.float(cfg.hudpos.HealthX),
    HealthYSlider = imgui.new.float(cfg.hudpos.HealthY),
    HealthWSlider = imgui.new.float(cfg.hudpos.HealthW),
    HealthHSlider = imgui.new.float(cfg.hudpos.HealthH),
    ArmorXSlider = imgui.new.float(cfg.hudpos.ArmorX),
    ArmorYSlider = imgui.new.float(cfg.hudpos.ArmorY),
    ArmorWSlider = imgui.new.float(cfg.hudpos.ArmorW),
    ArmorHSlider = imgui.new.float(cfg.hudpos.ArmorH),
    BreathXSlider = imgui.new.float(cfg.hudpos.BreathX),
    BreathYSlider = imgui.new.float(cfg.hudpos.BreathY),
    BreathWSlider = imgui.new.float(cfg.hudpos.BreathW),
    BreathHSlider = imgui.new.float(cfg.hudpos.BreathH),
    MoneyXSlider = imgui.new.float(cfg.hudpos.MoneyX),
    MoneyYSlider = imgui.new.float(cfg.hudpos.MoneyY),
    MoneyWSlider = imgui.new.float(cfg.hudpos.MoneyW),
    MoneyHSlider = imgui.new.float(cfg.hudpos.MoneyH),
    WeaponIconXSlider = imgui.new.float(cfg.hudpos.WeaponIconX),
    WeaponIconYSlider = imgui.new.float(cfg.hudpos.WeaponIconY),
    WeaponAmmoXSlider = imgui.new.float(cfg.hudpos.WeaponAmmoX),
    WeaponAmmoYSlider = imgui.new.float(cfg.hudpos.WeaponAmmoY),
    WeaponAmmoWSlider = imgui.new.float(cfg.hudpos.WeaponAmmoW),
    WeaponAmmoHSlider = imgui.new.float(cfg.hudpos.WeaponAmmoH),
    WantedXSlider = imgui.new.float(cfg.hudpos.WantedX),
    WantedYSlider = imgui.new.float(cfg.hudpos.WantedY),
    WantedWSlider = imgui.new.float(cfg.hudpos.WantedW),
    WantedHSlider = imgui.new.float(cfg.hudpos.WantedH),
    RadarXSlider = imgui.new.float(cfg.hudpos.RadarX),
    RadarYSlider = imgui.new.float(cfg.hudpos.RadarY),
    RadarWSlider = imgui.new.float(cfg.hudpos.RadarW),
    RadarHSlider = imgui.new.float(cfg.hudpos.RadarH)
}
 

ARMOR

Я креветка
Модератор
5,067
7,381
засунь эти переменные в таблицу
Lua:
local s = {
    HealthXSlider = imgui.new.float(cfg.hudpos.HealthX),
    HealthYSlider = imgui.new.float(cfg.hudpos.HealthY),
    HealthWSlider = imgui.new.float(cfg.hudpos.HealthW),
    HealthHSlider = imgui.new.float(cfg.hudpos.HealthH),
    ArmorXSlider = imgui.new.float(cfg.hudpos.ArmorX),
    ArmorYSlider = imgui.new.float(cfg.hudpos.ArmorY),
    ArmorWSlider = imgui.new.float(cfg.hudpos.ArmorW),
    ArmorHSlider = imgui.new.float(cfg.hudpos.ArmorH),
    BreathXSlider = imgui.new.float(cfg.hudpos.BreathX),
    BreathYSlider = imgui.new.float(cfg.hudpos.BreathY),
    BreathWSlider = imgui.new.float(cfg.hudpos.BreathW),
    BreathHSlider = imgui.new.float(cfg.hudpos.BreathH),
    MoneyXSlider = imgui.new.float(cfg.hudpos.MoneyX),
    MoneyYSlider = imgui.new.float(cfg.hudpos.MoneyY),
    MoneyWSlider = imgui.new.float(cfg.hudpos.MoneyW),
    MoneyHSlider = imgui.new.float(cfg.hudpos.MoneyH),
    WeaponIconXSlider = imgui.new.float(cfg.hudpos.WeaponIconX),
    WeaponIconYSlider = imgui.new.float(cfg.hudpos.WeaponIconY),
    WeaponAmmoXSlider = imgui.new.float(cfg.hudpos.WeaponAmmoX),
    WeaponAmmoYSlider = imgui.new.float(cfg.hudpos.WeaponAmmoY),
    WeaponAmmoWSlider = imgui.new.float(cfg.hudpos.WeaponAmmoW),
    WeaponAmmoHSlider = imgui.new.float(cfg.hudpos.WeaponAmmoH),
    WantedXSlider = imgui.new.float(cfg.hudpos.WantedX),
    WantedYSlider = imgui.new.float(cfg.hudpos.WantedY),
    WantedWSlider = imgui.new.float(cfg.hudpos.WantedW),
    WantedHSlider = imgui.new.float(cfg.hudpos.WantedH),
    RadarXSlider = imgui.new.float(cfg.hudpos.RadarX),
    RadarYSlider = imgui.new.float(cfg.hudpos.RadarY),
    RadarWSlider = imgui.new.float(cfg.hudpos.RadarW),
    RadarHSlider = imgui.new.float(cfg.hudpos.RadarH)
}
Не помогло
 

moreveal

Известный
980
712
как снять фокус с поля ввода диалогового окна? (через память как-нибудь, отправка кликов не подойдет)
 
Последнее редактирование:

kin4stat

mq-team · kin4@naebalovo.team
Всефорумный модератор
2,761
4,890
как снять фокус с поля ввода диалогового окна? (через память как-нибудь, отправка кликов не подойдет)
C++:
ffi.cast("int(*)()", getModuleHandle("samp.dll") + 0x807E0)() -- R1
ffi.cast("int(*)()", getModuleHandle("samp.dll") + 0x846F0)() -- R3
 
  • Нравится
  • Вау
Реакции: moreveal и ARMOR

chapo

tg/inst: @moujeek
Всефорумный модератор
9,205
12,541
как через gsub заменить отдельное слово?
например:
Lua:
local text = {
    "HelloWorld",
    "Hello World"
}

for k, v in ipairs(text) do
    print(v:gsub("Hello", "sosi")
end

-- вывод:
sosiWorld 1
sosi World 1
но мне нужно что бы слово заменялось только если оно идет отдельно,
то есть надо что бы замена работала только на второй элемент из массива

как через gsub заменить отдельное слово?
например:
Lua:
local text = {
    "HelloWorld",
    "Hello World"
}

for k, v in ipairs(text) do
    print(v:gsub("Hello", "sosi")
end

-- вывод:
sosiWorld 1
sosi World 1
но мне нужно что бы слово заменялось только если оно идет отдельно,
то есть надо что бы замена работала только на второй элемент из массива
upd. нашел ответ:
Lua:
v:gsub("%f[%a]Hello%f[%A]", "sosi")
 
Последнее редактирование: