Usa esto en el client-side:
local BannedIDs = { 432, 532 }
local rootElem = getRootElement()
local thisRoot = getResourceRootElement(getThisResource())
local player = getLocalPlayer()
local vehicle
local size = 1.2
local modo = 0.01
local score = 0
local screenScore = 0
local tick
local idleTime
local multTime
local driftTime
local Yellow = tocolor(255,128,0)
local Red = tocolor(234,0,3)
local TempCol = Yellow
local mult = 1
local tablamult = {350,1400,4200,11200}
local anterior = 0
local mejor = 0
local total = 0
local Shadow = tocolor(0,0,0,255)
local global_mejor = 0
local global_nombre = "N/A"
local screenWidth, screenHeight = guiGetScreenSize()
local x1,y1,x2,y2 = screenWidth*0.2,screenHeight*0.1,screenWidth*0.8,screenHeight*0.8
addEventHandler("onClientResourceStart", thisRoot,
function()
addEventHandler("onClientRender", rootElem, showText)
outputChatBox("* #0080FFEsperando datos de drift del server...", 255, 255, 255, true)
triggerServerEvent("driftClienteListo", rootElem, player)
end
)
addEventHandler("onClientResourceStop", thisRoot,
function()
removeEventHandler("onClientRender", rootElem, showText)
end
)
function isValidVehicle()
local temp = getPedOccupiedVehicle(player)
if not temp or getVehicleOccupant(temp,0) ~= player or getVehicleType(temp) ~= "Automobile" then
return false
end
local vehID = getElementModel(temp)
for k,v in ipairs(BannedIDs) do if vehID == v then return false end end
return temp
end
function showText()
dxDrawText(string.format("Mejor Drift: %s - %d",global_nombre,global_mejor),22,567,screenWidth,screenHeight,Shadow,1,"pricedown")
dxDrawText(string.format("Mejor Drift: %s - %d",global_nombre,global_mejor),20,565,screenWidth,screenHeight,Yellow,1,"pricedown")
vehicle = isValidVehicle()
if not vehicle then return end
if size > 1.3 then
modo = -0.01
elseif size < 1.2 then
modo = 0.01
end
size = size + modo
tick = getTickCount()
local angulo,velocidad = angle()
local tempBool = tick - (idleTime or 0) < 750
if not tempBool and score ~= 0 then
anterior = score
setElementData(player, "Anterior Drift", anterior)
total = total+anterior
setElementData(player, "Total Drift", total)
if score > mejor then
mejor = score
setElementData(player, "Mejor Drift", mejor)
checkPuntaje(mejor)
end
triggerEvent("onVehicleDriftEnd", rootElem, tick-driftTime-750)
score = 0
end
if angulo ~= 0 then
if score == 0 then
triggerEvent("onVehicleDriftStart", rootElem)
driftTime = tick
end
if tempBool then
score = score + math.floor(angulo*velocidad)*mult
else
score = math.floor(angulo*velocidad)*mult
end
if TempCol == Red then
TempCol = Yellow
end
screenScore = score
idleTime = tick
end
local temp2 = string.format("Factor: X%d\n%s",mult,mult~=5 and string.format("Ganar X%d con %d",mult+1,tablamult[mult]) or "MAX")
dxDrawText(temp2, 21.09,166.09,screenWidth,screenHeight, Shadow, 1.2, "default-bold","left")
dxDrawText(temp2, 20,165,screenWidth,screenHeight, Yellow, 1.2, "default-bold","left","top", false,true,false)
if velocidad <= 0.3 and mult ~= 1 then
dxDrawText("\n\nMuy Lento!", 21.09,166.09,screenWidth,screenHeight, Shadow, 1.2, "default-bold","left")
dxDrawText("\n\nMuy Lento!", 20,165,screenWidth,screenHeight, Yellow, 1.2, "default-bold","left","top", false,true,false)
end
if tick - (idleTime or 0) < 3000 then
local temp = "DRIFT"
if score >= 100000 then
temp = "DRIFT\n\nDrift King!"
elseif score >= 50000 then
temp = "DRIFT\n\nInsane Drift!"
elseif score >= 20000 then
temp = "DRIFT\n\nOutrageous!"
elseif score >= 15000 then
temp = "DRIFT\n\nColossal!"
elseif score >= 7000 then
temp = "DRIFT\n\nSuberb!"
elseif score >= 3000 then
temp = "DRIFT\n\nGreat Drift!"
elseif score >= 1000 then
temp = "DRIFT\n\nGood Drift!"
end
dxDrawText(temp, x1+2,y1+2,x2,y2, Shadow, 2.2, "sans","center")
dxDrawText(temp, x1,y1,x2,y2, TempCol, 2.2, "sans","center","top", false,true,false)
dxDrawText(string.format("\n%d",screenScore), x1+4,y1-8,x2,y2, Shadow, size, "pricedown","center")
dxDrawText(string.format("\n%d",screenScore), x1,y1-10,x2,y2, TempCol, size, "pricedown","center","top", false,true,false)
end
end
function angle()
local vx,vy,vz = getElementVelocity(vehicle)
local modV = math.sqrt(vx*vx + vy*vy)
if not isVehicleOnGround(vehicle) then return 0,modV end
local rx,ry,rz = getElementRotation(vehicle)
local sn,cs = -math.sin(math.rad(rz)), math.cos(math.rad(rz))
local deltaT = tick - (multTime or 0)
if mult~= 1 and modV <= 0.3 and deltaT > 750 then
mult = mult-1
multTime = tick
elseif deltaT > 1500 then
local temp = 1
if score >= 11200 then
temp = 5
elseif score >= 4200 then
temp = 4
elseif score >= 1400 then
temp = 3
elseif score >= 350 then
temp = 2
end
if temp>mult then
mult = temp
multTime = tick
end
end
if modV <= 0.2 then return 0,modV end --speed over 40 km/h
local cosX = (sn*vx + cs*vy)/modV
if cosX > 0.966 or cosX < 0 then return 0,modV end --angle between 15 and 90 degrees
return math.deg(math.acos(cosX))*0.5, modV
end
addEvent("driftCarCrashed", true)
addEventHandler("driftCarCrashed", rootElem,
function()
if score ~= 0 then
score = 0
mult = 1
TempCol = Red
triggerEvent("onVehicleDriftEnd", rootElem, 0)
end
end
)
addEventHandler( 'onVehicleDriftEnd', root,
function( score )
if score > 0 then
triggerServerEvent( 'rewardDrift', localPlayer, score )
end
end
)
addEvent("driftActualizarRecord", true)
addEventHandler("driftActualizarRecord", rootElem,
function(score, name)
global_mejor = score
global_nombre = name
end
)
function resetScore()
anterior,mejor,total = 0,0,0
setElementData(player, "Anterior Drift", anterior)
setElementData(player, "Total Drift", total)
setElementData(player, "Mejor Drift", mejor)
end
addEvent("driftResetAllScores", true)
addEventHandler("driftResetAllScores", rootElem, resetScore)
addCommandHandler("resetdrift", resetScore)
function checkPuntaje(BestDrift)
triggerServerEvent("driftNuevoRecord", rootElem, BestDrift, string.gsub(getPlayerName(player), "#%x%x%x%x%x%x", ""))
end
y esto para el server-side:
local root = getRootElement()
local thisResourceRoot = getResourceRootElement(getThisResource())
local drift_records = {}
local drift_mejor = 0
local drift_nombre = "N/A"
addEventHandler ( "onResourceStart", thisResourceRoot,
function()
call(getResourceFromName("scoreboardd"), "addScoreboardColumn", "Mejor Drift", 11, 11, 0.11)
call(getResourceFromName("scoreboardd"), "addScoreboardColumn", "Anterior Drift", 12, 12, 0.11)
call(getResourceFromName("scoreboardd"), "addScoreboardColumn", "Total Drift", 13, 13, 0.11)
executeSQLCreateTable("recordsDrift","pista TEXT, nombre TEXT, score INTEGER")
addEvent("driftClienteListo", true)
addEventHandler("driftClienteListo", root, function(player)
triggerClientEvent(player, "driftActualizarRecord", root, drift_mejor, drift_nombre)
if drift_mejor == 0 then
outputChatBox("* #0080FFNo hay records", player, 255, 255, 255, true)
else
outputChatBox(string.format("* #0080FFEl nuevo record es de [#FF8000%d#0080FF] puntos [#FF8000%s#0080FF]", drift_mejor, drift_nombre), player, 255, 255, 255, true)
end
end)
end
)
addEventHandler ( "onResourceStop", thisResourceRoot,
function()
call(getResourceFromName("scoreboardd"), "removeScoreboardColumn", "Mejor Drift", 11, 11, 0.11)
call(getResourceFromName("scoreboardd"), "removeScoreboardColumn", "Anterior Drift", 12, 12, 0.11)
call(getResourceFromName("scoreboardd"), "removeScoreboardColumn", "Total Drift", 13, 13, 0.11)
end
)
addEventHandler ( "onGamemodeMapStart", root, function(mapResource)
local mapname = getResourceInfo(mapResource, "name") or getResourceName(mapResource)
local command = string.format("pista='%s'",mapname)
local record = executeSQLSelect("recordsDrift","nombre, score",command)
if #record == 0 then
executeSQLInsert("recordsDrift",string.format("'%s', 'N/A', 0",mapname))
drift_mejor = 0
drift_nombre = "N/A"
else
drift_mejor = record[1]["score"]
drift_nombre = record[1]["nombre"]
end
triggerClientEvent(root, "driftActualizarRecord", root, drift_mejor, drift_nombre)
triggerClientEvent(root, "driftResetAllScores", root)
if drift_mejor == 0 then
outputChatBox("* #0080FFNo hay records", 255, 255, 255, true)
else
outputChatBox(string.format("* #0080FFEl nuevo record es de #FF8000%d #0080FFpuntos #FF8000(%s)", drift_mejor, drift_nombre), player, 255, 255, 255, true)
end
end)
addEventHandler ( "onGamemodeMapStop", root, function(mapResource)
local mapname = getResourceInfo(mapResource, "name") or getResourceName(mapResource)
if not mapname then return end
local command = string.format("pista='%s'",mapname)
executeSQLUpdate("recordsDrift",string.format("nombre = '%s', score = %d", drift_nombre, drift_mejor), command)
end)
addEventHandler("onVehicleDamage", root, function()
thePlayer = getVehicleOccupant(source, 0)
if thePlayer then
triggerClientEvent(thePlayer, "driftCarCrashed", root, source)
end
end)
addEvent("driftNuevoRecord", true)
addEventHandler("driftNuevoRecord", root, function(score, name)
if score > drift_mejor then
outputChatBox(string.format("* #0080FFNuevo record! #0080FF[#FF8000%d puntos#0080FF] #0080FF[#FF8000%s#0080FF]",score,name), player, 255, 255, 255, true)
drift_mejor = score
drift_nombre = name
triggerClientEvent(root, "driftActualizarRecord", root, drift_mejor, drift_nombre)
end
end)
addEvent( 'rewardDrift', true )
addEventHandler( 'rewardDrift', root,
function( reward )
givePlayerMoney( source, reward )
end
)
Revisa si funciona y avísame si es que algo falla.