[Unique] Quêtes Duel
Bonjours à tous !

Voilà un système qui plairas a beaucoup de monde :bibine:

Cela permet de coder des quêtes qui permette de tuer une classe en duel pour finir la quêtes.

Un p'tit +1 ne fais pas de mal :)

Auteur : Totomakers

ObjectMgr.h

Après:


[code=cpp]class Item; [/code]

Ajouter :

[code=cpp]struct kill_option
{
uint32 questId;
uint32 kill_class;
};

typedef UNORDERED_MAP<uint32, kill_option> KillOption;

enum class_creature_entry
{
NPC_CREDIT_WARRIOR = 1000000,
NPC_CREDIT_PALADIN = 1000001,
NPC_CREDIT_ROGUE = 1000002,
NPC_CREDIT_PRIEST = 1000003,
NPC_CREDIT_WARLOCK = 1000004,
NPC_CREDIT_SHAMAN = 1000005,
NPC_CREDIT_MAGE = 1000006,
NPC_CREDIT_HUNTER = 1000007,
NPC_CREDIT_DRUID = 1000008,
NPC_CREDIT_DEATH_KNIGHT = 1000009,
};

enum class_option_id
{
ID_WARRIOR = 1,
ID_PALADIN = 2,
ID_ROGUE = 3,
ID_PRIEST = 4,
ID_WARLOCK = 5,
ID_SHAMAN = 6,
ID_MAGE = 7,
ID_HUNTER = 8,
ID_DRUID = 9,
ID_DEATH_KNIGHT = 10,
};[/code]


Après :

[code=cpp] void LoadFactionChangeReputations();[/code]

Ajouter :

[code=cpp]void LoadKillOption();
void HaveQuestKillOption(Player* pKiller, Player* pVictim);
void QuestKillOption(Player* pKiller, Player* pVictim, kill_option const& killopt);[/code]

Après :
[code=cpp]protected:[/code]

Ajouter :

[code=cpp]KillOption m_killoption;[/code]

ObjectMgr.cpp

A la fin du fichier


[code=cpp]void ObjectMgr::LoadKillOption()
{
uint32 oldMSTime = getMSTime();

m_killoption.clear();

QueryResult result = WorldDatabase.Query("SELECT entry, questId, kill_class FROM quest_killoption");


if (!result)
{
sLog->outString(">> Loaded 0 kill quest.");
sLog->outString();
return;
}

uint32 count = 0;

do
{
Field *fields = result->Fetch();

uint32 entry = fields[0].GetUInt32();

kill_option killopt;

killopt.questId = fields[1].GetUInt32();
killopt.kill_class = fields[2].GetUInt32();

m_killoption[entry] = killopt;

++count;
}
while (result->NextRow());

sLog->outString(">> Loaded %u Kill quest in %u ms", count, GetMSTimeDiffToNow(oldMSTime));
sLog->outString();
}

void ObjectMgr::HaveQuestKillOption(Player* pKiller, Player* pVictim)
{
for (KillOption::const_iterator itr = m_killoption.begin(); itr != m_killoption.end(); ++itr)
{
if (pKiller->GetQuestStatus(itr->second.questId) == QUEST_STATUS_INCOMPLETE)
sObjectMgr->QuestKillOption(pKiller, pVictim, itr->second);
}
}

void ObjectMgr::QuestKillOption(Player* pKiller, Player* pVictim, kill_option const& killopt)
{
if (killopt.kill_class==ID_WARRIOR && pVictim->getClass()==CLASS_WARRIOR)
pKiller->KilledMonsterCredit(NPC_CREDIT_WARRIOR, 0);

if (killopt.kill_class==ID_PALADIN && pVictim->getClass()==CLASS_PALADIN)
pKiller->KilledMonsterCredit(NPC_CREDIT_PALADIN, 0);

if (killopt.kill_class==ID_ROGUE && pVictim->getClass()==CLASS_ROGUE)
pKiller->KilledMonsterCredit(NPC_CREDIT_ROGUE, 0);

if (killopt.kill_class==ID_PRIEST && pVictim->getClass()==CLASS_PRIEST)
pKiller->KilledMonsterCredit(NPC_CREDIT_PRIEST, 0);

if (killopt.kill_class==ID_WARLOCK && pVictim->getClass()==CLASS_WARLOCK)
pKiller->KilledMonsterCredit(NPC_CREDIT_WARLOCK, 0);

if (killopt.kill_class==ID_MAGE && pVictim->getClass()==CLASS_MAGE)
pKiller->KilledMonsterCredit(NPC_CREDIT_MAGE, 0);

if (killopt.kill_class==ID_SHAMAN && pVictim->getClass()==CLASS_SHAMAN)
pKiller->KilledMonsterCredit(NPC_CREDIT_WARLOCK, 0);

if (killopt.kill_class==ID_HUNTER && pVictim->getClass()==CLASS_HUNTER)
pKiller->KilledMonsterCredit(NPC_CREDIT_HUNTER, 0);

if (killopt.kill_class==ID_DRUID && pVictim->getClass()==CLASS_DRUID)
pKiller->KilledMonsterCredit(NPC_CREDIT_DRUID, 0);

if (killopt.kill_class==ID_DEATH_KNIGHT && pVictim->getClass()==CLASS_DEATH_KNIGHT)
pKiller->KilledMonsterCredit(NPC_CREDIT_DEATH_KNIGHT, 0);
}[/code]

