script_name("TruckHUD") script_author("Serhiy_Rubin") script_version("24.11.2023") local inicfg = require "inicfg" local dlstatus = require("moonloader").download_status local vkeys = require "lib.vkeys" local ffi = require("ffi") ffi.cdef [[ bool SetCursorPos(int X, int Y); ]] local encoding = require "encoding" encoding.default = "CP1251" local u8 = encoding.UTF8 function try(f, catch_f) local status, exception = pcall(f) if not status then catch_f(exception) end end ------- 3d text local id_3D_text = os.time() local what_is_uploaded = {[0] = "Нет", [1] = "Нефть", [2] = "Уголь", [3] = "Дерево"} local texts_of_reports = { ["n1"] = "Нефтезаводе №1", ["n2"] = "Нефтезаводе №2", ["y1"] = "Складе Угля №1", ["y2"] = "Складе Угля №2", ["l1"] = "Лесопилке №1", ["l2"] = "Лесопилке №2", ["lsn"] = "Нефть в ЛС", ["lsy"] = "Уголь в ЛС", ["lsl"] = "Дерево в ЛС", ["sfn"] = "Нефть в СФ", ["sfy"] = "Уголь в СФ", ["sfl"] = "Дерево в СФ" } local dop_chat_light = { "Нефтезавод №1", "Нефтезавод №2", "Склад Угля №1", "Склад Угля №2", "Лесопилку №1", "Лесопилку №2", "Нефть в Порт ЛС", "Нефть в Порт СФ", "Уголь в Порт ЛС", "Уголь в Порт СФ", "Дерево в Порт ЛС", "Дерево в Порт СФ", " в Порт ЛС", " в Порт СФ" } for k,v in pairs(texts_of_reports) do dop_chat_light[#dop_chat_light+1] = v end local find_3dText = { ["n1"] = "Нефтезавод №1.*Цена груза: 0.(%d+)", ["n2"] = "Нефтезавод №2.*Цена груза: 0.(%d+)", ["y1"] = "Склад угля №1.*Цена груза: 0.(%d+)", ["y2"] = "Склад угля №2.*Цена груза: 0.(%d+)", ["l1"] = "Лесопилка №1.*Цена груза: 0.(%d+)", ["l2"] = "Лесопилка №2.*Цена груза: 0.(%d+)", ["ls"] = "Порт ЛС.*Нефть: 0.(%d+).*Уголь: 0.(%d+).*Дерево: 0.(%d+)", ["sf"] = "Порт СФ.*Нефть: 0.(%d+).*Уголь: 0.(%d+).*Дерево: 0.(%d+)" } local menu = { [1] = {[1] = "TruckHUD: {06940f}ON", [2] = "TruckHUD: {d10000}OFF", run = false}, [2] = {[1] = "Load/Unload: {06940f}ON", [2] = "Load/Unload: {d10000}OFF", run = false}, [3] = {[1] = "Авто-Доклад: {06940f}ON", [2] = "Авто-Доклад: {d10000}OFF", run = false}, [4] = {[1] = "SMS » Serhiy_Rubin[777]", [2] = "Режим пары: {d10000}OFF", run = false}, [5] = {[1] = "Соло-Чекер: ", [2] = "Соло-Чекер: ", run = false}, [6] = {[1] = "Дальнобойщики онлайн", [2] = "Дальнобойщики онлайн", run = false}, [7] = {[1] = "Дальнобойщики со скриптом", [2] = "Дальнобойщики со скриптом", run = false}, [8] = {[1] = "Настройки", [2] = "Настройки", run = false}, [9] = {[1] = "Мониторинг цен", [2] = "Мониторинг цен", run = false}, [10] = {[1] = "Купить груз", [2] = "Купить груз", run = false}, [11] = {[1] = "Продать груз", [2] = "Продать груз", run = false}, [12] = {[1] = "Восстановить груз", [2] = "Восстановить груз", run = false} } local pair_afk_stop = { player_live = 0, pair_live = 0, auto_stop = 0 } local pair_mode, sms_pair_mode, report_text, pair_mode_id, pair_mode_name, BinderMode = false, "", "", -1, "Нет", true local script_run, control, auto, autoh, wait_auto, pos = false, false, false, true, 0, {[1] = false, [2] = false, [3] = false} local price_frozen, timer, antiflood, current_load, load_location, unload_location = false, 0, 0, 0, false, false local my_nick, server, timer_min, timer_sec, workload = "", "", 0, 0, 0 local mon_life, mon_time, mon_ctime = 0, 0, 0 local prices_3dtext_pos = {} local prices_3dtext_id = {} local prices_3dtext = { n1 = 0, n2 = 0, y1 = 0, y2 = 0, l1 = 0, l2 = 0, lsn = 0, lsy = 0, lsl = 0, sfn = 0, sfy = 0, sfl = 0 } local prices_mon = { n1 = 0, n2 = 0, y1 = 0, y2 = 0, l1 = 0, l2 = 0, lsn = 0, lsy = 0, lsl = 0, sfn = 0, sfy = 0, sfl = 0 } local prices_smon = { n1 = 0, n2 = 0, y1 = 0, y2 = 0, l1 = 0, l2 = 0, lsn = 0, lsy = 0, lsl = 0, sfn = 0, sfy = 0, sfl = 0 } local delay, d = {chatMon = 0, chat = 0, skill = -1, mon = 0, load = 0, unload = 0, sms = 0, dir = 0, paycheck = 0}, {[3] = ""} local pickupLoad = { [1] = {251.32167053223, 1420.3039550781, 11.5}, -- N1 [2] = {839.09020996094, 880.17510986328, 14.3515625}, -- Y1 [3] = {-1048.6430664063, -660.54699707031, 33.012603759766}, -- N2 [4] = {-2913.8544921875, -1377.0952148438, 12.762256622314}, -- y2 [5] = {-1963.6184082031, -2438.9055175781, 31.625}, -- l2 [6] = {-457.45620727539, -53.193939208984, 60.938865661621} -- l1 } local newMarkers = {} local pair_table = {} local pair_timestamp = 0 local pair_status = 0 local response_timestamp = 0 local transponder_delay = 500 local ScriptTerminate = false local msk_timestamp = 0 local responce_delay = 0 local timer_secc = 0 local base = {} local payday = 0 local chat_mon = {} local _3dTextplayers = {} local live = os.time() --- pair mode new parking_pair = { { [1] = { 251.32167053223, 1420.3039550781, 11.5, 15.0 }, -- N1 [2] = { -1048.6430664063, -660.54699707031, 33.012603759766, 10.0 } -- N2 }, { [1] = { 839.09020996094, 880.17510986328, 14.3515625, 15.0 }, -- У1 [2] = { -2913.8544921875, -1377.0952148438, 12.762256622314, 25.0 } -- У2 }, { [1] = { -457.45620727539, -53.193939208984, 60.938865661621, 15.0 }, -- Л1 [2] = { -1963.6184082031, -2438.9055175781, 31.625, 25.0 } -- Л2 }, { [1] = { 2507.0256, -2234.2151, 13.5469, 30.0 }, -- ЛС [2] = { -1731.5022, 118.8936, 3.5547, 30.0 } -- СФ } } pair_ready = false player_ready = false location_pos = { ["Нефть 1"] = {x = 256.02127075195, y = 1414.8492431641, z = 10.232398033142}, ["Уголь 1"] = {x = 832.10766601563, y = 864.03668212891, z = 11.643839836121}, ["Лес 1"] = {x = -448.91455078125, y = -65.951385498047, z = 58.959014892578}, ["Нефть 2"] = {x = -1046.7521972656, y = -670.66937255859, z = 31.885597229004}, ["Уголь 2"] = {x = -2913.8544921875, y = -1377.0952148438, z = 10.762256622314}, ["Лес 2"] = {x = -1978.8649902344, y = -2434.9421386719, z = 30.192840576172}, ["Порт ЛС"] = {x = 2507.02, y = -2234.05, z = 13.55}, ["Порт СФ"] = {x = -1731.5022, y = 118.8936, z = 3.5547}, ["Аренда"] = {x = 2239.8333, y = 2779.6016, z = 10.8203} } location_keys = { ["n1"] = {x = 256.02127075195, y = 1414.8492431641, z = 10.232398033142, }, ["y1"] = {x = 832.10766601563, y = 864.03668212891, z = 11.643839836121}, ["l1"] = {x = -448.91455078125, y = -65.951385498047, z = 58.959014892578}, ["n2"] = {x = -1046.7521972656, y = -670.66937255859, z = 31.885597229004}, ["y2"] = {x = -2913.8544921875, y = -1377.0952148438, z = 10.762256622314}, ["l2"] = {x = -1978.8649902344, y = -2434.9421386719, z = 30.192840576172}, ["ls"] = {x = 2507.02, y = -2234.05, z = 13.55}, ["sf"] = {x = -1731.5022, y = 118.8936, z = 3.5547} } cargo_replace = { "n", "y", "l" } binder_mode_sms = false stop_downloading_1, stop_downloading_2, stop_downloading_3, stop_downloading_4, stop_downloading_5 = false, false, false, false, false threads = {} threads_save = {} afk_solo_message_false = 0 function main() if not isSampLoaded() or not isSampfuncsLoaded() then return end while not isSampAvailable() do wait(0) end lua_thread.create(script_update.main) try(function() sampev = require "lib.samp.events" end, function(e) sampAddChatMessage(">> TruckHUD: Отсутствует модуль 'samp.events' (SAMP.lua)", 0xff0000) sampAddChatMessage(">> Официальная страница TruckHUD: https://vk.com/rubin.mods",0xff0000) thisScript():unload() end) loadEvents() loadPtt() repeat wait(0) until sampGetCurrentServerName() ~= "SA-MP" repeat wait(0) until sampGetCurrentServerName():find("Samp%-Rp.Ru") or sampGetCurrentServerName():find("SRP") local _, my_id = sampGetPlayerIdByCharHandle(PLAYER_PED) my_nick = sampGetPlayerNickname(my_id) server = sampGetCurrentServerName():gsub("|", "") server = (server:find("02") and "Two" or (server:find("Revo") and "Revolution" or (server:find("Legacy") and "Legacy" or (server:find("Classic") and "Classic" or (server:find("Zero Two") and "Two" or (server:find("TEST") and "TEST" or (server:find("Underground") and "Underground" or "" ))))))) if server == "" then thisScript():unload() end AdressConfig = string.format("%s\\moonloader\\config ", getGameDirectory()) AdressFolder = string.format("%s\\moonloader\\config\\TruckHUD", getGameDirectory()) AdressJson = string.format("%s\\moonloader\\config\\TruckHUD\\%s-%s.json", getGameDirectory(), server, my_nick) if not doesDirectoryExist(AdressConfig) then createDirectory(AdressConfig) end if not doesDirectoryExist(AdressFolder) then createDirectory(AdressFolder) end settings_load() lua_thread.create(get_time) logAvailable() for k,v in pairs(prices_mon) do prices_mon[k] = inifiles.tmonitor[k] end mon_time = inifiles.tmonitor.time menu[3].run = inifiles.Settings.Report font = renderCreateFont(inifiles.Render.FontName, inifiles.Render.FontSize, inifiles.Render.FontFlag) --gmap area lua_thread.create(transponder) lua_thread.create(fastmap) lua_thread.create(renderTruckers) lua_thread.create(luChecker.checker) lua_thread.create(doCruise) platinum_check() repeat wait(0) until msk_timestamp ~= 0 while true do wait(0) if os.time() - live > 3 then afk_solo_message_false = os.time() end live = os.time() logAvailable() doControl() doSendCMD() doDialog() doPair() doPickup() doPtt() if script_run then if not sampIsScoreboardOpen() and sampIsChatVisible() and not isKeyDown(116) and not isKeyDown(121) and fastmapshow == nil then doPair_G() doRenderStats() doRenderMon() doRenderBind() end end end end maxload_int = 0 function maxload() if maxload_int == 0 then addChatMessage("Пересядь в фуру чтобы понять сколько груза брать!") else sampSendChat("/truck load "..maxload_int) end end function settings_load() wait(0) local x1, y1 = convertGameScreenCoordsToWindowScreenCoords(14.992679595947, 274.75) local x2, y2 = convertGameScreenCoordsToWindowScreenCoords(146.17861938477, 345.91665649414) local x3, y3 = convertGameScreenCoordsToWindowScreenCoords(529.42901611328, 158.08332824707) defaultMon = [[!mn!Скилл: {FFFFFF}!skill! [!skill_poc!%] [!skill_reys!]!n!Ранг: {FFFFFF}!rang! [!rang_poc!%] [!rang_reys!]!n!!mn!Зарплата:{FFFFFF} !zp_hour!/!max_zp!!n!Прибыль: {FFFFFF}!profit!!n!Рейсы: {FFFFFF}!reys_hour!/!reys_day! [!left_reys!] ]] local table_std = { Settings = { binder_sms_mode = false, auto_load_unload_kd_pair_use = true, TruckRender = true, Cruise = false, chat_in_truck = false, blacklist_inversion = false, pairinfo = true, transponder = true, fastmap = true, ad = true, AutoWait = true, highlight_jf = true, Stop = false, ChatOFF = false, ChatDoklad = false, X1 = x1, Y1 = y1, X2 = x2, Y2 = y2, X3 = x3, Y3 = y3, AutoOFF = false, Tuning = true, Report = true, Key = 90, Key1 = "VK_RBUTTON", Key2 = "VK_Z", Key3 = "VK_LBUTTON", Key4 = 'VK_LSHIFT', Binder = true, SMSpara = false, ColorPara = "ff9900", LightingPara = true, LightingPrice = true, girl = false, pickup = true, markers = false, stats_text = defaultMon, renderTruck = true, AutoClear = true, NewPairMSG = true, luCheckerCargo = 0 }, Render = { FontName = "Segoe UI", FontSize = 10, FontFlag = 15, Color1 = "2f72f7", Color2 = "FFFFFF" }, Trucker = { Skill = 1, ReysSkill = 0, Rank = 1, ReysRank = 0, ProcSkill = 100.0, ProcRank = 100.0, MaxZP = 197000 }, Price = { Load = 500, UnLoad = 800 }, tmonitor = { time = 0, n1 = 0, n2 = 0, y1 = 0, y2 = 0, l1 = 0, l2 = 0, lsn = 0, lsy = 0, lsl = 0, sfn = 0, sfy = 0, sfl = 0 }, binder = { '/r На месте', '/r Загружаюсь', '/r Задержусь', '/r Разгружаюсь' }, binder_sms = { '/sms !ИдПары На месте', '/sms !ИдПары Загружаюсь', '/sms !ИдПары Задержусь', '/sms !ИдПары Разгружаюсь' }, blacklist = {}, version = thisScript().version, platinum = { status = false, time = 0 } } if not doesFileExist(AdressJson) then local file, error = io.open(AdressJson, "w") if file ~= nil then file:write(encodeJson(table_std)) file:flush() io.close(file) else sampAddChatMessage(error, -1) end end local readJson = function() local file, error = io.open(AdressJson, "r") if file then local fileText = file:read("*a") inifiles = decodeJson(fileText) if inifiles["version"] == nil then inifiles = decodeJson(u8(fileText)) inifiles["version"] = thisScript().version os.remove(AdressJson) addChatMessage("Конфиг был перезаписан в UTF-8!") local file, error = io.open(AdressJson, "w") if file ~= nil then file:write(encodeJson(inifiles)) file:flush() io.close(file) end else inifiles["version"] = thisScript().version end if inifiles == nil then sampAddChatMessage("[TruckHUD] Ошибка чтения конфига! Сбрасываю конфиг!", 0xff0000) local file, error = io.open(AdressJson, "w") if file ~= nil then file:write(encodeJson(table_std)) file:flush() io.close(file) end end io.close(file) end end local result = pcall(readJson) if not result then sampAddChatMessage("[TruckHUD] Ошибка чтения конфига! Сбрасываю конфиг!", 0xff0000) local file, error = io.open(AdressJson, "w") if file ~= nil then file:write(encodeJson(table_std)) file:flush() io.close(file) end end if inifiles ~= nil then if error_ini ~= nil then sampAddChatMessage("[TruckHUD] Конфиг был успешно загружен!", 0xff0000) error_ini = nil end for k,v in pairs(table_std) do if inifiles[k] == nil then inifiles[k] = v end if k ~= "binder" and k ~= "binder_sms" and type(v) == "table" then for i, s in pairs(v) do if inifiles[k][i] == nil then inifiles[k][i] = s end end end end settings_save() else error_ini = true sampAddChatMessage("[TruckHUD] Ошибка чтения конфига! Пробую ещё раз прочесть", 0xff0000) settings_load() end end function settings_save() local file, error = io.open(AdressJson, "w") if file ~= nil then file:write(encodeJson(inifiles)) file:flush() io.close(file) else sampAddChatMessage(error, -1) end end function doControl() if isKeyDown(vkeys[inifiles.Settings.Key1]) and (isTruckCar() or (isKeyDown(vkeys[inifiles.Settings.Key2] or pos[1] or pos[2] or pos[3]))) and not sampIsDialogActive() and not sampIsScoreboardOpen() then dialogActiveClock = os.time() sampSetCursorMode(3) local X, Y = getScreenResolution() if not control then ffi.C.SetCursorPos((X / 2), (Y / 2)) end control = true local plus = (renderGetFontDrawHeight(font) + (renderGetFontDrawHeight(font) / 10)) Y = ((Y / 2.2) - (renderGetFontDrawHeight(font) * 3)) for i = 1, 12 do local string_render = menu[i].run and menu[i][1] or menu[i][2] if i == 5 then local text = { "{d10000}OFF", "{06940f}Нефть", "{06940f}Уголь", "{06940f}Дерево", "{06940f}Все" } if text[inifiles.Settings.luCheckerCargo+1] ~= nil then string_render = string.format("%s%s", string_render, text[inifiles.Settings.luCheckerCargo+1]) end end if drawClickableText(string_render, ((X / 2) - (renderGetFontDrawTextLength(font, string_render) / 2)), Y) then if i == 1 then script_run = not script_run if script_run then delay.paycheck = 1 end menu[i].run = script_run end if i == 2 then auto = not auto menu[i].run = auto end if i == 3 then inifiles.Settings.Report = not inifiles.Settings.Report settings_save() menu[i].run = inifiles.Settings.Report end if i == 4 then if pair_mode then sampSetChatInputText("/sms " .. pair_mode_id .. " ") sampSetChatInputEnabled(true) else ShowDialog1(8) end end if i == 5 then inifiles.Settings.luCheckerCargo = inifiles.Settings.luCheckerCargo + 1 if inifiles.Settings.luCheckerCargo >= 5 then inifiles.Settings.luCheckerCargo = 0 end luChecker.load_position.x, luChecker.load_position.y, luChecker.load_position.z = 7777.0, 7777.0, 7777.0 settings_save() end if i == 6 then delay.dir = 1 end if i == 7 and script_run then lua_thread.create(showTruckers) end if i == 8 then ShowDialog1(1) end if i == 9 then sampSendChat("/truck mon") end if i == 10 then maxload() end if i == 11 then sampSendChat("/truck unload") end if i == 12 then sampSendChat("/truck trailer") end end if i == 4 and pair_mode and drawClickableText( "{e30202}х", ((X / 2) + (renderGetFontDrawTextLength(font, menu[4][1] .. " ") / 2)), Y ) then pair_mode = false menu[4].run = false end Y = Y + plus if i == 7 then Y = Y + plus end end else if control and not isKeyDown(vkeys[inifiles.Settings.Key1]) and not pos[1] and not pos[2] and not pos[3] then control = false sampSetCursorMode(0) end end end function doSendCMD() local ms = math.ceil(os.clock() * 1000 - antiflood) if ms >= 1150 then if delay.mon == 1 then sampSendChat("/truck mon") delay.mon = 2 end if delay.mon == 0 then if delay.chat == 1 then sampSendChat("/jf chat " .. report_text) delay.chat = 2 end if delay.chat == 0 then if delay.chatMon == 1 then sampSendChat("/jf chat " .. SendMonText) delay.chatMon = 2 end if delay.chatMon == 0 then if delay.sms == 1 then sampSendChat("/sms " .. pair_mode_id .. " " .. sms_pair_mode) delay.sms = 2 end if delay.sms == 0 then if delay.load == 1 then maxload() delay.load = 2 end if delay.load == 0 then if delay.unload == 1 then sampSendChat("/truck unload") delay.unload = 2 end if delay.unload == 0 then if delay.dir == 1 then sampSendChat("/dir") delay.dir = 2 end if delay.dir == 0 then if delay.skill == 1 then sampSendChat("/jskill") delay.skill = 2 end if delay.skill == 0 then if delay.paycheck == 1 then sampSendChat("/paycheck") delay.paycheck = 2 end end end end end end end end end end end function doDialog() local result, button, list, input = sampHasDialogRespond(222) local caption = sampGetDialogCaption() if caption:find('Truck%-HUD: Блокировка') then if result then doLocalBlock(button, list, input, caption) end end if string.find(caption, 'Truck%-HUD: Настройки') then if result and button == 1 then if dialogLine ~= nil and dialogLine[list + 1] ~= nil then local str = dialogLine[list + 1] if str:find("TruckHUD") then script_run = not script_run if script_run then delay.paycheck = 1 end menu[1].run = script_run ShowDialog1(1) end if str:find("Сменить позицию статистики с таймером") then wait(100) pos[1] = true end if str:find("Сменить позицию мониторинга цен") then wait(100) pos[2] = true end if str:find("Сменить позицию биндера") then wait(100) pos[3] = true end if str:find("Доклады по клику на цены") then inifiles.Settings.binder_sms_mode = not inifiles.Settings.binder_sms_mode settings_save() ShowDialog1(1) end if str:find("Редактировать формат статистики") then editbox_stats = true ShowDialog1(9) end if str:find("Cruise Control") then if str:find("Кнопка") then ShowDialog1(4, 4) else inifiles.Settings.Cruise = not inifiles.Settings.Cruise if inifiles.Settings.Cruise then sampAddChatMessage('Для активации когда едете нажмите '..inifiles.Settings.Key4:gsub('VK_', '')..'. Чтобы отключить нажмите W.', -1) end settings_save() ShowDialog1(1) end end if str:find("Информация о напарнике на HUD") then inifiles.Settings.pairinfo = not inifiles.Settings.pairinfo settings_save() ShowDialog1(9) end if str:find("Доклады в рацию") then inifiles.Settings.Report = not inifiles.Settings.Report menu[3].run = inifiles.Settings.Report settings_save() ShowDialog1(1) end if str:find("Доклады от") then inifiles.Settings.girl = not inifiles.Settings.girl settings_save() ShowDialog1(1) end if str:find("Авто загрузка/разгрузка") then auto = not auto menu[2].run = auto ShowDialog1(1) end if str:find("Учитывать КД напарника") then inifiles.Settings.auto_load_unload_kd_pair_use = not inifiles.Settings.auto_load_unload_kd_pair_use settings_save() ShowDialog1(1) end if str:find("Режим авто загрузки/разгрузки") then inifiles.Settings.AutoOFF = not inifiles.Settings.AutoOFF settings_save() ShowDialog1(1) end if str:find("Информация на фурах дальнобойщиков") then inifiles.Settings.TruckRender = not inifiles.Settings.TruckRender settings_save() ShowDialog1(1) end if str:find("Убрать тюнинг колес с фур") then inifiles.Settings.Tuning = not inifiles.Settings.Tuning settings_save() ShowDialog1(1) end if str:find("Биндер") then inifiles.Settings.Binder = not inifiles.Settings.Binder settings_save() ShowDialog1(1) end if str:find("Режим пары ") then if pair_mode then pair_mode = false menu[4].run = false ShowDialog1(9) else ShowDialog1(8) end end if str:find("Соло") then inifiles.Settings.luCheckerCargo = inifiles.Settings.luCheckerCargo + 1 if inifiles.Settings.luCheckerCargo >= 5 then inifiles.Settings.luCheckerCargo = 0 end luChecker.load_position.x, luChecker.load_position.y, luChecker.load_position.z = 7777.0, 7777.0, 7777.0 settings_save() ShowDialog1(1) end if str:find("Доклады в SMS") then inifiles.Settings.SMSpara = not inifiles.Settings.SMSpara settings_save() ShowDialog1(1) end if str:find("Подсветка напарника в чате") then inifiles.Settings.LightingPara = not inifiles.Settings.LightingPara settings_save() ShowDialog1(1) end if str:find("Остановка фуры после разгрузки") then inifiles.Settings.Stop = not inifiles.Settings.Stop settings_save() ShowDialog1(1) end if str:find("Синхронизация") then inifiles.Settings.transponder = not inifiles.Settings.transponder settings_save() ShowDialog1(1) end if str:find("Карта с позицией") then inifiles.Settings.fastmap = not inifiles.Settings.fastmap settings_save() ShowDialog1(1) end if str:find("Скрывать чат профсоюза") then inifiles.Settings.ChatOFF = not inifiles.Settings.ChatOFF settings_save() ShowDialog1(1) end if str:find("только в фуре") then inifiles.Settings.chat_in_truck = not inifiles.Settings.chat_in_truck settings_save() ShowDialog1(1) end if str:find("Отправка мониторинга в чат") then inifiles.Settings.ChatDoklad = not inifiles.Settings.ChatDoklad settings_save() ShowDialog1(1) end if str:find("Выделение Портов") then inifiles.Settings.highlight_jf = not inifiles.Settings.highlight_jf settings_save() ShowDialog1(1) end if str:find("Выделение цены") then inifiles.Settings.LightingPrice = not inifiles.Settings.LightingPrice settings_save() ShowDialog1(1) end if str:find("Цвет подсветки напарника") then if dialogTextToList[list + 1] ~= nil then ShowDialog1( 2, dialogTextToList[list + 1], inifiles.Settings.ColorPara, true, "Settings", "ColorPara" ) end end if str:find("Platinum VIP") then inifiles.platinum.status = not inifiles.platinum.status settings_save() ShowDialog1(1) end if str:find("Шрифт") then if dialogTextToList[list + 1] ~= nil then ShowDialog1(2, dialogTextToList[list + 1], inifiles.Render.FontName, true, "Render", "FontName") end end if str:find("Размер") then if dialogTextToList[list + 1] ~= nil then ShowDialog1( 2, dialogTextToList[list + 1], inifiles.Render.FontSize, false, "Render", "FontSize" ) end end if str:find("Стиль") then if dialogTextToList[list + 1] ~= nil then ShowDialog1( 2, dialogTextToList[list + 1], inifiles.Render.FontFlag, false, "Render", "FontFlag" ) end end if str:find("Цвет первый") then if dialogTextToList[list + 1] ~= nil then ShowDialog1(2, dialogTextToList[list + 1], inifiles.Render.Color1, true, "Render", "Color1") end end if str:find("Цвет второй") then if dialogTextToList[list + 1] ~= nil then ShowDialog1(2, dialogTextToList[list + 1], inifiles.Render.Color2, true, "Render", "Color2") end end if str:find("Цена авто%-загрузки") then if dialogTextToList[list + 1] ~= nil then ShowDialog1(2, dialogTextToList[list + 1], inifiles.Price.Load, false, "Price", "Load") end end if str:find("Цена авто%-разгрузки") then if dialogTextToList[list + 1] ~= nil then ShowDialog1(2, dialogTextToList[list + 1], inifiles.Price.UnLoad, false, "Price", "UnLoad") end end if str:find("Кнопка отображения меню") then ShowDialog1(4, 1) end if str:find("Задержка") then inifiles.Settings.AutoWait = not inifiles.Settings.AutoWait settings_save() ShowDialog1(1) end if str:find("Кнопка для работы без фуры") then ShowDialog1(4, 2) end if str:find("Кнопка для отображения карты") then ShowDialog1(4, 3) end if str:find("Локальная блокировка участников") then LocalBlock(1) end if str:find("Уведомления когда Вас установили напарником") then inifiles.Settings.NewPairMSG = not inifiles.Settings.NewPairMSG settings_save() ShowDialog1(1) end if str:find("Авто%-Очистка неиспользуемой памяти скрипта") then inifiles.Settings.AutoClear = not inifiles.Settings.AutoClear settings_save() ShowDialog1(1) end if str:find("Очистить неиспользуемую память скрипта") then local mem_do = string.format('%0.2f MB', (tonumber(gcinfo()) / 1000)) collectgarbage("step") sampAddChatMessage('Памяти очищена. Было: '..mem_do..'. Стало: '..string.format('%0.2f MB', (tonumber(gcinfo()) / 1000)), -1) ShowDialog1(1) end if str:find("Подробная статистика") then ShowStats(1) end if str:find("Контакты автора") then ShowDialog1(3) end if str:find("Перезагрузка скрипта") then thisScript():reload() end end end end if caption == "Truck-HUD: Изменение настроек" then if d[7] then d[7] = false sampSetCurrentDialogEditboxText(inifiles[d[5]][d[6]]) end if result then if button == 1 then local gou = (d[4] and (#input > 0 and true or false) or (input:find("%d+") and true or false)) if gou then d[3] = (d[4] and tostring(input) or tonumber(input)) inifiles[d[5]][d[6]] = d[3] settings_save() if d[5]:find("Render") then renderReleaseFont(font) font = renderCreateFont( inifiles.Render.FontName, inifiles.Render.FontSize, inifiles.Render.FontFlag ) end ShowDialog1(1) else ShowDialog1(d[1], d[2], d[3], d[4], d[5], d[6]) end else ShowDialog1(1) end end end if caption == "Truck-HUD: Редактор HUD" then if result then if button == 1 then local text = getClipboardText() if #text > 1 then inifiles.Settings.stats_text = text settings_save() else inifiles.Settings.stats_text = defaultMon settings_save() end end ShowDialog1(1) end end if caption == "Truck-HUD: Контакты автора" then if result then if button == 1 then if list == 0 then setClipboardText("Serhiy_Rubin") end if list == 1 then setClipboardText("https://vk.com/id353828351") end if list == 2 then setClipboardText("https://vk.com/club161589495") end if list == 3 then setClipboardText("serhiyrubin") end if list == 4 then setClipboardText("Serhiy_Rubin#3391") end ShowDialog1(3) else ShowDialog1(1) end end end if caption == 'Truck-HUD: Биндер' then if result then if button == 1 and #input > 0 then if d[2] == 1 then if not binder_mode_sms then inifiles.binder[#inifiles.binder + 1] = input else inifiles.binder_sms[#inifiles.binder_sms + 1] = input end settings_save() elseif d[2] == 2 then if not binder_mode_sms then inifiles.binder[d[3]] = input else inifiles.binder_sms[d[3]] = input end settings_save() end end end end if caption == "Truck-HUD: Статистика" then if result then WhileShowStats(button, list) end end if caption == "Truck-HUD: Режим пары" then if result then if button == 1 then if string.find(input, "(%d+)") then pair_mode_id = tonumber(string.match(input, "(%d+)")) if sampIsPlayerConnected(pair_mode_id) then error_message(1, '') para_message_send = nil pair_mode_name = sampGetPlayerNickname(pair_mode_id) menu[4][1] = "SMS » " .. pair_mode_name .. "[" .. pair_mode_id .. "]" pair_mode = true menu[4].run = true transponder_delay = 100 else pair_mode_id = -1 pair_mode = false menu[4].run = false sampAddChatMessage("Ошибка! Игрок под этим ID не в сети.", -1) end end else pair_mode = false menu[4].run = false end end end end function doPair() if pair_mode then if not sampIsPlayerConnected(pair_mode_id) or sampGetPlayerNickname(pair_mode_id) ~= pair_mode_name then pair_mode = false menu[4].run = false sampAddChatMessage( "Напарник " .. pair_mode_name .. "[" .. pair_mode_id .. "]" .. " вышел из игры. Режим пары выключен.", -1 ) if auto then auto = false menu[2].run = false sampAddChatMessage("Режим АВТО TruckHUD выключен!", -1) end end if pair_table["pos"] ~= nil then local x, y, z = getCharCoordinates(playerPed) local result_find = false for i = 1, #parking_pair do for k,v in pairs(parking_pair[i]) do local not_i = (k == 1 and 2 or 1) local pair_dist = getDistanceBetweenCoords3d(pair_table["pos"]["x"], pair_table["pos"]["y"], pair_table["pos"]["z"], parking_pair[i][not_i][1], parking_pair[i][not_i][2], parking_pair[i][not_i][3]) local player_dist = getDistanceBetweenCoords3d(x, y, z, v[1], v[2], v[3]) if player_dist <= v[4] then pair_ready = (pair_dist <= parking_pair[i][not_i][4] and true or false) player_ready = (player_dist <= v[4] and true or false) result_find = true break end end end if not result_find then pair_ready = false player_ready = false end else pair_ready = false player_ready = false end end end function doPickup() if script_run then for k, v in pairs(pickupLoad) do local X, Y, Z = getDeadCharCoordinates(PLAYER_PED) local distance = getDistanceBetweenCoords3d(X, Y, Z, v[1], v[2], v[3]) if inifiles.Settings.pickup and distance <= 15.0 and isTruckCar() then if v.pickup == nil then result, v.pickup = createPickup(19135, 1, v[1], v[2], v[3]) end else if v.pickup ~= nil then if doesPickupExist(v.pickup) then removePickup(v.pickup) v.pickup = nil end end end end else for k, v in pairs(pickupLoad) do if v.pickup ~= nil then if doesPickupExist(v.pickup) then removePickup(v.pickup) v.pickup = nil end end end end end function check_press_key(table) local result = false local result_key_text = "" for i = 1, #table do if isKeyDown(vkeys[table[i]]) then result = true result_key_text = table[i]:gsub("VK_", "") break end end return result, result_key_text end cruise = false function doCruise() while true do wait(0) if inifiles.Settings.Cruise and script_run then additional_key_stop = { "VK_W", "VK_S" } if not isCharInAnyCar(playerPed) or not isCarEngineOn(storeCarCharIsInNoSave(playerPed)) then if cruise then cruise = false printStringNow('~R~cruise control - OFF', 1500) end end if isCharInAnyCar(playerPed) and not sampIsChatInputActive() and not sampIsDialogActive() and not sampIsCursorActive() then if not cruise and isKeyDown(vkeys["VK_W"]) and isKeyDown(vkeys[inifiles.Settings.Key4]) then cruise = true printStringNow('~G~cruise control - ON', 1500) repeat wait(100) until not isKeyDown(vkeys["VK_W"]) elseif cruise and (isKeyDown(vkeys[inifiles.Settings.Key4]) or select(1, check_press_key(additional_key_stop))) then cruise = false printStringNow('~R~cruise control - OFF', 1500) end end if cruise then setGameKeyState(16, 255) end end end end function doRenderStats() if pos[1] then sampSetCursorMode(3) local X, Y = getCursorPos() inifiles.Settings.X1, inifiles.Settings.Y1 = X, Y + 15 if isKeyJustPressed(1) then settings_save() pos[1] = false sampSetCursorMode(0) end end if pair_timestamp ~= nil then local afk_wait = (live-pair_afk_stop.player_live > 3 and live-pair_afk_stop.player_live or (pair_timestamp-pair_afk_stop.pair_live > 3 and pair_timestamp-pair_afk_stop.pair_live or 0)) if afk_wait > 0 then pair_afk_stop.auto_stop = os.time() end pair_afk_stop.player_live = live pair_afk_stop.pair_live = pair_timestamp end local X, Y, c1, c2 = inifiles.Settings.X1, inifiles.Settings.Y1, inifiles.Render.Color1, inifiles.Render.Color2 local down = (renderGetFontDrawHeight(font) / 6) local height = (renderGetFontDrawHeight(font) - (renderGetFontDrawHeight(font) / 20)) if control then if drawClickableText("{" .. c2 .. "}[Смена позиции]", X, Y) then pos[1] = true end end Y = Y + height sec_timer = (inifiles.platinum.status and 120 or 180) timer_secc = sec_timer - os.difftime(msk_timestamp, timer) local ost_time = 3600 - (os.date("%M", msk_timestamp) * 60) + (os.date("%S", msk_timestamp)) local greys = 0 if workload == 1 then if timer_secc > 0 then if ost_time > timer_secc then ost_time = ost_time - timer_secc greys = 1 else greys = 0 end end end greys = greys + math.floor(ost_time / 360) if timer_secc >= (sec_timer - 3) and workload == 0 and isTruckCar() and inifiles.Settings.Stop then setGameKeyState(6, 255) end timer_min, timer_sec = math.floor(timer_secc / 60), timer_secc % 60 strok = (timer_secc >= 0 and (workload == 1 and string.format( "{%s}До разгрузки {%s}%d:%02d", inifiles.Render.Color1, (timer_secc <= 10 and "b50000" or inifiles.Render.Color2), timer_min, timer_sec ) or string.format( "{%s}До загрузки {%s}%d:%02d", inifiles.Render.Color1, (timer_secc <= 10 and "b50000" or inifiles.Render.Color2), timer_min, timer_sec )) or (workload == 1 and string.format("{%s}Можно разгружать", inifiles.Render.Color1) or string.format("{%s}Можно загружать", inifiles.Render.Color1))) if auto then if control then local delta = getMousewheelDelta() if delta ~= 0 then ChangeCena(delta) end end local autoColor = (autoh and inifiles.Render.Color2 or "d90b0b") str = (inifiles.Price[(workload == 1 and "UnLoad" or "Load")] ~= 0 and " {" .. autoColor .. "}[" .. (workload == 1 and "Un" or "") .. "Load: " .. inifiles.Price[(workload == 1 and "UnLoad" or "Load")] .. "] " or " {" .. autoColor .. "}[" .. (workload == 1 and "Un" or "") .. "Load] ") if os.difftime(msk_timestamp, timer) > 178 and isPairModeActive() and os.time() - pair_afk_stop.auto_stop <= 3 and (unload_location or load_location) then printStyledString("Wait afk " .. (3 - (os.time() - pair_afk_stop.auto_stop)), 1111, 5) end if os.difftime(msk_timestamp, timer) > sec_timer and autoh and (not isPairModeActive() or (isPairModeActive() and os.time() - pair_afk_stop.auto_stop >= 3)) and (not isPairModeActive() or (isPairModeActive() and (msk_timestamp - pair_timestamp) < 5)) and (not isPairModeActive() or (isPairModeActive() and (pair_ready and player_ready))) and not (isPairModeActive() and inifiles.Settings.auto_load_unload_kd_pair_use and base[pair_mode_name].gruz == current_load and os.difftime(msk_timestamp, base[pair_mode_name].timer) <= sec_timer) then if workload == 1 then if unload_location then local dp = {ls = "sf", sf = "ls"} -- определить порт local dport, ds = string.match(current_warehouse, "(..)(.)") -- место загрузки local dcena = (inifiles.tmonitor[dp[dport] .. ds] + inifiles.tmonitor[current_warehouse]) - prices_3dtext[current_warehouse] -- цена в другом порту f= цена груза в другом порту + цена в этом порту - цена на 3D тексте этом порту if inifiles.Price.UnLoad ~= 0 then if price_frozen then if tonumber(prices_3dtext[current_warehouse]) == tonumber(inifiles.Price.UnLoad) then autoh, delay.unload = (dcena ~= 900 and true or false), (dcena ~= 900 and 1 or delay.unload) end else if tonumber(prices_3dtext[current_warehouse]) >= tonumber(inifiles.Price.UnLoad) then autoh, delay.unload = (dcena ~= 900 and true or false), (dcena ~= 900 and 1 or delay.unload) end end else autoh, delay.unload = (dcena ~= 900 and true or false), (dcena ~= 900 and 1 or delay.unload) end end else if load_location then if inifiles.Price.Load ~= 0 then if (price_frozen and tonumber(prices_3dtext[current_warehouse]) == tonumber(inifiles.Price.Load)) or (not price_frozen and tonumber(prices_3dtext[current_warehouse]) <= tonumber(inifiles.Price.Load)) then if inifiles.Settings.AutoWait then if (msk_timestamp - wait_auto) <= 3 then printStyledString("Wait load " .. (3 - (msk_timestamp - wait_auto)), 1111, 5) end if (msk_timestamp - wait_auto) > 3 then delay.load, autoh = 1, false end else delay.load, autoh = 1, false end end else delay.load, autoh = 1, false end end end end if drawClickableText(str, (X + renderGetFontDrawTextLength(font, strok)), Y) then if autoh then if workload == 1 then inifiles.Price.UnLoad = 0 else inifiles.Price.Load = 0 end settings_save() else delay.load = 0 delay.unload = 0 autoh = true end end if price_frozen or control then if drawClickableText("=", (X + renderGetFontDrawTextLength(font, strok .. str)), Y) then price_frozen = not price_frozen end end if isKeyDown(vkeys[inifiles.Settings.Key1]) and (isTruckCar() or isKeyDown(90)) then if drawClickableText( "+", (X + renderGetFontDrawTextLength(font, strok) + (renderGetFontDrawTextLength(font, str) / 3)), (Y - height) ) then ChangeCena(1) end if drawClickableText( "-", (X + renderGetFontDrawTextLength(font, "+" .. strok) + (renderGetFontDrawTextLength(font, str) / 2)), (Y - height) ) then ChangeCena(0) end end end drawClickableText(strok, X, Y) local stats_array = split(inifiles.Settings.stats_text,'!n!') local stats_info = { ['!m!'] = string.format('%0.2f mb', (tonumber(gcinfo()) / 1000)), ['!skill!'] = inifiles.Trucker.Skill, ['!skill_poc!'] = inifiles.Trucker.ProcSkill, ['!skill_reys!'] = inifiles.Trucker.ReysSkill, ['!rang!'] = inifiles.Trucker.Rank, ['!rang_poc!'] = inifiles.Trucker.ProcRank, ['!rang_reys!'] = inifiles.Trucker.ReysRank, ['!zp_hour!'] = inifiles.log[os.date("%d.%m.%Y", msk_timestamp)].hour[os.date("%H", msk_timestamp)].zp, ['!max_zp!'] = inifiles.Trucker.MaxZP, ['!profit!'] = inifiles.log[os.date("%d.%m.%Y", msk_timestamp)].day.pribil, ['!reys_hour!'] = inifiles.log[os.date("%d.%m.%Y", msk_timestamp)].hour[os.date("%H", msk_timestamp)].razgruzkacount, ['!reys_day!'] = inifiles.log[os.date("%d.%m.%Y", msk_timestamp)].day.razgruzkacount, ['!left_reys!'] = greys, ['!profit_hour!'] = inifiles.log[os.date("%d.%m.%Y", msk_timestamp)].hour[os.date("%H", msk_timestamp)].pribil, ['!all_zp!'] = inifiles.log[os.date("%d.%m.%Y", msk_timestamp)].day.zp } for k, v in pairs(stats_array) do for i, s in pairs(stats_info) do if v:find(i) then v = v:gsub(i, s) end end if v:find('!mn!') then v = v:gsub('!mn!', '') Y = Y + down + height else Y = Y + height end drawClickableText(v, X, Y) end if inifiles.Settings.pairinfo and pair_mode and pair_status == 200 and pair_table ~= nil and pair_table["pos"] ~= nil and base[pair_mode_name] ~= nil then local afk = msk_timestamp - pair_timestamp local timer_d = sec_timer - (base[pair_mode_name].timer > 1000 and os.difftime(msk_timestamp, base[pair_mode_name].timer) or (sec_timer+1)) local color = ( not player_ready and "" or ( pair_ready and "{07a817}" or "{d90b0b}" )) string_render, Y = string.format(" {%s}%s%s[%s]%s", c2, color, pair_mode_name, pair_mode_id, (afk > 5 and ' [AFK: '..math.ceil(afk)..']' or '')), Y + height + down drawClickableText(string_render, X, Y) local para_pos = FindSklad(pair_table["pos"]["x"], pair_table["pos"]["y"], pair_table["pos"]["z"]) string_render, Y = string.format("{%s} [{%s}%s{%s}] %s (%s m)", c2, (timer_d < 11 and (timer_d > 0 and 'b50000' or c2) or c2), (timer_d > 0 and string.format('%d:%02d', math.floor(timer_d / 60), timer_d % 60) or '0:00'), c2, para_pos.text, math.ceil(para_pos.dist)), Y + height drawClickableText(string_render, X, Y) end if delay.skill == -1 then delay.skill = 1 end end function isPairModeActive() if pair_mode and pair_status == 200 and pair_table ~= nil and pair_table["pos"] ~= nil and base[pair_mode_name] ~= nil then return true end end function renderStringMON(X, Y, dist, text1, text2, sendtext1, sendtext2, dist2, text3, text4, sendtext3, sendtext4) if drawClickableText(text1, X, Y) then sampSendChat( string.format("%s %s м.", sendtext1, dist) ) end local x = (X + renderGetFontDrawTextLength(font, text1)) if drawClickableText(text2, x, Y) then sampSendChat( string.format("%s", sendtext2) ) end local x = x + renderGetFontDrawTextLength(font, text2) if drawClickableText(text3, x, Y) then sampSendChat( string.format("%s %s м.", sendtext3, dist2) ) end if drawClickableText(text4, x + renderGetFontDrawTextLength(font, text3), Y) then sampSendChat( string.format("%s", sendtext4) ) end end function doRenderMon() if pos[2] then sampSetCursorMode(3) local X, Y = getCursorPos() inifiles.Settings.X2, inifiles.Settings.Y2 = X, Y if isKeyJustPressed(1) then settings_save() pos[2] = false sampSetCursorMode(0) end end local X, Y, c1, c2 = inifiles.Settings.X2, inifiles.Settings.Y2, inifiles.Render.Color1, inifiles.Render.Color2 local height = renderGetFontDrawHeight(font) local A1 = os.difftime(msk_timestamp, mon_time) local A2 = os.difftime(msk_timestamp, mon_ctime) stimer = (A2 >= A1 and A1 or A2) local hour, minute, second = stimer / 3600, math.floor(stimer / 60), stimer % 60 send_time_mon = (hour >= 1 and string.format("%02d:%02d:%02d", math.floor(hour), minute - (math.floor(hour) * 60), second) or string.format("%02d:%02d", minute, second)) rdtext = string.format("Склады. %s", send_time_mon) if drawClickableText(rdtext, X, Y) then transponder_delay = 100 end local secund = os.difftime(msk_timestamp, mon_life) if secund == 3 or secund == 1 then c2 = "ff0000" end local pX, pY, pZ = getDeadCharCoordinates(PLAYER_PED) local replace_location = { ["Н1"] = { "Нефтезавод №1", "n1", "Нефть 1" }, ["Н2"] = { "Нефтезавод №2", "n2", "Нефть 2" }, ["У1"] = { "Склад Угля №1", "y1", "Уголь 1" }, ["У2"] = { "Склад Угля №2", "y2", "Уголь 2" }, ["Л1"] = { "Лесопилку №1", "l1", "Лес 1" }, ["Л2"] = { "Лесопилку №2", "l2", "Лес 2" } } local text_chat = "/jf chat " if inifiles.Settings.binder_sms_mode and binder_mode_sms then text_chat = "/sms "..pair_mode_id.." " end local text_render_mon = { "Н1", "Н2", "У1", "У2", "Л1", "Л2" } local newX = X Y = Y + height for i = 1, #text_render_mon do local pos = location_pos[replace_location[text_render_mon[i]][3]] local text_render_1 = string.format(" {%s}%s: ", c1, text_render_mon[i]) local text_render_2 = string.format("{%s}%03d", c2, prices_mon[replace_location[text_render_mon[i]][2]]) local text_send_1 = string.format("%sЕду на %s. До цели: %d м.", text_chat, replace_location[text_render_mon[i]][1], math.ceil(getDistanceBetweenCoords3d(pX, pY, pZ, pos.x, pos.y, pos.z)) ) local text_send_2 = string.format("%sКто едет на %s?", text_chat, replace_location[text_render_mon[i]][1]) if drawClickableText(text_render_1, newX, Y) then sampSendChat(text_send_1) end newX = newX + renderGetFontDrawTextLength(font, text_render_1) if drawClickableText(text_render_2, newX, Y) then sampSendChat(text_send_2) end newX = newX + renderGetFontDrawTextLength(font, text_render_2) if math.fmod(i, 2) == 0 then Y = Y + height newX = X end end if control and workload == 1 then if drawClickableText("?", X - renderGetFontDrawTextLength(font, " "), Y) then sampSendChat(text_chat .. what_is_uploaded[current_load] .. " в ЛС едет?") end end local string = string.format("{%s}Порт ЛС.\n Н: {%s}%03d {%s}У: {%s}%03d {%s}Л: {%s}%03d", c1, c2, prices_mon.lsn, c1, c2, prices_mon.lsy, c1, c2, prices_mon.lsl) if drawClickableText(string, X, Y) then local dist = getDistanceBetweenCoords3d(pX, pY, pZ, location_pos["Порт ЛС"].x, location_pos["Порт ЛС"].y, location_pos["Порт ЛС"].z) if workload ~= 0 then local text = string.format("%sВезу %s в Порт ЛС. До цели: %0.2d м.", text_chat, what_is_uploaded[current_load], dist) sampSendChat(text) else local text = string.format("%sЕду в Порт ЛС. До цели: %0.2d м.", text_chat, dist) sampSendChat(text) end end Y = Y + (height * 2) if control and workload == 1 then if drawClickableText("?", X - renderGetFontDrawTextLength(font, " "), Y) then sampSendChat("/jf chat " .. what_is_uploaded[current_load] .. " в СФ едет?") end end local string = string.format("{%s}Порт СФ.\n Н: {%s}%03d {%s}У: {%s}%03d {%s}Л: {%s}%03d", c1, c2, prices_mon.sfn, c1, c2, prices_mon.sfy, c1, c2, prices_mon.sfl) if drawClickableText(string, X, Y) then local dist = getDistanceBetweenCoords3d(pX, pY, pZ, location_pos["Порт СФ"].x, location_pos["Порт СФ"].y, location_pos["Порт СФ"].z) if workload ~= 0 then local text = string.format("%sВезу %s в Порт СФ. До цели: %0.2d м.", text_chat, what_is_uploaded[current_load], dist) sampSendChat(text) else local text = string.format("%sЕду в Порт СФ. До цели: %0.2d м.", text_chat, dist) sampSendChat(text) end end if control then Y = Y + (height * 2) if drawClickableText("{" .. inifiles.Render.Color2 .. "}[Смена позиции]", X, Y) then pos[2] = true end Y = Y + height if drawClickableText("{" .. inifiles.Render.Color2 .. "}[Отправить в чат]", X, Y) then if (unload_location or load_location) then delay.mon = 1 delay.chatMon = -1 else SendMonText = string.format("/jf chat [ЛС H:%d У:%d Л:%d] [1 H:%d У:%d Л:%d] [2 H:%d У:%d Л:%d] [CФ H:%d У:%d Л:%d] [%s]", (prices_mon.lsn / 100), (prices_mon.lsy / 100), (prices_mon.lsl / 100), (prices_mon.n1 / 100), (prices_mon.y1 / 100), (prices_mon.l1 / 100), (prices_mon.n2 / 100), (prices_mon.y2 / 100), (prices_mon.l2 / 100), (prices_mon.sfn / 100), (prices_mon.sfy / 100), (prices_mon.sfl / 100), send_time_mon) sampSendChat(SendMonText) end end end end function doRenderBind() if pos[3] then sampSetCursorMode(3) local X, Y = getCursorPos() inifiles.Settings.X3, inifiles.Settings.Y3 = X, Y + 15 if isKeyJustPressed(1) then settings_save() pos[3] = false sampSetCursorMode(0) end end if script_run and inifiles.Settings.Binder and control or pos[3] then local X, Y = inifiles.Settings.X3, inifiles.Settings.Y3 local plus = (renderGetFontDrawHeight(font) + (renderGetFontDrawHeight(font) / 10)) if drawClickableText("{" .. inifiles.Render.Color2 .. "}[Смена позиции]", X, Y) then pos[3] = true end if pair_mode then local color = (binder_mode_sms and "{06940f}" or "{d10000}") if drawClickableText(color.."[SMS]", X + renderGetFontDrawTextLength(font,"[Смена позиции] "), Y) then binder_mode_sms = not binder_mode_sms end end local array = (binder_mode_sms and inifiles.binder_sms or inifiles.binder) for k, string in pairs(array) do old_string = string if string.find(string, "!НикПары") then local nick = " " if sampIsPlayerConnected(pair_mode_id) then nick = sampGetPlayerNickname(pair_mode_id):gsub("_", " ") end string = string:gsub("!НикПары", nick) end if string.find(string, "!ИдПары") then string = string:gsub("!ИдПары", pair_mode_id) end if string.find(string, "!КД") then local min, sec = timer_min, timer_sec if min < 0 then min, sec = 0, 0 end string = string:gsub("!КД", string.format("%d:%02d", min, sec)) end if string.find(string, "!Груз") then string = string:gsub("!Груз", what_is_uploaded[current_load]) end if string.find(string, "!Место") then local x, y, z = getCharCoordinates(playerPed) local pos = FindSklad(x, y, z) string = string:gsub("!Место", string.format("%s (%s m)", pos.text, math.ceil(pos.dist))) end Y = Y + plus if drawClickableText(string, X, Y) then sampSendChat(string) end if drawClickableText("{ff0000}х", (X + renderGetFontDrawTextLength(font, string .. " ")), Y) then if not binder_mode_sms then table.remove(inifiles.binder, k) else table.remove(inifiles.binder_sms, k) end settings_save() end if drawClickableText("{12a61a}/", (X + renderGetFontDrawTextLength(font, string .. " ")), Y) then binder_read = old_string ShowDialog1(7, 2, k) end end Y = Y + plus if drawClickableText("{12a61a}Добавить строку", X, Y) then ShowDialog1(7, 1) end end end function doLocalBlock(button, list, input, caption) if caption:find('1') then if button == 1 then if list == 0 then LocalBlock(2) elseif list == 1 then LocalBlock(3) elseif list == 2 then inifiles.Settings.blacklist_inversion = not inifiles.Settings.blacklist_inversion settings_save() LocalBlock(1) end else ShowDialog1(1) end end if caption:find('2') then if button == 1 then if dialogFunc[list + 1] ~= nil then dialogFunc[list + 1]() end LocalBlock(2) else LocalBlock(1) end end if caption:find('3') then if button == 1 then if dialogFunc[list + 1] ~= nil then dialogFunc[list + 1]() end LocalBlock(3) else LocalBlock(1) end end end function LocalBlock(int, param) if int == 1 then dialogText = 'Блокировка мониторинга от пользователей\nБлокировка мониторинга с хостинга\nБлокировка мониторинга из чата\nРежим: '..(inifiles.Settings.blacklist_inversion and 'Как белый список' or 'Как черный список') sampShowDialog(222, 'Truck-HUD: Блокировка [1]', dialogText, 'Выбрать', 'Закрыть', 5) end if int == 2 then dialogFunc = {} dialogText = '' -- fa3620 for k, v in pairs(base) do if v.tmonitor ~= nil and v.tmonitor.lsn ~= nil then local color = ( inifiles.blacklist[k] == nil and 'FFFFFF' or ( inifiles.blacklist[k] == true and 'fa3620' or 'FFFFFF')) dialogText = string.format('%s{%s}Игрок: %s\tВремя мониторинга: %s\n', dialogText, color, k, (msk_timestamp - v.tmonitor.time)) dialogFunc[#dialogFunc + 1] = function() if inifiles.blacklist[k] == nil then inifiles.blacklist[k] = false end inifiles.blacklist[k] = not inifiles.blacklist[k] end dialogText = string.format('%s{%s}[ЛС Н:%s У:%s Л:%s] [1 Н:%s У:%s Л:%s] [2 Н:%s У:%s Л:%s] [CФ Н:%s У:%s Л:%s\n', dialogText, color, v.tmonitor.lsn, v.tmonitor.lsy,v.tmonitor.lsl,v.tmonitor.n1,v.tmonitor.y1,v.tmonitor.l1,v.tmonitor.n2,v.tmonitor.y2, v.tmonitor.l2, v.tmonitor.sfn,v.tmonitor.sfy,v.tmonitor.sfl) dialogFunc[#dialogFunc + 1] = dialogFunc[#dialogFunc] dialogText = string.format('%s \n', dialogText) dialogFunc[#dialogFunc + 1] = dialogFunc[#dialogFunc] end end settings_save() sampShowDialog(222, 'Truck-HUD: Блокировка [2]', dialogText, 'Выбрать', 'Назад', 2) end if int == 3 then dialogFunc = {} dialogText = '' -- fa3620 for k, v in pairs(chat_mon) do if v ~= nil and v.lsn ~= nil then local color = ( inifiles.blacklist[k] == nil and 'FFFFFF' or ( inifiles.blacklist[k] == true and 'fa3620' or 'FFFFFF')) dialogText = string.format('%s{%s}Игрок: %s\tВремя мониторинга: %s\n', dialogText, color, k, (msk_timestamp - v.time)) dialogFunc[#dialogFunc + 1] = function() if inifiles.blacklist[k] == nil then inifiles.blacklist[k] = false end inifiles.blacklist[k] = not inifiles.blacklist[k] end dialogText = string.format('%s{%s}[ЛС Н:%s У:%s Л:%s] [1 Н:%s У:%s Л:%s] [2 Н:%s У:%s Л:%s] [CФ Н:%s У:%s Л:%s\n', dialogText, color, v.lsn, v.lsy,v.lsl,v.n1,v.y1,v.l1,v.n2,v.y2, v.l2, v.sfn,v.sfy,v.sfl) dialogFunc[#dialogFunc + 1] = dialogFunc[#dialogFunc] dialogText = string.format('%s \n', dialogText) dialogFunc[#dialogFunc + 1] = dialogFunc[#dialogFunc] end end settings_save() sampShowDialog(222, 'Truck-HUD: Блокировка [3]', dialogText, 'Выбрать', 'Назад', 2) end end function ShowStats(int, param) dialogINT = int if int == 1 then dialogKeytoList = { '1' } dialogText = 'Статистика за всё время\n' local array = {} for k,v in pairs(inifiles.log) do local day, month, year = string.match(k, '(%d+)%.(%d+)%.%d%d(%d+)') local keydate = tonumber( string.format('%02d%02d%02d', year, month, day) ) array[keydate] = k end for i = tonumber(os.date('%y%m%d', msk_timestamp)), 1, -1 do if array[i] ~= nil then dialogText = string.format('%s%s\n', dialogText, array[i]) dialogKeytoList[#dialogKeytoList + 1] = array[i] end end dialogKeytoList[#dialogKeytoList + 1] = 'nil' dialogKeytoList[#dialogKeytoList + 1] = 'del' dialogText = string.format('%s\n \nУдалить всю статистику', dialogText) sampShowDialog(222, 'Truck-HUD: Статистика', dialogText, 'Выбрать', 'Назад', 2) end if int == 2 then dialogKeytoList = { param[1], param[1], param[1] } dialogText = 'Дата: '..param[1]..'\nСтатистика\nУдалить статистику' sampShowDialog(222, 'Truck-HUD: Статистика', dialogText, 'Выбрать', 'Назад', 5) end if int == 3 then dialogKeytoList = {} dialogText = '' local v = inifiles.log[param[1]][param[2]] if param[2] == 'day' then dialogKeytoList[1] = param[1] dialogText = string.format('Дата: %s{FFFFFF}\nПодсчет:\n %d фур на сумму %d вирт\n %d загрузок на сумму %d вирт\n %d разгрузок на сумму %d вирт\n %d заправок на сумму %d вирт\n %d починок на сумму %d вирт\n %d канистр на сумму %d вирт\n %d штрафов на сумму %d вирт\nИтоги:\n Зарплата: %d вирт\n Затраты: %d вирт\n Прибыль: %d вирт', param[1], v.arendacount, v.arenda, v.zagruzkacount, v.zagruzka, v.razgruzkacount, v.razgruzka, v.refillcount, v.refill, v.repaircount, v.repair, v.kanistrcount, v.kanistr, v.shtrafcount, v.shtraf, v.zp, (v.arenda + v.refill + v.repair + v.kanistr + v.shtraf), v.pribil) dialogText = string.format('%s\n \n Лог действий:\n', dialogText, v) for k, v in pairs(inifiles.log[param[1]].event) do dialogText = string.format('%s%s\n', dialogText, v) end sampShowDialog(222, 'Truck-HUD: Статистика', dialogText, 'Выбрать', 'Назад', 5) else local dd = {} local list = 0 for k,v in pairs(v) do dd[tonumber(k) + 1] = string.format('%s%02d:00\n', dialogText, tonumber(k) ) list = list + 1 end for i = 1, 25 do if dd[i] ~= nil then dialogText = dd[i]..dialogText dialogKeytoList[list] = { param[1], param[2], string.format('%02d', i - 1) } list = list -1 end end sampShowDialog(222, 'Truck-HUD: Статистика', dialogText, 'Выбрать', 'Назад', 2) end end if int == 4 then dialogKeytoList = {} dialogText = '' local v = inifiles.log[param[1]][param[2]][param[3]] dialogKeytoList[1] = { param[1], param[2] } dialogText = string.format('{FFFFFF}%02d:00 | %s\n\nПодсчет:\n %d фур на сумму %d вирт\n %d загрузок на сумму %d вирт\n %d разгрузок на сумму %d вирт\n %d заправок на сумму %d вирт\n %d починок на сумму %d вирт\n %d канистр на сумму %d вирт\n %d штрафов на сумму %d вирт\nИтоги:\n Зарплата: %d вирт\n Затраты: %d вирт\n Прибыль: %d вирт', tonumber(param[3]), param[1], v.arendacount, v.arenda, v.zagruzkacount, v.zagruzka, v.razgruzkacount, v.razgruzka, v.refillcount, v.refill, v.repaircount, v.repair, v.kanistrcount, v.kanistr, v.shtrafcount, v.shtraf, v.zp, (v.arenda + v.refill + v.repair + v.kanistr + v.shtraf), v.pribil) sampShowDialog(222, 'Truck-HUD: Статистика', dialogText, 'Выбрать', 'Назад', 5) end if int == 5 then local all = { arenda = 0, arendacount = 0, zagruzka = 0, zagruzkacount = 0, razgruzka = 0, razgruzkacount = 0, pribil = 0, shtraf = 0, shtrafcount = 0, repair = 0, repaircount = 0, refill = 0, refillcount = 0, reys = 0, kanistr = 0, kanistrcount = 0, zp = 0 } local day = 0 for k,v in pairs(inifiles.log) do day = day + 1 for i,s in pairs(v.day) do all[i] = all[i] + s end end dialogText = string.format('Статистика за %d суток{FFFFFF}\nПодсчет:\n %d фур на сумму %d вирт\n %d загрузок на сумму %d вирт\n %d разгрузок на сумму %d вирт\n %d заправок на сумму %d вирт\n %d починок на сумму %d вирт\n %d канистр на сумму %d вирт\n %d штрафов на сумму %d вирт\nИтоги:\n Зарплата: %d вирт\n Затраты: %d вирт\n Прибыль: %d вирт', day, all.arendacount, all.arenda, all.zagruzkacount, all.zagruzka, all.razgruzkacount, all.razgruzka, all.refillcount, all.refill, all.repaircount, all.repair, all.kanistrcount, all.kanistr, all.shtrafcount, all.shtraf, all.zp, (all.arenda + all.refill + all.repair + all.kanistr + all.shtraf), all.pribil) sampShowDialog(222, 'Truck-HUD: Статистика', dialogText, 'Выбрать', 'Назад', 5) end end function WhileShowStats(button, list) if dialogINT == 1 then if button == 1 and dialogKeytoList[list + 1] ~= nil then if list == 0 then ShowStats(5) else if dialogKeytoList[list + 1] == 'nil' then ShowStats(1) elseif dialogKeytoList[list + 1] == 'del' then inifiles.log = {} logAvailable() settings_save() ShowStats(1) else ShowStats(2, { dialogKeytoList[list + 1] }) end end else ShowDialog1(1) end return end if dialogINT == 2 then if button == 1 and dialogKeytoList[list + 1] ~= nil then if list == 1 then inifiles.log[dialogKeytoList[list + 1]] = nil logAvailable() settings_save() ShowStats(1) else ShowStats(3, { dialogKeytoList[list + 1], 'day'}) end else ShowStats(1) end return end if dialogINT == 3 then if type(dialogKeytoList[1]) == 'table' then if button == 1 then ShowStats(4, { dialogKeytoList[list + 1][1], dialogKeytoList[list + 1][2], dialogKeytoList[list + 1][3] }) else ShowStats(2, { dialogKeytoList[list + 1][1] }) end else if button == 1 then ShowStats(2, { dialogKeytoList[1] }) else ShowStats(2, { dialogKeytoList[1] }) end end return end if dialogINT == 4 then if button == 1 then ShowStats(3, dialogKeytoList[1]) else ShowStats(3, dialogKeytoList[1]) end return end if dialogINT == 5 then ShowStats(1) end end function ShowDialog1(int, dtext, dinput, string_or_number, ini1, ini2) d[1], d[2], d[3], d[4], d[5], d[6] = int, dtext, dinput, string_or_number, ini1, ini2 if int == 1 then local new = "{59fc30}[NEW]{ffffff} " dialogLine, dialogTextToList, iniName = {}, {}, {} dialogLine[#dialogLine + 1] = (script_run and "TruckHUD\t{59fc30}ON" or "TruckHUD\t{ff0000}OFF") if script_run then dialogLine[#dialogLine + 1] = "Сменить позицию статистики с таймером\t" dialogLine[#dialogLine + 1] = "Сменить позицию мониторинга цен\t" if inifiles.Settings.Binder then dialogLine[#dialogLine + 1] = "Сменить позицию биндера\t" end end dialogLine[#dialogLine + 1] = "Редактировать формат статистики\t" dialogLine[#dialogLine + 1] = "Cruise Control\t" .. (inifiles.Settings.Cruise == true and "{59fc30}ON" or "{ff0000}OFF") dialogLine[#dialogLine + 1] = "Информация о напарнике на HUD\t" .. (inifiles.Settings.pairinfo == true and "{59fc30}ON" or "{ff0000}OFF") dialogLine[#dialogLine + 1] = "Биндер\t" .. (inifiles.Settings.Binder == true and "{59fc30}ON" or "{ff0000}OFF") dialogLine[#dialogLine + 1] = "Доклады по клику на цены > в СМС напарнику\t" .. (inifiles.Settings.binder_sms_mode == true and "{59fc30}ON" or "{ff0000}OFF") dialogLine[#dialogLine + 1] = "Авто загрузка/разгрузка\t" .. (auto and "{59fc30}ON" or "{ff0000}OFF") dialogLine[#dialogLine + 1] = "Режим авто загрузки/разгрузки\t" .. (inifiles.Settings.AutoOFF == true and "{59fc30}Разовая" or "{59fc30}Постоянная") dialogLine[#dialogLine + 1] = "Учитывать КД напарника в режиме авто загрузка/разгрузка\t" .. (inifiles.Settings.auto_load_unload_kd_pair_use == true and "{59fc30}ON" or "{ff0000}OFF") dialogLine[#dialogLine + 1] = "Задержка перед авто-загрузкой\t" .. (inifiles.Settings.AutoWait == true and "{59fc30}ON" or "{ff0000}OFF") dialogLine[#dialogLine + 1] = "Остановка фуры после разгрузки\t" .. (inifiles.Settings.Stop == true and "{59fc30}ON" or "{ff0000}OFF") dialogLine[#dialogLine + 1] = "Авто Доклады в рацию\t" .. (inifiles.Settings.Report == true and "{59fc30}ON" or "{ff0000}OFF") dialogLine[#dialogLine + 1] = "Доклады от?\t" .. (inifiles.Settings.girl == true and "{59fc30}Женщины" or "{59fc30}Мужчины") dialogLine[#dialogLine + 1] = "Авто Отправка мониторинга в чат\t" .. (inifiles.Settings.ChatDoklad and "{59fc30}ON" or "{ff0000}OFF") dialogLine[#dialogLine + 1] = (pair_mode and "Режим пары\t{59fc30}" .. pair_mode_name .. "[" .. pair_mode_id .. "]" or "Режим пары\t{ff0000}OFF") local text = { "{ff0000}OFF", "{59fc30}Нефть", "{59fc30}Уголь", "{59fc30}Дерево", "{59fc30}Все" } if text[inifiles.Settings.luCheckerCargo+1] ~= nil then dialogLine[#dialogLine + 1] = "Соло-чекер\t" .. (text[inifiles.Settings.luCheckerCargo+1]) end dialogLine[#dialogLine + 1] = "Авто Доклады в SMS (режим пары)\t" .. (inifiles.Settings.SMSpara == true and "{59fc30}ON" or "{ff0000}OFF") dialogLine[#dialogLine + 1] = "Подсветка напарника в чате (режим пары)\t" .. (inifiles.Settings.LightingPara == true and "{59fc30}ON" or "{ff0000}OFF") dialogLine[#dialogLine + 1] = "Выделение Портов/Складов/Цен в докладах\t" .. (inifiles.Settings.highlight_jf == true and "{59fc30}ON" or "{ff0000}OFF") dialogLine[#dialogLine + 1] = "Выделение цены текущего груза в порту\t" .. (inifiles.Settings.LightingPrice == true and "{59fc30}ON" or "{ff0000}OFF") dialogLine[#dialogLine + 1] = "Скрывать чат профсоюза\t" .. (inifiles.Settings.ChatOFF == true and "{59fc30}ON" or "{ff0000}OFF") if inifiles.Settings.ChatOFF == false then dialogLine[#dialogLine + 1] = "Чат профсоюза только в фуре\t" .. (inifiles.Settings.chat_in_truck == true and "{59fc30}ON" or "{ff0000}OFF") end dialogLine[#dialogLine + 1] = "Информация на фурах дальнобойщиков\t" .. (inifiles.Settings.TruckRender == true and "{59fc30}ON" or "{ff0000}OFF") dialogLine[#dialogLine + 1] = "Убрать тюнинг колес с фур\t" .. (inifiles.Settings.Tuning == false and "{59fc30}ON" or "{ff0000}OFF") dialogLine[#dialogLine + 1] = "Синхронизация с другими пользователями\t" .. (inifiles.Settings.transponder == true and "{59fc30}ON" or "{ff0000}OFF") if inifiles.Settings.transponder then dialogLine[#dialogLine + 1] = "Карта с позицией напарника\t".. (inifiles.Settings.fastmap == true and "{59fc30}ON" or "{ff0000}OFF") end dialogLine[#dialogLine + 1] = "Цвет подсветки напарника\t{" .. inifiles.Settings.ColorPara .. "}" .. inifiles.Settings.ColorPara -- 6 dialogTextToList[#dialogLine] = "{FFFFFF}Введите новый цвет в HEX\nПодобрать цвет можно через браузер\nЧтобы скопировать ссылку введите /truck url" dialogLine[#dialogLine + 1] = new.."Platinum VIP (2 мин кд)\t" .. (inifiles.platinum.status == true and "{59fc30}ON" or "{ff0000}OFF") dialogLine[#dialogLine + 1] = "Шрифт\t" .. inifiles.Render.FontName -- 7 dialogTextToList[#dialogLine] = "{FFFFFF}Введите название шрифта" dialogLine[#dialogLine + 1] = "Размер\t" .. inifiles.Render.FontSize -- 8 dialogTextToList[#dialogLine] = "{FFFFFF}Введите размер шрифта" dialogLine[#dialogLine + 1] = "Стиль\t" .. inifiles.Render.FontFlag -- 9 dialogTextToList[#dialogLine] = "{FFFFFF}Устанавливайте стиль путем сложения.\n\nТекст без особенностей = 0\nЖирный текст = 1\nНаклонность(Курсив) = 2\nОбводка текста = 4\nТень текста = 8\nПодчеркнутый текст = 16\nЗачеркнутый текст = 32\n\nСтандарт: 13" dialogLine[#dialogLine + 1] = "Цвет первый\t{" .. inifiles.Render.Color1 .. "}" .. inifiles.Render.Color1 -- 10 dialogTextToList[#dialogLine] = "{FFFFFF}Введите новый цвет в HEX\nПодобрать цвет можно через браузер\nЧтобы скопировать ссылку введите /truck url" dialogLine[#dialogLine + 1] = "Цвет второй\t{" .. inifiles.Render.Color2 .. "}" .. inifiles.Render.Color2 -- 11 dialogTextToList[#dialogLine] = "{FFFFFF}Введите новый цвет в HEX\nПодобрать цвет можно через браузер\nЧтобы скопировать ссылку введите /truck url" dialogLine[#dialogLine + 1] = "Цена авто-загрузки\t" .. inifiles.Price.Load -- 12 dialogTextToList[#dialogLine] = "{FFFFFF}Введите цену Авто-Загрузки" dialogLine[#dialogLine + 1] = "Цена авто-разгрузки\t" .. inifiles.Price.UnLoad -- 13 dialogTextToList[#dialogLine] = "{FFFFFF}Введите цену Авто-Разгрузки" dialogLine[#dialogLine + 1] = "Кнопка отображения меню\t" .. inifiles.Settings.Key1:gsub("VK_", "") -- 14 dialogLine[#dialogLine + 1] = "Кнопка для работы без фуры\t" .. inifiles.Settings.Key2:gsub("VK_", "") -- 15 dialogLine[#dialogLine + 1] = "Кнопка для отображения карты\t" .. inifiles.Settings.Key3:gsub("VK_", "") -- 16 dialogLine[#dialogLine + 1] = "Кнопка для Cruise Control\t" .. inifiles.Settings.Key4:gsub("VK_", "") -- 16 dialogLine[#dialogLine + 1] = "Локальная блокировка участников" dialogLine[#dialogLine + 1] = "Уведомления когда Вас установили напарником\t" .. (inifiles.Settings.NewPairMSG == true and "{59fc30}ON" or "{ff0000}OFF") dialogLine[#dialogLine + 1] = "Авто-Очистка неиспользуемой памяти скрипта\t" .. (inifiles.Settings.AutoClear == true and "{59fc30}ON" or "{ff0000}OFF") dialogLine[#dialogLine + 1] = "Очистить неиспользуемую память скрипта\t" .. string.format('%0.2f MB', (tonumber(gcinfo()) / 1000)) dialogLine[#dialogLine + 1] = "Подробная статистика" dialogLine[#dialogLine + 1] = "Контакты автора" dialogLine[#dialogLine + 1] = "Перезагрузка скрипта" local text, list = "", 0 for k, v in pairs(dialogLine) do text = text .. "[" .. list .. "] " .. v .. "\n" list = list + 1 end sampShowDialog(222, "Truck-HUD: Настройки", text, "Выбрать", "Закрыть", 4) end if int == 2 then d[7] = true sampShowDialog(222, "Truck-HUD: Изменение настроек", dtext, "Выбрать", "Назад", 1) end if int == 3 then sampShowDialog( 222, "Truck-HUD: Контакты автора", "{FFFFFF}Выбери что скопировать\t\nНик на Samp-Rp\tSerhiy_Rubin\nСтраничка {4c75a3}VK{FFFFFF}\tvk.com/id353828351\nГруппа {4c75a3}VK{FFFFFF} с модами\tvk.com/club161589495\n{10bef2}Skype{FFFFFF}\tserhiyrubin\n{7289da}Discord{FFFFFF}\tSerhiy_Rubin#3391\nПромокод\t#rubin", "Копировать", "Назад", 5 ) end if int == 4 then lua_thread.create( function() wait(100) local key = "" repeat wait(0) if not sampIsDialogActive() then sampShowDialog( 222, "LUA Truck-HUD: Смена активации", "Нажмите на любую клавишу", "Выбрать", "Закрыть", 0 ) end for k, v in pairs(vkeys) do if wasKeyPressed(v) and k ~= "VK_ESCAPE" and k ~= "VK_RETURN" then key = k end end until key ~= "" local ini__name = string.format("Key%d", dtext) inifiles.Settings[ini__name] = key settings_save() ShowDialog1(1) end ) end if int == 7 then sampShowDialog( 222, "Truck-HUD: Биндер", "{FFFFFF}Поддерживает замены\n!НикПары - Заменится ником напарника\n!ИдПары - Заменится на ID напарника\n!КД - Заменится на время до загрузки/разгрузки\n!Груз - Заменится на [Без груза/Нефть/Уголь/Дерево]\n!Место - Заменится на склад/порт который ближе", "Сохранить", "Закрыть", 1 ) if binder_read ~= nil then repeat wait(0) until sampIsDialogActive() sampSetCurrentDialogEditboxText(binder_read) binder_read = nil end if dtext == 2 then d[7] = true end end if int == 8 then sampShowDialog( 222, "Truck-HUD: Режим пары", "\t{FFFFFF}Введите ID напарника\nЕму будут отсылаться SMS сообщения о ваших загрузках/разгрузках", "Выбрать", "Закрыть", 1 ) end if int == 9 then setClipboardText(inifiles.Settings.stats_text..'\n\n!n! - Для новой строки\n!mn! - Используется для двойного отступа, после !n!\n!skill! - Скилл\n!skill_poc! - Проценты скилла\n!skill_reys! - Остаток рейсов до нового скилла\n!rang! - Ранг\n!rang_poc! - Проценты ранга\n!rang_reys! - Остаток рейсов для нового ранга\n!reys_hour! - Рейсов в этом часу\n!reys_day! - Рейсов за сутки\n!zp_hour! - Зарплата в этом часу\n!all_zp! - Зарплата за сутки\n!profit_hour! - Прибыль в этом часу\n!profit! - Прибыль за сутки') sampShowDialog( 222, "Truck-HUD: Редактор HUD", [[{ffffff}Замены для составления HUD статистики {ff0000}ТЕКУЩИЙ ТЕКСТ HUD ПОМЕЩЕН В ВАШ БУФЕР ОБМЕНА СВЕРНИТЕ ИГРУ {ff0000}ОТКРОЙТЕ БЛОКНОТ В WINDOWS И ВСТАВЬТЕ ТУДА ТЕКСТ CTRL + V {ff0000}ПОСЛЕ ВНЕСЕНИЯ ИЗМЕНЕНИЙ СКОПИРУЙТЕ КОД СТАТИСТИКИ РАЗВЕРНИТЕ ИГРУ И НАЖМИТЕ CОХРАНИТЬ В ДИАЛОГЕ {FFFFFF} ЧТОБЫ ВЕРНУТЬ ВСЕ ПО УМОЛЧАНИЮ СКОПИРУЙТЕ ЦИФРУ 0 И НАЖМИТЕ CОХРАНИТЬ ЕСЛИ КОПИРУЮТСЯ ИЕРОГЛИФЫ ВМЕСТО РУССКИХ БУКВ - ПОВТОРИТЕ ВСЕ ТОЖЕ САМОЕ С РУССКОЙ РАКЛАДКОЙ !n! - Для новой строки !mn! - Используется для двойного отступа, после !n! !skill! - Скилл !skill_poc! - Проценты скилла !skill_reys! - Остаток рейсов до нового скилла !rang! - Ранг !rang_poc! - Проценты ранга !rang_reys! - Остаток рейсов для нового ранга !reys_hour! - Рейсов в этом часу !reys_day! - Рейсов за сутки !zp_hour! - Зарплата в этом часу !all_zp! - Зарплата за сутки !zatrat_hour! - Затраты в этом часу !zatrat_day! - Затраты за сутки !profit_hour! - Прибыль в этом часу !profit! - Прибыль за сутки]], "Сохранить", "Назад", 0 ) end end function FindSklad(x, y, z) local minDist, minResult = 1000000, "" for name, cord in pairs(location_pos) do local distance = getDistanceBetweenCoords3d(x, y, z, cord.x, cord.y, cord.z) if distance < minDist then minDist = distance minResult = name end end return { text = minResult, dist = minDist } end function loadEvents() time_send_trailer_sync = 0 function sampev.onSendVehicleSync() time_send_trailer_sync = os.time() end function sampev.onSendTrailerSync() if os.time() - time_send_trailer_sync >= 2 then local data = samp_create_sync_data("vehicle") data.send() end end function sampev.onVehicleSync(playerId, vehicleId, data) luChecker.vehicleSync(playerId, vehicleId, data) end function sampev.onTrailerSync(playerId, data) luChecker.trailerSync(playerId, data) end function sampev.onVehicleStreamOut(vehicleId) luChecker.vehicleStream(false, vehicleId) end function sampev.onSendChat(message) antiflood = os.clock() * 1000 end function sampev.onSendCommand(cmd) local command, params = string.match(cmd, "^%/([^ ]*)(.*)") if command ~= nil and params ~= nil and command:lower() == "truck" then if params:lower() == " menu" then ShowDialog1(1) return false end if params:lower() == " cmd" then local text = " /truck hud\tВкл/Выкл скрипт\n /truck auto\tВкл/Выкл Auto-Load/Unload\n /truck chat\tВкл/Выкл доклады в рацию\n /truck para\tВкл/Выкл режим пары\n /truck menu\tМеню настроек скрипта\n /truck play\tДополнительное меню управления скриптом\n /truck mon [ID]\tОтправить мониторинг другому игроку в СМС" sampShowDialog(222, "Команды скрипта TruckHUD", text, "Закрыть", "", 4) return false end if params:lower() == " hud" then script_run = not script_run if script_run then delay.paycheck = 1 end menu[1].run = script_run return false end if params:lower() == " auto" then auto = not auto menu[2].run = auto return false end if params:lower() == " chat" then inifiles.Settings.Report = not inifiles.Settings.Report menu[3].run = inifiles.Settings.Report sampAddChatMessage( string.format("Авто Доклад в рацию %s", (inifiles.Settings.Report and "активирован" or "деактивирован")), 0xFF2f72f7 ) settings_save() return false end if params:lower() == " para" then if pair_mode then pair_mode = false else ShowDialog1(8) end return false end if params:lower() == " url" then setClipboardText("https://colorscheme.ru/color-converter.html") return false end if params:lower() == " users" then showUsers() return false end if params:lower():find(" mon (%d+)") then local id = params:lower():match(" mon (%d+)") return { string.format( "/sms %s [ЛС H:%d У:%d Л:%d][1 H:%d У:%d Л:%d][2 H:%d У:%d Л:%d][CФ H:%d У:%d Л:%d]", id, (prices_mon.lsn / 100), (prices_mon.lsy / 100), (prices_mon.lsl / 100), (prices_mon.n1 / 100), (prices_mon.y1 / 100), (prices_mon.l1 / 100), (prices_mon.n2 / 100), (prices_mon.y2 / 100), (prices_mon.l2 / 100), (prices_mon.sfn / 100), (prices_mon.sfy / 100), (prices_mon.sfl / 100) ) } end end if params:lower():find(" server_help") then sampShowDialog(0, 'TruckHUD: Server Help', [[{FFFFFF} << Основные причины проблем соединения с сервером >> 1. Сервер отключился. Поспрашивайте других дальнобойщиков нет ли у них такой проблемы Если у всех такая проблема - значит сервер упал. Сообщите в группу разработчику. 2. У скрипта нет доступа в интернет. Установлен антистиллер.]], 'Закрыть', '', 0) return false end antiflood = os.clock() * 1000 end function sampev.onVehicleStreamIn(vehicleId, data) luChecker.vehicleStream(true, vehicleId, data) if inifiles ~= nil and not inifiles.Settings.Tuning and (data.type == 403 or data.type == 515) then data.modSlots[8] = 0 return {vehicleId, data} end end function sampev.onServerMessage(color, message) if message:find("У вас .E5E4E2.PLATINUM VIP.EAC700. до %d+/%d+/%d+ %d+:%d+") then local year, mounth, day, hour, min = message:match("У вас .E5E4E2.PLATINUM VIP.EAC700. до (%d+)/(%d+)/(%d+) (%d+):(%d+)") datetime = { year = tonumber(year), month = tonumber(mounth), day = tonumber(day), hour = tonumber(hour), min = tonumber(min), sec = 5 } if os.time(datetime) ~= inifiles.platinum.time then inifiles.platinum.time = os.time(datetime) settings_save() end if not inifiles.platinum.status then inifiles.platinum.status = true settings_save() end end if string.find(message, " Нефть: %d+ / (%d+)$") then maxload_int = tonumber(string.match(message, " Нефть: %d+ / (%d+)$")) end if message == " У вас бан чата!" then delay.chatMon = 0 delay.chat = 0 end if script_run and string.find(message, " Вы заработали (.+) вирт%. Деньги будут зачислены на ваш банковский счет в .+") then local string = string.match(message, " Вы заработали (.+) вирт%. Деньги будут зачислены на ваш банковский счет в .+") inifiles.log[os.date("%d.%m.%Y", msk_timestamp)].hour[os.date("%H", msk_timestamp)].zp = string:find('/') and string:match('(%d+) /') or string if delay.paycheck == 2 then delay.paycheck = 0 return false end end if string.find(message, " .+<.+>: .+") and not string.find(message, "%->Вопрос") and inifiles ~= nil then if string.find(message, my_nick) then if string.find(message, "ЛС Н") then delay.chatMon = 0 else delay.chat = 0 end end if inifiles.Settings.ChatOFF then return false else if inifiles.Settings.chat_in_truck and not isTruckCar() then return false end end if pair_mode and inifiles.Settings.LightingPara and string.find(message, pair_mode_name) then paraColor = "{"..inifiles.Settings.ColorPara.."}" color = "0xFF" .. inifiles.Settings.ColorPara else paraColor = "{30A0A7}" color = "0xFF30A0A7" end local result = false if string.find(message, " Serhiy_Rubin%[%d+%]<.+>: .+") or string.find(message, " Rafael_Moreno%[%d+%]<.+>: .+") or string.find(message, " Warren_Ix%[%d+%]<.+>: .+") then result = true local text = message:match(" (.+)%[%d+%]<") message = message:gsub(" "..text.."%[", " {FFFFFF}[DEV]"..paraColor.." "..text.."[") end if script_run then if inifiles.Settings.highlight_jf then local result = "" for i = 1, #dop_chat_light do if message:find(dop_chat_light[i]) then result = dop_chat_light[i] break end end if result ~= "" then message = message:gsub(result, "{ffffff}"..result..paraColor) if message:find("(по %d+)") then local text = message:match("по (%d+)") message = message:gsub(" по "..text, " по {ffffff}"..text..paraColor) end if message:find(" в ") then local text = message:match(" в (.+)") if text:find(paraColor) then message = message:gsub(" в ", paraColor.." в {ffffff}") end end sampAddChatMessage(message, color) return false end end if pair_mode and inifiles.Settings.LightingPara and string.find(message, pair_mode_name) then sampAddChatMessage(message, color) return false end end if result then sampAddChatMessage(message, 0xFF30A0A7) return false end end if string.find( message, " (.*)<(.*)>: %[ЛС Н:(%d+) У:(%d+) Л:(%d+)%] %[1 Н:(%d+) У:(%d+) Л:(%d+)%] %[2 Н:(%d+) У:(%d+) Л:(%d+)%] %[CФ Н:(%d+) У:(%d+) Л:(%d+)%]" ) then if (string.find(message, "Купил") or string.find(message, "Продал")) then nick, rank, prices_smon.lsn, prices_smon.lsy, prices_smon.lsl, prices_smon.n1, prices_smon.y1, prices_smon.l1, prices_smon.n2, prices_smon.y2, prices_smon.l2, prices_smon.sfn, prices_smon.sfy, prices_smon.sfl, _ = string.match( message, " (.*)%[.+%]<(.*)>: %[ЛС Н:(%d+) У:(%d+) Л:(%d+)%] %[1 Н:(%d+) У:(%d+) Л:(%d+)%] %[2 Н:(%d+) У:(%d+) Л:(%d+)%] %[CФ Н:(%d+) У:(%d+) Л:(%d+)%] %[(.*)%]" ) else nick, rank, prices_smon.lsn, prices_smon.lsy, prices_smon.lsl, prices_smon.n1, prices_smon.y1, prices_smon.l1, prices_smon.n2, prices_smon.y2, prices_smon.l2, prices_smon.sfn, prices_smon.sfy, prices_smon.sfl = string.match( message, " (.*)%[.+%]<(.*)>: %[ЛС Н:(%d+) У:(%d+) Л:(%d+)%] %[1 Н:(%d+) У:(%d+) Л:(%d+)%] %[2 Н:(%d+) У:(%d+) Л:(%d+)%] %[CФ Н:(%d+) У:(%d+) Л:(%d+)%]" ) end chat_mon[nick] = prices_smon chat_mon[nick].time = msk_timestamp if inifiles.blacklist[nick] == nil then inifiles.blacklist[nick] = false end if (not inifiles.Settings.blacklist_inversion and inifiles.blacklist[nick] == false) or (inifiles.Settings.blacklist_inversion and inifiles.blacklist[nick] == true) then mon_life = msk_timestamp mon_ctime = msk_timestamp prices_mon.lsn = prices_smon.lsn * 100 prices_mon.lsy = prices_smon.lsy * 100 prices_mon.lsl = prices_smon.lsl * 100 prices_mon.sfn = prices_smon.sfn * 100 prices_mon.sfy = prices_smon.sfy * 100 prices_mon.sfl = prices_smon.sfl * 100 prices_mon.n1 = prices_smon.n1 * 100 prices_mon.n2 = prices_smon.n2 * 100 prices_mon.y1 = prices_smon.y1 * 100 prices_mon.y2 = prices_smon.y2 * 100 prices_mon.l1 = prices_smon.l1 * 100 prices_mon.l2 = prices_smon.l2 * 100 end end if string.find(message, " Нефть: (%d+) / (%d+)") then if current_load ~= 0 then check_noLoad = true end local S1, S2 = string.match(message, " Нефть: (%d+) / (%d+)") if tonumber(S1) ~= 0 then current_load = 1 check_noLoad = false end end if string.find(message, " Уголь: (%d+) / (%d+)") then local S1, S2 = string.match(message, " Уголь: (%d+) / (%d+)") if tonumber(S1) ~= 0 then current_load = 2 check_noLoad = false end end if string.find(message, " Дерево: (%d+) / (%d+)") then local S1, S2 = string.match(message, " Дерево: (%d+) / (%d+)") if tonumber(S1) ~= 0 then current_load = 3 check_noLoad = false end if check_noLoad and current_load ~= 0 then current_load = 0 end end if string.find(message, " Извините, мы вас немного задержим, нужно подготовить груз. Осталось (%d+) секунд") then local S1 = string.match(message, " Извините, мы вас немного задержим, нужно подготовить груз. Осталось (%d+) секунд") if tonumber(S1) > 3 then delay.load = 0 delay.unload = 0 end end if message == " У вас недостаточно денег" or message == " Нужно находиться у склада" or message == " Нужно находиться в порту" or message == " У вас нет продуктов" or message == " Вы прибыли без прицепа" or message == " Вы не в служебной машине. Нужно быть водителем" or message == " Вы должны находиться в порту, или на складе" or message == " Вы должны устроиться на работу дальнобойщика" then delay.mon, delay.chatMon = 0, 0 delay.load = 0 delay.unload = 0 if auto then auto = false autoh = true menu[2].run = false message = message..". Режим АВТО TruckHUD выключен!" return { color, message } end end -- /truck load unload error if message == " Вам не доступен этот чат!" or message == " Введите: /r или /f [text]" then delay.chat = 0 delay.chatMon = 0 end -- /jf chat error if string.find(message, "===============%[(%d+):(%d+)%]===============") then payday = msk_timestamp write_table_log('payday', {0}, 9) settings_save() end -- Log update if message == " Сообщение доставлено" or message == " Игрок оффлайн" or message == " Введите: /sms [playerid / phonenumber] [текст]" or message == " Телефон вне зоны доступа сети" then delay.sms = 0 end if string.find(message, "Загружено %d+ груза, на сумму (%d+) вирт. Скидка: %d+ вирт") and isTruckCar() then timer = msk_timestamp local Z1, Z2, Z3 = string.match(message, " Загружено (%d+) груза, на сумму (%d+) вирт. Скидка: (%d+) вирт") gruzLOAD = Z1 if texts_of_reports[current_warehouse] ~= nil then local cena = (Z2 + Z3) / (Z1 / 1000) local sklad = texts_of_reports[current_warehouse] local modelId = getCharModel(PLAYER_PED) report_text = (not inifiles.Settings.girl and "Загрузился" or "Загрузилась") .. " на " .. sklad .. " по " .. cena sms_pair_mode = report_text if inifiles.Settings.Report then delay.chat = 1 end if pair_mode and inifiles.Settings.SMSpara then delay.sms = 1 end end write_table_log('zagruzka', {Z2}, 1) delay.load = 0 if script_run then if inifiles.Settings.ChatDoklad then delay.chatMon = -1 end delay.mon = 1 end workload = 1 autoh = true if inifiles.Settings.AutoOFF then auto = false end end if string.find(message, "Вы заработали (%d+) вирт, из которых (%d+) вирт будет добавлено к вашей зарплате") and isTruckCar() then pttModule() timer = msk_timestamp local Z1, Z2 = string.match(message, " Вы заработали (%d+) вирт, из которых (%d+) вирт будет добавлено к вашей зарплате") if texts_of_reports[current_warehouse] ~= nil and gruzLOAD ~= nil then local cena = Z1 / (gruzLOAD / 1000) local sklad = texts_of_reports[current_warehouse] local modelId = getCharModel(PLAYER_PED) report_text = "Разгрузил" .. (not inifiles.Settings.girl and " " or "а ") .. sklad .. " по " .. cena sms_pair_mode = report_text if inifiles.Settings.Report then delay.chat = 1 end if pair_mode and inifiles.Settings.SMSpara then delay.sms = 1 end end if inifiles.Trucker.MaxZP > tonumber(inifiles.log[os.date("%d.%m.%Y", msk_timestamp)].hour[os.date("%H", msk_timestamp)].zp + Z2) then write_table_log('razgruzka', {Z1, Z2, (Z1 - Z2)}, 2) else if tonumber(inifiles.log[os.date("%d.%m.%Y", msk_timestamp)].hour[os.date("%H", msk_timestamp)].zp) ~= inifiles.Trucker.MaxZP then local param4 = ((tonumber(inifiles.log[os.date("%d.%m.%Y", msk_timestamp)].hour[os.date("%H", msk_timestamp)].zp) + Z2) - inifiles.Trucker.MaxZP - Z2) local param5 = string.match(param4, "-(.*)") write_table_log('razgruzka', {param5, param5, 0}, 2) end end delay.unload = 0 if script_run then if inifiles.Settings.ChatDoklad then delay.chatMon = -1 end delay.mon = 1 delay.skill = 1 end workload = 0 current_load = 0 autoh = true if inifiles.Settings.AutoOFF then auto = false end delay.paycheck = 1 end if message == " Не флуди!" then if delay.skill == 2 then delay.skill = 1 end if delay.load == 2 then delay.load = 1 end if delay.unload == 2 then delay.unload = 1 end if delay.sms == 2 then delay.sms = 1 end if delay.chat == 2 then delay.chat = 1 end if delay.chatMon == 2 then delay.chatMon = 1 end if delay.dir == 2 then delay.dir = 1 end end if message == " У вас нет телефонного справочника!" then delay.dir = 0 end if string.find(message, " Вы арендовали транспортное средство") and isTruckCar() then local message = sampGetDialogText() if string.find(message, "Стоимость") then local Z1 = string.match(message, "Стоимость аренды: {FFFF00}(%d+) вирт") write_table_log('arenda', {Z1}, 3) end end if string.find(message, " Вы заплатили штраф (%d+) вирт, Офицеру (%g+)") then local Z1, Z2 = string.match(message, " Вы заплатили штраф (%d+) вирт, Офицеру (%g+)") write_table_log('shtraf', {Z1, message}, 4) end if string.find(message, " Вашу машину отремонтировал%(а%) за (%d+) вирт, Механик (%g+)") and isTruckCar() then local Z1, Z2 = string.match(message, " Вашу машину отремонтировал%(а%) за (%d+) вирт, Механик (%g+)") write_table_log('repair', {Z1}, 5) end if string.find(message, " Автомеханик (%g+) заправил ваш автомобиль на 300 за (%d+) вирт") and isTruckCar() then local Z1, Z2 = string.match(message, " Автомеханик (%g+) заправил ваш автомобиль на 300 за (%d+) вирт") write_table_log('refill', {Z2}, 6) end if string.find(message, " Машина заправлена, за: (%d+) вирт") and isTruckCar() then local Z1 = string.match(message, " Машина заправлена, за: (%d+) вирт") write_table_log('refill', {Z1}, 7) end if string.find(message, " Вы купили канистру с 50 литрами бензина за (%d+) вирт") and isTruckCar() then local Z1 = string.match(message, " Вы купили канистру с 50 литрами бензина за (%d+) вирт") write_table_log('kanistr', {Z1}, 8) end end function sampev.onShowDialog(DdialogId, Dstyle, Dtitle, Dbutton1, Dbutton2, Dtext) if Dstyle == 0 and string.find(Dtext, "{00AB06}Дальнобойщик{CECECE}") and string.find(Dtext, "{00AB06}Механик{CECECE}") then local Skill, SkillP, Rank, RankP = string.match( Dtext, ".+{00AB06}Дальнобойщик{CECECE}.*Скилл: (%d+)\tОпыт: .+ (%d+%.%d+)%%.*{CECECE}Ранг: (%d+) \tОпыт: .+ (%d+%.%d+)%%") if Skill ~= nil then SkillP = tonumber(SkillP) RankP = tonumber(RankP) Skill = tonumber(Skill) Rank = tonumber(Rank) local gruzs = (Skill < 10 and 10000 or (Skill < 20 and 20000 or (Skill < 30 and 30000 or (Skill < 40 and 40000 or (Skill >= 40 and 50000))))) local S1 = gruzs / 100 * (1.1 ^ (50 - inifiles.Trucker.Skill)) local S2 = 10000 * (1.1 ^ inifiles.Trucker.Skill) local S3 = (S1 * 100) / S2 inifiles.Trucker.ReysSkill = math.ceil((100.0 - SkillP) / S3) inifiles.Trucker.ProcSkill = SkillP if inifiles.Trucker.ProcRank ~= RankP then inifiles.Trucker.ReysRank = math.ceil((100.0 - RankP) / (RankP - inifiles.Trucker.ProcRank)) inifiles.Trucker.ProcRank = RankP end inifiles.Trucker.Skill = Skill inifiles.Trucker.Rank = Rank inifiles.Trucker.MaxZP = math.ceil( 50000 + (2500 * (1.1 ^ Skill)) + (2500 * (1.1 ^ Rank)) ) settings_save() end if delay.skill ~= 0 then delay.skill = 0 return false end end if DdialogId == 22 and Dstyle == 0 and string.find(Dtext, "Заводы") then delay.mon = 0 mon_life = msk_timestamp mon_time = msk_timestamp prices_mon.n1, prices_mon.n2, prices_mon.y1, prices_mon.y2, prices_mon.l1, prices_mon.l2, prices_mon.lsn, prices_mon.lsy, prices_mon.lsl, prices_mon.sfn, prices_mon.sfy, prices_mon.sfl = string.match( Dtext, "[Заводы].*Нефтезавод №1.*.*Нефть: 0.(%d+) вирт.*Нефтезавод №2.*.*Нефть: 0.(%d+) вирт.*Склад угля №1.*.*Уголь: 0.(%d+) вирт.*Склад угля №2.*.*Уголь: 0.(%d+) вирт.*Лесопилка №1.*.*Дерево: 0.(%d+) вирт.*Лесопилка №2.*.*Дерево: 0.(%d+) вирт.*[Порты].*Порт ЛС.*.*Нефть: 0.(%d+) вирт.*.*Уголь: 0.(%d+) вирт.*.*Дерево: 0.(%d+) вирт.*Порт СФ.*.*Нефть: 0.(%d+) вирт.*.*Уголь: 0.(%d+) вирт.*.*Дерево: 0.(%d+) вирт" ) for k, v in pairs(prices_mon) do if string.find(tostring(prices_mon[k]), "99") then prices_mon[k] = tonumber(prices_mon[k]) + 1 end end inifiles.tmonitor = { n1 = prices_mon.n1, n2 = prices_mon.n2, y1 = prices_mon.y1, y2 = prices_mon.y2, l1 = prices_mon.l1, l2 = prices_mon.l2, lsn = prices_mon.lsn, lsy = prices_mon.lsy, lsl = prices_mon.lsl, sfn = prices_mon.sfn, sfy = prices_mon.sfy, sfl = prices_mon.sfl, time = msk_timestamp } settings_save() if delay.chatMon == -1 then SendMonText = string.format( "[ЛС Н:%d У:%d Л:%d] [1 Н:%d У:%d Л:%d] [2 Н:%d У:%d Л:%d] [CФ Н:%d У:%d Л:%d]", (prices_mon.lsn / 100), (prices_mon.lsy / 100), (prices_mon.lsl / 100), (prices_mon.n1 / 100), (prices_mon.y1 / 100), (prices_mon.l1 / 100), (prices_mon.n2 / 100), (prices_mon.y2 / 100), (prices_mon.l2 / 100), (prices_mon.sfn / 100), (prices_mon.sfy / 100), (prices_mon.sfl / 100) ) delay.chatMon = 1 end if script_run then transponder_delay = 100 return false end end if delay.dir ~= 0 then if string.find(Dtitle, "Тел.справочник") and delay.dir == 2 then sampSendDialogResponse(DdialogId, 1, 1, "") delay.dir = 3 return false end if string.find(Dtitle, "Работы") and delay.dir == 3 then lua_thread.create( function() repeat wait(0) until delay.dir == 4 wait(150) sampSendDialogResponse(DdialogId, 1, 8, "[8] Дальнобойщик") end ) delay.dir = 4 return false end if string.find(Dtitle, "Меню") and string.find(Dtext, "AFK секунд") and delay.dir == 4 then delay.dir = 0 sampShowDialog(222, Dtitle, Dtext, Dbutton1, Dbutton2, Dstyle) return false end end end function sampev.onCreate3DText(id, color, position, distance, testLOS, attachedPlayerId, attachedVehicleId, text) lua_thread.create( function(id, color, position, distance, testLOS, attachedPlayerId, attachedVehicleId, textt) for k, v in pairs(find_3dText) do if string.find(text, v) then if (msk_timestamp - id_3D_text) > 1 then wait_auto = msk_timestamp end id_3D_text = id if text:find("Порт") then unload_location = true local one_plus = function(price) for i = 1, #price do if string.find(tostring(price[i]), "99") then price[i] = tonumber(price[i]) + 1 end end return price[1], price[2], price[3] end local cargoN, cargoY, cargoL = string.match(text, v) cargoN, cargoY, cargoL = one_plus({cargoN, cargoY, cargoL}) luChecker.set3Dtext("Порт", {prices_3dtext[k .. "n"], prices_3dtext[k .. "y"], prices_3dtext[k .. "l"]}, {cargoN, cargoY, cargoL}, position) prices_3dtext[k .. "n"], prices_3dtext[k .. "y"], prices_3dtext[k .. "l"] = cargoN, cargoY, cargoL prices_3dtext_id[k .. "n"], prices_3dtext_id[k .. "y"], prices_3dtext_id[k .. "l"] = id, id, id prices_3dtext_pos[k .. "n"], prices_3dtext_pos[k .. "y"], prices_3dtext_pos[k .. "l"] = position, position, position local port = (text:find("ЛС") and "ЛС" or "СФ") local ctext = string.format( "Порт %s\nНефть: 0.%s\nУголь: 0.%s\nДерево: 0.%s ", port, prices_3dtext[k .. "n"], prices_3dtext[k .. "y"], prices_3dtext[k .. "l"] ) current_warehouse = (current_load == 1 and k .. "n" or (current_load == 2 and k .. "y" or (current_load == 3 and k .. "l" or ""))) repeat wait(0) until sampIs3dTextDefined(id) if inifiles.Settings.LightingPrice then if current_load == 1 then ctext = ctext:gsub("Нефть:", "{FFFFFF}Нефть:") ctext = ctext:gsub("Уголь:", "{FFFF00}Уголь:") elseif current_load == 2 then ctext = ctext:gsub("Уголь:", "{FFFFFF}Уголь:") ctext = ctext:gsub("Дерево:", "{FFFF00}Дерево:") elseif current_load == 3 then ctext = ctext:gsub("Дерево:", "{FFFFFF}Дерево:") end end sampCreate3dTextEx( id, ctext, 0xFFFFFF00, position.x, position.y, position.z, distance, testLOS, attachedPlayerId, attachedVehicleId ) else local cargo_save = string.match(text, v) luChecker.set3Dtext("Склад", {prices_3dtext[k], k}, {cargo_save, k}, position) prices_3dtext[k] = cargo_save prices_3dtext_id[k] = id prices_3dtext_pos[k] = position load_location = true current_warehouse = k end end end end, id, color, position, distance, testLOS, attachedPlayerId, attachedVehicleId, text ) end function sampev.onRemove3DTextLabel(Cid) -- f3d2 lua_thread.create(function(Cid) if id_3D_text == Cid then id_3D_text = msk_timestamp load_location = false unload_location = false current_warehouse = "none" end local result, key = isTruck3dTextDefined(Cid) if result then for i = 1, #key do prices_3dtext_id[key[i]] = nil prices_3dtext[key[i]] = 0 end end end, Cid) end utf8({ "sampev", "onShowDialog" }, "AnsiToUtf8", "Utf8ToAnsi") utf8({ "sampev", "onServerMessage" }, "AnsiToUtf8", "Utf8ToAnsi") utf8({ "sampev", "onCreate3DText" }, "AnsiToUtf8", "Utf8ToAnsi") end function isTruck3dTextDefined(id) local result = false local delete = {} local x, y, z = getCharCoordinates(PLAYER_PED) for k,v in pairs(prices_3dtext_id) do local dist = getDistanceBetweenCoords3d(x, y, z, prices_3dtext_pos[k].x, prices_3dtext_pos[k].y, prices_3dtext_pos[k].z) if id == v and v ~= -1 and dist > 20 then result = true delete[#delete+1] = k end end return result, delete end function say(text) sampAddChatMessage(tostring(text),-1) end function write_table_log(key, param, Log) if Log >= 3 and Log ~= 9 then inifiles.log[os.date("%d.%m.%Y", msk_timestamp)].hour[os.date("%H", msk_timestamp)]['pribil'] = inifiles.log[os.date("%d.%m.%Y", msk_timestamp)].hour[os.date("%H", msk_timestamp)]['pribil'] - tonumber(param[1]) inifiles.log[os.date("%d.%m.%Y", msk_timestamp)].day['pribil'] = inifiles.log[os.date("%d.%m.%Y", msk_timestamp)].day['pribil'] - tonumber(param[1]) inifiles.log[os.date("%d.%m.%Y", msk_timestamp)].hour[os.date("%H", msk_timestamp)][key] = inifiles.log[os.date("%d.%m.%Y", msk_timestamp)].hour[os.date("%H", msk_timestamp)][key] + tonumber(param[1]) inifiles.log[os.date("%d.%m.%Y", msk_timestamp)].day[key] = inifiles.log[os.date("%d.%m.%Y", msk_timestamp)].day[key] + tonumber(param[1]) end if inifiles.log[os.date("%d.%m.%Y", msk_timestamp)].hour[os.date("%H", msk_timestamp)][key..'count'] ~= nil then inifiles.log[os.date("%d.%m.%Y", msk_timestamp)].hour[os.date("%H", msk_timestamp)][key..'count'] = inifiles.log[os.date("%d.%m.%Y", msk_timestamp)].hour[os.date("%H", msk_timestamp)][key..'count'] + 1 inifiles.log[os.date("%d.%m.%Y", msk_timestamp)].day[key..'count'] = inifiles.log[os.date("%d.%m.%Y", msk_timestamp)].day[key..'count'] + 1 end if key == 'zagruzka' then inifiles.Settings.DataLoad = os.date("%d.%m.%Y", msk_timestamp) inifiles.Settings.HourLoad = os.date("%H", msk_timestamp) if inifiles.Trucker.MaxZP > tonumber(inifiles.log[os.date("%d.%m.%Y", msk_timestamp)].hour[os.date("%H", msk_timestamp)].zp) then inifiles.log[os.date("%d.%m.%Y", msk_timestamp)].hour[os.date("%H", msk_timestamp)]['pribil'] = inifiles.log[os.date("%d.%m.%Y", msk_timestamp)].hour[os.date("%H", msk_timestamp)]['pribil'] - tonumber(param[1]) inifiles.log[os.date("%d.%m.%Y", msk_timestamp)].day['pribil'] = inifiles.log[os.date("%d.%m.%Y", msk_timestamp)].day['pribil'] - tonumber(param[1]) inifiles.log[os.date("%d.%m.%Y", msk_timestamp)].hour[os.date("%H", msk_timestamp)][key] = inifiles.log[os.date("%d.%m.%Y", msk_timestamp)].hour[os.date("%H", msk_timestamp)][key] + tonumber(param[1]) inifiles.log[os.date("%d.%m.%Y", msk_timestamp)].day[key] = inifiles.log[os.date("%d.%m.%Y", msk_timestamp)].day[key] + tonumber(param[1]) end end if key == 'razgruzka' then if inifiles.Trucker.MaxZP > tonumber(inifiles.log[os.date("%d.%m.%Y", msk_timestamp)].hour[os.date("%H", msk_timestamp)].zp)then if inifiles.Settings.HourLoad ~= os.date("%H", msk_timestamp) or inifiles.Settings.DataLoad ~= os.date("%d.%m.%Y", msk_timestamp) then inifiles.log[os.date("%d.%m.%Y", msk_timestamp)].hour[os.date("%H", msk_timestamp)]['zp'] = inifiles.log[os.date("%d.%m.%Y", msk_timestamp)].hour[os.date("%H", msk_timestamp)]['zp'] + tonumber(param[2]) inifiles.log[os.date("%d.%m.%Y", msk_timestamp)].day['zp'] = inifiles.log[os.date("%d.%m.%Y", msk_timestamp)].day['zp'] + tonumber(param[2]) inifiles.log[os.date("%d.%m.%Y", msk_timestamp)].hour[os.date("%H", msk_timestamp)]['pribil'] = inifiles.log[os.date("%d.%m.%Y", msk_timestamp)].hour[os.date("%H", msk_timestamp)]['pribil'] + tonumber(param[2]) inifiles.log[os.date("%d.%m.%Y", msk_timestamp)].day['pribil'] = inifiles.log[os.date("%d.%m.%Y", msk_timestamp)].day['pribil'] + tonumber(param[2]) inifiles.log[os.date("%d.%m.%Y", msk_timestamp)].hour[os.date("%H", msk_timestamp)][key] = inifiles.log[os.date("%d.%m.%Y", msk_timestamp)].hour[os.date("%H", msk_timestamp)][key] + tonumber(param[1]) inifiles.log[os.date("%d.%m.%Y", msk_timestamp)].day[key] = inifiles.log[os.date("%d.%m.%Y", msk_timestamp)].day[key] + tonumber(param[1]) else inifiles.log[os.date("%d.%m.%Y", msk_timestamp)].hour[os.date("%H", msk_timestamp)]['zp'] = inifiles.log[os.date("%d.%m.%Y", msk_timestamp)].hour[os.date("%H", msk_timestamp)]['zp'] + tonumber(param[2]) inifiles.log[os.date("%d.%m.%Y", msk_timestamp)].day['zp'] = inifiles.log[os.date("%d.%m.%Y", msk_timestamp)].day['zp'] + tonumber(param[2]) inifiles.log[os.date("%d.%m.%Y", msk_timestamp)].hour[os.date("%H", msk_timestamp)]['pribil'] = inifiles.log[os.date("%d.%m.%Y", msk_timestamp)].hour[os.date("%H", msk_timestamp)]['pribil'] + tonumber(param[1]) inifiles.log[os.date("%d.%m.%Y", msk_timestamp)].day['pribil'] = inifiles.log[os.date("%d.%m.%Y", msk_timestamp)].day['pribil'] + tonumber(param[1]) inifiles.log[os.date("%d.%m.%Y", msk_timestamp)].hour[os.date("%H", msk_timestamp)][key] = inifiles.log[os.date("%d.%m.%Y", msk_timestamp)].hour[os.date("%H", msk_timestamp)][key] + tonumber(param[1]) inifiles.log[os.date("%d.%m.%Y", msk_timestamp)].day[key] = inifiles.log[os.date("%d.%m.%Y", msk_timestamp)].day[key] + tonumber(param[1]) end inifiles.Settings.HourLoad = os.date("%H", msk_timestamp) inifiles.Settings.DataLoad = os.date("%d.%m.%Y", msk_timestamp) end end local text_to_log = { [1] = { string.format('Загрузка за %s$ %s', param[1], (inifiles.Trucker.MaxZP < tonumber(inifiles.log[os.date("%d.%m.%Y", msk_timestamp)].hour[os.date("%H", msk_timestamp)].zp) and ' [Достигнут лимит зарплаты]' or '') )}, [2] = { string.format('Разгрузка за %s$ | Заработано %s$ %s', param[1], param[2], (inifiles.Trucker.MaxZP < tonumber(inifiles.log[os.date("%d.%m.%Y", msk_timestamp)].hour[os.date("%H", msk_timestamp)].zp) and ' [Достигнут лимит зарплаты]' or '')) }, [3] = { string.format('Аренда фуры за %s$', param[1]) }, [4] = { string.format('Штраф %s$ офицеру %s', param[1], param[2]) }, [5] = { string.format('Починка фуры за %s$', param[1]) }, [6] = { string.format('Заправка фуры за %s$', param[1]) }, [7] = { string.format('Заправка фуры за %s$', param[1]) }, [8] = { string.format('Покупка канистры за %s$', param[1]) }, [9] = { string.format('PayDay') } } for k, v in pairs(text_to_log[Log]) do inifiles.log[os.date("%d.%m.%Y", msk_timestamp)].event[#inifiles.log[os.date("%d.%m.%Y", msk_timestamp)].event + 1] = os.date("%X", msk_timestamp).." | "..v end settings_save() end function logAvailable() if msk_timestamp == 0 then return end if inifiles.log == nil then inifiles.log = {} settings_save() end if inifiles.log[os.date("%d.%m.%Y", msk_timestamp)] == nil then inifiles.log[os.date("%d.%m.%Y", msk_timestamp)] = { event = {}, hour = {}, day = { arenda = 0, arendacount = 0, zagruzka = 0, zagruzkacount = 0, razgruzka = 0, razgruzkacount = 0, pribil = 0, shtraf = 0, shtrafcount = 0, repair = 0, repaircount = 0, refill = 0, refillcount = 0, kanistr = 0, kanistrcount = 0, zp = 0 } } settings_save() end if inifiles.log[os.date("%d.%m.%Y", msk_timestamp)].hour[os.date("%H", msk_timestamp)] == nil then inifiles.log[os.date("%d.%m.%Y", msk_timestamp)].hour[os.date("%H", msk_timestamp)] = { arenda = 0, arendacount = 0, zagruzka = 0, zagruzkacount = 0, razgruzka = 0, razgruzkacount = 0, pribil = 0, shtraf = 0, shtrafcount = 0, repair = 0, repaircount = 0, refill = 0, refillcount = 0, kanistr = 0, kanistrcount = 0, zp = 0 } settings_save() end end function isTruckCar() if isCharInModel(PLAYER_PED, 403) or isCharInModel(PLAYER_PED, 514) or isCharInModel(PLAYER_PED, 515) then --463 ubrat or isCharInModel(PLAYER_PED, 463) if getDriverOfCar(getCarCharIsUsing(playerPed)) == playerPed then return true else return false end else return false end end function ChangeCena(st) if st > 0 then if workload == 1 then if inifiles.Price.UnLoad >= 0 and inifiles.Price.UnLoad < 900 then inifiles.Price.UnLoad = inifiles.Price.UnLoad + 100 settings_save() end else if inifiles.Price.Load >= 0 and inifiles.Price.Load < 900 then inifiles.Price.Load = inifiles.Price.Load + 100 settings_save() end end else if workload == 1 then if inifiles.Price.UnLoad > 0 and inifiles.Price.UnLoad <= 900 then inifiles.Price.UnLoad = inifiles.Price.UnLoad - 100 settings_save() end else if inifiles.Price.Load > 0 and inifiles.Price.Load <= 900 then inifiles.Price.Load = inifiles.Price.Load - 100 settings_save() end end end end function drawClickableText(text, posX, posY) if text ~= nil and posX ~= nil and posY ~= nil then renderFontDrawText(font, text, posX, posY, "0xFF" .. inifiles.Render.Color1) local textLenght = renderGetFontDrawTextLength(font, text) local textHeight = renderGetFontDrawHeight(font) local curX, curY = getCursorPos() if curX >= posX and curX <= posX + textLenght and curY >= posY and curY <= posY + textHeight then if control or sampIsChatInputActive() then renderFontDrawText(font, text, posX, posY, "0x70" .. inifiles.Render.Color2) if isKeyJustPressed(1) then return true else return false end end end else return false end end -------------------------------------------------------------------------------- --------------------------------------GMAP-------------------------------------- -------------------------------------------------------------------------------- delay_start = 0 function clearSoloMessage() solo_message_send = { name = "", id = -1, action = "", cargo = "", time = 0 } end function doPair_G() if pair_yes ~= nil then if os.time() - pair_yes.time < 60 then if wasKeyPressed(vkeys["VK_G"]) then pair_mode_id = tonumber(pair_yes.id) if sampIsPlayerConnected(pair_mode_id) then error_message(1, '') para_message_send = nil pair_mode_name = sampGetPlayerNickname(pair_mode_id) menu[4][1] = "SMS » " .. pair_mode_name .. "[" .. pair_mode_id .. "]" pair_mode = true menu[4].run = true transponder_delay = 100 else pair_mode_id = -1 pair_mode = false menu[4].run = false sampAddChatMessage("Ошибка! Игрок под этим ID не в сети.", -1) end pair_yes = nil end else pair_yes = nil end end end function transponder() new_pair = {} error_array = {} solo_data_antiflood = {} clearSoloMessage() while true do wait(0) if script_run and inifiles.Settings.transponder then delay_start = os.clock() repeat wait(0) until os.clock() * 1000 - (delay_start * 1000) > transponder_delay if inifiles.Settings.transponder then local request_table = {} request_table["request"] = 1 local ip, port = sampGetCurrentServerAddress() local _, myid = sampGetPlayerIdByCharHandle(PLAYER_PED) local x, y, z = getCharCoordinates(playerPed) local result, myid = sampGetPlayerIdByCharHandle(PLAYER_PED) local myname = sampGetPlayerNickname(myid) if (os.time() - afk_solo_message_false < 7 or os.time() - live > 7) or (solo_message_send.time ~= 0 and os.time() - solo_message_send.time > 5) then -- Очистить если данные устарели clearSoloMessage() end request_table["info"] = { server = ip .. ":" .. tostring(port), sender = myname, pos = {x = x, y = y, z = z, heading = getCharHeading(playerPed)}, data = { pair_mode_name = pair_mode_name, is_truck = isTruckCar(), gruz = current_load, skill = inifiles.Trucker.Skill, rank = inifiles.Trucker.Rank, id = myid, paraid = pair_mode_id, timer = timer, tmonitor = inifiles.tmonitor, version = inifiles.version, platinum = inifiles.platinum.status }, solo_message = solo_message_send } request_table['random'] = tostring(os.clock()):gsub('%.', '') if pair_mode and pair_mode_name ~= nil then request_table["info"]['data']["pair_mode_name"] = pair_mode_name else request_table["info"]['data']["pair_mode_name"] = "____" end download_call = 0 collecting_data = false wait_for_response = true local response_path = os.tmpname() down = false download_id_4 = downloadUrlToFile( "http://th.deadpoo.net/" .. encodeJson(request_table), response_path, function(id, status, p1, p2) if stop_downloading_4 then stop_downloading_4 = false download_id_4 = nil return false end if status == dlstatus.STATUS_ENDDOWNLOADDATA then down = true download_id_4 = nil end if status == dlstatus.STATUSEX_ENDDOWNLOAD then wait_for_response = false download_id_4 = nil end end ) while wait_for_response do wait(10) end processing_response = true if down and doesFileExist(response_path) then local f = io.open(response_path, "r") if f then local fileText = f:read("*a") if fileText ~= nil and #fileText > 0 then try(function() info = decodeJson(fileText) end, function(e) sampfuncsLog(fileText) sampAddChatMessage("[TruckHUD]: Ошибочный ответ сервера!",-1) info = nil end) if info == nil then print("{ff0000}[" .. string.upper(thisScript().name) .. "]: Был получен некорректный ответ от сервера.") else if download_call == 0 then if request_table["info"]["solo_message"]["name"] == solo_message_send.name then clearSoloMessage() end transponder_delay = info.delay response_timestamp = info.timestamp if info.base ~= nil then transponder_solo_message(info) base = info.base error_message('2', '') local minKD = 1000000 local dialogText = 'Имя[ID]\tСкилл\tФура/Груз\tНапарник\n' local tmonitor = {} for k,v in pairs(base) do if v.pair_mode_name == myname then if new_pair[k] == nil then if sampIsPlayerConnected(v.id) and sampGetPlayerNickname(v.id) == k then new_pair[k] = true sampAddChatMessage('TruckHUD: Игрок '..k..'['..v.id..'] добавил Вас в режим пары.', -1) if pair_mode_id ~= v.id then sampAddChatMessage('TruckHUD: Нажмите {e63939}"G"{FFFFFF} чтобы принять его в напарники.', -1) pair_yes = { time = os.time(), id = v.id } end end end end if new_pair[k] ~= nil and v.pair_mode_name ~= myname then sampAddChatMessage('TruckHUD: Игрок '..k..'['..v.id..'] убрал Вас из режима пары.', -1) new_pair[k] = nil end if inifiles.blacklist[k] == nil then inifiles.blacklist[k] = false end if (not inifiles.Settings.blacklist_inversion and inifiles.blacklist[k] == false) or (inifiles.Settings.blacklist_inversion and inifiles.blacklist[k] == true) then if v.tmonitor ~= nil and v.tmonitor.lsn ~= nil and tonumber(v.tmonitor.lsn) ~= 0 then local monKD = msk_timestamp - v.tmonitor.time if monKD > 0 then if monKD < minKD then minKD = monKD tmonitor = v.tmonitor end end end end end if minKD ~= 1000000 then if mon_ctime < tmonitor.time then mon_time = tmonitor.time for k, v in pairs(prices_mon) do if tmonitor[k] ~= nil then prices_mon[k] = tmonitor[k] end end end end end if info.result == "para" then error_message('2', '') pair_timestamp = info.data.timestamp base[pair_mode_name].pos = { x = info.data.x, y = info.data.y, z = info.data.z } base[pair_mode_name].heading = info.data.heading pair_table = base[pair_mode_name] pair_status = 200 if para_message_send == nil then para_message_send = 1 sampAddChatMessage("Установлен напарник "..pair_mode_name.."["..pair_mode_id.."]"..". Теперь вы можете пользоваться картой.", -1) sampAddChatMessage(string.format("Активация в фуре: %s. Без фуры: %s + %s.", inifiles.Settings.Key3:gsub("VK_", ""), inifiles.Settings.Key3:gsub("VK_", ""), inifiles.Settings.Key2:gsub("VK_", "")), -1) end elseif info.result == "error" then if info.reason ~= nil then if info.reason == 403 then error_message('2', '') pair_status = info.reason error_message('1', pair_mode_name.."["..pair_mode_id.."] пока не установил Вас напарником в своем TruckHUD.") elseif info.reason == 404 then error_message('2', '') pair_status = info.reason error_message('1', pair_mode_name.."["..pair_mode_id.."] не найден в базе игроков TruckHUD") elseif info.reason == 425 then error_message('2', 'Слишком частые запросы на хостинг. Разберитесь с этим или обратитесь за помощью в группу vk.com/rubin.mods') end end end end wait_for_response = false info = nil end end fileText = nil f:close() f = nil end else error_message('2', 'Не получил ответа от хостинга. Найдите причину с помощью /truck server_help или напишите о проблеме в группу vk.com/rubin.mods.') end if doesFileExist(response_path) then os.remove(response_path) end request_table = nil processing_response = false end end end end function fix_l(symbol, cargo_msg) if symbol == "l" then if cargo_msg == "lsn" or cargo_msg == "lsy" then return false end end return true end solo_antiflood_message = {} function transponder_solo_message(info) if info.solo_data ~= nil then for sender, solo_data in pairs(info.solo_data) do if (inifiles.blacklist[sender] ~= nil and not inifiles.blacklist[sender]) and info.timestamp - solo_data.time < 5 and getNameById(tonumber(solo_data.id)) == solo_data.name then if solo_data_antiflood[sender] == nil then solo_data_antiflood[sender] = {} end local result_find = false -- Отклонить показ сообщения local check_label = { "id", "name", "action", "cargo" } local cargo_symbol = (inifiles.Settings.luCheckerCargo == 1 and "n" or (inifiles.Settings.luCheckerCargo == 2 and "y" or (inifiles.Settings.luCheckerCargo == 3 and "l" or ""))) if cargo_symbol ~= "" or inifiles.Settings.luCheckerCargo == 4 then if (solo_data["cargo"]:find(cargo_symbol) and fix_l(cargo_symbol, solo_data["cargo"])) or inifiles.Settings.luCheckerCargo == 4 then for i = 1, #solo_data_antiflood[sender] do -- Поиск дубликата local counter = 0 for s = 1, #check_label do if solo_data[s] == solo_data_antiflood[sender][i][s] then counter = counter + 1 end end if counter == 4 and os.time() - solo_data_antiflood[sender][i]["antiflood"] < 10 then result_find = true break else if af_say == nil then af_say = {} end local key = string.format("%s%s", solo_data_antiflood[sender][i]["name"], solo_data_antiflood[sender][i]["time"]) if af_say[key] == nil then af_say[key] = true end end end if not result_find then if texts_of_reports[solo_data["cargo"]] ~= nil then local text1 = string.format("%s[%s] %s %s.", solo_data.name, solo_data.id, (solo_data.action == "load" and "загрузился на" or "разгрузил"), texts_of_reports[solo_data["cargo"]]) local text = string.format("%s Отправил: %s", text1, sender) if solo_antiflood_message[text1] == nil or (os.time() - solo_antiflood_message[text1] > 3) then solo_antiflood_message[text1] = os.time() addChatMessage(text) end end end solo_data_antiflood[sender][#solo_data_antiflood[sender]+1] = solo_data solo_data_antiflood[sender][#solo_data_antiflood[sender]]["antiflood"] = os.time() end end end end end end function error_message(key, text) if text ~= '' then if error_array[key] == nil then error_array[key] = true sampAddChatMessage(text, -1) end else if error_array[key] ~= nil then if key == '2' or key == '3' then sampAddChatMessage('Связь с сервером TruckHUD возобновлена.', -1) end error_array[key] = nil end end end function count_next() local count = (transponder_delay - (os.clock() * 1000 - delay_start * 1000)) / 1000 if count >= 0 then return string.format("%0.3fс", count) elseif wait_for_response then return "Ожидание ответа" -- WAITING FOR RESPONSE elseif processing_response then return "Обработка ответа" -- PROCESSING RESPONSE else return "Выполнение запроса" -- PERFOMING REQUEST end end function dn(nam) file = getGameDirectory() .. "\\moonloader\\resource\\TruckHUD\\" .. nam if not doesFileExist(file) then downloadUrlToFile( "http://th.deadpoo.net/download/" .. nam, file ) end end function init() if not doesDirectoryExist(getGameDirectory() .. "\\moonloader\\resource") then createDirectory(getGameDirectory() .. "\\moonloader\\resource") end if not doesDirectoryExist(getGameDirectory() .. "\\moonloader\\resource\\TruckHUD") then createDirectory(getGameDirectory() .. "\\moonloader\\resource\\TruckHUD") end dn("truck.png") dn("pla.png") dn("map.png") player = renderLoadTextureFromFile(getGameDirectory() .. "/moonloader/resource/TruckHUD/pla.png") truck = renderLoadTextureFromFile(getGameDirectory() .. "/moonloader/resource/TruckHUD/truck.png") map = renderLoadTextureFromFile(getGameDirectory() .. "/moonloader/resource/TruckHUD/map.png") font10 = renderCreateFont("Segoe UI", 10, 13) resX, resY = getScreenResolution() if resX > 1024 and resY >= 1024 then bX = (resX - 1024) / 2 bY = (resY - 1024) / 2 size = 1024 iconsize = 32 elseif resX > 720 and resY >= 720 then bX = (resX - 720) / 2 bY = (resY - 720) / 2 size = 720 iconsize = 24 else bX = (resX - 512) / 2 bY = (resY - 512) / 2 size = 512 iconsize = 16 end end function fastmap() init() dialogActiveClock = os.time() while true do wait(0) if inifiles.Settings.transponder and inifiles.Settings.fastmap then if sampIsDialogActive() then dialogActiveClock = os.time() end if pair_mode and pair_status == 200 and not sampIsDialogActive() and (os.time() - dialogActiveClock) > 1 and not sampIsScoreboardOpen() and not isSampfuncsConsoleActive() and ( (isKeyDown(vkeys[inifiles.Settings.Key3]) and isKeyDown(vkeys[inifiles.Settings.Key2]) or (isTruckCar() and isKeyDown(vkeys[inifiles.Settings.Key3])))) then fastmapshow = true local x, y = getCharCoordinates(playerPed) renderDrawTexture(map, bX, bY, size, size, 0, 0xFFFFFFFF) if isTruckCar() then renderDrawTexture( truck, getX(x), getY(y), iconsize, iconsize, -getCharHeading(playerPed) + 90, -1 ) else renderDrawTexture( player, getX(x), getY(y), iconsize, iconsize, -getCharHeading(playerPed), -1 ) end if pair_table ~= nil and pair_table["pos"] ~= nil and pair_table["pos"]["x"] ~= nil then color = 0xFFdedbd2 if pair_table["is_truck"] then renderDrawTexture(truck, getX(pair_table["pos"]["x"]), getY(pair_table["pos"]["y"]), iconsize, iconsize, -pair_table["heading"] + 90, -1 ) else renderDrawTexture(player, getX(pair_table["pos"]["x"]), getY(pair_table["pos"]["y"]), iconsize, iconsize, -pair_table["heading"], -1 ) end end else fastmapshow = nil end end end end function getX(x) x = math.floor(x + 3000) return bX + x * (size / 6000) - iconsize / 2 end function getY(y) y = math.floor(y * -1 + 3000) return bY + y * (size / 6000) - iconsize / 2 end function onScriptTerminate(LuaScript, quitGame) if LuaScript == thisScript() then stop_downloading_1 = true stop_downloading_2 = true stop_downloading_3 = true stop_downloading_4 = true stop_downloading_5 = true for k, v in pairs(pickupLoad) do if v.pickup ~= nil then if doesPickupExist(v.pickup) then removePickup(v.pickup) v.pickup = nil end end end delete_all__3dTextplayers() removeBlip(pttBlip) if sampIs3dTextDefined(ptt3dText) then sampDestroy3dText(ptt3dText) end deleteActor(999) end end function get_time() _time = os.time() if inifiles.Settings.transponder then local adress = os.getenv('TEMP')..'\\truck-timestamp' local url = 'http://th.deadpoo.net/timestamp' downloadUrlToFile(url, adress, function(id, status, p1, p2) if status == dlstatus.STATUSEX_ENDDOWNLOAD then if doesFileExist(adress) then local f = io.open(adress, 'r') if f then local time = f:read('*a') msk_timestamp = tonumber(time) f:close() os.remove(adress) else msk_timestamp = os.time() sampAddChatMessage('TruckHUD: Ошибка получения точного времени. Используется локальное.', -1) end end end if status == 58 then if msk_timestamp == 0 then msk_timestamp = os.time() sampAddChatMessage('TruckHUD: Ошибка получения точного времени. Используется локальное.', -1) end end end) else msk_timestamp = os.time() sampAddChatMessage('TruckHUD: Ошибка получения точного времени. Используется локальное.', -1) end repeat wait(0) until msk_timestamp > 0 while true do wait(500) msk_timestamp = msk_timestamp + (os.time() - _time) _time = os.time() if inifiles.Settings.AutoClear then collectgarbage("step") end end end function split(str, delim, plain) local tokens, pos, plain = {}, 1, not (plain == false) --[[ delimiter is plain text by default ]] repeat local npos, epos = string.find(str, delim, pos, plain) table.insert(tokens, string.sub(str, pos, npos and npos - 1)) pos = epos and epos + 1 until not pos return tokens end function showUsers() local dialogText = 'Имя[ID] AFK\tВерсия скрипта\n' local trucker_count = 0 local _, myid = sampGetPlayerIdByCharHandle(PLAYER_PED) for k,v in pairs(base) do if v.pair_mode_name ~= nil and v.is_truck ~= nil and v.gruz ~= nil and v.skill ~= nil and v.id ~= nil and v.paraid ~= nil and v.timer ~= nil and v.tmonitor ~= nil then if (sampIsPlayerConnected(v.id) or myid == v.id) and sampGetPlayerNickname(v.id) == k then trucker_count = trucker_count + 1 local afk = math.ceil(msk_timestamp - v.timestamp) dialogText = string.format('%s%s[%s] %s\t%s\n', dialogText, k, v.id, (afk > 10 and '[AFK: '..afk..']' or ''), (v.version ~= nil and v.version or "Неизвестно")) end end end sampShowDialog(0, 'Дальнобойщики со скриптом в сети: '..trucker_count, (#dialogText == 0 and 'Список пуст' or dialogText), 'Выбрать', 'Закрыть', 5) end function showTruckers() local dialogText = 'Имя[ID] AFK\tСкилл / Ранг\tФура / Груз\tНапарник\n' local trucker_count = 0 local _, myid = sampGetPlayerIdByCharHandle(PLAYER_PED) for k,v in pairs(base) do if v.pair_mode_name ~= nil and v.is_truck ~= nil and v.gruz ~= nil and v.skill ~= nil and v.id ~= nil and v.paraid ~= nil and v.timer ~= nil and v.tmonitor ~= nil then if (sampIsPlayerConnected(v.id) or myid == v.id) and sampGetPlayerNickname(v.id) == k then trucker_count = trucker_count + 1 local afk = math.ceil(msk_timestamp - v.timestamp) local platinum = "" if v.platinum then platinum = "[VIP] " end dialogText = string.format('%s%s%s[%s] %s\t%s / %s\t%s\t%s\n', dialogText, platinum, k, v.id, (afk > 10 and '[AFK: '..afk..']' or ''), v.skill, v.rank, ( (v.is_truck and 'Да ' or 'Нет ')..(v.gruz == 0 and '/ Нет' or (v.gruz == 1 and '/ Нефть' or (v.gruz == 2 and '/ Уголь' or (v.gruz == 3 and '/ Дерево' or '/ Нет')))) ), ( v.pair_mode_name == '____' and 'Нет' or v.pair_mode_name..'['..v.paraid..']')) end end end sampShowDialog(0, 'Дальнобойщики со скриптом в сети: '..trucker_count, (#dialogText == 0 and 'Список пуст' or dialogText), 'Выбрать', 'Закрыть', 5) end function renderTruckers() font_t = renderCreateFont(inifiles.Render.FontName, inifiles.Render.FontSize, inifiles.Render.FontFlag) _3dTextplayers = {} while true do wait(0) if script_run and inifiles.Settings.TruckRender then for id = 0, 999 do if sampIsPlayerConnected(id) then local nickname = sampGetPlayerNickname(id) if base[nickname] ~= nil then local stream, ped = sampGetCharHandleBySampPlayerId(id) if stream then if (isCharInModel(ped, 403) or isCharInModel(ped, 514) or isCharInModel(ped, 515)) then sec_timer = (base[nickname].platinum and 120 or 180) local car = storeCarCharIsInNoSave(ped) local result, idcar = sampGetVehicleIdByCarHandle(car) if _3dTextplayers[id] == nil and result then _3dTextplayers[id] = sampCreate3dText(' ', -1, 0.0, 0.0, 0.0, 30.0, false, -1, idcar) end if _3dTextplayers[id] ~= nil and result then local timer_player = sec_timer - (base[nickname].timer > 1000 and os.difftime(msk_timestamp, base[nickname].timer) or (sec_timer+1)) local color = (timer_player <= 0 and inifiles.Render.Color2 or (timer_player <= 10 and 'b50000' or inifiles.Render.Color2)) local kd_player = (timer_player > 0 and string.format('{%s}<< {%s}%d:%02d {%s}>>', inifiles.Render.Color1, color, math.floor(timer_player / 60), timer_player % 60, inifiles.Render.Color1) or string.format('{%s}<< {%s}0:00 {%s}>>', inifiles.Render.Color1, inifiles.Render.Color2, inifiles.Render.Color1) ) local gruz_player = string.format('{%s}%s', inifiles.Render.Color2, (base[nickname].gruz == 0 and 'Нет груза' or (base[nickname].gruz == 1 and 'Нефть' or (base[nickname].gruz == 2 and 'Уголь' or (base[nickname].gruz == 3 and 'Дерево' or 'Нет')))) ) local para_player = string.format('{%s}%s', inifiles.Render.Color2, (base[nickname].pair_mode_name ~= '____' and base[nickname].pair_mode_name..'['..base[nickname].paraid..']' or 'Нет напарника') ) local pair_kd = '' if base[nickname].pair_mode_name ~= '____' and base[base[nickname].pair_mode_name] ~= nil then local timer_d = sec_timer - (base[base[nickname].pair_mode_name].timer > 1000 and os.difftime(msk_timestamp, base[base[nickname].pair_mode_name].timer) or (sec_timer+1)) local color = (timer_d <= 0 and inifiles.Render.Color2 or (timer_d <= 10 and 'b50000' or inifiles.Render.Color2)) pair_kd = string.format('(%s{%s})', (timer_d > 0 and string.format('{%s}%d:%02d', color, math.floor(timer_d / 60), timer_d % 60) or string.format('{%s}0:00', inifiles.Render.Color2)), inifiles.Render.Color2) end sampSet3dTextString(_3dTextplayers[id], string.format('%s\n%s\n%s %s', kd_player, gruz_player, para_player, pair_kd)) end if not result and _3dTextplayers[id] ~= nil then sampDestroy3dText(_3dTextplayers[id]) _3dTextplayers[id] = nil end else if _3dTextplayers[id] ~= nil then sampDestroy3dText(_3dTextplayers[id]) _3dTextplayers[id] = nil end end else if _3dTextplayers[id] ~= nil then sampDestroy3dText(_3dTextplayers[id]) _3dTextplayers[id] = nil end end end else if _3dTextplayers[id] ~= nil then sampDestroy3dText(_3dTextplayers[id]) _3dTextplayers[id] = nil end end end else delete_all__3dTextplayers() end end end function delete_all__3dTextplayers() for k, v in pairs(_3dTextplayers) do sampDestroy3dText(_3dTextplayers[k]) _3dTextplayers[k] = nil end end --->>> function loadPtt() pttCreate = false pttManStatus = false pttTime = 0 ptt3dText = 0 pttBlip = 0 pttStatus = 1 pttArr = { [1] = { skins = { 63, 64, 85, 87, 152, 178, 207, 237, 238, 243, 244, 245, 246, 256, 257 }, names = { "Rachel", "Sara", "Cindy", "Clover", "Cleo", "Lisa", "Melissa", "Jessica", "Samantha", "Susan", "Rose", "April", "Ashley", "Amelia", "Emily", "Angela", "Annabel", "Abby", "Abigail", "Elise", "Milly", "Stacey", "Gloria", "Courtney", "Patricia", "Penelope" }, message = { "А вот и король дорог приехал", "Разгрузил тележку? Потанцуй со мной", "От тебя воняет бензином, фии", "Руками не трогать", "Отойди на 3 метра, противный", "Иди ко мне, мой тигр!", "Я сейчас тебе покажу такое, чего ты никогда не видел в жизни", "Ну иди сюда, ты заслужил", "Хочешь поразвлекаться?", "Я могу поднять твое настроение, если ты понимаешь о чем я", "Первый час бесплатно, за второй ты еще не отработал", "Хочеть выпить кофе со мной?", "К тебе или ко мне?" } }, -- shluxi [2] = { skins = { 10, 39, 53, 54, 75, 77, 88, 89, 129, 130, 196, 197, 199, 218, 231, 232 }, names = { "Rachel", "Sara", "Cindy", "Clover", "Cleo", "Lisa", "Melissa", "Jessica", "Samantha", "Susan", "Rose", "April", "Ashley", "Amelia", "Emily", "Angela", "Annabel", "Abby", "Abigail", "Elise", "Milly", "Stacey", "Gloria", "Courtney", "Patricia", "Penelope" }, message = { "Ээх, встряхнем стариной", "Давай танцуй внучок", "Деньги только крупными купюрами, все таки пенсия понимаешь", "Бутылочку от пива не выбрасывай", "И что как работа, внучок? Платят хоть?", "Иди ко мне, мой тигр!", "Иди сюда, мой милый, не бойся", "До тебя пол страны обслужила, а все такая же красивая", "Как говорится \"В 45 - баба ягодка опять\"", "Можешь оплатить пустыми банками", "Ты прям как мой внучек, такой же стеснительный", "Трахни меня, я тебе заплачу", "Да ты не пугайся, я просто не накрашена" } }, -- bomjixi [3] = { skins = { 78, 79, 134, 135, 136, 137, 160, 162, 200, 212, 213, 230, 239 }, names = { "Ivan", "Vanya", "Dmitry", "Dima", "Mikhail", "Vladimir", "Vova", "Evgeny", "Zhenya", "Alexei", "Lyosha", "Slava" }, anim = { { "VENDING", "VEND_EAT1_P" }, { "ATTRACTORS", "STEPSIT_LOOP" }, { "BAR", "DNK_STNDF_LOOP" }, { "BASEBALL", "BAT_BLOCK" }, { "BD_FIRE", "BD_PANIC_01" }, { "BENCHPRESS", "GYM_BP_CELEBRATE" }, { "FREEWEIGHTS", "GYM_FREE_CELEBRATE" } }, message = { "Ну ты и долгий, я ее уже во все щели отымел пока ты полз на своем корыте", "У твоей бабочки отвалились крылышки", "Садись в свое корыто и вали отсюда", "Свободен!", "Шо, и тебе колено прострелить?", "Если ты ищешь даму своего сердца, то ты опоздал", "Ищешь кого-то? Тут ты никого не найдешь", "А ты что тут забыл?", "Ты потерялся? Показать дорогу нахуй?", "Я конечно не баба, но можно попробовать" } } -- bomji } pttAnim = { "PLY_CASH", "PUN_CASH", "PUN_HOLLER", "PUN_LOOP", "strip_A", "strip_B", "strip_C", "strip_D", "strip_E", "strip_F", "strip_G", "STR_A2B", "STR_B2C", "STR_C1", "STR_C2", "STR_Loop_A", "STR_Loop_B", "STR_Loop_C"} pttCoord = { { { 2329.87, -2315.49, 13.55, 129.32 }, { 2281.67, -2364.62, 13.55, 316.15 }, { 2506.76, -2205.70, 13.55, 94.71 }, { 2380.22, -2265.17, 13.55, 312.31 }, { 2364.69, -2285.37, 14.31, 295.64 } }, { { -1742.690918, 36.748432, 3.554688, 90.169365 }, { -1811.328369, -135.691116, 6.141476, 271.798401 }, { -1722.343262, -117.837288, 3.548919, 119.073662 }, { -1862.199219, -144.499191, 11.898438, 12.920449 }, { -1712.599976, -65.256927, 3.554688, 95.030235 } } } end function pttStart() if not pttCreate then pttCreate = true pttMessage = false math.randomseed(os.time()) pttStatus = (math.random(1, 5) == 3 and 2 or 1) local x, y, z = getCharCoordinates(PLAYER_PED) local dist_portLS = getDistanceBetweenCoords3d(x, y, z, 2507.02, -2234.05, 13.55) local dist_portSF = getDistanceBetweenCoords3d(x, y, z, -1733.18, 120.08, 3.11) local pttPos = (dist_portLS < dist_portSF and 1 or 2) local randPos = math.random(1, #pttCoord[pttPos]) pttX, pttY, pttZ, pttHeading = pttCoord[pttPos][randPos][1], pttCoord[pttPos][randPos][2], pttCoord[pttPos][randPos][3], pttCoord[pttPos][randPos][4] createActor(999, pttArr[pttStatus].skins[math.random(1, #pttArr[pttStatus].skins)], pttX, pttY, pttZ + 0.5, pttHeading, 100.0) animActor(999, "STRIP", pttAnim[math.random(1, #pttAnim)], 4.1, 0, 0, 0, 0, 0) pttName = pttArr[pttStatus].names[math.random(1, #pttArr[pttStatus].names)] create3DtextPtt(pttName, pttX, pttY, pttZ) pttTime = os.time() local text = string.format(" SMS: %s ждёт Вас! Дистанция: %0.2d м. Отправитель: Prostitute_Radar", pttName, getDistanceBetweenCoords3d(x, y, z, pttX, pttY, pttZ)) sampAddChatMessage(text, 0xFFFFFF00) removeBlip(pttBlip) pttBlip = addBlipForCoord(pttX, pttY, pttZ) changeBlipScale(pttBlip, 1) changeBlipColour(pttBlip, 0xFFFFFFFF) end end function pttCMD(param) pttStart() end function doPtt() if pttCreate and pttX ~= nil then local x, y, z = getCharCoordinates(PLAYER_PED) local dist = getDistanceBetweenCoords3d(x, y, z, pttX, pttY, pttZ) if dist < 10.0 then pttTime = 0 if pttBlip ~= 0 then removeBlip(pttBlip) pttBlip = 0 end if wasKeyPressed(vkeys["VK_H"]) then if pttStatus ~= 3 then anim = pttAnim[math.random(1, #pttAnim)] animActor(999, "STRIP", anim, 4.1, 0, 0, 0, 0, 0) else local rands = math.random(1, #pttArr[pttStatus].anim) animActor(999, pttArr[pttStatus].anim[rands][1], pttArr[pttStatus].anim[rands][2], 4.1, 0, 0, 0, 0, 0) end local rands = math.random(1, #pttArr[pttStatus].message) local text = pttArr[pttStatus].message[rands] if not pttMessage then pttMessage = true sampAddChatMessage(string.format("- %s: %s", pttName, text), 0xFFC8C8C8) end end elseif dist > 1000 and os.time() - pttTime > 180 then if pttBlip ~= 0 then removeBlip(pttBlip) pttBlip = 0 end end if pttTime ~= 0 and os.time() - pttTime > 60 and pttStatus ~= 3 then pttStatus = 3 createActor(999, pttArr[pttStatus].skins[math.random(1, #pttArr[pttStatus].skins)], pttX, pttY, pttZ, pttHeading, 100.0) pttName = pttArr[pttStatus].names[math.random(1, #pttArr[pttStatus].names)] create3DtextPtt(pttName, pttX, pttY, pttZ) local text = string.format(" SMS: Слишком долго. Отправитель: Prostitute_Radar") sampAddChatMessage(text, 0xFFFFFF00) end if dist < 100 then if afptt == nil or os.time() - afptt > 3 then afptt = os.time() setActorPos(999, pttX, pttY, pttZ) end end end end function createActor(actorId, skinId, x, y, z, rotation, health) deleteActor(actorId) local bs = raknetNewBitStream() raknetBitStreamWriteInt16(bs,actorId) -- actorId raknetBitStreamWriteInt32(bs,skinId) -- skinId raknetBitStreamWriteFloat(bs,x) -- PosX raknetBitStreamWriteFloat(bs,y) -- PosY raknetBitStreamWriteFloat(bs,z) -- PosZ raknetBitStreamWriteFloat(bs,rotation) -- rotation raknetBitStreamWriteFloat(bs,health) -- health raknetEmulRpcReceiveBitStream(171,bs) raknetDeleteBitStream(bs) end function clearAnimActor(actorId) local bs = raknetNewBitStream() raknetBitStreamWriteInt16(bs,actorId) raknetEmulRpcReceiveBitStream(174,bs) raknetDeleteBitStream(bs) end function animActor(actorId, animLib, animName, frameDelta, loop, lockX, lockY, freeze, time) clearAnimActor(actorId) local bs = raknetNewBitStream() raknetBitStreamWriteInt16(bs,actorId) raknetBitStreamWriteInt8(bs, #animLib) raknetBitStreamWriteString(bs, animLib) raknetBitStreamWriteInt8(bs, #animName) raknetBitStreamWriteString(bs, animName) raknetBitStreamWriteFloat(bs,frameDelta) raknetBitStreamWriteBool(bs,loop) raknetBitStreamWriteBool(bs,lockX) raknetBitStreamWriteBool(bs,lockY) raknetBitStreamWriteBool(bs,freeze) raknetBitStreamWriteInt32(bs,time) raknetEmulRpcReceiveBitStream(173,bs) raknetDeleteBitStream(bs) end function deleteActor(actorId) local bs = raknetNewBitStream() raknetBitStreamWriteInt16(bs,actorId) raknetEmulRpcReceiveBitStream(172,bs) raknetDeleteBitStream(bs) end function setActorPos(actorId, x, y, z) local bs = raknetNewBitStream() raknetBitStreamWriteInt16(bs,actorId) raknetBitStreamWriteFloat(bs,x) raknetBitStreamWriteFloat(bs,y) raknetBitStreamWriteFloat(bs,z) raknetEmulRpcReceiveBitStream(176,bs) raknetDeleteBitStream(bs) end function create3DtextPtt(text, x, y, z) sampDestroy3dText(ptt3dText) text = text.."\n\n\n\n\n\n\n\n\n\n\n\n{028c00}PRESS 'H'" ptt3dText = sampCreate3dText(text, 0xFFFFFFFF, x, y, z + 1.0, 8.0, true, -1, -1) end function pttModule() if pttMax == nil then math.randomseed(os.time()) pttMax = math.random(11, 20) pttCount = 0 end pttCount = pttCount + 1 if pttCount ~= -1 and pttCount >= pttMax then pttCount = -1 pttStart() end end --> LOAD & UNLOAD CHECKER luChecker = { vehicles = {}, truckers = {}, -- Игроки не в скрипте price_set = {}, trailer_delete = {}, load_position = { x = 0.0, y = 0.0, z = 0.0 } } --[[ разгрузил эвент сменился 3д текст эвент разгрузил эвент сменился 3д текст эвент ]] function isPlayerHaveTruckHUD(playerId) local result = false for k,v in pairs(base) do if v.id == playerId then result = true break end end return result end function isVehicleTruckersDelete(table, vehicleId) local result = false local playerId = -1 local isTrailer = false for k,v in pairs(table) do if v["trailerData"] ~= nil and v["trailerData"].trailerId == vehicleId then result = true playerId = k isTrailer = true break end if v.vehicleId == vehicleId then result = true playerId = k break end end return result, playerId, isTrailer end function luChecker.vehicleStream(stream, vehicleId, data) if stream then luChecker.vehicles[vehicleId] = {} luChecker.vehicles[vehicleId]["type"] = data["type"] else local result, playerId, isTrailer = isVehicleTruckersDelete(luChecker.truckers, vehicleId) if result then if isTrailer then luChecker.trailer_delete[#luChecker.trailer_delete + 1] = { time = os.clock() * 1000, playerId = playerId, position = luChecker.truckers[playerId]["data"]["position"] } luChecker.truckers[playerId]["trailerData"] = { trailerId = -1 } else luChecker.truckers[playerId] = nil end end luChecker.vehicles[vehicleId] = nil end end function luChecker.vehicleSync(playerId, vehicleId, data) if luChecker.vehicles[vehicleId] ~= nil and not isPlayerHaveTruckHUD(playerId) then if luChecker.vehicles[vehicleId] ~= nil and (luChecker.vehicles[vehicleId].type == 403 or luChecker.vehicles[vehicleId].type == 514 or luChecker.vehicles[vehicleId].type == 515) then if luChecker.truckers[playerId] == nil then luChecker.truckers[playerId] = {} luChecker.truckers[playerId]["data"] = {} luChecker.truckers[playerId]["data"]["position"] = data["position"] luChecker.truckers[playerId]["vehicleId"] = vehicleId luChecker.truckers[playerId]["vehicleDataTime"] = os.time() luChecker.truckers[playerId]["trailerDataTime"] = 0 luChecker.truckers[playerId]["trailerData"] = { trailerId = -1 } else luChecker.truckers[playerId]["data"] = {} luChecker.truckers[playerId]["data"]["position"] = data["position"] luChecker.truckers[playerId]["vehicleId"] = vehicleId if os.time() - luChecker.truckers[playerId]["trailerDataTime"] > 5 and os.time() - luChecker.truckers[playerId]["vehicleDataTime"] < 5 and os.time() - live == 0 then luChecker.truckers[playerId]["trailerData"]["trailerId"] = -1 end luChecker.truckers[playerId]["vehicleDataTime"] = os.time() end end end end function luChecker.trailerSync(playerId, data) if not isPlayerHaveTruckHUD(playerId) and luChecker.truckers[playerId] ~= nil then if luChecker.vehicles[data["trailerId"]] ~= nil then luChecker.truckers[playerId]["trailerDataTime"] = os.time() luChecker.checkerLoad(playerId, data, luChecker.truckers[playerId]["data"]["position"]) luChecker.truckers[playerId]["trailerData"]["trailerId"] = data["trailerId"] end end end function luChecker.checkerLoad(playerId, data, position) -- Проверка когда игрок получил груз if luChecker.truckers[playerId]["trailerData"]["trailerId"] ~= data["trailerId"] then if getLocalPlayerId() ~= playerId then local trucker_x, trucker_y, trucker_z = position.x, position.y, position.z local key, x, y, z = getKeysPoint(trucker_x, trucker_y, trucker_z) local cargoNow = (key:find("n") and 1 or (key:find("y") and 2 or (key:find("l") and 3 or 0))) local local_x, local_y, local_z = getCharCoordinates(PLAYER_PED) local dist_localPlayer_storage = getDistanceBetweenCoords3d(local_x, local_y, local_z, x, y, z) local dist_trucker_storage = getDistanceBetweenCoords3d(trucker_x, trucker_y, trucker_z, x, y, z) if dist_localPlayer_storage <= 120.0 and dist_trucker_storage <= 50.0 then solo_message_send = { name = getNameById(playerId), id = playerId, action = "load", cargo = key, time = os.time() } end end end end function luChecker.set3Dtext(type, data_old, data, position) if type == "Порт" then for key = 1, 3 do if tonumber(data_old[key]) ~= 0 and not (tonumber(data_old[key]) == tonumber(data[1])) then if tonumber(data_old[key]) > tonumber(data[key]) then luChecker.price_set[#luChecker.price_set + 1] = { type = "unload", old_price = tonumber(data_old[key]), new_price = tonumber(data[key]), time = os.clock() * 1000, position = position, key = key } end end end elseif type == "Склад" then local cargoName = data[2] local cargoId = (cargoName:find("n") and 1 or (cargoName:find("y") and 2 or (cargoName:find("l") and 3 or 0))) if cargoId ~= 0 then luChecker.load_position = { x = position.x, y = position.y, z = position.z } end end end function luChecker.checker() while true do wait(0) clear_old_value("price_set") clear_old_value("trailer_delete") if luChecker.price_set[1] ~= nil and luChecker.trailer_delete[1] ~= nil then playerId = luChecker.trailer_delete[1].playerId old_price = luChecker.price_set[1].old_price new_price = luChecker.price_set[1].new_price position_3dtext = luChecker.price_set[1].position position_trailer = luChecker.trailer_delete[1].position if getLocalPlayerId() ~= playerId then local dist = getDistanceBetweenCoords3d(position_3dtext.x,position_3dtext.y,position_3dtext.z,position_trailer.x,position_trailer.y,position_trailer.z) if dist < 50 then local key = getPort(position_trailer.x,position_trailer.y,position_trailer.z) key = key..cargo_replace[luChecker.price_set[1].key] solo_message_send = { name = getNameById(playerId), id = playerId, action = "unload", cargo = key, time = os.time() } end end table.remove(luChecker.trailer_delete, 1) table.remove(luChecker.price_set, 1) end end end -- platinum function platinum_check() if inifiles.platinum.status and inifiles.platinum.time < os.time() then addChatMessage("'Platinum VIP' закончился. Теперь у Вас кд сново 3 минуты") inifiles.platinum.status = false settings_save() end end function getLocalPlayerId() return select(2,sampGetPlayerIdByCharHandle(PLAYER_PED)) end function getNameById(i) local name = "" if sampIsPlayerConnected(i) or i == select(2,sampGetPlayerIdByCharHandle(PLAYER_PED)) then name = sampGetPlayerNickname(i) end return name end function clear_old_value(key) local delete = {} for i = 1, #luChecker[key] do if os.clock() * 1000 - luChecker[key][i].time > 500 then delete[#delete+1] = i end end for i = 1, #delete do table.remove(luChecker[key], delete[i]) end end function getKeysPoint(x, y, z) local minDist, minResult = 1000000, "" local resX, resY, resZ = 0.0, 0.0, 0.0 for name, cord in pairs(location_keys) do if not name:find("ls") and not name:find("sf") then local distance = getDistanceBetweenCoords3d(x, y, z, cord.x, cord.y, cord.z) if distance < minDist then minDist = distance minResult = name resX, resY, resZ = cord.x, cord.y, cord.z end end end return minResult, resX, resY, resZ end function getPort(x, y, z) local coords = { ["ls"] = {x = 2507.02, y = -2234.05, z = 13.55}, ["sf"] = {x = -1731.5022, y = 118.8936, z = 3.5547} } local minDist, minResult = 1000000, "" local resX, resY, resZ = 0.0, 0.0, 0.0 for name, cord in pairs(coords) do local distance = getDistanceBetweenCoords3d(x, y, z, cord.x, cord.y, cord.z) if distance < minDist then minDist = distance minResult = name resX, resY, resZ = cord.x, cord.y, cord.z end end return minResult, resX, resY, resZ end function samp_create_sync_data(sync_type, copy_from_player) local ffi = require "ffi" local sampfuncs = require "sampfuncs" local raknet = require "samp.raknet" copy_from_player = copy_from_player or true local sync_traits = { player = {"PlayerSyncData", raknet.PACKET.PLAYER_SYNC, sampStorePlayerOnfootData}, vehicle = {"VehicleSyncData", raknet.PACKET.VEHICLE_SYNC, sampStorePlayerIncarData}, passenger = {"PassengerSyncData", raknet.PACKET.PASSENGER_SYNC, sampStorePlayerPassengerData}, aim = {"AimSyncData", raknet.PACKET.AIM_SYNC, sampStorePlayerAimData}, trailer = {"TrailerSyncData", raknet.PACKET.TRAILER_SYNC, sampStorePlayerTrailerData}, unoccupied = {"UnoccupiedSyncData", raknet.PACKET.UNOCCUPIED_SYNC, nil}, bullet = {"BulletSyncData", raknet.PACKET.BULLET_SYNC, nil}, spectator = {"SpectatorSyncData", raknet.PACKET.SPECTATOR_SYNC, nil} } local sync_info = sync_traits[sync_type] local data_type = "struct " .. sync_info[1] local data = ffi.new(data_type, {}) local raw_data_ptr = tonumber(ffi.cast("uintptr_t", ffi.new(data_type .. "*", data))) if copy_from_player then local copy_func = sync_info[3] if copy_func then local _, player_id if copy_from_player == true then _, player_id = sampGetPlayerIdByCharHandle(playerPed) else player_id = tonumber(copy_from_player) end copy_func(player_id, raw_data_ptr) end end local func_send = function() local bs = raknetNewBitStream() raknetBitStreamWriteInt8(bs, sync_info[2]) raknetBitStreamWriteBuffer(bs, raw_data_ptr, ffi.sizeof(data)) raknetSendBitStreamEx(bs, sampfuncs.HIGH_PRIORITY, sampfuncs.UNRELIABLE_SEQUENCED, 1) raknetDeleteBitStream(bs) end local mt = { __index = function(t, index) return data[index] end, __newindex = function(t, index, value) data[index] = value end } return setmetatable({send = func_send}, mt) end -->> UPDATE MODULE function openURL(url, fpath) local text = "" local file_download = false local download_final = false if doesFileExist(fpath) then os.remove(fpath) end downloadUrlToFile(url, fpath, function(id, status, p1, p2) if status == dlstatus.STATUS_ENDDOWNLOADDATA then file_download = true end if status == dlstatus.STATUSEX_ENDDOWNLOAD then download_final = true end end ) repeat wait(1000) until download_final or file_download if file_download then local f = io.open(fpath, "r") if f then text = f:read("*a") io.close(f) end os.remove(fpath) end if (text:find("Not found") and not text:find('"Not found"')) or text == "" then text = "" addChatMessage("Не удалось скачать обновление по ссылке:") addChatMessage(url) end return text end function addChatMessage(text) local tag = string.format("{667dff}[%s]{FFFFFF} ", thisScript().name) sampAddChatMessage(tag..text, 0xFFFFFFFF) end script_update = { version_url = "http://git.deadpoo.net/rubin/TruckHUD/raw/branch/master/version", script_url = "http://git.deadpoo.net/rubin/TruckHUD/raw/branch/master/TruckHUD.lua", changelog_url = "http://git.deadpoo.net/rubin/TruckHUD/raw/branch/master/changelog", address_ini = string.format("rubin-mods-updates\\%s.ini", thisScript().name), main = function() if not doesDirectoryExist("moonloader\\config\\rubin-mods-updates") then createDirectory("moonloader\\config\\rubin-mods-updates") end local ini = inicfg.load({ settings = { check_update = true, auto_update = true, server_version = "" } }, script_update.address_ini) ini.settings.version_url = script_update.version_url ini.settings.script_url = script_update.script_url ini.settings.changelog_url = script_update.changelog_url ini.settings.version = thisScript().version ini.settings.script_name = thisScript().name local command = (thisScript().name:gsub(" ", "").."-update"):lower() sampRegisterChatCommand(command, script_update.command) if ini.settings.check_update or ini.settings.auto_update then local fpath = os.tmpname() local result, text = pcall(openURL, script_update.version_url, fpath) if result then ini.settings.server_version = text if text ~= "" and text ~= thisScript().version then addChatMessage( string.format("Вышла новая версия '%s'. Текущая: '%s'", text, thisScript().version) ) if ini.settings.auto_update then addChatMessage( string.format("Автообновление скрипта включено. Процесс запущен!") ) script_update.command() else addChatMessage( string.format("Автообновление скрипта выключено. Обновить самому: /%s", command) ) end end end end inicfg.save(ini, script_update.address_ini) script_update.menu.init() end, command = function() lua_thread.create(function() local fpath = os.tmpname() local result, text = pcall(openURL, script_update.version_url, fpath) if result then if text ~= "" and text ~= thisScript().version then addChatMessage( string.format("Вышла новая версия '%s'. Текущая: '%s'", text, thisScript().version) ) local fpath = os.tmpname() local result, text = pcall(openURL, script_update.script_url, fpath) if result and text ~= "" and text:find(thisScript().name:gsub("%-", "%%-")) then local file, error = io.open(thisScript().path, "w") if file ~= nil then file:write(text) file:flush() io.close(file) addChatMessage("Обновление завершено, скрипт перезагружен!") wait(500) thisScript():reload() end end else addChatMessage("У Вас установлена последняя версия!") end end end) end, menu = { dialog = {}, ini = {}, init = function() if not sampIsChatCommandDefined("rubin-mods") then sampAddChatMessage("{667dff}[RUBIN MODS]{FFFFFF} Управление обновлениями скриптов: /rubin-mods", 0xFFFFFFFF) sampRegisterChatCommand("rubin-mods",script_update.menu.show) while true do wait(0) local result, button, list, input = sampHasDialogRespond(2160) if result and button == 1 then if script_update.menu.ini[list+1] ~= nil and script_update.menu.dialog[list+1] ~= nil then script_update.menu.dialog[list+1](script_update.menu.ini[list+1]) end end local result, button, list, input = sampHasDialogRespond(2162) if result then if button == 1 then if script_update.menu2.text[list+1] ~= nil and script_update.menu2.dialog[list+1] ~= nil then script_update.menu2.dialog[list+1]() end else script_update.menu.show() end end local result, button, list, input = sampHasDialogRespond(2161) if result then script_update.menu2.show(script_update.menu2.data) end end end end, show = function() script_update.menu.dialog = {} script_update.menu.ini = {} local text = "" if doesDirectoryExist("moonloader\\config\\rubin-mods-updates") then local FileHandle, FileName = findFirstFile("moonloader\\config\\rubin-mods-updates\\*") while FileName ~= nil do if FileName ~= nil and FileName ~= ".." and FileName ~= "." and FileName:find("%.ini") then local address = string.format("moonloader\\config\\rubin-mods-updates\\%s", FileName) if doesFileExist(address) then local ini = inicfg.load({}, address) script_update.menu.ini[#script_update.menu.ini+1] = address text = string.format("%s%s\n", text, string.format("%s\t%s%s", ini.settings.script_name, (ini.settings.version == ini.settings.server_version and "{59fc30}" or "{ff0000}"),ini.settings.version)) script_update.menu.dialog[#script_update.menu.dialog+1] = function(data) script_update.menu2.show(data) end end end FileName = findNextFile(FileHandle) end findClose(FileHandle) else text = "Не найдена директория:\t\n moonloader\\config\\rubin-mods-updates\t" end sampShowDialog(2160,"Обновление скриптов: Rubin Mods","Скрипт\tВерсия\n"..text,"Выбрать","Закрыть",5) end }, menu2 = { data = {}, text = {}, dialog = {}, show = function(data) script_update.menu2.data = data script_update.menu2.text = {} script_update.menu2.dialog = {} if doesFileExist(data) then local ini = inicfg.load({}, data) script_update.menu2.text[#script_update.menu2.text+1] = string.format("Автообновление %s", (ini.settings.auto_update and "{59fc30}ON" or "{ff0000}OFF")) script_update.menu2.dialog[#script_update.menu2.dialog+1] = function() ini.settings.auto_update = not ini.settings.auto_update inicfg.save(ini, data) script_update.menu2.show(data) end if not ini.settings.auto_update then script_update.menu2.text[#script_update.menu2.text+1] = string.format("Проверять обновления %s", (ini.settings.check_update and "{59fc30}ON" or "{ff0000}OFF")) script_update.menu2.dialog[#script_update.menu2.dialog+1] = function() ini.settings.check_update = not ini.settings.check_update inicfg.save(ini, data) script_update.menu2.show(data) end end script_update.menu2.text[#script_update.menu2.text+1] = string.format("Последние изменения") script_update.menu2.dialog[#script_update.menu2.dialog+1] = function() script_update.changelog(ini.settings.changelog_url, ini.settings.script_name) end script_update.menu2.text[#script_update.menu2.text+1] = string.format("Удалить из списка") script_update.menu2.dialog[#script_update.menu2.dialog+1] = function() os.remove(data) script_update.menu.show() end local text = "" for i = 1, #script_update.menu2.text do text = text..script_update.menu2.text[i].."\n" end sampShowDialog(2162,"Настройки обновления для "..ini.settings.script_name,text,"Выбрать","Назад",2) end end }, changelog = function(url, name) local fpath = os.tmpname() local result, text = pcall(openURL, url, fpath) if result then sampShowDialog(2161,"Changelog - "..name,text,"Выбрать","Назад",4) end end } -->> SCRIPT UTF-8 -->> utf8(table path, incoming variables encoding, outcoming variables encoding) -->> table path example { "sampev", "onShowDialog" } -->> encoding options nil | AnsiToUtf8 | Utf8ToAnsi _utf8 = load([=[return function(utf8_func, in_encoding, out_encoding); if encoding == nil then; encoding = require("encoding"); encoding.default = "CP1251"; u8 = encoding.UTF8; end; if type(utf8_func) ~= "table" then; return false; end; if AnsiToUtf8 == nil or Utf8ToAnsi == nil then; AnsiToUtf8 = function(text); return u8(text); end; Utf8ToAnsi = function(text); return u8:decode(text); end; end; if _UTF8_FUNCTION_SAVE == nil then; _UTF8_FUNCTION_SAVE = {}; end; local change_var = "_G"; for s = 1, #utf8_func do; change_var = string.format('%s["%s"]', change_var, utf8_func[s]); end; if _UTF8_FUNCTION_SAVE[change_var] == nil then; _UTF8_FUNCTION = function(...); local pack = table.pack(...); readTable = function(t, enc); for k, v in next, t do; if type(v) == 'table' then; readTable(v, enc); else; if enc ~= nil and (enc == "AnsiToUtf8" or enc == "Utf8ToAnsi") then; if type(k) == "string" then; k = _G[enc](k); end; if type(v) == "string" then; t[k] = _G[enc](v); end; end; end; end; return t; end; return table.unpack(readTable({_UTF8_FUNCTION_SAVE[change_var](table.unpack(readTable(pack, in_encoding)))}, out_encoding)); end; local text = string.format("_UTF8_FUNCTION_SAVE['%s'] = %s; %s = _UTF8_FUNCTION;", change_var, change_var, change_var); load(text)(); _UTF8_FUNCTION = nil; end; return true; end]=]) function utf8(...) pcall(_utf8(), ...) end utf8({ "sampShowDialog" }, "Utf8ToAnsi") utf8({ "sampSendChat" }, "Utf8ToAnsi") utf8({ "sampAddChatMessage" }, "Utf8ToAnsi") utf8({ "print" }, "Utf8ToAnsi") utf8({ "renderGetFontDrawTextLength" }, "Utf8ToAnsi") utf8({ "renderFontDrawText" }, "Utf8ToAnsi") utf8({ "sampSetCurrentDialogEditboxText" }, "Utf8ToAnsi") utf8({ "sampCreate3dTextEx" }, "Utf8ToAnsi") utf8({ "sampCreate3dText" }, "Utf8ToAnsi") utf8({ "sampSet3dTextString" }, "Utf8ToAnsi") utf8({ "sampGetDialogText" }, nil, "AnsiToUtf8") utf8({ "sampGetDialogCaption" }, nil, "AnsiToUtf8") utf8({ "sampHasDialogRespond" }, nil, "AnsiToUtf8")