Jump to content

Сохранение очков при дрифтинге


Recommended Posts

Помогите пожалуйста. Хочу сделать сохранение очков за дрифтинг, но запарился на их загрузке при входе. Сделал сохранение очков через setAccountData, проверил в internal все сохранилось. Но знаний по люа недостаточно чтобы понять что к чему в этом скрипте и куда надо подгружать сохраненные данные. В общем нужно сделать чтобы при входе в списке игроков были показаны сохраненные данные, а не нулевые. Вот скрипты:

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.2 
local modo = 0.01 
local score = 0 
local screenScore = 0 
local tick 
local idleTime 
local multTime 
local driftTime 
local Yellow = tocolor(255,232,25) 
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 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("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" class="kw2">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("Best Drift: %s - %d",global_nombre,global_mejor),44,screenHeight-43,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, "Last Drift", anterior) 
        total = total+anterior 
        setElementData(player, "Total Drift", 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,155,screenWidth,screenHeight, Yellow, 1.2, "sans","left","top", false,true,false) 
     
    if velocidad <= 0.3 and mult ~= 1 then 
        dxDrawText("\n\nToo Slow!", 20,155,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, "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, "Total Drift", total) 
    setElementData(player, "Best Drift", mejor) 
end 
addEvent("driftResetAllScores", true) 
addEventHandler("driftResetAllScores", rootElem, resetScore) 
addCommandHandler("resetdrift", resetScore) 
  
function checkPuntaje() 
    if total > global_mejor then 
        triggerServerEvent("driftNuevoRecord", rootElem, total, 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_mejor = 0 
local drift_nombre = "N/A" 
  
addEventHandler ( "onResourceStart", thisResourceRoot, 
    function() 
        call(getResourceFromName("scoreboard"), "addScoreboardColumn", "Best Drift") 
        call(getResourceFromName("scoreboard"), "addScoreboardColumn", "Last Drift") 
        call(getResourceFromName("scoreboard"), "addScoreboardColumn", "Total Drift") 
         
        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("There's no record set on this map", player) 
            else 
                outputChatBox(string.format("The current record is %d points (%s)", drift_mejor, drift_nombre), player) 
            end 
        end) 
    end 
) 
  
addEventHandler ( "onResourceStop", thisResourceRoot, 
    function() 
        call(getResourceFromName("scoreboard"), "removeScoreboardColumn", "Best Drift") 
        call(getResourceFromName("scoreboard"), "removeScoreboardColumn", "Last Drift") 
        call(getResourceFromName("scoreboard"), "removeScoreboardColumn", "Total Drift") 
    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("There's no record set on this map") 
    else 
        outputChatBox(string.format("The current record is %d points (%s)", drift_mejor, drift_nombre)) 
    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("New drift record! (%d points) (%s)",score,name))  
        drift_mejor = score 
        drift_nombre = name 
        triggerClientEvent(root, "driftActualizarRecord", root, drift_mejor, drift_nombre) 
    end 
end) 

Link to comment

Ну если бы ты сам сначала разобрался в этом чужом скрипте, было бы лучше. А ты хочешь, чтобы кто-то разобрался в этом чужом ресурсе и еще добавил туда подгрузку очков из аккаунта.

Link to comment
Ну если бы ты сам сначала разобрался в этом чужом скрипте, было бы лучше. А ты хочешь, чтобы кто-то разобрался в этом чужом ресурсе и еще добавил туда подгрузку очков из аккаунта.

Я никого не прошу делать что-то за меня, я прошу помочь мне

... Хочу сделать ...

Я просто не пойму как и где использовать total, anterior, mejor (очки дрифта).

Link to comment

Я не понимаю, где ошибка? Это тупо не работает. В логах ничего не пишет, значит я что-то не так написал. Хелп :cry:

function LoadStatsDrift() 
      local playeraccount = getPlayerAccount ( source ) 
      if ( playeraccount ) then 
            local playerbest = getAccountData (playeraccount, "s.best") 
            mejor = playerbest 
            setElementData(player, "Best Drift", mejor) 
      end 
end 
addEventHandler("onPlayerLogin", rootElem,LoadStatsDrift) 
addCommandHandler("loaddrift", LoadStatsDrift) 

Link to comment

Кто такой player?

setElementData(player, "Best Drift", mejor) 

Правильнее будет

setElementData(source, "Best Drift", mejor) 

Уверен что у игрока есть accountData s.best? Лучше перестраховаться:

local playerbest = getAccountData (playeraccount, "s.best") or 0 

Link to comment
Кто такой player?

player = getLocalPlayer()

Уверен что у игрока есть accountData s.best?

Да есть, я же писал выше что это у меня сохраняется данные в файле internal. Скрипт drft.lua вредный очень, не хочет читать данные, а только создает все с нуля при перезаходах.

Link to comment
getLocalPlayer( ) т.к это клиентская функция и не может быть на сервере.

как это понять? не я ставил в скрипт getLocalPlayer( ), это поставил автор и скрипт работает с getLocalPlayer( ) если ты про это.

Link to comment
Скинь ресурс полностью. Залей куда-нибудь.

скрипт из паблика если что https://community.multitheftauto.com/index.php?p= ... ls&id=1336

качай ток дрифт мод, в архиве drft.zip это тот самый скрипт

я хотел сделать сохранение очков трех типов из этого плагина, но не могу т.к. в люа дуб. А изучать его ради пары строк как то глупо. Поможешь сделать? да/нет скайп еще чтонить

Link to comment

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 account

Sign in

Already have an account? Sign in here.

Sign In Now
  • Recently Browsing   0 members

    • No registered users viewing this page.
×
×
  • Create New...