Jump to content

[BUG SCRIPT] Problème scoredrift et sauvegarde des "teams" !


Recommended Posts

Bonjour/Bonsoir, :D

Voilà je vous explique mon problème, quand je créer une team, elle s'affiche je peux la rejoindre et la quitter et elle apparait bien dans le scoreboard mais quand je déconnectes ou reconnecte le compte, je ne suis plus dans la team alors que la team est toujours présente sur le scoreboard et dans le paneladmin, je ne comprends donc pas d'où ça vient ! Merci de m'éclairer sur le sujet !! :wink:

Et deuxième problème j'ai le scoredrift avec multiplicateur (le jaune, pas le blanc avec les combo) l'autre celui ou il y a marqué "best drift : N/A - 0" en bas à gauche tous fonctionne dans le scoreboard les drifts s'enregistrent mais dans le "best drifft" ainsi que mon "recordsDrift.xml" rien ne se sauvegarde... Merci de m'aider sur ce bug. qui me prends la tête :oops::twisted: après plusieurs recherche et tentative je viens donc vous demander de l'aide. :|

Script de mon scoredrift =

-drift.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("Recherche du record de Drift sur ce serveur...") 
        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("Meilleur 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, "Petit Drift", anterior) 
        total = total+anterior 
        setElementData(player, "Total Drift", total) 
        if score > mejor then 
            mejor = score 
            setElementData(player, "Gros 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("Multiplicateur : X%d\n%s",mult,mult~=5 and string.format("Gain X%d avec %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\nTrop Lent !", 20,155,screenWidth,screenHeight, Yellow, 1.2, "sans","left","top", false,true,false) 
    end 
     
    if tick - (idleTime or 0) < 3000 then 
        local temp = "--SCORE FINAL--" 
        if score >= 350000 then 
            temp = "-- MONSTER KILL --\n\nMonster Drifter ! Like That YESS !" 
        elseif score >= 100000 then 
            temp = "-- FUCK ME --\n\nDrift King ! YES !" 
        elseif score >= 50000 then 
            temp = "-- BADASS --\n\nFurious Drift BABY!" 
        elseif score >= 25000 then 
            temp = "-- HARDCORE --\n\nEnooorme et SEC !" 
        elseif score >= 15000 then 
            temp = "-- YEAHHH --\n\nColossal Drift!" 
        elseif score >= 9000 then 
            temp = "-- MOUAI --\n\nFunny Drift !" 
        elseif score >= 3000 then 
            temp = "-- BOF --\n\nDrift Junior !" 
        elseif score >= 350 then 
            temp = "-- NOOB --\n\nBaby 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, "Petit Drift", anterior) 
    setElementData(player, "Total Drift", total) 
    setElementData(player, "Gros 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) 
  

-drift_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", "Gros Drift") 
        call(getResourceFromName("scoreboard"), "addScoreboardColumn", "Petit 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("Il n'y a pas de record enregistré sur cette map", player) 
            else 
                outputChatBox(string.format("Le record actuelle est %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("Aucun record enregistrer sur cette map !") 
    else 
        outputChatBox(string.format("Le record actuelle est %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("Nouveau record de drift ! (%d points) (%s)",score,name))  
        drift_mejor = score 
        drift_nombre = name 
        triggerClientEvent(root, "driftActualizarRecord", root, drift_mejor, drift_nombre) 
    end 
end) 

Edited by Guest
Link to comment
  • Moderators

Problème #1

je ne comprends donc pas d'où ça vient !

Bah en fait c'est le comportement normal :mrgreen:

Si tu veux faire ça, il faut le coder:

1 - Lorsque le joueur se déconnecte, tu essayes de récupérer sa team

2 - S'il en a une, tu la stock quelque part avec son nom pour être capable de récupérer la bonne team s'il se reconnecte

3 - Lorsqu'un joueur se connecte, tu récupères son nom et tu vérifies si t'as stocké une team pour ce nom là

4 - Si c'est le cas assigner la team, (sinon afficher le menu de sélection de team ?)

Problème #2

Je n'ai pas trouvé de problème avec ce script mais en tout cas ça ne stock rien en xml, ça se sauvegarde dans la base de données sqlite registry.db qui se trouve dans ton dossier deathmatch.


S'il y a un nouveau record de drift sur une map, il sera annoncé à la fin de la map (je sais pas si t'as bien attendu avant de dire que ça marchait pas).

Sinon il me faut les erreurs serveurs ET clients car il doit sûrement y en avoir. Pour avoir les 2 types d'erreurs il te faut te login en tant qu'administrateur et taper dans ta console (F8) debugscript 3

Link to comment

Bonsoir, merci pour vos réponses mais du coup j'ai quelques questions ! :lol:

J'ai essayer ça pour sauvegarder les teams :

Normalement, si j'ai bien compris ce que vous m'avez dis ça devrait ressembler à ceci =

   function playerLogin (thePreviousAccount, theCurrentAccount, autoLogin) 
      if  not (isGuestAccount (getPlayerAccount (source))) then 
        local accountData = getAccountData (theCurrentAccount, "team") 
        if (accountData) then 
        setPlayerTeam(source,accountData) 
        end   
      end 
    end 
    addEventHandler ("onPlayerLogin", getRootElement(), playerLogin) 
      
   function onQuit (quitType, reason, responsibleElement,thePreviousAccount) 
      if not (isGuestAccount (getPlayerAccount (source))) then 
        account = getPlayerAccount (source) 
        if (account) then 
        local team = getPlayerTeam(source) 
        local teamname = getTeamName(team)  
          setAccountData (account, "team", teamname) 
            end 
        end 
    end 
    addEventHandler ("onPlayerQuit", getRootElement(), onQuit) 
      
   function onLogout(prevAccount) 
      if not (isGuestAccount (getPlayerAccount (source))) then 
        account = getPlayerAccount (source) 
        if (account) then 
        local team = getPlayerTeam(source) 
        local teamname = getTeamName(team) 
          setAccountData (account, "team", teamname) 
            end 
        end 
    end 
    addEventHandler("onPlayerLogout", getRootElement(), onLogout) 
  

Avec ce meta :

    
        "Jux" version="1.0" type="script" 
         
        description="Sauvegarde Team Quit/logout" /> 
        

Et pour le scoredrift, je vois donc pourquoi il ne se passe rien :lol: car enfaite le script est peux être prévu pour le gamemode "race" :? qui est une suite de map changeante mais moi je suis en gamemode "freeroam" personnalisé.

Donc si je veux que mes score s'actualisent en freeroam à chaque fois qu'une personne fait un score plus élevé que le score déjà enregistré "best drift" (et aussi que ça utilise le xml ?) ?! Je dois faire comment ?! :cry: Je vois pas du tous ce que je dois modifier, merci d'avance de me répondre !!! :fadein:

[EDIT] : Je vais voir pour les erreurs ! ;)

[EDIT 2] : Voici l'image du debugscript 3

570147Capture1.jpg

Link to comment
  • Moderators
Normalement, si j'ai bien compris ce que vous m'avez dis ça devrait ressembler à ceci =
   function playerLogin (thePreviousAccount, theCurrentAccount, autoLogin) 
      if  not (isGuestAccount (getPlayerAccount (source))) then 
        local accountData = getAccountData (theCurrentAccount, "team") 
        if (accountData) then 
        setPlayerTeam(source,accountData) 
        end   
      end 
    end 
    addEventHandler ("onPlayerLogin", getRootElement(), playerLogin) 
      
   function onQuit (quitType, reason, responsibleElement,thePreviousAccount) 
      if not (isGuestAccount (getPlayerAccount (source))) then 
        account = getPlayerAccount (source) 
        if (account) then 
        local team = getPlayerTeam(source) 
        local teamname = getTeamName(team)  
          setAccountData (account, "team", teamname) 
            end 
        end 
    end 
    addEventHandler ("onPlayerQuit", getRootElement(), onQuit) 
      
   function onLogout(prevAccount) 
      if not (isGuestAccount (getPlayerAccount (source))) then 
        account = getPlayerAccount (source) 
        if (account) then 
        local team = getPlayerTeam(source) 
        local teamname = getTeamName(team) 
          setAccountData (account, "team", teamname) 
            end 
        end 
    end 
    addEventHandler("onPlayerLogout", getRootElement(), onLogout) 
  

Oui ce code devrait marcher mais à condition que les utilisateurs peuvent s'enregistrer (/register) sur ton serveur et se connecter à leur compte (/login).

Ça ne fonctionnera pas la team pour un joueur n'étant pas connecté à un compte.

Avec ce meta :
    
        "Jux" version="1.0" type="script" 
         
        description="Sauvegarde Team Quit/logout" /> 
        

Heuu oui sauf qu'il ne faut pas faire de retours à la ligne en plein milieu de la définition d'un tag ().

Le serveur te sortira une erreur sinon et ne te chargera pas la ressource (impossible de la lancer).

Pour ton scoredrift, je me demande vraiment pourquoi tu tiens à utiliser un fichier xml, c'est système de stockage plus lent, moins fiable et demande plus de ressources CPU que SQLite. Si c'est pour pouvoir consulter les records et/ou les modifier, il suffit d'utiliser SQLite Browser et tu ouvres le fichier internal.db.

Sinon pour que ça annonce un nouveau record n'importe quand sur ton freeroam, je pense qu'il suffit d'ajouter cette ligne dans ton drift.lua à la fin de ce que tu m'as montré (après les 2 autres addEventHandler)

addEventHandler("onVehicleDriftEnd", root, checkPuntaje) 

Citizen

Link to comment

Oui ce code devrait marcher mais à condition que les utilisateurs peuvent s'enregistrer (/register) sur ton serveur et se connecter à leur compte (/login).

Ça ne fonctionnera pas la team pour un joueur n'étant pas connecté à un compte.

- Pourtant j'ai essayer en étant login avec l'auto-login et la team "Admins" créer avec le panel Admin et ça ne fonctionne pas, je ne suis pas remis dans la team au moment de la reconnexion, c'est étrange.. :?

Heuu oui sauf qu'il ne faut pas faire de retours à la ligne en plein milieu de la définition d'un tag ().

Le serveur te sortira une erreur sinon et ne te chargera pas la ressource (impossible de la lancer).

- La ressource se lance normalement sans erreurs mais ne fait pas son travaille, elle ne veux pas me remettre dans ma team "Admins" créer avec le Panel Admin "P". C'est embêtant :|

Pour ton scoredrift, je me demande vraiment pourquoi tu tiens à utiliser un fichier xml, c'est système de stockage plus lent, moins fiable et demande plus de ressources CPU que SQLite.

- J'abandonne l'idée du "xml", je ne savais pas que c'étais plus lent, laissons tomber le xml. :arrow::lol:

Sinon pour que ça annonce un nouveau record n'importe quand sur ton freeroam, je pense qu'il suffit d'ajouter cette ligne dans ton drift.lua à la fin de ce que tu m'as montré (après les 2 autres addEventHandler)
addEventHandler("onVehicleDriftEnd", root, checkPuntaje) 

Ok merci, j'ai donc modifier mon "drift.lua" ce qui me donne normalement ceci (si je n'ai pas fais d'erreur) :

function checkPuntaje() 
    if total > global_mejor then 
        triggerServerEvent("driftNuevoRecord", rootElem, total, getPlayerName(player)) 
    end 
end 
addEventHandler("onClientPlayerFinish", rootElem, checkPuntaje) 
addEventHandler("onClientPlayerOutOfTime", rootElem, checkPuntaje) 
addEventHandler("onVehicleDriftEnd", root, checkPuntaje) 

C'est a la fin du script drift.lua, on est d'accord ! :wink:

Toujours, le même problème, le score reste bloquer sur "Meilleur drift : N/A - 0"

[EDIT : Voici l'image du bug.]

782924Capturebugdrift.jpg

Link to comment
  • Moderators
Normalement, si j'ai bien compris ce que vous m'avez dis ça devrait ressembler à ceci =
   function playerLogin (thePreviousAccount, theCurrentAccount, autoLogin) 
      if  not (isGuestAccount (getPlayerAccount (source))) then 
        local accountData = getAccountData (theCurrentAccount, "team") 
        if (accountData) then 
        setPlayerTeam(source,accountData) 
        end   
      end 
    end 
    addEventHandler ("onPlayerLogin", getRootElement(), playerLogin) 
      
   function onQuit (quitType, reason, responsibleElement,thePreviousAccount) 
      if not (isGuestAccount (getPlayerAccount (source))) then 
        account = getPlayerAccount (source) 
        if (account) then 
        local team = getPlayerTeam(source) 
        local teamname = getTeamName(team)  
          setAccountData (account, "team", teamname) 
            end 
        end 
    end 
    addEventHandler ("onPlayerQuit", getRootElement(), onQuit) 
      
   function onLogout(prevAccount) 
      if not (isGuestAccount (getPlayerAccount (source))) then 
        account = getPlayerAccount (source) 
        if (account) then 
        local team = getPlayerTeam(source) 
        local teamname = getTeamName(team) 
          setAccountData (account, "team", teamname) 
            end 
        end 
    end 
    addEventHandler("onPlayerLogout", getRootElement(), onLogout) 
  

Oui ce code devrait marcher mais à condition que les utilisateurs peuvent s'enregistrer (/register) sur ton serveur et se connecter à leur compte (/login).

En fait non, ça ne fonctionnera pas, j'ai lu un peu vite ton code.

Dans la partie enregistrement de la team, tu enregistres le nom de la team en faisant un getTeamName sur la team du joueur puis un setAccountData.

Puis dans la partie "restauration" de la team, tu récupères la donnée enregistrée, c'est à dire le nom de la team, puis tu essayes de faire un setPlayerTeam en utilisant le nom de cette team.

Hors ce n'est pas possible. Il faut d'abord récupérer la team via son nom en utilisant getTeamFromName, puis appeler setPlayerTeam avec la team trouvée.

function playerLogin (thePreviousAccount, theCurrentAccount, autoLogin) 
    if  not (isGuestAccount (theCurrentAccount)) then 
        local teamName = getAccountData (theCurrentAccount, "team") -- Le nom de la team 
        if (teamName) then 
            local team = getTeamFromName(teamName) -- La team via son nom 
            if (team) then 
                setPlayerTeam(source, team) -- Replacement dans la team 
            end 
        end   
    end 
end 
addEventHandler ("onPlayerLogin", getRootElement(), playerLogin) 

En ce qui concerne les 2 fonctions onQuit et onLogout, comme c'est le même code à l’intérieur et que tu n'utilises pas les paramètres de ces fonctions dans le code, tu peux le faire en une seule fonction avec les deux addEventHandler qui appellent cette seule fonction:

function savePlayerTeam() 
    if not (isGuestAccount (getPlayerAccount (source))) then 
        local account = getPlayerAccount (source) 
        if (account) then 
            local team = getPlayerTeam(source) 
            local teamname = getTeamName(team) 
            setAccountData (account, "team", teamname) 
        end 
    end 
end 
addEventHandler ("onPlayerQuit", getRootElement(), savePlayerTeam) 
addEventHandler("onPlayerLogout", getRootElement(), savePlayerTeam) 

Concernant la partie sur le drift, peux-tu me passer le lien vers le téléchargement de cette ressource drift ?

Je pensais que l'event onVehicleDriftEnd était appelé à chaque fois que tu terminais un drift, mais ça n'a pas l'air d'être le cas. Il faut que je regarde plus en détail cette ressource pour comprendre son fonctionnement.

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...