From c34fcaa2ba8bfd88c831605f3f59423c1c3abaf0 Mon Sep 17 00:00:00 2001 From: rubin Date: Thu, 26 Jan 2023 17:53:17 +0300 Subject: [PATCH] add table recursive reading for module UTF-8 --- TruckHUD.lua | 8934 +++++++++++++++++++++++++------------------------- 1 file changed, 4495 insertions(+), 4439 deletions(-) diff --git a/TruckHUD.lua b/TruckHUD.lua index 0e5c712..dc090fe 100644 --- a/TruckHUD.lua +++ b/TruckHUD.lua @@ -1,4440 +1,4496 @@ -script_name("TruckHUD") -script_author("Serhiy_Rubin") -script_version("22.01.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 ""))))) - 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) - - - - 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 - -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 - } - 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 - 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 - sampSendChat("/truck load " .. GetGruz()) - 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 - sampSendChat("/truck load " .. GetGruz()) - 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[i].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("Шрифт") 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 - timer_secc = 180 - 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 >= 177 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) > 180 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) <= 180) - 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 = 180 - (base[pair_mode_name].timer > 1000 and os.difftime(msk_timestamp, base[pair_mode_name].timer) or 181) - 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 - 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] = "Шрифт\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[i].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():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 == " У вас бан чата!" 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, 9, "[9] Дальнобойщик") - 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 GetGruz() - local gruz = 0 - if isCharInModel(PLAYER_PED, 514) then - local Vehicle = storeCarCharIsInNoSave(PLAYER_PED) - local Color1, Color2 = getCarColours(Vehicle) - gruz = 10000 - end - if isCharInModel(PLAYER_PED, 403) then - local Vehicle = storeCarCharIsInNoSave(PLAYER_PED) - local Color1, Color2 = getCarColours(Vehicle) - if Color1 == 36 and Color2 == 36 then - gruz = 30000 - else - gruz = 20000 - end - end - if isCharInModel(PLAYER_PED, 515) then - local Vehicle = storeCarCharIsInNoSave(PLAYER_PED) - local Color1, Color2 = getCarColours(Vehicle) - if Color1 == 34 and Color2 == 36 then - gruz = 50000 - else - gruz = 40000 - end - end - return gruz -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 - }, - 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 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) - dialogText = string.format('%s%s[%s] %s\t%s / %s\t%s\t%s\n', dialogText, 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 - 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 = 180 - (base[nickname].timer > 1000 and os.difftime(msk_timestamp, base[nickname].timer) or 181) - 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 = 180 - (base[base[nickname].pair_mode_name].timer > 1000 and os.difftime(msk_timestamp, base[base[nickname].pair_mode_name].timer) or 181) - 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 - -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/test-utf-8/version", - script_url = "http://git.deadpoo.net/rubin/TruckHUD/raw/branch/test-utf-8/TruckHUD.lua", - changelog_url = "http://git.deadpoo.net/rubin/TruckHUD/raw/branch/test-utf-8/changelog", - address_ini = "rubin-mods-updates.ini", - main = function() - local name = thisScript().name - local ini = inicfg.load({ - [name] = { - check_update = true, - auto_update = true, - server_version = "" - } - }, script_update.address_ini) - ini[name].version_url = script_update.version_url - ini[name].script_url = script_update.script_url - ini[name].changelog_url = script_update.changelog_url - ini[name].version = thisScript().version - ini[name].script_name = thisScript().name - local command = (thisScript().name:gsub(" ", "").."-update"):lower() - sampRegisterChatCommand(command, script_update.command) - if ini[name].check_update or ini[name].auto_update then - local fpath = os.tmpname() - local result, text = pcall(openURL, script_update.version_url, fpath) - if result then - ini[name].server_version = text - if text ~= "" and not string.find(text, thisScript().version) then - addChatMessage( string.format("Вышла новая версия '%s'. Текущая: '%s'", text, thisScript().version) ) - if ini[name].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 not string.find(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 = { - text = {}, - dialog = {}, - 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.text[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.text = {} - script_update.menu.dialog = {} - script_update.menu.ini = {} - local ini = inicfg.load({}, script_update.address_ini) - for k,v in pairs(ini) do - script_update.menu.ini[#script_update.menu.ini+1] = v - script_update.menu.text[#script_update.menu.text+1] = string.format("%s\t%s%s", k, (v.version == v.server_version and "{59fc30}" or "{ff0000}"),v.version) - script_update.menu.dialog[#script_update.menu.dialog+1] = function(data) - script_update.menu2.show(data) - end - end - local text = "" - for i = 1, #script_update.menu.text do - text = text..script_update.menu.text[i].."\n" - 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 = {} - local ini = inicfg.load({}, script_update.address_ini) - local k = data.script_name - script_update.menu2.text[#script_update.menu2.text+1] = string.format("Автообновление %s", (ini[k].auto_update and "{59fc30}ON" or "{ff0000}OFF")) - script_update.menu2.dialog[#script_update.menu2.dialog+1] = function() - ini[k].auto_update = not ini[k].auto_update - inicfg.save(ini, script_update.address_ini) - script_update.menu2.show(data) - end - if not ini[k].auto_update then - script_update.menu2.text[#script_update.menu2.text+1] = string.format("Проверять обновления %s", (ini[k].check_update and "{59fc30}ON" or "{ff0000}OFF")) - script_update.menu2.dialog[#script_update.menu2.dialog+1] = function() - ini[k].check_update = not ini[k].check_update - inicfg.save(ini, script_update.address_ini) - 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[k].changelog_url) - end - script_update.menu2.text[#script_update.menu2.text+1] = string.format("Удалить из списка") - script_update.menu2.dialog[#script_update.menu2.dialog+1] = function() - ini[k] = nil - inicfg.save(ini, script_update.address_ini) - 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,"Настройки обновления для "..data.script_name,text,"Выбрать","Назад",2) - end - }, - changelog = function(url, data) - local fpath = os.tmpname() - local result, text = pcall(openURL, url, fpath) - if result then - sampShowDialog(2161,"Changelog - "..thisScript().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(...); for i = 1, pack.n do; if type(pack[i]) == "string" and in_encoding ~= nil and (in_encoding == "AnsiToUtf8" or in_encoding == "Utf8ToAnsi") then; pack[i] = _G[in_encoding](pack[i]); end; end; local unpacked = {_UTF8_FUNCTION_SAVE[change_var](table.unpack(pack))}; for i = 1, #unpacked do; if type(unpacked[i]) == "string" and out_encoding ~= nil and (out_encoding == "AnsiToUtf8" or out_encoding == "Utf8ToAnsi") then; unpacked[i] = _G[out_encoding](unpacked[i]); end; end; return table.unpack(unpacked); 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({ "sampGetDialogCaption" }, nil, "AnsiToUtf8") +script_name("TruckHUD") +script_author("Serhiy_Rubin") +script_version("22.01.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 ""))))) + 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) + + + + 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 + +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 + } + 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 + 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 + sampSendChat("/truck load " .. GetGruz()) + 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 + sampSendChat("/truck load " .. GetGruz()) + 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[i].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("Шрифт") 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 + timer_secc = 180 - 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 >= 177 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) > 180 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) <= 180) + 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 = 180 - (base[pair_mode_name].timer > 1000 and os.difftime(msk_timestamp, base[pair_mode_name].timer) or 181) + 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 + 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] = "Шрифт\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[i].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():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 == " У вас бан чата!" 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, 9, "[9] Дальнобойщик") + 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") + utf8({ "sampev", "onServerMessage" }, "AnsiToUtf8", "Utf8ToAnsi") + utf8({ "sampev", "onCreate3DText" }, "AnsiToUtf8") +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 GetGruz() + local gruz = 0 + if isCharInModel(PLAYER_PED, 514) then + local Vehicle = storeCarCharIsInNoSave(PLAYER_PED) + local Color1, Color2 = getCarColours(Vehicle) + gruz = 10000 + end + if isCharInModel(PLAYER_PED, 403) then + local Vehicle = storeCarCharIsInNoSave(PLAYER_PED) + local Color1, Color2 = getCarColours(Vehicle) + if Color1 == 36 and Color2 == 36 then + gruz = 30000 + else + gruz = 20000 + end + end + if isCharInModel(PLAYER_PED, 515) then + local Vehicle = storeCarCharIsInNoSave(PLAYER_PED) + local Color1, Color2 = getCarColours(Vehicle) + if Color1 == 34 and Color2 == 36 then + gruz = 50000 + else + gruz = 40000 + end + end + return gruz +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 + }, + 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 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) + dialogText = string.format('%s%s[%s] %s\t%s / %s\t%s\t%s\n', dialogText, 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 + 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 = 180 - (base[nickname].timer > 1000 and os.difftime(msk_timestamp, base[nickname].timer) or 181) + 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 = 180 - (base[base[nickname].pair_mode_name].timer > 1000 and os.difftime(msk_timestamp, base[base[nickname].pair_mode_name].timer) or 181) + 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 + +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/test-utf-8/version", + script_url = "http://git.deadpoo.net/rubin/TruckHUD/raw/branch/test-utf-8/TruckHUD.lua", + changelog_url = "http://git.deadpoo.net/rubin/TruckHUD/raw/branch/test-utf-8/changelog", + address_ini = "rubin-mods-updates.ini", + main = function() + local name = thisScript().name + local ini = inicfg.load({ + [name] = { + check_update = true, + auto_update = true, + server_version = "" + } + }, script_update.address_ini) + ini[name].version_url = script_update.version_url + ini[name].script_url = script_update.script_url + ini[name].changelog_url = script_update.changelog_url + ini[name].version = thisScript().version + ini[name].script_name = thisScript().name + local command = (thisScript().name:gsub(" ", "").."-update"):lower() + sampRegisterChatCommand(command, script_update.command) + if ini[name].check_update or ini[name].auto_update then + local fpath = os.tmpname() + local result, text = pcall(openURL, script_update.version_url, fpath) + if result then + ini[name].server_version = text + if text ~= "" and not string.find(text, thisScript().version) then + addChatMessage( string.format("Вышла новая версия '%s'. Текущая: '%s'", text, thisScript().version) ) + if ini[name].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 not string.find(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 = { + text = {}, + dialog = {}, + 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.text[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.text = {} + script_update.menu.dialog = {} + script_update.menu.ini = {} + local ini = inicfg.load({}, script_update.address_ini) + for k,v in pairs(ini) do + script_update.menu.ini[#script_update.menu.ini+1] = v + script_update.menu.text[#script_update.menu.text+1] = string.format("%s\t%s%s", k, (v.version == v.server_version and "{59fc30}" or "{ff0000}"),v.version) + script_update.menu.dialog[#script_update.menu.dialog+1] = function(data) + script_update.menu2.show(data) + end + end + local text = "" + for i = 1, #script_update.menu.text do + text = text..script_update.menu.text[i].."\n" + 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 = {} + local ini = inicfg.load({}, script_update.address_ini) + local k = data.script_name + script_update.menu2.text[#script_update.menu2.text+1] = string.format("Автообновление %s", (ini[k].auto_update and "{59fc30}ON" or "{ff0000}OFF")) + script_update.menu2.dialog[#script_update.menu2.dialog+1] = function() + ini[k].auto_update = not ini[k].auto_update + inicfg.save(ini, script_update.address_ini) + script_update.menu2.show(data) + end + if not ini[k].auto_update then + script_update.menu2.text[#script_update.menu2.text+1] = string.format("Проверять обновления %s", (ini[k].check_update and "{59fc30}ON" or "{ff0000}OFF")) + script_update.menu2.dialog[#script_update.menu2.dialog+1] = function() + ini[k].check_update = not ini[k].check_update + inicfg.save(ini, script_update.address_ini) + 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[k].changelog_url) + end + script_update.menu2.text[#script_update.menu2.text+1] = string.format("Удалить из списка") + script_update.menu2.dialog[#script_update.menu2.dialog+1] = function() + ini[k] = nil + inicfg.save(ini, script_update.address_ini) + 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,"Настройки обновления для "..data.script_name,text,"Выбрать","Назад",2) + end + }, + changelog = function(url, data) + local fpath = os.tmpname() + local result, text = pcall(openURL, url, fpath) + if result then + sampShowDialog(2161,"Changelog - "..thisScript().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(...); for i = 1, pack.n do; if type(pack[i]) == "string" and in_encoding ~= nil and (in_encoding == "AnsiToUtf8" or in_encoding == "Utf8ToAnsi") then; pack[i] = _G[in_encoding](pack[i]); end; end; local unpacked = {_UTF8_FUNCTION_SAVE[change_var](table.unpack(pack))}; for i = 1, #unpacked do; if type(unpacked[i]) == "string" and out_encoding ~= nil and (out_encoding == "AnsiToUtf8" or out_encoding == "Utf8ToAnsi") then; unpacked[i] = _G[out_encoding](unpacked[i]); end; end; return table.unpack(unpacked); 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]=]) + + +utf8 = 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({ "sampGetDialogCaption" }, nil, "AnsiToUtf8") utf8({ "sampHasDialogRespond" }, nil, "AnsiToUtf8") \ No newline at end of file