Compare commits

..

No commits in common. 'dad8eb4c9fbd3f33cce18996b3b664d0bcb2dd61' and '8c3fc250ea5647cce90f93ee9beb9f389bc08121' have entirely different histories.

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

2
.gitattributes vendored

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

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

@ -1,10 +1,8 @@
script_name('corn-hud') script_name('cornHUD')
script_author("Serhiy_Rubin") script_author("Serhiy_Rubin")
script_version("23.01.2023") script_version("22/09/2019")
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
@ -22,21 +20,22 @@ 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
lua_thread.create(script_update.main) repeat
repeat wait(0) until sampGetCurrentServerName() ~= "SA-MP" wait(100)
repeat wait(0) until sampGetCurrentServerName():find("Samp%-Rp.Ru") or sampGetCurrentServerName():find("SRP") local res, id = sampGetPlayerIdByCharHandle(PLAYER_PED)
server = sampGetCurrentServerName():gsub("|", "") nickname = sampGetPlayerNickname(id)
server = if res then score = sampGetPlayerScore(id) end
(server:find("02") and "Two" or until score > 0
(server:find("Revo") and "Revolution" or local magicChar = { ":", "|" }
(server:find("Legacy") and "Legacy" or (server:find("Classic") and "Classic" or local hostName = sampGetCurrentServerName()
(server:find("Zero Two") and "Two" or ""))))) for i = 1, #magicChar do hostName = hostName:gsub(magicChar[i], '') end
if server == "" then if string.find(hostName, "Legacy") then serverName = "Legacy" end
thisScript():unload() if string.find(hostName, "Reborn") then serverName = "Reborn" end
end if string.find(hostName, "Revolution") then serverName = "Revolution" end
iniName = string.format("corn-%s", server) if hostName == "Samp-Rp.Ru Server 02 Client 0.3.7" then serverName = "Two" end
local x1, y1 = convertGameScreenCoordsToWindowScreenCoords(14.992679595947, 274.75) if serverName == nil then thisScript():unload() end
ini = inicfg.load({ iniName = string.format("cornHUD-%s", serverName)
ini = inicfg.load({
['Farm 0'] = { ['Farm 0'] = {
corn = 0, corn = 0,
cornPrice = 0, cornPrice = 0,
@ -86,19 +85,30 @@ function main()
}, },
Settings = { Settings = {
Key1='VK_RBUTTON', Key1='VK_RBUTTON',
Key2='VK_MENU', Key2='VK_C',
X=x1, X=0,
Y=y1 Y=0
}, },
}, iniName) }, iniName)
inicfg.save(ini, iniName) inicfg.save(ini, iniName)
sampfuncsLog(' {FFFFFF}corn-hud loaded. CMD: /corn | /corn hud. | Key combo: '..ini.Settings.Key1:gsub("VK_", '')..' + '..ini.Settings.Key2:gsub("VK_", '')) sampfuncsLog(' {FFFFFF}corn-hud by Serhiy_Rubin 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)
lua_thread.create(menu.loop) sampRegisterChatCommand('getcoord', function(param)
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
@ -116,14 +126,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
@ -135,7 +145,7 @@ function main()
end end
end end
end end
if isKeyDown(vkeys[ini.Settings.Key1]) and (isCharInModel(PLAYER_PED, 440) or isKeyDown(vkeys[ini.Settings.Key2])) then if isKeyDown(VK_RBUTTON) and (isCharInModel(PLAYER_PED, 440) or isKeyDown(VK_C)) then
sampSetCursorMode(3) sampSetCursorMode(3)
mouse = 1 mouse = 1
local posX, posY = getScreenResolution() local posX, posY = getScreenResolution()
@ -144,22 +154,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
@ -167,71 +177,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
@ -239,27 +249,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
@ -267,7 +277,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
@ -276,6 +286,24 @@ 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)
@ -293,359 +321,4 @@ 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
}

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