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 :)