Pedro001 Posted August 30, 2018 Share Posted August 30, 2018 Hi guys. Hm, After wandering for a while I found right here on the community the saving drift points script I asked about before. I don't know much about programming, but I've been studying it and apparently there's something wrong with the code... It only works when I start the resource, If I drift for a second time it just doesn't work, nothing happens, and the points I get when I drift for the first time after starting the resource doesn't appear on the scoreboard, even though the columns are there! I don't want to bother anyone, but could someone help me out with it? I've been looking for it for weeks now! This is the file drft.lua --these are the banned vehicle ids where you cannot get drift points. local BannedIDs = { 432, 532 } local rootElem = getRootElement() local thisRoot = getResourceRootElement(getThisResource()) local player = getLocalPlayer() local vehicle local size = 1.4 local modo = 0.01 local score = 0 local screenScore = 0 local tick local idleTime local multTime local driftTime local Yellow = tocolor(0,255,0) local Red = tocolor(234,0,3) local TempCol = Yellow local White = tocolor(255,255,255) local mult = 1 local tablamult = {350,1400,4200,11200} local anterior = 0 local mejor = 0 local total = 0 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 textcols = { {0,255,0, 255}, { 255,232,25, 255 }, { 0, 150, 255, 255 }, {0,255,0, 255}, { 255,232,25, 255 }, { 0, 150, 255, 255 }, {0,255,0, 255}, { 255,232,25, 255 }, { 0, 150, 255, 255 }, {0,255,0, 255}, { 255,232,25, 255 }, { 0, 150, 255, 255 } } function randomtxtcol( ) _tempcols = math.random(#textcols) tempr, tempg, tempb = textcols[_tempcols][1], textcols[_tempcols][2], textcols[_tempcols][3] Yellow = tocolor(tempr, tempg, tempb) TempCol = Yellow end setTimer( randomtxtcol, 600000, 0 ) addEventHandler("onClientResourceStart", getResourceRootElement(getThisResource()), randomtxtcol ) addEventHandler("onClientResourceStart", thisRoot, function() addEventHandler("onClientRender", rootElem, showText) --outputChatBox("Waiting for server drift data...") 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 math.round(number, decimals, method) decimals = decimals or 0 local factor = 10 ^ decimals if (method == "ceil" or method == "floor") then return math[method](number * factor) / factor else return tonumber(("%."..decimals.."f"):format(number)) end end function showText() dxDrawText(string.format("Best Drift: %s - %d",global_nombre,global_mejor),24,screenHeight-280,screenWidth,screenHeight,White,0.85,"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() total = getElementData( player, "Drift Score" ) mejor = getElementData( player, "Best Drift" ) local tempBool = tick - (idleTime or 0) < 750 if not tempBool and score ~= 0 then anterior = score setElementData(player, "Last Drift", anterior) total = total+anterior cash = anterior/100 triggerServerEvent("updatecash", player, player, cash ) checkPuntaje(anterior) setElementData(player, "Drift Score", total) if score > mejor then mejor = score setElementData(player, "Best Drift", 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("Gain X%d with %d",mult+1,tablamult[mult]) or "MAX") dxDrawText(temp2, 20,195,screenWidth,screenHeight, Yellow, 1.2, "sans","left","top", false,true,false) if velocidad <= 0.3 and mult ~= 1 then dxDrawText("\n\nToo Slow!", 20,195,screenWidth,screenHeight, Yellow, 1.2, "sans","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,y1,x2,y2, TempCol, 2.2, "sans","center","top", false,true,false) dxDrawText(string.format("\n%d",screenScore), x1,y1-10,x2,y2, TempCol, size+0.15, "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 ) 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, "Last Drift", anterior) setElementData(player, "Drift Score", total) setElementData(player, "Best Drift", mejor) end addCommandHandler("resetdrift", resetScore) function checkPuntaje(sendscore) if sendscore > global_mejor then triggerServerEvent("driftNuevoRecord", rootElem, sendscore, getPlayerName(player)) end end addEventHandler("onClientPlayerFinish", rootElem, checkPuntaje) addEventHandler("onClientPlayerOutOfTime", rootElem, checkPuntaje) drft_server.lua local root = getRootElement() local thisResourceRoot = getResourceRootElement(getThisResource()) local drift_records = {} --local drift_record_number = 0 --local drift_record_player = "N/A" -- Record Saving function XMLInit() xmlRecordsFile = xmlLoadFile("recordDrift.xml") scorenode = xmlFindChild( xmlRecordsFile, "score", 0 ) xmlRecordScore = xmlNodeGetValue( scorenode ) playernode = xmlFindChild ( xmlRecordsFile, "name", 0 ) xmlRecordPlayer = xmlNodeGetValue( playernode ) drift_record_number = tonumber(xmlRecordScore) drift_record_player = xmlRecordPlayer --outputChatBox("The Current Drift Record holder is: "..xmlRecordPlayer.." with "..xmlRecordScore.." Points!", root, 255, 255, 255 ) xmlUnloadFile( xmlRecordsFile ) end function XMLSetRecord(record,user) xmlRecordsFile = xmlLoadFile("recordDrift.xml") scorexml = xmlFindChild( xmlRecordsFile, "score", 0 ) xmlNodeSetValue( scorexml, record ) playerxml = xmlFindChild( xmlRecordsFile, "name", 0 ) xmlNodeSetValue( playerxml, user ) xmlSaveFile( xmlRecordsFile ) xmlUnloadFile( xmlRecordsFile ) end addEventHandler("onResourceStart", thisResourceRoot, XMLInit ) -- Drift Ranks call(getResourceFromName("scoreboard"), "addScoreboardColumn", "Drift Rank") function updatelvl() local players = getElementsByType ( "player" ) for theKey,thePlayer in ipairs(players) do totaldrift = tonumber(getElementData(thePlayer, "Drift Score" )) or 0 if totaldrift < 99000 then setElementData(thePlayer, "Drift Rank", "Newbie" ) elseif totaldrift > 100000 and totaldrift < 500000 then setElementData(thePlayer, "Drift Rank", "Trained" ) elseif totaldrift > 500000 and totaldrift < 1000000 then setElementData(thePlayer, "Drift Rank", "Drifter" ) elseif totaldrift > 1000000 and totaldrift < 5000000 then setElementData(thePlayer, "Drift Rank", "Adv. Drifter" ) elseif totaldrift > 5000000 and totaldrift < 25000000 then setElementData(thePlayer, "Drift Rank", "Best Drifter" ) elseif totaldrift > 25000000 and totaldrift < 50000000 then setElementData(thePlayer, "Drift Rank", "Drift Expert" ) elseif totaldrift > 50000000 and totaldrift < 100000000 then setElementData(thePlayer, "Drift Rank", "Drift King" ) elseif totaldrift > 100000000 and totaldrift < 250000000 then setElementData(thePlayer, "Drift Rank", "Drift Master" ) elseif totaldrift > 250000000 and totaldrift < 500000000 then setElementData(thePlayer, "Drift Rank", "Drift Legend" ) elseif totaldrift > 500000000 then setElementData(thePlayer, "Drift Rank", "Drift Elite" ) end end end setTimer( updatelvl, 30000, 0 ) addEventHandler ( "onResourceStart", thisResourceRoot, function() call(getResourceFromName("scoreboard"), "addScoreboardColumn", "Best Drift") call(getResourceFromName("scoreboard"), "addScoreboardColumn", "Last Drift") call(getResourceFromName("scoreboard"), "addScoreboardColumn", "Drift Score") XMLInit() addEvent("driftClienteListo", true) addEventHandler("driftClienteListo", root, function(player) triggerClientEvent(player, "driftActualizarRecord", root, drift_record_number, drift_record_player) if drift_record_number == 0 then outputChatBox("There's no drift record set!", player) else outputChatBox(string.format("The current drift record is %d points (%s)", drift_record_number, drift_record_player), player) end end) end ) addEventHandler ( "onResourceStop", thisResourceRoot, function() call(getResourceFromName("scoreboard"), "removeScoreboardColumn", "Best Drift") call(getResourceFromName("scoreboard"), "removeScoreboardColumn", "Last Drift") call(getResourceFromName("scoreboard"), "removeScoreboardColumn", "Drift Score") end ) addEventHandler ( "onGamemodeMapStop", root, function(mapResource) 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_record_number then outputChatBox(string.format("New drift record! (%d points) (%s)",score,name)) drift_record_number = score drift_record_player = name XMLSetRecord( score, name ) triggerClientEvent(root, "driftActualizarRecord", root, drift_record_number, drift_record_player) end end) function gcash(player,money) givePlayerMoney( player, tonumber(money) ) end addEvent("updatecash", true ) addEventHandler("updatecash", root, gcash ) -- saving / Load function loadDrift (thePreviousAccount, theCurrentAccount, autoLogin) if not (isGuestAccount (getPlayerAccount (source))) then if getAccountData(theCurrentAccount, "Drift Score") == false or getAccountData(theCurrentAccount, "Drift Score") == nil then setAccountData(theCurrentAccount, "Drift Score", 0 ) setElementData(source, "Drift Score", 0 ) end setElementData( source, "Drift Score", getAccountData(theCurrentAccount, "Drift Score" ) ) if getAccountData(theCurrentAccount, "Best Drift") == false or getAccountData(theCurrentAccount, "Best Drift") == nil then setAccountData(theCurrentAccount, "Best Drift", 0 ) setElementData(source, "Best Drift", 0 ) end setElementData( source, "Best Drift", getAccountData(theCurrentAccount, "Best Drift" ) ) end end addEventHandler ("onPlayerLogin", getRootElement(), loadDrift) function saveDrift (quitType, reason, responsibleElement) if not (isGuestAccount (getPlayerAccount (source))) then account = getPlayerAccount (source) if (account) then if getElementData(source, "Drift Score") == false or getElementData(source, "Drift Score") == nil then setAccountData(account, "Drift Score", 0 ) setElementData(source, "Drift Score", 0 ) end setAccountData(account, "Drift Score", getElementData(source, "Drift Score" ) ) if getElementData(source, "Best Drift") == false or getElementData(source, "Best Drift") == nil then setAccountData(account, "Best Drift", 0 ) setElementData(source, "Best Drift", 0 ) end setAccountData(account, "Best Drift", getElementData(source, "Best Drift" ) ) end end end addEventHandler ("onPlayerQuit", getRootElement(), saveDrift) recordDrift.xml <meta> <score>1</score> <name>None</name> </meta> Link to comment
JeViCo Posted August 30, 2018 Share Posted August 30, 2018 I highly recommend you to use sqlite/mysql database to save everything. Anyway, if you use xml, you should create child with player's account name and store information such as drift points with xmlNodeSetAttribute @Pedro001 Link to comment
Recommended Posts
Create an account or sign in to comment
You need to be a member in order to leave a comment
Create an account
Sign up for a new account in our community. It's easy!
Register a new accountSign in
Already have an account? Sign in here.
Sign In Now