You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
TruckHUD/TruckHUD.lua

4505 lines
210 KiB

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