Jump to content

Stocker des informations avec ELUNA (LUA)


iThorgrim

Recommended Posts

Stocker des informations avec ELUNA (LUA)

 

Bonjour, aujourd’hui un tutoriel plutôt complexe dans la forme plus que dans le fond ..

 

Comme vous le savez pour les serveurs World of Warcraft il existe 2 langages de développement qui sont les vedettes et les plus utilisés le SQL et le C++.

Depuis maintenant quelques années un module à fait sont entrés et à permis à des petits devs de faire de grande choses, je parle de ELUNA, qui permet de développer en LUA pour les émulatateurs compatibles.

 

Alors Eluna est plein de bonne choses, mais disons que pour ce qui est du stockage c’est presque peine perdu.

Quand vous voulez stocker une information, vous êtes obligés, de faire une requête SQL et pour pas vous mentir, si vous avez un script de Modificateur de rates EXP et que vous souhaitez vérifier la rate choisis à chaque Kill, ça fait beaucoup de requêtes pour pas grand choses ..

 

J’étais dans ce problème, et j’ai trouvés une solution, j’ai utilisés des Tableaux pour stocker des informations(C'est pas la meilleur mais c'est celle que je préfère).

Et aujourd’hui je vous propose un guide plus qu’un tutoriel, car les domaines d’applications sont vraiment vastes et que j’ai pas d’exemple ultra stylés pour vous montrer le p p p p power de cette chose.

 

Pour notre exemple on va dire que l’ont cherche à stocker les informations de notre personnage et plus précisément la Rate d’EXP.

Donc dans l'exemple on a fait notre code, la rates d’exp elle est stockés dans une colonne custom de `characters` qui s’appelleras `rates`

(je rappelle que ceci est un exemple, ne cherchais pas la colonne `rate` dans `characters` hein ..)

 

Alors ont va juste improviser un bout de code pour avoir un petit exemple « visuel » sous les yeux :

local EXP = {};
local PLAYER_EVENT_ON_LOGIN = 3 

function EXP.GetRates(event, player)

end

RegisterPlayerEvent(PLAYER_EVENT_ON_LOGIN, EXP.GetRates)

Donc pour faire assez simple et concis on utilise l'événement connexion pour aller chercher la Rates d'EXP et la garder en mémoire le temps que le joueur reste connectés!

 

Maintenant on va se créer un tableau et des valeurs par défauts (au cas ou..).

 

local EXP = {};
local PLAYER_EVENT_ON_LOGIN = 3 

function EXP.GetRates(event, player)
	local pGuid = player:GetGUIDLow()
  	if not(EXP[pGuid])then
      EXP[pGuid] = {
        rate = 1
      }
  	end
end

RegisterPlayerEvent(PLAYER_EVENT_ON_LOGIN, EXP.GetRates)

Alors là je vais vous décortiquer ça
 

  • local pGuid = player:GetGUIDLow() -- On va chercher le GUID du joueur qui je le rappelle est unique ! (Très important d'avoir une donnée unique comme Index/Identitifant)
  • if not(EXP[pGuid])then -- Si le Tableau EXP[pGUID] n'existe pas, donc si le tableau avec notre GUID n'existe pas alors ..
    • EXP[pGuid] = { rate = 1} -- Tu me créer un tableau avec dedans une "colonne" rate qui a par défaut la valeur 1

 

Attention je vulgarise la chose, en réalités certains terme ne s'utilise/se dise pas comme ça, c'est pour l'exemple et le guide.

 

Alors du coup maintenant on a notre valeur par défaut et notre tableau il nous faut aller récupérer la rate de notre joueur.

local EXP = {};
local PLAYER_EVENT_ON_LOGIN = 3 

function EXP.GetRates(event, player)
	local pGuid = player:GetGUIDLow()
  	if not(EXP[pGuid])then
      EXP[pGuid] = {
        rate = 1
      }
  	end
  	local Q0 = CharDBQuery('SELECT rate FROM `characters` WHERE guid = '..pGuid..';')
  	if Q0 then
    	EXP[pGuid].rate = Q0:GetUInt32(0)
   	end
end

RegisterPlayerEvent(PLAYER_EVENT_ON_LOGIN, EXP.GetRates)

 

Comme pour tout à l'heure je vais expliquer un peu :

  • local Q0 = CharDBQuery('SELECT rate FROM `characters` WHERE guid = '..pGuid..';') -- La très simple je vais chercher la rate de mon personnage dans la DB -> Table -> Colonne
  • if Q0 then -- Si Q0 aboutis à quelques choses (car il ne peu pas être nul si jamais la rate devrais normalement être à 1)
    • EXP[pGuid].rate = Q0:GetUInt32(0) -- Alors rate dans EXP[pGuid] est égale au résultat de la requête (Donc si le résultat est 28, EXP[pGuid].rate seras maintenant égale à 28)

 

Voilà, je ne sais pas si vous avez compris ou si c'est assez clair, mais ça permet beauuucoup plus de choses et ça rajoute un confort appelés stabilités des serveurs.

Si jamais voici quelques petits conseil que je peu vous donner pour l'utilisation des tableaux 'Stockeur'  :

  • Arrêtez le stockage en live dans la base de donnée et préférés des stockage directement dans des tableaux, puis stockés seulement dans la DB à la déconnexion du joueur
  • Arrêtez les vérifications systématique dans la base de donnée et stockés l'information une fois dans un tableau

 

J’espère que ceci vous aideras à stocker des informations, et vous pouvez littéralement en abuser.
Arrête avec tes 300 requêtes/scd.

 

Allez moi je go manger des bébé phoques, la bise ❤️

Edited by iThorgrim (see edit history)
  • Like 2
Link to post

Encore du beau tutoriel, bravo.

Personnellement je ne suis pas trop pour attribuer des noms de variable court pour conserver des valeurs importantes comme pour le rate du joueur en Q0. Ce genre de variable, j'ai tendance a l'utiliser sur des boucles, car pour moi, plus le nom est long plus la variable est importante. J'aurais bien vu Rate_pGuid a la place du Q0 car la valeur est importante pour moi et son nom me rappel a quoi cela correspond, si je traduit le nom de la variable j'obtiens tout simplement le rate du joueur. Tout ceci n'est pas tres important en soit mais en cas de code tres long cela facilite la lecture et la comprehension du code meme six mois plus tard. En attendant bravo pour ce tutoriel bien explique et facilement assimilable, encore merci.

Si tu avances, tu meurs ... si tu recules, tu meurs ... alors dis moi ... pourquoi tu recules ?

(Proverbe Mongole)

 

 

 

Link to post
  • ASIKOO changed the title to Stocker des informations avec ELUNA (LUA)

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


  • Flux d'Activité

    1. 1

      Mondial2 Remastered - New School International Private Server Open 27/11/2020

    2. 17

      serveur Metin2

    3. 29

      Dump Proto 2014

    4. 17

      serveur Metin2

    5. 15

      Mustang SF - Full - 1.8

    6. 17

      serveur Metin2

    7. 17

      serveur Metin2

  • Recently Browsing

    No registered users viewing this page.

×
×
  • Create New...

Important Information

Terms of Use / Privacy Policy / Guidelines / We have placed cookies on your device to help make this website better. You can adjust your cookie settings, otherwise we'll assume you're okay to continue.