World.cpp

World.cpp

Après :


[code=cpp] sLog->outString("Loading SmartAI scripts...");
sSmartScriptMgr->LoadSmartAIFromDB();[/code]

Ajouter :


[code=cpp] sLog->outString("[Custom] Initialize Kill quest...");
sObjectMgr->LoadKillOption();[/code]

Créez un nouveaux fichiers system_duel.cpp

[code=cpp]#include "ScriptPCH.h"

class system_duel : public PlayerScript
{
public:
system_duel() : PlayerScript("system_duel") {}

void OnDuelEnd(Player *winner, Player *loser, DuelCompleteType type)
{
sObjectMgr->HaveQuestKillOption(winner,loser);
}
};

void AddSC_system_duel()
{
new system_duel;
}
[/code]

N'oubliez pas d'ajouter le fichier au cmake et d'ajouter AddSC_system_duel() au loader :)
Pièce(s) jointe(s)
.sql  [world]quest_killoption.sql (Taille : 4.43 Ko)
Je ne comprend pas l'interet de cette quête, pourrais-tu m'expliquer stp Smile
Le principe de cette quêtes est de coder des quêtes nécessitant de tuer une certaine classe un nombre de fois prédéfinis (exemple : Battre 5 voleurs en Duel)
Il suffira de coder une quêtes avec 5 créature (id : 1000002) a tuer. Ajouter une ligne dans la table quest_kill avec les informations nécessaire (3 pour des voleurs)
Il suffira donc de gagner un duel contre un voleur pour avoir 1/5 et ainsi de suite Clin
Ce systèmes est utiles les serveurs PvP car ce systèmes peut être migrer pour un système de simple Kill Pvp Clin
C'est effectivement intéressant Smile. Je pense qu'il est inutile d'utiliser des id différentes des id officiels pour les classes, ainsi tu aurais pu résumer tout une partie de ton code à :
[code=cpp] if (killopt.kill_class == pVictim->getClass())
pKiller->KilledMonsterCredit(NPC_CREDIT_CLASS+pVictim->getClass(), 0);[/code]

Où NPC_CREDIT_CLASS = 999999 par exemple.
Ha ouai, je viens de comprendre donc oui cela est utile Smile
Merci Smile
Le soucis encore avec ce système Sadikum c'est que on ne peut pas faire un system de multi-kill (ici vous pouvez coder une quête qui peut demander de tuer des démonistes et des mages etc Smile )

je me demande comment Trinty fait c'est calcul pour les quêtes (Race1 + Race2 = X ) car du coup il faut des entrer différente a chaque fois pour chaque class + race ça commence a faire beaucoup de NPC créez pour "rien" et je me demande si on ne peut pas faire un système de credit par quêtes plutot x)
Je ne vois pas en quoi ce que je propose empêche le multi-kill Blink
En gros le système marche comme ça : On tue une classe précisse on gagne 1 point de crédit précis

avec le NPC_CREDIT_CLASS = 999999 n'importe quelle class que je tuerais je gagnerais un point de crédit

car que je tue un mage ou un paladin je gagnerai un point de crédit class Langue
Non regarde mon code de plus prêt :
Code :
pKiller->KilledMonsterCredit(NPC_CREDIT_CLASS+pVictim->getClass(), 0);

C'est "NPC_CREDIT_CLASS+pVictim->getClass()" donc différent pour chaque classe. Ce que je te propose ne change rien à ton système il ne fait que simplifier et raccourcir la fonction QuestKillOption
Ahh ok Clin oui ça serait plus simple

Retourner en haut Accueil