--[[
Skrypt zosta? wykonany przez:
-Asper (nezymr69@gmail.com),
-Hardu? (rafox123.1990@o2.pl).
Na potrzeby serwera:
-WestRPG (2018).
Jedyne i wy??czone prawo do u?ywania kodu ma serwer WestRPG oraz autor skryptu. (Asper, Hardu?)
]]
local dxLibary = exports.dxLibary
local speedometer = {}
local sw,sh = guiGetScreenSize()
local baseX = 1920
local scale = 1
local minScale = 2
if sw < baseX then
scale = math.min(minScale, baseX/sw)
end
local addScale = false
local tick = getTickCount()
function isEventHandlerAdded(eventName, rootName, fnc)
if type(eventName) == 'string' and isElement(rootName) and type(fnc) == 'function' then
local eventHandlers = getEventHandlers(eventName, rootName)
if type(eventHandlers) == 'table' and #eventHandlers > 0 then
for i,v in ipairs(eventHandlers) do
if v == fnc then
return true
end
end
end
end
return false
end
function speedometer:ReplaceTextures()
self['txd_speedometer'] = dxLibary:createTexture(':licznik/images/licznik.png', 'dxt5', false, 'clamp')
self['txd_center'] = dxLibary:createTexture(':licznik/images/srodek.png', 'dxt5', false, 'clamp')
self['txd_arrow'] = dxLibary:createTexture(':licznik/images/strzalka.png', 'dxt5', false, 'clamp')
self['txd_progress'] = dxLibary:createTexture(':licznik/images/progress.png', 'dxt5', false, 'clamp')
self['txd_gas-bottle'] = dxLibary:createTexture(':licznik/images/gas_bottle.png', 'dxt5', false, 'clamp')
self['txd_pasek'] = dxLibary:createTexture(':licznik/images/pasek.png', 'dxt5', false, 'clamp')
self['font_1'] = dxCreateFont('fonts/Digital-7.ttf', 13/scale)
self['font_2'] = dxCreateFont('fonts/Digital-7.ttf', 30/scale)
self['render_fnc'] = function() self:Render() end
self['pre_render-fnc'] = function() self:PreRender() end
self['pos'] = {}
self['pos_tick'] = getTickCount()
end
function speedometer:Render()
if (not self['vehicle'] or self['vehicle'] and not isElement(self['vehicle'])) then
self:Showed(false)
return
end
if getElementData(self['vehicle'], 'vehicle:handbrake') and not getControlState('handbrake') then
setControlState('handbrake', true)
end
local speed = self:GetVehicleSpeed() > 285 and math.random(285,286) or self:GetVehicleSpeed()
local speed_ = self:GetVehicleSpeed_()
local distance = getElementData(self['vehicle'], 'vehicle:distance') or 0
local fuel = getElementData(self['vehicle'], 'vehicle:fuel') or 25
local gas = getElementData(self['vehicle'], 'vehicle:gas') or 25
local type = getElementData(self['vehicle'], 'vehicle:type') or 'Benzyna'
local bak = getElementData(self['vehicle'], 'vehicle:bak') or 25
local rot = getVehicleRPM(self['vehicle']) / 25
local actualType = getElementData(self['vehicle'], 'vehicle:actualType') or 'Benzyna'
local engine = getElementData(self['vehicle'], 'vehicle:engine') or 1.2
local enginePower = getElementData(self['vehicle'], 'vehicle:enginePower') or 100
if fuel > bak then
fuel = bak
elseif gas > bak then
gas = bak
end
if speed_ > 25 and getVehicleType(self['vehicle']) == 'Bike' then
local lvl = (speed_-25) > 255 and 255 or (speed_-25)
setBlurLevel(lvl)
else
setBlurLevel(0)
end
local _type = (actualType == 'Benzyna' and 'PB-95' or actualType == 'Diesel' and 'ON' or actualType == 'LPG' and 'PB-95')
local _iftype = (type == 'LPG' and true or false)
if not getElementData(localPlayer, 'pokaz:hud') or not get() then return end
--dxDrawText(engine..' dm³ - '..enginePower..' KM', sw-(700/scale) + 1, sh-(125/scale) + 1, 35/scale + sw-(110/scale) + 1, 230/scale + sh-(150/scale) + 1, tocolor(0, 0, 0, 255), 1, self['font_1'], 'center', 'center', false, false, false, false, false)
--dxDrawText(engine..' dm³ - '..enginePower..' KM', sw-(700/scale), sh-(125/scale), 35/scale + sw-(110/scale), 230/scale + sh-(150/scale), tocolor(255, 255, 255, 255), 1, self['font_1'], 'center', 'center', false, false, false, false, false)
if(getElementModel(self.vehicle) == 453)then return end
if getVehicleType(self['vehicle']) == 'Bike' then
if addScale then
scale = scale - 0.1
addScale = false
end
dxDrawText(string.format('%01d', speed_)..'km/h', 1656/scale + 1, 1025/scale + 1, 1910/scale + 1, 1045/scale + 1, tocolor(0, 0, 0, 255), 1, self['font_2'], 'right', 'bottom', false, false, false, false, false)
dxDrawText('#0072ff'..string.format('%01d', speed_)..'#939393km/h', 1656/scale, 1025/scale, 1910/scale, 1045/scale, tocolor(255, 255, 255, 255), 1, self['font_2'], 'right', 'bottom', false, false, false, true, false)
dxDrawText(string.format('%.1f', distance)..'km', 1685/scale + 1, 1041/scale + 1, 1910/scale + 1, 1035/scale + 1, tocolor(0, 0, 0, 255), 1, self['font_1'], 'right', 'top', false, false, false, true, false)
dxDrawText('#0072ff'..string.format('%.1f', distance)..'#939393km', 1685/scale, 1041/scale, 1910/scale, 1035/scale, tocolor(255, 255, 255, 255), 1, self['font_1'], 'right', 'top', false, false, false, true, false)
dxDrawText(string.format('%.1f', fuel)..' / '..bak..'L', 1685/scale + 1, 975/scale + 1, 1910/scale + 1, 1072/scale + 1, tocolor(0, 0, 0, 255), 1, self['font_1'], 'right', 'top', false, false, false, true, false)
dxDrawText('#0072ff'..string.format('%.1f', fuel)..'#939393 / #0072ff'..bak..'#939393L', 1685/scale, 975/scale, 1910/scale, 1072/scale, tocolor(255, 255, 255, 255), 1, self['font_1'], 'right', 'top', false, false, false, true, false)
else
if not addScale then
scale = scale + 0.1
addScale = true
end
fuel = fuel < 0 and 0 or fuel
dxDrawImage(sw-(350/scale), sh-(343/scale), 330/scale, 330/scale, self['txd_speedometer'], 0, 0, 0, tocolor(255, 255, 255, 255), false)
dxDrawImage(sw-(338/scale), sh-(333/scale), 305/scale, 305/scale, self['txd_center'], rot, 0, 0, tocolor(255, 255, 255, 255), false)
dxDrawImage(sw-(338/scale), sh-(333/scale), 305/scale, 305/scale, self['txd_arrow'], speed / 1.1, 0, 0, tocolor(255, 255, 255, 255), false)
dxDrawImage(sw-(110/scale), sh-(100/scale), 135/scale, 25/scale, self['txd_progress'], 90, 0, 0, tocolor(255, 255, 255, 255), false)
dxDrawImage(sw-(50/scale), sh-(25/scale), 15/scale, (-125/scale) * (fuel/bak), self['txd_pasek'], 0, 0, 0, tocolor(255, 255, 255, 255), false)
dxDrawText(_type, sw-(110/scale) + 1, sh-(180/scale) + 1, 135/scale + sw-(110/scale) + 1, 25/scale + sh-(100/scale) + 1, tocolor(0, 0, 0, 255), 1, self['font_1'], 'center', 'top', false)
dxDrawText(_type, sw-(110/scale), sh-(180/scale), 135/scale + sw-(110/scale), 25/scale + sh-(100/scale), tocolor(255, 255, 255, 255), 1, self['font_1'], 'center', 'top', false)
if _iftype then
local r,g,b = 0,255,0
local myBak = (gas / bak) * 100
if myBak == bak then
r,g,b = 0,255,0
elseif myBak < 5 then
r,g,b = 255,0,0
elseif myBak > 5 and myBak < 25 then
r,g,b = 200,0,0
elseif myBak > 25 and myBak < 50 then
r,g,b = 255,255,0
elseif myBak > 50 and myBak < 75 then
r,g,b = 50,255,0
elseif myBak > 75 and myBak < 100 then
r,g,b = 25,255,25
end
dxDrawRectangle(sw-(48/scale), sh-(300/scale), 35/scale, - (gas / bak) * 25/scale, tocolor(r, g, b, 100), false)
if gas < 5 then
dxDrawImage(sw-(64/scale) + 1, sh-(350/scale) + 1, 64/scale + 1, 64/scale + 1, self['txd_gas-bottle'], 0, 0, 0, tocolor(0, 0, 0, 225), false)
local a = interpolateBetween(75, 0, 0, 225, 0, 0, (getTickCount() - tick)/3000, 'SineCurve')
dxDrawImage(sw-(64/scale), sh-(350/scale), 64/scale, 64/scale, self['txd_gas-bottle'], 0, 0, 0, tocolor(255, 0, 0, a), false)
else
dxDrawImage(sw-(64/scale) + 1, sh-(350/scale) + 1, 64/scale + 1, 64/scale + 1, self['txd_gas-bottle'], 0, 0, 0, tocolor(0, 0, 0, 225), false)
dxDrawImage(sw-(64/scale), sh-(350/scale), 64/scale, 64/scale, self['txd_gas-bottle'], 0, 0, 0, tocolor(255, 255, 255, 225), false)
end
end
dxDrawText(string.format('%03d', speed_), sw-(110/scale) + 1, sh-(180/scale) + 1, 35/scale + sw-(110/scale) + 1, 230/scale + sh-(150/scale) + 1, tocolor(0, 0, 0, 255), 1, self['font_2'], 'right', 'center', false, false, false, false, false)
dxDrawText(string.format('%03d', speed_), sw-(110/scale), sh-(180/scale), 35/scale + sw-(110/scale), 230/scale + sh-(150/scale), tocolor(255, 255, 255, 255), 1, self['font_2'], 'right', 'center', false, false, false, false, false)
dxDrawText(string.format('%.1f', distance)..'km', sw-(110/scale) + 1, sh-(250/scale) + 1, 35/scale + sw-(110/scale) + 1, 230/scale + sh-(150/scale) + 1, tocolor(0, 0, 0, 255), 1, self['font_1'], 'right', 'center', false, false, false, false, false)
dxDrawText(string.format('%.1f', distance)..'km', sw-(110/scale), sh-(250/scale), 35/scale + sw-(110/scale), 230/scale + sh-(150/scale), tocolor(255, 255, 255, 255), 1, self['font_1'], 'right', 'center', false, false, false, true, false)
end
end
function get()
local settings = getElementData(localPlayer, 'settings') or {}
local showed = #settings < 1 and true or false
for i,v in ipairs(settings) do
if v['name'] == 'Poka? HUD' and v['state'] == 1 then
showed = true
break
end
end
return showed
end
function speedometer:GetVehicleSpeed()
local vx, vy, vz = getElementVelocity(self['vehicle'])
return math.sqrt(vx^2+vy^2+vz^2)*200
end
function speedometer:GetVehicleSpeed_()
local vx, vy, vz = getElementVelocity(self['vehicle'])
return math.sqrt(vx^2+vy^2+vz^2)*190
end
function speedometer:PreRender()
if (not self['vehicle'] or self['vehicle'] and not isElement(self['vehicle'])) then return end
local distance = getElementData(self['vehicle'], 'vehicle:distance') or 0
local fuel = getElementData(self['vehicle'], 'vehicle:fuel') or 25
local gas = getElementData(self['vehicle'], 'vehicle:gas') or 25
local actualType = getElementData(self['vehicle'], 'vehicle:actualType') or 'Benzyna'
if ((actualType == 'Benzyna' or actualType == 'Diesel') and fuel <= 0) or (actualType == 'LPG' and gas <= 0) and getVehicleEngineState(self['vehicle']) == true then
setVehicleEngineState(self['vehicle'], false)
end
if #self['pos'] < 3 then
self['pos'] = {getElementPosition(self['vehicle'])}
self['pos_tick'] = getTickCount()
else
local x,y,z = getElementPosition(self['vehicle'])
local dist = getDistanceBetweenPoints3D(self['pos'][1], self['pos'][2], self['pos'][3], x, y, z)
if dist > 10 then
setElementData(self['vehicle'], 'vehicle:distance', distance + 0.01)
if actualType == 'Benzyna' or actualType == 'Diesel' then
setElementData(self['vehicle'], 'vehicle:fuel', fuel - 0.01)
elseif actualType == 'LPG' then
setElementData(self['vehicle'], 'vehicle:gas', gas - 0.01)
end
self['pos'] = {getElementPosition(self['vehicle'])}
self['pos_tick'] = getTickCount()
end
end
end
function speedometer:Showed(bool, vehicle)
if bool == true then
if vehicle then
self['vehicle'] = vehicle
end
if not isEventHandlerAdded('onClientRender', root, self['render_fnc']) and not isEventHandlerAdded('onClientPreRender', root, self['pre_render-fnc']) then
if getVehicleName(self.vehicle) == 'Bike' or getVehicleName(self.vehicle) == 'BMX' or getVehicleName(self.vehicle) == 'Mountain Bike' then return end
addEventHandler('onClientRender', root, self['render_fnc'])
addEventHandler('onClientPreRender', root, self['pre_render-fnc'])
end
else
removeEventHandler('onClientRender', root, self['render_fnc'])
removeEventHandler('onClientPreRender', root, self['pre_render-fnc'])
self['vehicle'] = false
end
end
addEventHandler('onClientVehicleEnter', root, function(player)
if player ~= localPlayer then return end
speedometer:Showed(true, source)
end)
addEventHandler('onClientVehicleExit', root, function(player)
if player ~= localPlayer then return end
speedometer:Showed(false)
end)
addEventHandler('onClientResourceStart', resourceRoot, function()
speedometer:ReplaceTextures()
if getPedOccupiedVehicle(localPlayer) then
speedometer:Showed(true, getPedOccupiedVehicle(localPlayer))
end
end)
function getVehicleRPM(vehicle)
local vehicleRPM = 0
if (vehicle) then
if (getVehicleEngineState(vehicle) == true) then
if getVehicleCurrentGear(vehicle) > 0 then
vehicleRPM = math.floor(((speedometer:GetVehicleSpeed()/getVehicleCurrentGear(vehicle))*180) + 0.5)
if (vehicleRPM < 650) then
vehicleRPM = math.random(650, 750)
elseif (vehicleRPM >= 9600) then
vehicleRPM = math.random(9600, 9900)
end
else
vehicleRPM = math.floor((speedometer:GetVehicleSpeed()*180) + 0.5)
if (vehicleRPM < 650) then
vehicleRPM = math.random(650, 750)
elseif (vehicleRPM >= 9600) then
vehicleRPM = math.random(9600, 9900)
end
end
else
vehicleRPM = 0
end
return tonumber(vehicleRPM)
else
return 0
end
end