script_name('[ERP] Taxi Helper')
require 'lib.moonloader'
require 'lib.sampfuncs'
--REQUESTS--
local sf = require 'sampfuncs'
local sampev = require 'lib.samp.events'
local vkeys = require "vkeys"
encoding = require 'encoding'
local rx, ry = getScreenResolution()
local wx, wy = rx-500, ry-390
local inicfg = require 'inicfg'
imgui = require 'imgui'
encoding.default = 'CP1251'
u8 = encoding.UTF8
---------------------------------------------------DEFOLT CONFIG-----------------------------------------------
local defcfg =
{
Main =
{
clist = 0,
autoClist = false,
autoAccept = false,
autoSkill = false,
acceptDistance = 1500,
delay = 2000,
}
}
---------------------------------------------------------------------------------------------------------
local directIni = "TaxiHelper.ini" -- путь к конфигу
local mainIni = inicfg.load(defcfg, "TaxiHelper.ini") -- загрузка конфига
inicfg.save(mainIni, directIni) -- сохранение конфига
local main_window_state = imgui.ImBool(false) -- состояние имгуи окна при запуске скрипта
local text_buffer = imgui.ImBuffer(256) -- сохраненный текст
function main()
if not isSampLoaded() or not isSampfuncsLoaded() then return end
while not isSampAvailable() do wait(100) end
sampAddChatMessage('{edf511}[Taxi Helper] {ffffff}successful loaded.', -1)
sampRegisterChatCommand("th", cmd_th) -- регистрация команды
imgui.Process = false -- имгуи процесс не работает
while true do
wait(0)
if main_window_state.v == false then
imgui.Process = false
end
end
end
function cmd_th(arg) --команда /th
main_window_state.v = not main_window_state.v
imgui.Process = main_window_state.v
end
rabden = nil
autoSkill = imgui.ImBool(mainIni.Main.autoSkill) -- состояние автоскилла берет из конфига
autoClist = imgui.ImBool(mainIni.Main.autoClist) -- состояние автоклист берет из конфига
autoAccept = imgui.ImBool(mainIni.Main.autoAccept) -- состояние автоакцепт берет из конфига
clistId = imgui.ImInt(mainIni.Main.clist) -- номер клиста берет из конфига
accdist = imgui.ImInt(mainIni.Main.acceptDistance) -- расстояние для работы автоакцепта из конфига
delay = imgui.ImInt(mainIni.Main.delay) -- задержка между поступлением вызова и его принятием
function apply_custom_style()
imgui.SwitchContext()
local style = imgui.GetStyle()
local colors = style.Colors
local clr = imgui.Col
local ImVec4 = imgui.ImVec4
style.WindowRounding = 3.5
style.WindowTitleAlign = imgui.ImVec2(0.5, 0.5)
style.ChildWindowRounding = 2.0
style.FrameRounding = 3.5
style.ItemSpacing = imgui.ImVec2(5.0, 4.0)
style.ScrollbarSize = 13.0
style.ScrollbarRounding = 0
style.GrabMinSize = 8.0
style.GrabRounding = 1.0
style.WindowPadding = imgui.ImVec2(4.0, 4.0)
style.FramePadding = imgui.ImVec2(3.5, 3.5)
style.ButtonTextAlign = imgui.ImVec2(0.0, 0.5)
colors[clr.CheckMark] = ImVec4(0.1, 0.83, 0.01, 0.8)
colors[clr.Separator] = ImVec4(0.85, 0.63, 0.01, 0.8)
colors[clr.TitleBg] = ImVec4(0.85, 0.63, 0.01, 0.8)
colors[clr.TitleBgActive] = ImVec4(0.85, 0.63, 0.01, 0.8)
colors[clr.WindowBg] = ImVec4(0.06, 0.06, 0.06, 0.91)
colors[clr.Button] = ImVec4(0.65, 0.6, 0.05, 0.8)
colors[clr.ButtonHovered] = ImVec4(0.86, 0.57, 0.13, 0.5)
colors[clr.ButtonActive] = ImVec4(0.21, 0.21, 0.21, 0.81)
colors[clr.SliderGrab] = imgui.ImVec4(0.85, 0.63, 0.01, 1.00)
colors[clr.SliderGrabActive] = ImVec4(0.65, 0.6, 0.05, 1.00)
end
apply_custom_style()
function imgui.TextQuestion(text)
imgui.TextDisabled('(?)')
if imgui.IsItemHovered() then
imgui.BeginTooltip()
imgui.PushTextWrapPos(450)
imgui.TextUnformatted(text)
imgui.PopTextWrapPos()
imgui.EndTooltip()
end
end
function imgui.OnDrawFrame() -- работа имгуи каждый кадр
imgui.SetNextWindowSize(imgui.ImVec2(400, 260)) --размер имгуи окна
imgui.SetNextWindowPos(imgui.ImVec2(rx/2-wx/4, ry/2-wy/3)) -- позиция имгуи окна
imgui.Begin(u8"Taxi Helper", main_window_state, imgui.WindowFlags.NoCollapse + imgui.WindowFlags.NoResize) -- создание имгуи, заголовок
if imgui.Checkbox(u8"Авто /clist", autoClist) then -- если чекбокс автоклист включен или выключен, то
mainIni.Main.autoClist = autoClist.v -- записывает состояние автоклиста после изменения состояния чекбокса в кфг
inicfg.save(mainIni, directIni) -- сохраняет кфг
end
imgui.SameLine(nil, 5)
imgui.TextQuestion(u8'Автоматически включает заданный /clist после начала работы на такси, спавна игрока во время рабочего дня и при завершении рабочего дня устанавливает /clist 0.')
if imgui.Checkbox(u8"Авто /sendcall", autoAccept) then --если чекбокс автоакцепт вкл или выкл
mainIni.Main.autoAccept = autoAccept.v -- записывает состояние автоакцепта после изменения состояние чекбокса в кфг
inicfg.save(mainIni, directIni) -- сохраняет кфг
end
imgui.SameLine(nil, 5)
imgui.TextQuestion(u8'Автоматически принимает вызов такси, если расстояние равно или меньше заданного. Если вы уже приняли вызов или какой-то пассажир сел в ваше такси, то функция отключается. Функция снова начинает свою работу, если пассажир вышел из такси и больше пассажиров в такси нет, также если вызов был отменен или пассажир уехал на другом такси.')
if imgui.Checkbox(u8"Авто /taxiskill", autoSkill) then --если чекбокс авточекскилл вкл или выкл
mainIni.Main.autoSkill = autoSkill.v -- записывает состояние авточекаскилла после изменения состояние чекбокса в кфг
inicfg.save(mainIni, directIni) -- сохраняет кфг
end
imgui.SameLine(nil, 5)
imgui.TextQuestion(u8'Автоматически проверяет скилл через 2 секунды после выхода пассажира из такси. Если выйдет 2 пассажира, то скилл проверит 2 раза.')
imgui.NewLine()
if imgui.SliderInt("Clist", clistId, 0, 33) then -- слайдер выбора клиста
mainIni.Main.clist = clistId.v -- записывает клист в кфг
inicfg.save(mainIni, directIni) -- сохраняет кфг
end
imgui.SameLine(nil, 5)
imgui.TextQuestion(u8'Устанавливает значение цвета для функции Авто /clist.')
imgui.NewLine()
if imgui.SliderInt("Accept Distance", accdist, 0, 6000) then -- слайдер выбора клиста
mainIni.Main.acceptDistance = accdist.v -- записывает дистанцию в кфг
inicfg.save(mainIni, directIni) -- сохраняет кфг
end
imgui.SameLine(nil, 5)
imgui.TextQuestion(u8'Устанавливает значение расстояния для функции Авто /sendcall.')
imgui.NewLine()
if imgui.SliderInt("Delay", delay, 1000, 10000) then -- слайдер выбора клиста
mainIni.Main.delay = delay.v -- записывает задержку в кфг
inicfg.save(mainIni, directIni) -- сохраняет кфг
end
imgui.SameLine(nil, 5)
imgui.TextQuestion(u8'Устанавливает задержку между поступлением вызова и его принятием.')
imgui.Separator() --линия разделения
if imgui.Button(u8"Перезагрузить скрипт") then --если нажать кнопку перезагрузить скрипт
showCursor(false) -- убирает курсор
thisScript():reload() -- перезагрузка скрипта
end
imgui.End() -- завершение имгуи процесса
end
function sampev.onDisplayGameText(rstyle, rtime, rtext) -- проверка на кар и аренду за 1к
dtext = rtext
dstyle = rstyle
dtime = rtime
if dtext == "~b~~h~C: -$1000" then
setVirtualKeyDown(13, true)
setVirtualKeyDown(13, false)
if mainIni.Main.autoClist == true then
lua_thread.create(function()
wait(1000)
_, myid = sampGetPlayerIdByCharHandle(PLAYER_PED)
mycol = sampGetPlayerColor(myid)
if mycol == 4294958628 then
sampAddChatMessage('{edf511}[Taxi Helper] {ffffff}Цвет ника сменен на: {edf511}' .. mainIni.Main.clist, -1)
wait(100)
sampSendChat("/clist " .. mainIni.Main.clist)
end
end)
end
if mainIni.Main.autoAccept == true then
if isCharInAnyCar(PLAYER_PED) then
carhandle = storeCarCharIsInNoSave(PLAYER_PED)
idcar = getCarModel(carhandle)
if idcar == 420 or 438 or 405 or 560 then
rabden = true
end
end
end
end
end
function sampev.onServerMessage(color, text) --автоакцепт
if not isGamePaused() or not isPauseMenuActive() then
if mainIni.Main.autoAccept == true then -- если в кфг автоакцепт тру, то работает этота функция
if string.find(text, "- Диспетчер: Расстояние", 1, true) then -- ищет в строке текст
lua_thread.create(function()
wait(100)
local rast, idv = text:match('- Диспетчер: Расстояние (.+) метр%(ов%). Введите %{FFFFFF%}%"/sendcall %[ (.+) %]') --берет из него расстояние и ид
if tonumber(rast) <= mainIni.Main.acceptDistance and tonumber(rast) ~= nil then -- если расстояние меньше или равно расстоянию из конфига и не равно нулю
if rabden == true or rabden == nil then -- если рабочий день начат (при аренде машины, высадке всех пассажиров) или nil (при перезагрузке скрипта)
wait(mainIni.Main.delay) -- задержка между поступление вызова и его принятием (из конфига)
sampSendChat("/sendcall "..idv) -- принимает вызов
rabden = false -- рабочий день фолс, т.к. принят вызов
rast = 6000 -- чтобы не было бесконечноого цикла
end
end
end)
end
end
end
if text:find('Пассажир .+ сел в ваше Такси.') and rabden == true then -- если закончил работу таксиста, то
lua_thread.create(function()
wait(100)
rabden = false
end)
end
if text:find('Пассажир вышел из вашего Такси.') then -- если пассажир вышел из такси, то
lua_thread.create(function()
wait(100)
if isCharInAnyCar(PLAYER_PED) then -- если игрок в любой машине
carhandle = storeCarCharIsInNoSave(PLAYER_PED) -- получаем хендл кара
_, passengers = getNumberOfPassengers(carhandle) -- проверяет сколько пассажиров в машине
if passengers == 0 then -- если пассажиров 0
rabden = true -- рабочий день снова начат и скрипт принимает вызовы
end
end
end)
if mainIni.Main.autoSkill == true then -- если чек автоскилла включен
lua_thread.create(function()
wait(2000)
sampSendChat('/taxiskill') -- чекает скилл такси после выхода пассажира
end)
end
end
if text:find('- Диспетчер: Пассажир уехал на другом такси') then -- если пассажир уехал на другом такси, то
lua_thread.create(function()
wait(100)
rabden = true -- снова принимаем вызовы
end)
end
if text:find('- Диспетчер: Вызов отменен пользователем') then -- если пассажир отменил вызов, то
lua_thread.create(function()
wait(100)
rabden = true -- снова принимаем вызовы
end)
end
if text:find('Зарплата будет перечислена во время PayDay') then
if mainIni.Main.autoClist == true then
lua_thread.create(function()
wait(100)
sampAddChatMessage('{edf511}[Taxi Helper] {ffffff}Цвет ника сменен на: {edf511} 0', -1)
sampSendChat('/clist 0') -- клист 0
rabden = false
end)
else
rabden = false
end
end
end
function sampev.onSendSpawn() -- если рабочий день начат и игрок заспавнился например после смерти, то автоматом ставит клист
if mainIni.Main.autoClist == true and rabden == true then
lua_thread.create(function()
wait(1200)
sampSendChat('/clist '..mainIni.Main.clist)
sampAddChatMessage('{edf511}[Taxi Helper] {ffffff}Цвет ника сменен на: {edf511}' .. mainIni.Main.clist, -1)
end)
end
end