Compare commits

...

6 Commits

  1. 2
      .gitattributes
  2. 5
      changelog
  3. 537
      corn-hud.lua
  4. 1
      version

2
.gitattributes vendored

@ -0,0 +1,2 @@
*.lua working-tree-encoding=windows-1251
changelog working-tree-encoding=windows-1251

@ -0,0 +1,5 @@
Версия от 23.01.2023
Добавлено меню по команде /corn
Добавлена функция смены активации
Добавлен модуль автообновления
Исправлена работа на сервере Classic

@ -1,8 +1,10 @@
script_name('cornHUD') script_name('corn-hud')
script_author("Serhiy_Rubin") script_author("Serhiy_Rubin")
script_version("22/09/2019") script_version("23.01.2023")
require 'lib.sampfuncs' require 'lib.sampfuncs'
require 'lib.moonloader' require 'lib.moonloader'
local dlstatus = require("moonloader").download_status
local vkeys = require "lib.vkeys"
local sampev, inicfg = require 'lib.samp.events', require 'inicfg' local sampev, inicfg = require 'lib.samp.events', require 'inicfg'
local render, antiflood = false, 0 local render, antiflood = false, 0
local zerno, urojai, narko, priceZerno, priceUrojai, priceNarko, finfoCheck = 0, 0, 0, 0, 0, 0, 0 local zerno, urojai, narko, priceZerno, priceUrojai, priceNarko, finfoCheck = 0, 0, 0, 0, 0, 0, 0
@ -20,22 +22,21 @@ local coord = {
function main() function main()
if not isSampLoaded() or not isSampfuncsLoaded() then return end if not isSampLoaded() or not isSampfuncsLoaded() then return end
while not isSampAvailable() do wait(0) end while not isSampAvailable() do wait(0) end
repeat lua_thread.create(script_update.main)
wait(100) repeat wait(0) until sampGetCurrentServerName() ~= "SA-MP"
local res, id = sampGetPlayerIdByCharHandle(PLAYER_PED) repeat wait(0) until sampGetCurrentServerName():find("Samp%-Rp.Ru") or sampGetCurrentServerName():find("SRP")
nickname = sampGetPlayerNickname(id) server = sampGetCurrentServerName():gsub("|", "")
if res then score = sampGetPlayerScore(id) end server =
until score > 0 (server:find("02") and "Two" or
local magicChar = { ":", "|" } (server:find("Revo") and "Revolution" or
local hostName = sampGetCurrentServerName() (server:find("Legacy") and "Legacy" or (server:find("Classic") and "Classic" or
for i = 1, #magicChar do hostName = hostName:gsub(magicChar[i], '') end (server:find("Zero Two") and "Two" or "")))))
if string.find(hostName, "Legacy") then serverName = "Legacy" end if server == "" then
if string.find(hostName, "Reborn") then serverName = "Reborn" end thisScript():unload()
if string.find(hostName, "Revolution") then serverName = "Revolution" end end
if hostName == "Samp-Rp.Ru Server 02 Client 0.3.7" then serverName = "Two" end iniName = string.format("corn-%s", server)
if serverName == nil then thisScript():unload() end local x1, y1 = convertGameScreenCoordsToWindowScreenCoords(14.992679595947, 274.75)
iniName = string.format("cornHUD-%s", serverName) ini = inicfg.load({
ini = inicfg.load({
['Farm 0'] = { ['Farm 0'] = {
corn = 0, corn = 0,
cornPrice = 0, cornPrice = 0,
@ -85,30 +86,19 @@ function main()
}, },
Settings = { Settings = {
Key1='VK_RBUTTON', Key1='VK_RBUTTON',
Key2='VK_C', Key2='VK_MENU',
X=0, X=x1,
Y=0 Y=y1
}, },
}, iniName) }, iniName)
inicfg.save(ini, iniName) inicfg.save(ini, iniName)
sampfuncsLog(' {FFFFFF}corn-hud by Serhiy_Rubin loaded. CMD: /corn | /corn hud. | Key combo: '..ini.Settings.Key1:gsub("VK_", '')..' + '..ini.Settings.Key2:gsub("VK_", '')) sampfuncsLog(' {FFFFFF}corn-hud loaded. CMD: /corn | /corn hud. | Key combo: '..ini.Settings.Key1:gsub("VK_", '')..' + '..ini.Settings.Key2:gsub("VK_", ''))
font = renderCreateFont(ini.Render.FontName, ini.Render.FontSize, ini.Render.FontFlag) font = renderCreateFont(ini.Render.FontName, ini.Render.FontSize, ini.Render.FontFlag)
sampRegisterChatCommand('getcoord', function(param) lua_thread.create(menu.loop)
local x, y, z = getCharCoordinates(PLAYER_PED)
string = string.format("%0.2f, %0.2f, %0.2f", x, y, z)
setClipboardText(string)
end)
sampRegisterChatCommand('corn', function(param)
if render and param:lower():find('pos') then
SetPos()
else
render = not render
end
end)
while true do while true do
wait(0) wait(0)
points = '' points = ''
for k,v in pairs(coord) do for k,v in pairs(coord) do
local dist = math.floor(getDistanceBetweenCoords3d(v.x, v.y, v.z, getCharCoordinates(playerPed))) local dist = math.floor(getDistanceBetweenCoords3d(v.x, v.y, v.z, getCharCoordinates(playerPed)))
if dist <= 30 then if dist <= 30 then
points = k points = k
@ -126,14 +116,14 @@ function main()
end end
if render then if render then
renderText = { renderText = {
[1] = '{00D900}Öåíà ïîêóïêè çåðíà: '..ini.price.zerno..'$', [1] = '{00D900}Цена покупки зерна: '..ini.price.zerno..'$',
[2] = '{00D900}Öåíà ïðîäàæè óðîæàÿ: '..ini.price.urojai..'$', [2] = '{00D900}Цена продажи урожая: '..ini.price.urojai..'$',
[3] = '{00D900} ', [3] = '{00D900} ',
[4] = string.format('{00D900}Ôåðìà ¹0 | Áàëàíñ: %d$ | Çåðíî: %d [%d$] | Óðîæàé: %d [%d$]', ini['Farm 0'].bank, ini['Farm 0'].corn, ini['Farm 0'].cornPrice, ini['Farm 0'].product, ini['Farm 0'].productPrice), [4] = string.format('{00D900}Ферма №0 | Баланс: %d$ | Зерно: %d [%d$] | Урожай: %d [%d$]', ini['Farm 0'].bank, ini['Farm 0'].corn, ini['Farm 0'].cornPrice, ini['Farm 0'].product, ini['Farm 0'].productPrice),
[5] = string.format('{00D900}Ôåðìà ¹1 | Áàëàíñ: %d$ | Çåðíî: %s [%s$] | Óðîæàé: %s [%s$]', ini['Farm 1'].bank, ini['Farm 1'].corn, ini['Farm 1'].cornPrice, ini['Farm 1'].product, ini['Farm 1'].productPrice), [5] = string.format('{00D900}Ферма №1 | Баланс: %d$ | Зерно: %s [%s$] | Урожай: %s [%s$]', ini['Farm 1'].bank, ini['Farm 1'].corn, ini['Farm 1'].cornPrice, ini['Farm 1'].product, ini['Farm 1'].productPrice),
[6] = string.format('{00D900}Ôåðìà ¹2 | Áàëàíñ: %d$ | Çåðíî: %s [%s$] | Óðîæàé: %s [%s$]', ini['Farm 2'].bank, ini['Farm 2'].corn, ini['Farm 2'].cornPrice, ini['Farm 2'].product, ini['Farm 2'].productPrice), [6] = string.format('{00D900}Ферма №2 | Баланс: %d$ | Зерно: %s [%s$] | Урожай: %s [%s$]', ini['Farm 2'].bank, ini['Farm 2'].corn, ini['Farm 2'].cornPrice, ini['Farm 2'].product, ini['Farm 2'].productPrice),
[7] = string.format('{00D900}Ôåðìà ¹3 | Áàëàíñ: %d$ | Çåðíî: %s [%s$] | Óðîæàé: %s [%s$]', ini['Farm 3'].bank, ini['Farm 3'].corn, ini['Farm 3'].cornPrice, ini['Farm 3'].product, ini['Farm 3'].productPrice), [7] = string.format('{00D900}Ферма №3 | Баланс: %d$ | Зерно: %s [%s$] | Урожай: %s [%s$]', ini['Farm 3'].bank, ini['Farm 3'].corn, ini['Farm 3'].cornPrice, ini['Farm 3'].product, ini['Farm 3'].productPrice),
[8] = string.format('{00D900}Ôåðìà ¹4 | Áàëàíñ: %d$ | Çåðíî: %s [%s$] | Óðîæàé: %s [%s$]', ini['Farm 4'].bank, ini['Farm 4'].corn, ini['Farm 4'].cornPrice, ini['Farm 4'].product, ini['Farm 4'].productPrice), [8] = string.format('{00D900}Ферма №4 | Баланс: %d$ | Зерно: %s [%s$] | Урожай: %s [%s$]', ini['Farm 4'].bank, ini['Farm 4'].corn, ini['Farm 4'].cornPrice, ini['Farm 4'].product, ini['Farm 4'].productPrice),
} }
local X, Y = ini.Settings.X, ini.Settings.Y local X, Y = ini.Settings.X, ini.Settings.Y
for i = 1, #renderText do for i = 1, #renderText do
@ -145,7 +135,7 @@ function main()
end end
end end
end end
if isKeyDown(VK_RBUTTON) and (isCharInModel(PLAYER_PED, 440) or isKeyDown(VK_C)) then if isKeyDown(vkeys[ini.Settings.Key1]) and (isCharInModel(PLAYER_PED, 440) or isKeyDown(vkeys[ini.Settings.Key2])) then
sampSetCursorMode(3) sampSetCursorMode(3)
mouse = 1 mouse = 1
local posX, posY = getScreenResolution() local posX, posY = getScreenResolution()
@ -154,22 +144,22 @@ function main()
posY = ((posY / 2.2) - (renderGetFontDrawHeight(font) * 3)) posY = ((posY / 2.2) - (renderGetFontDrawHeight(font) * 3))
renderText = { renderText = {
[1] = (render and 'Corn-HUD: ON' or 'Corn-HUD: OFF'), [1] = (render and 'Corn-HUD: ON' or 'Corn-HUD: OFF'),
[2] = 'Çàãðóçèòü', [2] = 'Загрузить',
[3] = 'Ðàçãðóçèòü', [3] = 'Разгрузить',
[4] = 'Èíôîðìàöèÿ î ôåðìå', [4] = 'Информация о ферме',
[5] = 'Îáíîâèòü èíôîðìàöèþ î ôåðìå' [5] = 'Обновить информацию о ферме'
} }
for i = 1, #renderText do for i = 1, #renderText do
if drawClickableText(renderText[i], posX - (renderGetFontDrawTextLength(font, renderText[i]) / 2), posY, 0xFF00D900, 0xFFFFFFFF) then if drawClickableText(renderText[i], posX - (renderGetFontDrawTextLength(font, renderText[i]) / 2), posY, 0xFF00D900, 0xFFFFFFFF) then
if i == 1 then if i == 1 then
render = not render render = not render
end end
if i == 2 then if i == 2 then
if points ~= '' then if points ~= '' then
if points:find('Farm') then if points:find('Farm') then
local warecorn = urojai local warecorn = urojai
local corn = ( (1500 - warecorn) < tonumber(ini[points].product) and (1500 - warecorn) or tonumber(ini[points].product) ) local corn = ( (1500 - warecorn) < tonumber(ini[points].product) and (1500 - warecorn) or tonumber(ini[points].product) )
sampSendChat('/cornmenu 2 '..corn) sampSendChat('/cornmenu 2 '..corn)
finfoCheck = 1 finfoCheck = 1
end end
if points:find('Zerno') then if points:find('Zerno') then
@ -177,71 +167,71 @@ function main()
end end
end end
end end
if i == 3 then if i == 3 then
if points ~= '' then if points ~= '' then
if points:find('Farm') then if points:find('Farm') then
sampSendChat('/cornmenu 1 '..(zerno > (10000 - ini[points].corn) and (10000 - ini[points].corn) or zerno)) sampSendChat('/cornmenu 1 '..(zerno > (10000 - ini[points].corn) and (10000 - ini[points].corn) or zerno))
finfoCheck = 1 finfoCheck = 1
end end
if points:find('Narko') then if points:find('Narko') then
sampSendChat('/cornmenu 4 '..narko) sampSendChat('/cornmenu 4 '..narko)
end end
if points:find('Urojai') then if points:find('Urojai') then
sampSendChat('/cornmenu 4 '..urojai) sampSendChat('/cornmenu 4 '..urojai)
end end
end end
end end
if i == 4 then if i == 4 then
sampSendChat('/finfo') sampSendChat('/finfo')
end end
if i == 5 then if i == 5 then
finfoCheck = 1 finfoCheck = 1
end end
end end
posY = posY + plus posY = posY + plus
end end
else else
if mouse ~= nil and mouse == 1 then if mouse ~= nil and mouse == 1 then
sampSetCursorMode(0) sampSetCursorMode(0)
mouse = nil mouse = nil
end end
end end
end end
end end
function sampev.onServerMessage(color, message) function sampev.onServerMessage(color, message)
if message:find(' Çåðíî: (%d+) / 1500') then if message:find(' Зерно: (%d+) / 1500') then
zerno = tonumber(message:match(' Çåðíî: (%d+) / 1500')) zerno = tonumber(message:match(' Зерно: (%d+) / 1500'))
end end
if message:find(' Óðîæàé: (%d+) / 1500') then if message:find(' Урожай: (%d+) / 1500') then
urojai = tonumber(message:match(' Óðîæàé: (%d+) / 1500')) urojai = tonumber(message:match(' Урожай: (%d+) / 1500'))
end end
if message:find(' Íàðêîòèêè: (%d+) / 1500') then if message:find(' Наркотики: (%d+) / 1500') then
narko = tonumber(message:match(' Íàðêîòèêè: (%d+) / 1500')) narko = tonumber(message:match(' Наркотики: (%d+) / 1500'))
end end
end end
function sampev.onCreate3DText(id, color, position, distance, testLOS, attachedPlayerId, attachedVehicleId, text) function sampev.onCreate3DText(id, color, position, distance, testLOS, attachedPlayerId, attachedVehicleId, text)
if text:find('{FF8000}Ðàçãðóçêà íàðêîòèêîâ.*Ñòîèìîñòü íàðêîòèêîâ (%d+) âèðò') then if text:find('{FF8000}Разгрузка наркотиков.*Стоимость наркотиков (%d+) вирт') then
ini.price.narko = text:match('{FF8000}Ðàçãðóçêà íàðêîòèêîâ.*Ñòîèìîñòü íàðêîòèêîâ (%d+) âèðò') ini.price.narko = text:match('{FF8000}Разгрузка наркотиков.*Стоимость наркотиков (%d+) вирт')
inicfg.save(ini, iniName) inicfg.save(ini, iniName)
end end
if text:find('{FF8000}Çàãðóçêà çåðíà.*Ñòîèìîñòü çåðíà (%d+) âèðò.+') then if text:find('{FF8000}Загрузка зерна.*Стоимость зерна (%d+) вирт.+') then
ini.price.zerno = text:match('{FF8000}Çàãðóçêà çåðíà.*Ñòîèìîñòü çåðíà (%d+) âèðò.+') ini.price.zerno = text:match('{FF8000}Загрузка зерна.*Стоимость зерна (%d+) вирт.+')
inicfg.save(ini, iniName) inicfg.save(ini, iniName)
end end
if text:find('{FF8000}Ðàçãðóçêà óðîæàÿ.*Ñòîèìîñòü óðîæàÿ (%d+) âèðò') then if text:find('{FF8000}Разгрузка урожая.*Стоимость урожая (%d+) вирт') then
ini.price.urojai = text:match('{FF8000}Ðàçãðóçêà óðîæàÿ.*Ñòîèìîñòü óðîæàÿ (%d+) âèðò') ini.price.urojai = text:match('{FF8000}Разгрузка урожая.*Стоимость урожая (%d+) вирт')
inicfg.save(ini, iniName) inicfg.save(ini, iniName)
end end
end end
function sampev.onShowDialog(dialogId, style, title, button1, button2, text) function sampev.onShowDialog(dialogId, style, title, button1, button2, text)
if text:find(".FBDD7E.Áàëàíñ ôåðìû:.FFFFFF.\t\t\t(%d+).+FBDD7E.Ñåìåíà â àìáàðå:.FFFFFF.\t\t\t(%d+) / %d+.+FBDD7E.Óðîæàÿ íà ïîëå:{FFFFFF}\t\t\t(%d+) / %d+.+FBDD7E.Ïðîäóêöèè â àìáàðå:.FFFFFF.\t\t\t(%d+) / %d+.+FBDD7E.Öåíà çà ñåìåíà:.FFFFFF.\t\t\t(%d+).+FBDD7E.Öåíà íà ïðîäóêöèþ:.FFFFFF.\t\t\t(%d+)") then if text:find(".FBDD7E.Баланс фермы:.FFFFFF.\t\t\t(%d+).+FBDD7E.Семена в амбаре:.FFFFFF.\t\t\t(%d+) / %d+.+FBDD7E.Урожая на поле:{FFFFFF}\t\t\t(%d+) / %d+.+FBDD7E.Продукции в амбаре:.FFFFFF.\t\t\t(%d+) / %d+.+FBDD7E.Цена за семена:.FFFFFF.\t\t\t(%d+).+FBDD7E.Цена на продукцию:.FFFFFF.\t\t\t(%d+)") then
local S0 = CheckCoord() local S0 = CheckCoord()
if S0 ~= '' then if S0 ~= '' then
ini[S0].bank, ini[S0].corn, ini[S0].product, ini[S0].cornPrice, ini[S0].productPrice = text:match(".FBDD7E.Áàëàíñ ôåðìû:.FFFFFF.\t\t\t(%d+).+FBDD7E.Ñåìåíà â àìáàðå:.FFFFFF.\t\t\t(%d+) / %d+.+FBDD7E.Óðîæàÿ íà ïîëå:{FFFFFF}\t\t\t%d+ / %d+.+FBDD7E.Ïðîäóêöèè â àìáàðå:.FFFFFF.\t\t\t(%d+) / %d+.+FBDD7E.Öåíà çà ñåìåíà:.FFFFFF.\t\t\t(%d+).+FBDD7E.Öåíà íà ïðîäóêöèþ:.FFFFFF.\t\t\t(%d+)") ini[S0].bank, ini[S0].corn, ini[S0].product, ini[S0].cornPrice, ini[S0].productPrice = text:match(".FBDD7E.Баланс фермы:.FFFFFF.\t\t\t(%d+).+FBDD7E.Семена в амбаре:.FFFFFF.\t\t\t(%d+) / %d+.+FBDD7E.Урожая на поле:{FFFFFF}\t\t\t%d+ / %d+.+FBDD7E.Продукции в амбаре:.FFFFFF.\t\t\t(%d+) / %d+.+FBDD7E.Цена за семена:.FFFFFF.\t\t\t(%d+).+FBDD7E.Цена на продукцию:.FFFFFF.\t\t\t(%d+)")
inicfg.save(ini, iniName) inicfg.save(ini, iniName)
if finfoCheck ~= 0 then if finfoCheck ~= 0 then
finfoCheck = 0 finfoCheck = 0
@ -249,27 +239,27 @@ function sampev.onShowDialog(dialogId, style, title, button1, button2, text)
end end
end end
end end
if text:find('{FFFFFF}Çåðíà êóïëåíî: {0289CC}(%d+).*{FFFFFF}Öåíà: {0289CC}%d+ âèðò.*{FFFFFF}Ñêèäêà: {0289CC}%d+ âèðò') then if text:find('{FFFFFF}Зерна куплено: {0289CC}(%d+).*{FFFFFF}Цена: {0289CC}%d+ вирт.*{FFFFFF}Скидка: {0289CC}%d+ вирт') then
zerno = zerno + tonumber(text:match('{FFFFFF}Çåðíà êóïëåíî: {0289CC}(%d+).*{FFFFFF}Öåíà: {0289CC}%d+ âèðò.*{FFFFFF}Ñêèäêà: {0289CC}%d+ âèðò')) zerno = zerno + tonumber(text:match('{FFFFFF}Зерна куплено: {0289CC}(%d+).*{FFFFFF}Цена: {0289CC}%d+ вирт.*{FFFFFF}Скидка: {0289CC}%d+ вирт'))
print(zerno) print(zerno)
end end
if text:find('{FFFFFF}Çåðíà ïðîäàíî: {0289CC}(%d+).*{FFFFFF}Öåíà: {0289CC}%d+ âèðò.*{FFFFFF}Äîáàâëåíî ê ÇÏ: {0289CC}%d+ âèðò') then if text:find('{FFFFFF}Зерна продано: {0289CC}(%d+).*{FFFFFF}Цена: {0289CC}%d+ вирт.*{FFFFFF}Добавлено к ЗП: {0289CC}%d+ вирт') then
zerno = zerno - tonumber(text:match('{FFFFFF}Çåðíà ïðîäàíî: {0289CC}(%d+).*{FFFFFF}Öåíà: {0289CC}%d+ âèðò.*{FFFFFF}Äîáàâëåíî ê ÇÏ: {0289CC}%d+ âèðò')) zerno = zerno - tonumber(text:match('{FFFFFF}Зерна продано: {0289CC}(%d+).*{FFFFFF}Цена: {0289CC}%d+ вирт.*{FFFFFF}Добавлено к ЗП: {0289CC}%d+ вирт'))
print(zerno) print(zerno)
end end
if text:find('{FFFFFF}Óðîæàÿ êóïëåíî: {0289CC}(%d+).*{FFFFFF}Öåíà: {0289CC}%d+ âèðò') then if text:find('{FFFFFF}Урожая куплено: {0289CC}(%d+).*{FFFFFF}Цена: {0289CC}%d+ вирт') then
urojai = urojai + tonumber(text:match('{FFFFFF}Óðîæàÿ êóïëåíî: {0289CC}(%d+).*{FFFFFF}Öåíà: {0289CC}%d+ âèðò')) urojai = urojai + tonumber(text:match('{FFFFFF}Урожая куплено: {0289CC}(%d+).*{FFFFFF}Цена: {0289CC}%d+ вирт'))
print(urojai) print(urojai)
end end
if text:find('Óðîæàÿ ïðîäàíî: {0289CC}(%d+).*{FFFFFF}Öåíà: {0289CC}%d+ âèðò') then if text:find('Урожая продано: {0289CC}(%d+).*{FFFFFF}Цена: {0289CC}%d+ вирт') then
urojai = urojai - tonumber(text:match('Óðîæàÿ ïðîäàíî: {0289CC}(%d+).*{FFFFFF}Öåíà: {0289CC}%d+ âèðò')) urojai = urojai - tonumber(text:match('Урожая продано: {0289CC}(%d+).*{FFFFFF}Цена: {0289CC}%d+ вирт'))
print(urojai) print(urojai)
end end
if text:find('{FFFFFF}Íàðêîòèêîâ êóïëåíî: {0289CC}(%d+).*{FFFFFF}Öåíà: {0289CC}%d+ âèðò') then if text:find('{FFFFFF}Наркотиков куплено: {0289CC}(%d+).*{FFFFFF}Цена: {0289CC}%d+ вирт') then
narko = narko + tonumber(text:match('{FFFFFF}Íàðêîòèêîâ êóïëåíî: {0289CC}(%d+).*{FFFFFF}Öåíà: {0289CC}%d+ âèðò')) narko = narko + tonumber(text:match('{FFFFFF}Наркотиков куплено: {0289CC}(%d+).*{FFFFFF}Цена: {0289CC}%d+ вирт'))
end end
if text:find('Íàðêîòèêîâ ïðîäàíî: {0289CC}(%d+)') then if text:find('Наркотиков продано: {0289CC}(%d+)') then
narko = narko - tonumber(text:match('Íàðêîòèêîâ ïðîäàíî: {0289CC}(%d+)')) narko = narko - tonumber(text:match('Наркотиков продано: {0289CC}(%d+)'))
end end
end end
@ -277,7 +267,7 @@ function sampev.onSendChat(message) antiflood = os.clock() * 1000 end
function sampev.onSendCommand(cmd) antiflood = os.clock() * 1000 end function sampev.onSendCommand(cmd) antiflood = os.clock() * 1000 end
function CheckCoord() function CheckCoord()
for k,v in pairs(coord) do for k,v in pairs(coord) do
local dist = math.floor(getDistanceBetweenCoords3d(v.x, v.y, v.z, getCharCoordinates(playerPed))) local dist = math.floor(getDistanceBetweenCoords3d(v.x, v.y, v.z, getCharCoordinates(playerPed)))
if dist <= 30 then if dist <= 30 then
return k return k
@ -286,24 +276,6 @@ function CheckCoord()
return '' return ''
end end
function SetPos()
lua_thread.create(function()
wait(100)
repeat
wait(0)
pos = true
sampSetCursorMode(3)
local X, Y = getCursorPos()
ini.Settings.X = X
ini.Settings.Y = Y
inicfg.save(ini, iniName)
until isKeyJustPressed(1)
sampSetCursorMode(0)
wait(100)
pos = false
end)
end
function drawClickableText(text, posX, posY, Color1, Color2) function drawClickableText(text, posX, posY, Color1, Color2)
if text ~= nil and posX ~= nil and posY ~= nil then if text ~= nil and posX ~= nil and posY ~= nil then
renderFontDrawText(font, text, posX, posY, Color1) renderFontDrawText(font, text, posX, posY, Color1)
@ -321,4 +293,359 @@ function drawClickableText(text, posX, posY, Color1, Color2)
else else
return false return false
end end
end end
-->> MENU
menu = {}
function menu.get()
return {
{
settings = {title = "corn-hud" ,style = 4 ,btn1 = "Выбрать" ,btn2 = "Закрыть" ,forward = "{ffffff}" ,backwards = "\n" ,score = true},
{
{
title = 'HUD\t'..(render and "ON" or "OFF"),
click = function(button, list, input , outs)
if button ~= 1 then return end
render = not render
showMenu = true
end
},
{
title = 'Сменить позицию\t',
click = function(button, list, input , outs)
if button ~= 1 then return end
if not render then
render = true
end
wait(200)
repeat
wait(0)
sampSetCursorMode(3)
local X, Y = getCursorPos()
ini.Settings.X = X
ini.Settings.Y = Y
until isKeyJustPressed(1)
inicfg.save(ini, iniName)
sampSetCursorMode(0)
showMenu = true
end
},
{
title = 'Клавиша №1\t'..ini.Settings.Key1:gsub("VK_", ""),
click = function(button, list, input , outs)
if button ~= 1 then return end
wait(200)
local key = ""
repeat
wait(0)
if not sampIsDialogActive() then
sampShowDialog(0, "Смена активации", "Нажмите на любую клавишу", "Выбрать", "Закрыть", 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 ~= ""
ini.Settings.Key1 = key
inicfg.save(ini, iniName)
showMenu = true
end
},
{
title = 'Клавиша №2\t'..ini.Settings.Key2:gsub("VK_", ""),
click = function(button, list, input , outs)
if button ~= 1 then return end
wait(200)
local key = ""
repeat
wait(0)
if not sampIsDialogActive() then
sampShowDialog(0, "Смена активации", "Нажмите на любую клавишу", "Выбрать", "Закрыть", 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 ~= ""
ini.Settings.Key2 = key
inicfg.save(ini, iniName)
showMenu = true
end
},
}
}
}
end
function menu.loop()
showMenu = false
sampRegisterChatCommand('corn', function(param)
showMenu = true
end)
while true do
wait(0)
if showMenu then
showMenu = false
menu.dialog = menu.get()
start_dialog(menu.dialog[1])
end
end
end
function start_dialog(menu) -- module by trefa
function _dialog(menu, id, outs)
sampShowDialog(id, menu.settings.title, tbl_split(menu.settings.style, menu, menu.settings.forward ,menu.settings.backwards ,menu.settings.score), menu.settings.btn1, (menu.settings.btn2 ~= nil and menu.settings.btn2 or _), menu.settings.style)
repeat
wait(0)
local result, button, list, input = sampHasDialogRespond(id)
if result then
local out, outs = menu[((menu.settings.style == 0 or menu.settings.style == 1 or menu.settings.style == 3) and 1 or ((list + 1) > #menu[1] and 2 or 1))][((menu.settings.style == 0 or menu.settings.style == 1 or menu.settings.style == 3) and 1 or ((list + 1) > #menu[1] and (list - #menu[1]) + 1 or list + 1))].click(button, list, input, outs)
if type(out) == "table" then
return _dialog(out, id - 1, outs)
elseif type(out) == "boolean" then
if not out then
return out
end
return _dialog(menu, id, outs)
end
end
until result
end
function tbl_split(style, tbl, forward ,backwards ,score)
if style == 2 or style == 4 or style == 5 then
text = (style == 5 and tbl[1].text.."\n" or "")
for i, val in ipairs(tbl[1]) do
text = text..""..forward..""..(score and "["..(i-1).."] " or "")..""..val.title..""..backwards
end
if tbl[2] ~= nil then
for _, val in ipairs(tbl[2]) do
text = text..""..forward..""..val.title..""..backwards
end
end
return text
end
return tbl[1].text
end
return _dialog(menu, 1337, outs)
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/corn-hud/raw/branch/master/version",
script_url = "http://git.deadpoo.net/rubin/corn-hud/raw/branch/master/corn-hud.lua",
changelog_url = "http://git.deadpoo.net/rubin/corn-hud/raw/branch/master/changelog",
address_ini = "rubin-mods-updates.ini",
main = function()
local name = thisScript().name
local ini = inicfg.load({
[name] = {
check_update = true,
auto_update = true,
server_version = ""
}
}, script_update.address_ini)
ini[name].version_url = script_update.version_url
ini[name].script_url = script_update.script_url
ini[name].changelog_url = script_update.changelog_url
ini[name].version = thisScript().version
ini[name].script_name = thisScript().name
local command = (thisScript().name:gsub(" ", "").."-update"):lower()
sampRegisterChatCommand(command, script_update.command)
if ini[name].check_update or ini[name].auto_update then
local fpath = os.tmpname()
local result, text = pcall(openURL, script_update.version_url, fpath)
if result then
ini[name].server_version = text
if text ~= "" and not string.find(text, thisScript().version) then
addChatMessage( string.format("Вышла новая версия '%s'. Текущая: '%s'", text, thisScript().version) )
if ini[name].auto_update then
addChatMessage( string.format("Автообновление скрипта включено. Процесс запущен!") )
script_update.command()
else
addChatMessage( string.format("Автообновление скрипта выключено. Обновить самому: /%s", command) )
end
end
end
end
inicfg.save(ini, script_update.address_ini)
script_update.menu.init()
end,
command = function()
lua_thread.create(function()
local fpath = os.tmpname()
local result, text = pcall(openURL, script_update.version_url, fpath)
if result then
if text ~= "" and not string.find(text, thisScript().version) then
addChatMessage( string.format("Вышла новая версия '%s'. Текущая: '%s'", text, thisScript().version) )
local fpath = os.tmpname()
local result, text = pcall(openURL, script_update.script_url, fpath)
if result and text ~= "" and text:find(thisScript().name:gsub("%-", "%%-")) then
local file, error = io.open(thisScript().path, "w")
if file ~= nil then
file:write(text)
file:flush()
io.close(file)
addChatMessage("Обновление завершено, скрипт перезагружен!")
wait(500)
thisScript():reload()
end
end
else
addChatMessage("У Вас установлена последняя версия!")
end
end
end)
end,
menu = {
text = {},
dialog = {},
init = function()
if not sampIsChatCommandDefined("rubin-mods") then
sampAddChatMessage("{667dff}[RUBIN MODS]{FFFFFF} Управление обновлениями скриптов: /rubin-mods", 0xFFFFFFFF)
sampRegisterChatCommand("rubin-mods",script_update.menu.show)
while true do
wait(0)
local result, button, list, input = sampHasDialogRespond(2160)
if result and button == 1 then
if script_update.menu.text[list+1] ~= nil and script_update.menu.dialog[list+1] ~= nil then
script_update.menu.dialog[list+1](script_update.menu.ini[list+1])
end
end
local result, button, list, input = sampHasDialogRespond(2162)
if result then
if button == 1 then
if script_update.menu2.text[list+1] ~= nil and script_update.menu2.dialog[list+1] ~= nil then
script_update.menu2.dialog[list+1]()
end
else
script_update.menu.show()
end
end
local result, button, list, input = sampHasDialogRespond(2161)
if result then
script_update.menu2.show(script_update.menu2.data)
end
end
end
end,
show = function()
script_update.menu.text = {}
script_update.menu.dialog = {}
script_update.menu.ini = {}
local ini = inicfg.load({}, script_update.address_ini)
for k,v in pairs(ini) do
script_update.menu.ini[#script_update.menu.ini+1] = v
script_update.menu.text[#script_update.menu.text+1] = string.format("%s\t%s%s", k, (v.version == v.server_version and "{59fc30}" or "{ff0000}"),v.version)
script_update.menu.dialog[#script_update.menu.dialog+1] = function(data)
script_update.menu2.show(data)
end
end
local text = ""
for i = 1, #script_update.menu.text do
text = text..script_update.menu.text[i].."\n"
end
sampShowDialog(2160,"Обновление скриптов: Rubin Mods","Скрипт\tВерсия\n"..text,"Выбрать","Закрыть",5)
end
},
menu2 = {
data = {},
text = {},
dialog = {},
show = function(data)
script_update.menu2.data = data
script_update.menu2.text = {}
script_update.menu2.dialog = {}
local ini = inicfg.load({}, script_update.address_ini)
local k = data.script_name
script_update.menu2.text[#script_update.menu2.text+1] = string.format("Автообновление %s", (ini[k].auto_update and "{59fc30}ON" or "{ff0000}OFF"))
script_update.menu2.dialog[#script_update.menu2.dialog+1] = function()
ini[k].auto_update = not ini[k].auto_update
inicfg.save(ini, script_update.address_ini)
script_update.menu2.show(data)
end
if not ini[k].auto_update then
script_update.menu2.text[#script_update.menu2.text+1] = string.format("Проверять обновления %s", (ini[k].check_update and "{59fc30}ON" or "{ff0000}OFF"))
script_update.menu2.dialog[#script_update.menu2.dialog+1] = function()
ini[k].check_update = not ini[k].check_update
inicfg.save(ini, script_update.address_ini)
script_update.menu2.show(data)
end
end
script_update.menu2.text[#script_update.menu2.text+1] = string.format("Последние изменения")
script_update.menu2.dialog[#script_update.menu2.dialog+1] = function()
script_update.changelog(ini[k].changelog_url)
end
script_update.menu2.text[#script_update.menu2.text+1] = string.format("Удалить из списка")
script_update.menu2.dialog[#script_update.menu2.dialog+1] = function()
ini[k] = nil
inicfg.save(ini, script_update.address_ini)
script_update.menu.show()
end
local text = ""
for i = 1, #script_update.menu2.text do
text = text..script_update.menu2.text[i].."\n"
end
sampShowDialog(2162,"Настройки обновления для "..data.script_name,text,"Выбрать","Назад",2)
end
},
changelog = function(url, data)
local fpath = os.tmpname()
local result, text = pcall(openURL, url, fpath)
if result then
sampShowDialog(2161,"Changelog - "..thisScript().name,text,"Выбрать","Назад",4)
end
end
}

@ -0,0 +1 @@
23.01.2023
Loading…
Cancel
Save