Jump to content
Search In
  • More options...
Find results that contain...
Find results in...
Bienvenue Guest!

Rejoignez la communauté pour avoir accès à l'entièreté du site! Une fois que vous serez enregistré, vous pourrez créer, aider, partager et discuter avec les membres de la communauté et également participer à l'amélioration du site. Alors, qu'attendez vous ? Enregistrez-vous !

Sign in to follow this  
Kanda Sorata

novice L'utilisation des Events sur FiveM

Recommended Posts

Kanda Sorata

S'améliorer dans l'utilisation des events

Parlons un peu d'exemples de codes pour corriger quelques exploits simple

Imaginez que vous avez un inventaire dans votre gamemode.
Vous devez stocker vos objets côté serveur pour éviter des glitchs/hacks.

Prenons donc un exemple ci dessous:

Inventory = { }

function Inventory.ConsumeFood()
    TriggerServerEvent('gamemode:consumeFood') -- Vérifier si le joueur possède la nourriture.
end

AddEventHandler('gamemode:onFoodConsumed', function(consume)
    if not consume then return end -- 'consume' est un booléen pour vérifier si le joueur mange.

    Inventory.DoConsumeFood() -- L'action lors de la consommation de la nourriture comme donner de la vie, de la stamina etc...
end)

Ce code a de potentiels exploits.
Nous allons le corriger étape par étape.

Premièrement, avec ce code vous pouvez consommer votre nourriture plusieurs fois en même temps.

Ce fix est relativement simple, il suffit d'utilisé un booléen pour vérifier si la consommation est déjà en cours.

Inventory.IsConsumingFood = false

function Inventory.ConsumeFood()
    if Inventory.IsConsumingFood then
        return false
    end

    Inventory.IsConsumingFood = true
    TriggerServerEvent('gamemode:consumeFood')

    return true --On peut également retourner un booléen pour savoir si la nourriture est consommée.
end

Mais que ce passe t-il sur un joueur meurt en attendant la réponse du serveur ?

Vous devez toujours réfléchir aux events et à n'importe quel event avec Citizen.Wait(ms)qui sont appelées de façon asynchrone*. Et pour corriger ce problème, vous ne devez pas oublier de "remettre à zéro" votre booléen à l'endroit approprié

AddEventHandler('playerSpawned', function()
    Inventory.CancelConsuming()
end)

-- Il est mieux d\'utiliser une fonction "globale" pour vos futurs objets comme les bandages, boissons etc.
function Inventory.CancelConsuming()
    Inventory.IsConsumingFood = false
end

AddEventHandler('gamemode:onFoodConsumed', function(consume)
    if not consume or not Inventory.IsConsumingFood then return end

    Inventory.DoConsumeFood()
end)

Ce serait aussi une bonne idée d'annuler le processus de consommation côté serveur.

function Inventory.CancelConsuming()
    if Inventory.IsConsumingFood then
        TriggerServerEvent('gamemode:cancelConsumingFood')
    end

    Inventory.IsConsumingFood = false
end

Et voilà ! C'est tout pour le moment, si vous avez des questions, n'hésitez pas, nous vous répondrons du mieux que possible ;)

 

*asynchrone

Citation
  • en mode synchrone, le processus appelant attend que le processus appelé ait renvoyé sa réponse pour continuer à s'exécuter,
  • en mode asynchrone, le processus appelant continue à travailler pendant que le processus appelé exécute le traitement demandé et gère via un événement - ou éventuellement via une instruction de synchronisation - le(s) retour(s) du processus appelé.

 

Lien original du tutoriel

Share this post


Link to post
Share on other sites

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
Sign in to follow this  

×
×
  • Create New...

Important Information

En utilisant ce site, vous acceptez les présents règlements Terms of Use, Privacy Policy,Guidelines.