[C++] Experience en tuant des joueurs
[code=cpp]
#include "StdAfx.h"
#include "Setup.h"

#define GOLD 5000 // 5 piece d'or

void OnKillPlayer(Player *pPlayer, Player *pVictim)
{
if(pVictim->getLevel() <= (pPlayer->getLevel()- 9))
{
pPlayer->BroadcastMessage("Tuer un joueur moins du level 10 ne vous donnera aucune récompense !");
return;
}

if(pPlayer->getLevel() == 80)
pPlayer->GiveGold(GOLD);
else
{
uint16 xp;

if(pPlayer->getLevel() <= 10) xp = 2000;
else if(pPlayer->getLevel() <= 20) xp = 5000;
else if(pPlayer->getLevel() <= 30) xp = 9000;
else if(pPlayer->getLevel() >= 40) xp = 14000;
else if(pPlayer->getLevel() >= 50) xp = 18000;
else if(pPlayer->getLevel() >= 60) xp = 22000;
else if(pPlayer->getLevel() >= 70) xp = 24000;
else xp = 0;

if(xp != 0)
pPlayer->GiveXP(xp, pPlayer->GetGUID(), true);
}
}

void SetupOnKillPlayer(ScriptMgr * mgr)
{
mgr->register_hook(SERVER_HOOK_EVENT_ON_KILL_PLAYER, (void *)&OnKillPlayer);
}[/code]

Informations :
* Level 10-: 2000 xp
* Level 20-: 5000 xp
* Level 30-: 9000 xp
* Level 40+: 14000 xp
* Level 50+: 18000 xp
* Level 60+: 22000 xp
* Level 70+: 24000 xp
* Level 80 : 5 po.

Vous pouvez modifier à votre façon.

Ce scripte n'est peut-être pas à jours, faite une demande d'aide si tel est le cas ou ré-adapter le Smile
Source : Wolferine @ ac-web, modifié par SgT-Fatality
Merci du partage !
Beaucoup beaucoup de fautes dans ce script, dommage.

Explications :
Pour les "plus petit que ou égal à" et "plus grand que ou égal à", il faut toujours mettre les signes "< ou >" avant le "=".

>= : Plus grand ou égal à
<= : Plus petit ou égal à
(Donc dans les informations que tu donnes il y a des fautes Clin)

Ensuite mieux vaut utiliser "else if" à la place d'avoir un pâté de "if...else..." illisible.
Pour l'enregistrement du Hook, il faut ajouter le type de la fonction avant son nom, autrement il y a un problème sous Linux, je ne me rappelle pas l'erreur de tête :
[code=cpp]mgr->register_hook(SERVER_HOOK_EVENT_ON_KILL_PLAYER, (void *)&OnKillPlayer);[/code]

Finalement il y avait quelques fautes genre un ";" qui manque, "Player" à la place de "pPlayer", etc... Hihi Mais merci quand même pour le partage !

Voilà la version "améliorée", j'ai pris en compte les infos que tu as donné au début pour l'XP par level, théoriquement ça devrait être juste :
[code=cpp]
#define GOLD 5000 // 5 piece d'or

void OnKillPlayer(Player *pPlayer, Player *pVictim)
{
if(pVictim->getLevel() <= (pPlayer->getLevel()- 9))
{
pPlayer->BroadcastMessage("Tuer un joueur moins du level 10 ne vous donnera aucune récompense !");
return;
}

if(pPlayer->getLevel() == 80)
pPlayer->GiveGold(GOLD);
else
{
uint64 guid = pPlayer->GetGUID();
uint16 xp;

if(pPlayer->getLevel() <= 10) xp = 2000;
else if(pPlayer->getLevel() <= 20) xp = 5000;
else if(pPlayer->getLevel() <= 30) xp = 9000;
else if(pPlayer->getLevel() >= 40) xp = 14000;
else if(pPlayer->getLevel() >= 50) xp = 18000;
else if(pPlayer->getLevel() >= 60) xp = 22000;
else if(pPlayer->getLevel() >= 70) xp = 24000;
else xp = 0;

if(xp != 0)
pPlayer->GiveXP(xp, guid, true);
}
}

void SetupOnKillPlayer(ScriptMgr * mgr)
{
mgr->register_hook(SERVER_HOOK_EVENT_ON_KILL_PLAYER, (void *)&OnKillPlayer);
}
[/code]

(Ne pas oublier d'ajouter le script dans les Setup.cpp/.h Smile)

Cordialement,
Sgt Fatality

EDIT: J'espère que je n'ai pas fait de faute, si jamais n'hésitez à m'en faire part ! Langue
Bien joué, vu que je n'y connais pas grand chose en C++, je n'y aurai vu que du feu ! Hihi
Merci du partage, j'ai édité le premier message avec le code de SgT-Fatality (merci à toi). Tout à l'air OK à par le message du Broadcast qui n'est pas très français, mais ça c'est à l'utilisateur de mettre ce qu'il veut.
(09-03-2011 14:56)Sadikum a écrit :  Merci du partage, j'ai édité le premier message avec le code de SgT-Fatality (merci à toi). Tout à l'air OK à par le message du Broadcast qui n'est pas très français, mais ça c'est à l'utilisateur de mettre ce qu'il veut.

De rien ! (Bien vu pour le GUID, je l'avais oublié)
Pourquoi ne pas mettre ça dans la fonction qui gère les kill ? Par exemple OnKill tu redirige vers la fonction GiveXp() (enfin je connais pas le nom sous ascent) . Enfin c'est comme ça que j'aurais fait , parceque là tu rajoutes un appel de fonction ce qui n'est pas très propre et pas vraiment conseillé
Non la méthode est bonne, je n'en vois d'ailleurs pas d'autre, à moins de modifier dans le core mais c'est totalement inutile puisque SERVER_HOOK_EVENT_ON_KILL_PLAYER est fait pour ça.
Ne connaissant pas trop la structure d'ascent je ne peux pas te le certifier , mais j'ai déjà fais ça pour mangos et c'est comme cela que j'avais fais
Ben je connais bien Ascent, et c'est la meilleur (la seul, à moins de modifier le core comme je l'ai dit) solution Clin.

Retourner en haut Accueil