commit
54752f3af3
@ -0,0 +1,409 @@ |
|||||||
|
script_name('ProdHUD') |
||||||
|
script_authors("RuBin") |
||||||
|
local samp = require 'samp.events' |
||||||
|
local inicfg = require 'inicfg' |
||||||
|
|
||||||
|
function main() |
||||||
|
if not isSampLoaded() or not isSampfuncsLoaded() then return end |
||||||
|
while not isSampAvailable() do wait(100) end |
||||||
|
iniLoad() |
||||||
|
font = renderCreateFont(ini.settings.font_name, ini.settings.font_size, ini.settings.font_flag) |
||||||
|
|
||||||
|
while true do |
||||||
|
wait(0) |
||||||
|
doRenderMenu() |
||||||
|
doBuyMode() |
||||||
|
doSendDialog() |
||||||
|
doCheckMonMode() |
||||||
|
end |
||||||
|
end |
||||||
|
|
||||||
|
function samp.onServerMessage(color, message) |
||||||
|
if message:find("Âû äîëæíû íàõîäèòüñÿ íà ñêëàäå, ñ âûáðàííûì âàìè òèïîì áèçíåñà") or |
||||||
|
message:find("Íåâåðíî óêàçàíî êîëè÷åñòâî") or |
||||||
|
message:find("Â ôóðãîíå íåò ìåñòà") or |
||||||
|
message:find("Ó âàñ íåò ïðîäóêòîâ") or |
||||||
|
message:find("Íóæíî íàõîäèòüñÿ ðÿäîì ñ áèçíåñîì, êîòîðîìó õîòèòå ïðîäàòü") or |
||||||
|
message:find("Ó âàñ íåäîñòàòî÷íî äåíåã") or |
||||||
|
(isCar() and message:find("Âû çàðàáîòàëè %d+ âèðò, èç êîòîðûõ %d+ âèðò áóäåò äîáàâëåíî ê âàøåé çàðïëàòå")) then |
||||||
|
if buyMode ~= nil then scip = true end |
||||||
|
buyMode = nil |
||||||
|
if checkMon ~= nil then |
||||||
|
return false |
||||||
|
end |
||||||
|
end |
||||||
|
if string.find(message, " Åäà: (%d+) / (%d+)") then |
||||||
|
prod.food, prod_count = string.match(message, " Åäà: (%d+) / (%d+)") |
||||||
|
if prod_count == prod.food and buyMode then scip = true end |
||||||
|
if prod.food == "0" and buyMode then scip = true end |
||||||
|
buyMode = nil |
||||||
|
end |
||||||
|
if string.find(message, " Áåíçèí: (%d+) / (%d+)") then |
||||||
|
prod.benz, prod_count = string.match(message, " Áåíçèí: (%d+) / (%d+)") |
||||||
|
if prod_count == prod.benz and buyMode then scip = true end |
||||||
|
if prod.benz == "0" and buyMode then scip = true end |
||||||
|
buyMode = nil |
||||||
|
end |
||||||
|
if string.find(message, " Òîâàðû: (%d+) / (%d+)") then |
||||||
|
prod.products, prod_count = string.match(message, " Òîâàðû: (%d+) / (%d+)") |
||||||
|
if prod_count == prod.products and buyMode then scip = true end |
||||||
|
if prod.products == "0" and buyMode then scip = true end |
||||||
|
buyMode = nil |
||||||
|
end |
||||||
|
if string.find(message, " Àëêîãîëü: (%d+) / (%d+)") then |
||||||
|
prod.alcohol, prod_count = string.match(message, " Àëêîãîëü: (%d+) / (%d+)") |
||||||
|
if prod_count == prod.alcohol and buyMode then scip = true end |
||||||
|
if prod.alcohol == "0" and buyMode then scip = true end |
||||||
|
buyMode = nil |
||||||
|
end |
||||||
|
end |
||||||
|
|
||||||
|
function samp.onShowDialog(DdialogId, Dstyle, Dtitle, Dbutton1, Dbutton2, Dtext) |
||||||
|
dialogActiveTime = os.clock() * 1000 |
||||||
|
if buyMode ~= nil or (buyMode == nil and scip ~= nil) then |
||||||
|
if Dtitle:find("Ðàçâîç÷èê ïðîäóêòîâ") then |
||||||
|
if scip == nil then |
||||||
|
send_dialog = { time = os.clock() * 1000, id = DdialogId, button = 1, listitem = (sell and 1 or 0), input = "" } |
||||||
|
end |
||||||
|
return false |
||||||
|
end |
||||||
|
if Dtext:find("Áàðû è êëóáû") and Dtext:find("Çàïðàâêè") then |
||||||
|
if scip == nil then |
||||||
|
local list = { alcohol = 0, benz = 1, products = 3, food = 2 } |
||||||
|
send_dialog = { time = os.clock() * 1000, id = DdialogId, button = 1, listitem = list[buyMode], input = "" } |
||||||
|
end |
||||||
|
return false |
||||||
|
end |
||||||
|
if Dtitle:find("Ââîä ïàðàìåòðà") and Dtext:find("Ââåäèòå êîëè÷åñòâî ïðîäóêòîâ îò %d+ äî (%d+)") then |
||||||
|
if scip == nil then |
||||||
|
local count = tonumber(Dtext:match("Ââåäèòå êîëè÷åñòâî ïðîäóêòîâ îò %d+ äî (%d+)")) - prod[buyMode] |
||||||
|
send_dialog = { time = os.clock() * 1000, id = DdialogId, button = 1, listitem = 0, input = tostring(count) } |
||||||
|
end |
||||||
|
return false |
||||||
|
end |
||||||
|
if Dtitle:find("Ñîîáùåíèå") and Dtext:find("Ñòîèìîñòü")and Dtext:find("Êîëè÷åñòâî") then |
||||||
|
if scip == nil then |
||||||
|
send_dialog = { time = os.clock() * 1000, id = DdialogId, button = 1, listitem = 0, input = "" } |
||||||
|
end |
||||||
|
return false |
||||||
|
end |
||||||
|
end |
||||||
|
if DdialogId == 22 and Dstyle == 0 and Dtitle == "Ñîîáùåíèå" and string.find(Dtext, "Áèçíåñ") and string.find(Dtext, "Ñêîëüêî ìîæåò êóïèòü") then |
||||||
|
if string.find(Dtext, "Cluc") or string.find(Dtext, "Pizza") or string.find(Dtext, "Cluck") or string.find(Dtext, "Burger") then |
||||||
|
monArray["food"] = Dtext |
||||||
|
elseif string.find(Dtext, "24%-7") then |
||||||
|
monArray["products"] = Dtext |
||||||
|
elseif string.find(Dtext, "gas") or string.find(Dtext, "Gas") or string.find(Dtext, "Gsa") then |
||||||
|
monArray["benz"] = Dtext |
||||||
|
else |
||||||
|
monArray["alcohol"] = Dtext |
||||||
|
end |
||||||
|
if checkMon ~= nil then |
||||||
|
send_dialog = { time = os.clock() * 1000, id = DdialogId, button = 0, listitem = 0, input = "" } |
||||||
|
return false |
||||||
|
end |
||||||
|
end |
||||||
|
if checkMon ~= nil then |
||||||
|
if Dtitle:find("Ðàçâîç÷èê ïðîäóêòîâ") then |
||||||
|
if scip == nil then |
||||||
|
send_dialog = { time = os.clock() * 1000, id = DdialogId, button = 1, listitem = 2, input = "" } |
||||||
|
end |
||||||
|
return false |
||||||
|
end |
||||||
|
if Dtitle:find("Ìîíèòîðèíã") then |
||||||
|
if checkMon == "" then |
||||||
|
checkMon = nil |
||||||
|
return false |
||||||
|
end |
||||||
|
if scip == nil then |
||||||
|
local arr_sled = { alcohol = "benz", benz = "food", food = "products", products = "" } |
||||||
|
local arr_button = { alcohol = 0, benz = 1, food = 2, products = 3 } |
||||||
|
send_dialog = { time = os.clock() * 1000, id = DdialogId, button = 1, listitem = arr_button[checkMon], input = "" } |
||||||
|
checkMon = arr_sled[checkMon] |
||||||
|
end |
||||||
|
return false |
||||||
|
end |
||||||
|
end |
||||||
|
if Dtitle:find("GPS") and bizname ~= nil then |
||||||
|
local arr_sled = { alcohol = 2, benz = 8, food = 10, products = 9 } |
||||||
|
send_dialog = { time = os.clock() * 1000, id = DdialogId, button = 1, listitem = arr_sled[monMode], input = "" } |
||||||
|
return false |
||||||
|
end |
||||||
|
if (bizname ~= nil or ( bizname == nil and scip ~= nil)) and (Dtitle:find("Áåíçîçàïðàâêè") or Dtitle:find("Ìàãàçèíû") or Dtitle:find("Áàðû") or Dtitle:find("Çàêóñî÷íûå") ) then |
||||||
|
if scip ~= nil then |
||||||
|
scip = nil |
||||||
|
return false |
||||||
|
end |
||||||
|
local arr = split(Dtext, "\n") |
||||||
|
local result = -1 |
||||||
|
for i = 1, #arr do |
||||||
|
local str = arr[i]:gsub("%-", " ") |
||||||
|
local findText = bizname:gsub("%-", " ") |
||||||
|
|
||||||
|
if monMode == "benz" and not findText:find("Emerald") and not findText:find("Tierra") then |
||||||
|
bizname = string.gsub(bizname, " ", "") |
||||||
|
end |
||||||
|
|
||||||
|
if str:gsub("%-", " "):find(findText) then |
||||||
|
result = i - 1 |
||||||
|
break |
||||||
|
end |
||||||
|
end |
||||||
|
if result ~= -1 then |
||||||
|
scip = true |
||||||
|
send_dialog = { time = os.clock() * 1000, id = DdialogId, button = 1, listitem = result, input = "" } |
||||||
|
else |
||||||
|
sampAddChatMessage(bizname, -1) |
||||||
|
end |
||||||
|
bizname = nil |
||||||
|
return false |
||||||
|
end |
||||||
|
|
||||||
|
scip = nil |
||||||
|
end |
||||||
|
|
||||||
|
function samp.onSendDialogResponse(dialogId, button, listboxId, input) |
||||||
|
|
||||||
|
end |
||||||
|
|
||||||
|
function isCar() |
||||||
|
if isCharInModel(PLAYER_PED, 455) or isCharInModel(PLAYER_PED, 459) or isCharInModel(PLAYER_PED, 552) or isCharInModel(PLAYER_PED, 414) or isCharInModel(PLAYER_PED, 456) then |
||||||
|
return true |
||||||
|
end |
||||||
|
end |
||||||
|
|
||||||
|
-->> RENDER MENU |
||||||
|
|
||||||
|
function doRenderMenu() |
||||||
|
if not isCar() or sampIsDialogActive() or sampIsChatInputActive() or not isKeyDown(2) then |
||||||
|
if control then |
||||||
|
sampSetCursorMode(0) |
||||||
|
end |
||||||
|
control = false |
||||||
|
return |
||||||
|
end |
||||||
|
|
||||||
|
if not control then |
||||||
|
control = true |
||||||
|
end |
||||||
|
|
||||||
|
sampSetCursorMode(3) |
||||||
|
|
||||||
|
|
||||||
|
-->> Render MENU |
||||||
|
local height = renderGetFontDrawHeight(font) |
||||||
|
local plus = height + (height / 4) |
||||||
|
local X, Y = getScreenResolution() |
||||||
|
Y = ((Y / 2.0) - (height * 3)) |
||||||
|
|
||||||
|
local textLength = renderGetFontDrawTextLength(font, "Ïðîäàòü äëÿ Çàêóñî÷íîé") |
||||||
|
|
||||||
|
|
||||||
|
renderDrawBox((X - textLength), Y, textLength, (plus * 11), 0x80000000) |
||||||
|
local x, y = (X - textLength) - 72, Y |
||||||
|
for i = 10, 80 do |
||||||
|
x = x + 1 |
||||||
|
local color = string.format("0x%d000000", i) |
||||||
|
renderDrawBox(x, y, 1, (plus * 11), color) |
||||||
|
end |
||||||
|
|
||||||
|
string = "Êóïèòü äëÿ Áàðà" |
||||||
|
if drawClickableText(string, (X - renderGetFontDrawTextLength(font, string.." ")), Y) then |
||||||
|
sell = false |
||||||
|
buyMode = "alcohol" |
||||||
|
end |
||||||
|
Y = Y + plus |
||||||
|
string = "Ïðîäàòü äëÿ Áàðà" |
||||||
|
if drawClickableText(string, (X - renderGetFontDrawTextLength(font, string.." ")), Y) then |
||||||
|
sell = true |
||||||
|
buyMode = "alcohol" |
||||||
|
end |
||||||
|
|
||||||
|
|
||||||
|
Y = Y + plus + plus |
||||||
|
|
||||||
|
string = "Êóïèòü äëÿ Çàïðàâêè" |
||||||
|
if drawClickableText(string, (X - renderGetFontDrawTextLength(font, string.." ")), Y) then |
||||||
|
sell = false |
||||||
|
buyMode = "benz" |
||||||
|
end |
||||||
|
Y = Y + plus |
||||||
|
string = "Ïðîäàòü äëÿ Çàïðàâêè" |
||||||
|
if drawClickableText(string, (X - renderGetFontDrawTextLength(font, string.." ")), Y) then |
||||||
|
sell = true |
||||||
|
buyMode = "benz" |
||||||
|
end |
||||||
|
|
||||||
|
Y = Y + plus + plus |
||||||
|
|
||||||
|
string = "Êóïèòü äëÿ Ìàãàçèíà" |
||||||
|
if drawClickableText(string, (X - renderGetFontDrawTextLength(font, string.." ")), Y) then |
||||||
|
sell = false |
||||||
|
buyMode = "products" |
||||||
|
end |
||||||
|
Y = Y + plus |
||||||
|
string = "Ïðîäàòü äëÿ Ìàãàçèíà" |
||||||
|
if drawClickableText(string, (X - renderGetFontDrawTextLength(font, string.." ")), Y) then |
||||||
|
sell = true |
||||||
|
buyMode = "products" |
||||||
|
end |
||||||
|
|
||||||
|
Y = Y + plus + plus |
||||||
|
|
||||||
|
string = "Êóïèòü äëÿ Çàêóñî÷íîé" |
||||||
|
if drawClickableText(string, (X - renderGetFontDrawTextLength(font, string.." ")), Y) then |
||||||
|
sell = false |
||||||
|
buyMode = "food" |
||||||
|
end |
||||||
|
Y = Y + plus |
||||||
|
string = "Ïðîäàòü äëÿ Çàêóñî÷íîé" |
||||||
|
if drawClickableText(string, (X - renderGetFontDrawTextLength(font, string.." ")), Y) then |
||||||
|
sell = true |
||||||
|
buyMode = "food" |
||||||
|
end |
||||||
|
|
||||||
|
|
||||||
|
-->> Render Monitoring |
||||||
|
|
||||||
|
local X, Y = getScreenResolution() |
||||||
|
Y = ((Y / 2.2) - (height * 3)) |
||||||
|
|
||||||
|
string = "[Îáíîâèòü öåíû]" |
||||||
|
if drawClickableText(string, (X / 2 - (renderGetFontDrawTextLength(font, string.." ") / 2 )), Y) then |
||||||
|
checkMon = "alcohol" |
||||||
|
end |
||||||
|
|
||||||
|
Y = Y + plus |
||||||
|
|
||||||
|
string = string.format("{%s}Àëêîãîëü {%s}| {%s}Çàïðàâêè {%s}| {%s}Ìàãàçèíû {%s}| {%s}Çàêóñî÷íûå", |
||||||
|
(monMode == "alcohol" and ini.settings.color2 or ini.settings.color1), |
||||||
|
ini.settings.color1, |
||||||
|
(monMode == "benz" and ini.settings.color2 or ini.settings.color1), |
||||||
|
ini.settings.color1, |
||||||
|
(monMode == "products" and ini.settings.color2 or ini.settings.color1), |
||||||
|
ini.settings.color1, |
||||||
|
(monMode == "food" and ini.settings.color2 or ini.settings.color1) |
||||||
|
) |
||||||
|
if drawClickableText(string, (X / 2 - (renderGetFontDrawTextLength(font, string.." ") / 2 )), Y) then |
||||||
|
local mode_sled = { alcohol = "benz", benz = "products", products = "food", food = "alcohol" } |
||||||
|
monMode = mode_sled[monMode] |
||||||
|
end |
||||||
|
local delta = getMousewheelDelta() |
||||||
|
if delta > 0 then |
||||||
|
local mode_sled = { alcohol = "benz", benz = "products", products = "food", food = "alcohol" } |
||||||
|
monMode = mode_sled[monMode] |
||||||
|
elseif delta < 0 then |
||||||
|
local mode_sled = { alcohol = "food", benz = "alcohol", products = "benz", food = "products" } |
||||||
|
monMode = mode_sled[monMode] |
||||||
|
end |
||||||
|
|
||||||
|
Y = Y + plus |
||||||
|
|
||||||
|
local arr = split(monArray[monMode], "\n") |
||||||
|
|
||||||
|
for i = 1, #arr do |
||||||
|
local string = arr[i] |
||||||
|
if drawClickableText(string, (X / 2 - (renderGetFontDrawTextLength(font, string.." ") / 2 )), Y) then |
||||||
|
if string:find("{FFFFFF}(.+) {6AB1FF}%d+ {00A86B}%d+") then |
||||||
|
bizname = string:match("{FFFFFF}(.+) {6AB1FF}%d+ {00A86B}%d+") |
||||||
|
local replace = { |
||||||
|
[" Cluck"] = "", |
||||||
|
[" Pizza"] = "", |
||||||
|
[" Burger"] = "", |
||||||
|
[" 24%-7"] = "", |
||||||
|
[" Gas"] = "", |
||||||
|
[" Gsa"] = "", |
||||||
|
["Four dragon"] = "Ñêëàä áàðà 4Äðàêîíîâ", |
||||||
|
["Caligula"] = "Ñêëàä áàðà Êàëèãóëû", |
||||||
|
[" Bar"] = "", |
||||||
|
[" bar"] = "", |
||||||
|
["Quebrados"] = "Guebrabos" |
||||||
|
} |
||||||
|
for k,v in pairs(replace) do |
||||||
|
bizname = string.gsub(bizname, k, v) |
||||||
|
end |
||||||
|
sampSendChat("/gps") |
||||||
|
end |
||||||
|
end |
||||||
|
Y = Y + plus |
||||||
|
end |
||||||
|
|
||||||
|
end |
||||||
|
|
||||||
|
-->> BuyMode |
||||||
|
function doBuyMode() |
||||||
|
if buyMode == nil or prod[buyMode] == nil then return end |
||||||
|
if dialogActiveTime == nil then dialogActiveTime = 0 end |
||||||
|
if sampIsDialogActive() then dialogActiveTime = os.clock() * 1000 return end |
||||||
|
|
||||||
|
if os.clock() * 1000 - dialogActiveTime > 500 then |
||||||
|
dialogActiveTime = os.clock() * 1000 |
||||||
|
sampSendChat("/prodmenu") |
||||||
|
end |
||||||
|
end |
||||||
|
|
||||||
|
-->> CHECK MODE |
||||||
|
function doCheckMonMode() |
||||||
|
if checkMon == nil then return end |
||||||
|
if dialogActiveTime == nil then dialogActiveTime = 0 end |
||||||
|
if sampIsDialogActive() then dialogActiveTime = os.clock() * 1000 return end |
||||||
|
|
||||||
|
if os.clock() * 1000 - dialogActiveTime > 500 then |
||||||
|
dialogActiveTime = os.clock() * 1000 |
||||||
|
sampSendChat("/prodmenu") |
||||||
|
end |
||||||
|
end |
||||||
|
|
||||||
|
|
||||||
|
-->> SEND DIALOG |
||||||
|
function doSendDialog() |
||||||
|
if send_dialog == nil then return end |
||||||
|
if os.clock() * 1000 - send_dialog.time < 300 then return end |
||||||
|
sampSendDialogResponse(send_dialog.id,send_dialog.button,send_dialog.listitem,send_dialog.input) |
||||||
|
send_dialog = nil |
||||||
|
end |
||||||
|
|
||||||
|
-->> INIFILES |
||||||
|
|
||||||
|
function iniLoad() |
||||||
|
ini = inicfg.load({ |
||||||
|
settings = { |
||||||
|
font_name = "SegoeUI", |
||||||
|
font_size = 10, |
||||||
|
font_flag = 13, |
||||||
|
color1 = "2f72f7", |
||||||
|
color2 = "ffffff" |
||||||
|
} |
||||||
|
}) |
||||||
|
inicfg.save(ini) |
||||||
|
|
||||||
|
prod = { alcohol = 0, benz = 0, products = 0, food = 0 } |
||||||
|
monMode = "alcohol" |
||||||
|
monArray = { alcohol = "Ïóñòî", benz = "Ïóñòî", products = "Ïóñòî", food = "Ïóñòî" } |
||||||
|
end |
||||||
|
|
||||||
|
|
||||||
|
-->> New Func |
||||||
|
|
||||||
|
function drawClickableText(text, posX, posY) |
||||||
|
renderFontDrawText(font, text, posX, posY, '0xFF'..ini.settings.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 |
||||||
|
renderFontDrawText(font, text, posX, posY, '0x70'..ini.settings.color2) |
||||||
|
if isKeyJustPressed(1) then |
||||||
|
return true |
||||||
|
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 |
Loading…
Reference in new issue