Expérience automatique
Bonjour à tous,

Je suis entrain de développer un système d'expérience automatique.
L'idée est la suivante :
Je souhaite que les joueurs puissent xp de manière normale (Monstres + Quêtes) jusqu'au niveau 20.
A partir de ce niveau, je souhaite que l'expérience donnée par les quêtes, les découvertes de territoires et celle gagnée par les monstres tués soit désactivée.

A ce moment là, c'est un script php qui prend le relai et ajoute périodiquement de l'expérience aux joueurs.

Où j'en suis ?
J'ai actuellement une première version du script qui ajoute correctement de l'expérience aux joueurs mais il ne fonctionne que lorsqu'ils sont déconnectés.
Si le script est appelé lorsque le joueur est en jeu, connecté, il ne reçoit rien, et lors de sa déconnexion/reconnexion, la base de donnée lui remet la quantité qui était présente avant l'appel du script.

Questions :
Comment faire en sorte que ce soucis n'apparaisse pas ?
Comment bloquer de manière simple l'expérience des joueurs une fois le niveau 20 acquis ?
Après avoir jeté un œil à ce patch (http://www.zone-emu.fr/thread-13408-post...pid63912), que signifie :

Citation :Au niveau ou tu ajoute le flag sur ton personnage


Merci d'avance des éventuelles réponses que vous m'apporterez.

Taglina,
Bonjour,
L'idée d'un script PHP pour ajouter de l'expérience n'est pas une très bonne idée. Il faudrait que tu utilises à la place un script C++ car j'imagine que par le script PHP, tu injectes directement dans la base de données l'expérience que tu veux ajouter. Sauf que le problème est que le client ne reconnaîtra pas ce changement. Voilà pourquoi ce soucis apparaît. Je te conseille donc d'utiliser la fonction ModifyMoney() dans un script C++ si mes souvenirs sont bons pour rajouter de l'or.
Ensuite, lorsque MacWarrior te dit :
Citation :Au niveau ou tu ajoute le flag sur ton personnage
Il t'explique en fait qu'il faut que tu ajoutes le flag PLAYER_FLAGS_XP_USER_DISABLED à PLAYER_FLAGS à l'aide la fonction suivante :
Code :
SetFlag(PLAYER_FLAGS, PLAYER_FLAGS_XP_USER_DISABLED);

Puis rajouter le patch de MacWarrior pour empêcher l'expérience d'être ajoutée au joueur.
(09-04-2011 12:17)Shyax a écrit :  Bonjour,
L'idée d'un script PHP pour ajouter de l'expérience n'est pas une très bonne idée. Il faudrait que tu utilises à la place un script C++ car j'imagine que par le script PHP, tu injectes directement dans la base de données l'expérience que tu veux ajouter. Sauf que le problème est que le client ne reconnaîtra pas ce changement. Voilà pourquoi ce soucis apparaît.

Le client arrive à voir les modifications, lorsque le joueur n'est pas connecté. Lorsqu'il l'est, je stocke la valeur qu'il aurait du recevoir et lui injecte quand il est déconnecté.
L'avantage du script php, c'est que je peux le lier aux fonctions des Crontabs de linux, afin de l'appeler périodiquement.

(09-04-2011 12:17)Shyax a écrit :  Je te conseille donc d'utiliser la fonction ModifyMoney() dans un script C++ si mes souvenirs sont bons pour rajouter de l'or.

Moi c'est de l'xp dont j'ai besoin, bien qu'elle doit très certainement s'adapter facilement, je ne pense pas m'y connaître assez pour me lancer dans les changements au niveau C++.

(09-04-2011 12:17)Shyax a écrit :  Ensuite, lorsque MacWarrior te dit :
[quote]
Au niveau ou tu ajoute le flag sur ton personnage

Il t'explique en fait qu'il faut que tu ajoutes le flag PLAYER_FLAGS_XP_USER_DISABLED à PLAYER_FLAGS à l'aide la fonction suivante :
Code :
SetFlag(PLAYER_FLAGS, PLAYER_FLAGS_XP_USER_DISABLED);

Puis rajouter le patch de MacWarrior pour empêcher l'expérience d'être ajoutée au joueur.
Comme dit plus haut, je ne pense pas avoir compris.

Quoiqu'il en soit, merci pour vos réponses, je n'ai plus réellement de problèmes en ce qui concerne l'ajout d'xp, personnage connecté ou non.
Je dois juste vérifier que l'expérience actuelle du joueur, après ajout, est supérieur ou égale à l'xp nécessaire pour passer un level, auquel cas une requête modifiera le level en question.
Je bloque pour le moment, mais rien de grave.

Par contre, je ne vois toujours pas comment bloquer, je le répète, de manière simple, l'expérience des joueurs.
Pour bloquer l'exeperience au niveau 20 tu modifie le fichier :CharacterHandler.cpp dans la fonction HandlePlayerLogin()
tu rajoute
[code=cpp]
if(pCurrChar->getLevel() >= 20 )
pCurrChar->SetFlag(PLAYER_FLAGS, PLAYER_FLAGS_XP_USER_DISABLED);
[/code]
Effectivement, cela marche parfaitement, je te remercie.
Apres pour pourvoir augmenter l'experience des joueur en jeu tu peut (mais c'est completement degeulasse) ajouter dans la fonction Update de la classe Player une requête qui récupère l'xp dans la db et la set au joueur en appelant la fonction RewardXpGain()

Mais le problème de cette technique c'est que la requête SQL sera effectuée environs toutes les 100ms (0.1s) et donc si tu multiplie ca par le nombre de joueur en ligne ca risque de faire lagger un max.

A la limite il faudrais ajouter un timer du genre rajouter un attribut
uint32 m_lastXpUpdate
et dans la fonction Update tu fait
[code=cpp]
m_lastXpUpdate+=time;
if (m_lastXpUpdate >= 20*MINUTE*IN_MILLISECONDS)
{
m_lastXpUpdate = 0; // reset du timer
QueryResult result = CharacterDatabase.PQuery("SELECT xp FROM characters WHERE guid = %u", GetGUID()); // on recup l'xp
if(!result)
return; // si rien ne reviens c'est qu'il y a un prob dans la requete
Field fields = result->Fetch();
uint32 xp = fields[0].GetUInt32(); // on recup l'xp stocker dans la db
uint32 currXp = GetUInt32Value(PLAYER_XP); //on recup l'xp actuel
uint32 newXp = xp - currXp; // on calcule l'xp à remettre
GiveXP(newXp); // et on la donne :p
}
[/code]

Avec ce code l'xp est mise a jour pour les joueurs en jeu toutes les 20 minutes ;)
Voila un morceau de code intéressant. Smile
Comment spécifier la valeur d'xp périodiquement ajoutée avec cette méthode ?
Est-elle réellement fiable ? Meilleur qu'un script php ?
Ce bout de code est basé sur ton script php.

Si le joueur est hors ligne ton script lui ajoute l'xp naturellement.

Si il est en ligne ton script ajoute l'xp est le bout de code entre en jeu

Retourner en haut Accueil