AzerothCore 3.3.5a
OpenSource WoW Emulator
Loading...
Searching...
No Matches
quest_commandscript Class Reference
Inheritance diagram for quest_commandscript:
CommandScript ScriptObject

Public Member Functions

 quest_commandscript ()
 
ChatCommandTable GetCommands () const override
 
- Public Member Functions inherited from ScriptObject
virtual bool IsDatabaseBound () const
 
virtual bool isAfterLoadScript () const
 
virtual void checkValidity ()
 
const std::string & GetName () const
 
uint16 GetTotalAvailableHooks ()
 

Static Public Member Functions

static bool HandleQuestAdd (ChatHandler *handler, Quest const *quest, Optional< PlayerIdentifier > playerTarget)
 
static bool HandleQuestRemove (ChatHandler *handler, Quest const *quest, Optional< PlayerIdentifier > playerTarget)
 
static bool HandleQuestComplete (ChatHandler *handler, Quest const *quest, Optional< PlayerIdentifier > playerTarget)
 
static bool HandleQuestReward (ChatHandler *handler, Quest const *quest, Optional< PlayerIdentifier > playerTarget)
 
static bool HandleQuestStatus (ChatHandler *handler, Quest const *quest, Optional< PlayerIdentifier > playerTarget)
 

Additional Inherited Members

- Protected Member Functions inherited from CommandScript
 CommandScript (const char *name)
 
- Protected Member Functions inherited from ScriptObject
 ScriptObject (const char *name, uint16 totalAvailableHooks=0)
 
virtual ~ScriptObject ()=default
 

Detailed Description

Constructor & Destructor Documentation

◆ quest_commandscript()

quest_commandscript::quest_commandscript ( )
inline
33: CommandScript("quest_commandscript") { }
Definition CommandScript.h:25

Member Function Documentation

◆ GetCommands()

ChatCommandTable quest_commandscript::GetCommands ( ) const
inlineoverridevirtual

Implements CommandScript.

36 {
37 static ChatCommandTable questCommandTable =
38 {
39 { "add", HandleQuestAdd, rbac::RBAC_PERM_COMMAND_QUEST_ADD, Console::Yes },
43 { "status", HandleQuestStatus, rbac::RBAC_PERM_COMMAND_QUEST, Console::Yes },
44 };
45 static ChatCommandTable commandTable =
46 {
47 { "quest", questCommandTable },
48 };
49 return commandTable;
50 }
static bool HandleQuestComplete(ChatHandler *handler, Quest const *quest, Optional< PlayerIdentifier > playerTarget)
Definition cs_quest.cpp:221
static bool HandleQuestReward(ChatHandler *handler, Quest const *quest, Optional< PlayerIdentifier > playerTarget)
Definition cs_quest.cpp:487
static bool HandleQuestRemove(ChatHandler *handler, Quest const *quest, Optional< PlayerIdentifier > playerTarget)
Definition cs_quest.cpp:131
static bool HandleQuestAdd(ChatHandler *handler, Quest const *quest, Optional< PlayerIdentifier > playerTarget)
Definition cs_quest.cpp:52
static bool HandleQuestStatus(ChatHandler *handler, Quest const *quest, Optional< PlayerIdentifier > playerTarget)
Definition cs_quest.cpp:732
std::vector< ChatCommandBuilder > ChatCommandTable
Definition ChatCommand.h:46
@ RBAC_PERM_COMMAND_QUEST_REMOVE
Definition RBAC.h:435
@ RBAC_PERM_COMMAND_QUEST_REWARD
Definition RBAC.h:436
@ RBAC_PERM_COMMAND_QUEST
Definition RBAC.h:432
@ RBAC_PERM_COMMAND_QUEST_COMPLETE
Definition RBAC.h:434
@ RBAC_PERM_COMMAND_QUEST_ADD
Definition RBAC.h:433

References HandleQuestAdd(), HandleQuestComplete(), HandleQuestRemove(), HandleQuestReward(), HandleQuestStatus(), rbac::RBAC_PERM_COMMAND_QUEST, rbac::RBAC_PERM_COMMAND_QUEST_ADD, rbac::RBAC_PERM_COMMAND_QUEST_COMPLETE, rbac::RBAC_PERM_COMMAND_QUEST_REMOVE, and rbac::RBAC_PERM_COMMAND_QUEST_REWARD.

◆ HandleQuestAdd()

static bool quest_commandscript::HandleQuestAdd ( ChatHandler handler,
Quest const *  quest,
Optional< PlayerIdentifier playerTarget 
)
inlinestatic
53 {
54 if (!playerTarget)
55 {
56 playerTarget = PlayerIdentifier::FromTargetOrSelf(handler);
57 }
58
59 if (!playerTarget)
60 {
62 return false;
63 }
64
65 uint32 entry = quest->GetQuestId();
66
67 // check item starting quest (it can work incorrectly if added without item in inventory)
68 ItemTemplateContainer const* itc = sObjectMgr->GetItemTemplateStore();
69 ItemTemplateContainer::const_iterator result = find_if(itc->begin(), itc->end(), Finder<uint32, ItemTemplate>(entry, &ItemTemplate::StartQuest));
70
71 if (result != itc->end())
72 {
73 handler->SendErrorMessage(LANG_COMMAND_QUEST_STARTFROMITEM, entry, result->second.ItemId);
74 return false;
75 }
76
77 if (Player* player = playerTarget->GetConnectedPlayer())
78 {
79 if (player->IsActiveQuest(entry))
80 {
81 handler->SendErrorMessage(LANG_COMMAND_QUEST_ACTIVE, quest->GetTitle().c_str(), entry);
82 return false;
83 }
84
85 // ok, normal (creature/GO starting) quest
86 if (player->CanAddQuest(quest, true))
87 {
88 player->AddQuestAndCheckCompletion(quest, nullptr);
89 }
90 }
91 else
92 {
93 ObjectGuid::LowType guid = playerTarget->GetGUID().GetCounter();
94 QueryResult result = CharacterDatabase.Query("SELECT 1 FROM character_queststatus WHERE guid = {} AND quest = {}", guid, entry);
95
96 if (result)
97 {
98 handler->SendErrorMessage(LANG_COMMAND_QUEST_ACTIVE, quest->GetTitle().c_str(), entry);
99 return false;
100 }
101
102 uint8 index = 0;
103
105 stmt->SetData(index++, guid);
106 stmt->SetData(index++, entry);
107 stmt->SetData(index++, 1);
108 stmt->SetData(index++, false);
109 stmt->SetData(index++, 0);
110
111 for (uint8 i = 0; i < QUEST_OBJECTIVES_COUNT; i++)
112 {
113 stmt->SetData(index++, 0);
114 }
115
116 for (uint8 i = 0; i < QUEST_ITEM_OBJECTIVES_COUNT; i++)
117 {
118 stmt->SetData(index++, 0);
119 }
120
121 stmt->SetData(index, 0);
122
123 CharacterDatabase.Execute(stmt);
124 }
125
126 handler->PSendSysMessage(LANG_COMMAND_QUEST_ADD, quest->GetTitle(), entry);
127 handler->SetSentErrorMessage(false);
128 return true;
129 }
@ CHAR_REP_CHAR_QUESTSTATUS
Definition CharacterDatabase.h:442
std::shared_ptr< ResultSet > QueryResult
Definition DatabaseEnvFwd.h:27
DatabaseWorkerPool< CharacterDatabaseConnection > CharacterDatabase
Accessor to the character database.
Definition DatabaseEnv.cpp:21
std::uint8_t uint8
Definition Define.h:109
std::uint32_t uint32
Definition Define.h:107
std::unordered_map< uint32, ItemTemplate > ItemTemplateContainer
Definition ItemTemplate.h:831
@ LANG_COMMAND_QUEST_STARTFROMITEM
Definition Language.h:514
@ LANG_COMMAND_QUEST_ACTIVE
Definition Language.h:518
@ LANG_PLAYER_NOT_FOUND
Definition Language.h:548
@ LANG_COMMAND_QUEST_ADD
Definition Language.h:1136
#define sObjectMgr
Definition ObjectMgr.h:1723
#define QUEST_ITEM_OBJECTIVES_COUNT
Definition QuestDef.h:36
#define QUEST_OBJECTIVES_COUNT
Definition QuestDef.h:35
void PSendSysMessage(std::string_view str, bool escapeCharacters=false)
Definition Chat.cpp:219
void SendErrorMessage(uint32 entry)
Definition Chat.cpp:224
void SetSentErrorMessage(bool val)
Definition Chat.h:238
uint32 LowType
Definition ObjectGuid.h:122
Definition Player.h:1084
Acore::Types::is_default< T > SetData(const uint8 index, T value)
Definition PreparedStatement.h:77
Definition PreparedStatement.h:157
static Optional< PlayerIdentifier > FromTargetOrSelf(ChatHandler *handler)
Definition ChatCommandTags.h:189
Definition Util.h:35
uint32 StartQuest
Definition ItemTemplate.h:668

References CHAR_REP_CHAR_QUESTSTATUS, CharacterDatabase, Acore::ChatCommands::PlayerIdentifier::FromTargetOrSelf(), Quest::GetQuestId(), Quest::GetTitle(), LANG_COMMAND_QUEST_ACTIVE, LANG_COMMAND_QUEST_ADD, LANG_COMMAND_QUEST_STARTFROMITEM, LANG_PLAYER_NOT_FOUND, ChatHandler::PSendSysMessage(), QUEST_ITEM_OBJECTIVES_COUNT, QUEST_OBJECTIVES_COUNT, ChatHandler::SendErrorMessage(), PreparedStatementBase::SetData(), ChatHandler::SetSentErrorMessage(), sObjectMgr, and ItemTemplate::StartQuest.

Referenced by GetCommands().

◆ HandleQuestComplete()

static bool quest_commandscript::HandleQuestComplete ( ChatHandler handler,
Quest const *  quest,
Optional< PlayerIdentifier playerTarget 
)
inlinestatic
222 {
223 if (!playerTarget)
224 {
225 playerTarget = PlayerIdentifier::FromTargetOrSelf(handler);
226 }
227
228 if (!playerTarget)
229 {
231 return false;
232 }
233
234 uint32 entry = quest->GetQuestId();
235
236 if (Player* player = playerTarget->GetConnectedPlayer())
237 {
238 // If player doesn't have the quest
239 if (player->GetQuestStatus(entry) == QUEST_STATUS_NONE)
240 {
242 return false;
243 }
244
245 // Add quest items for quests that require items
246 for (uint8 x = 0; x < QUEST_ITEM_OBJECTIVES_COUNT; ++x)
247 {
248 uint32 id = quest->RequiredItemId[x];
249 uint32 count = quest->RequiredItemCount[x];
250 if (!id || !count)
251 {
252 continue;
253 }
254
255 uint32 curItemCount = player->GetItemCount(id, true);
256
257 ItemPosCountVec dest;
258 uint8 msg = player->CanStoreNewItem(NULL_BAG, NULL_SLOT, dest, id, count - curItemCount);
259 if (msg == EQUIP_ERR_OK)
260 {
261 Item* item = player->StoreNewItem(dest, id, true);
262 player->SendNewItem(item, count - curItemCount, true, false);
263 }
264 }
265
266 // All creature/GO slain/casted (not required, but otherwise it will display "Creature slain 0/10")
267 for (uint8 i = 0; i < QUEST_OBJECTIVES_COUNT; ++i)
268 {
269 int32 creature = quest->RequiredNpcOrGo[i];
270 uint32 creatureCount = quest->RequiredNpcOrGoCount[i];
271
272 if (creature > 0)
273 {
274 if (CreatureTemplate const* creatureInfo = sObjectMgr->GetCreatureTemplate(creature))
275 {
276 for (uint16 z = 0; z < creatureCount; ++z)
277 {
278 player->KilledMonster(creatureInfo, ObjectGuid::Empty);
279 }
280 }
281 }
282 else if (creature < 0)
283 {
284 for (uint16 z = 0; z < creatureCount; ++z)
285 {
286 player->KillCreditGO(creature);
287 }
288 }
289 }
290
291 // player kills
292 if (quest->HasSpecialFlag(QUEST_SPECIAL_FLAGS_PLAYER_KILL))
293 {
294 if (uint32 reqPlayers = quest->GetPlayersSlain())
295 {
296 player->KilledPlayerCreditForQuest(reqPlayers, quest);
297 }
298 }
299
300 // If the quest requires reputation to complete
301 if (uint32 repFaction = quest->GetRepObjectiveFaction())
302 {
303 uint32 repValue = quest->GetRepObjectiveValue();
304 uint32 curRep = player->GetReputationMgr().GetReputation(repFaction);
305 if (curRep < repValue)
306 {
307 if (FactionEntry const* factionEntry = sFactionStore.LookupEntry(repFaction))
308 {
309 player->GetReputationMgr().SetReputation(factionEntry, static_cast<float>(repValue));
310 }
311 }
312 }
313
314 // If the quest requires a SECOND reputation to complete
315 if (uint32 repFaction = quest->GetRepObjectiveFaction2())
316 {
317 uint32 repValue2 = quest->GetRepObjectiveValue2();
318 uint32 curRep = player->GetReputationMgr().GetReputation(repFaction);
319 if (curRep < repValue2)
320 {
321 if (FactionEntry const* factionEntry = sFactionStore.LookupEntry(repFaction))
322 {
323 player->GetReputationMgr().SetReputation(factionEntry, static_cast<float>(repValue2));
324 }
325 }
326 }
327
328 // If the quest requires money
329 int32 ReqOrRewMoney = quest->GetRewOrReqMoney(player->GetLevel());
330 if (ReqOrRewMoney < 0)
331 {
332 player->ModifyMoney(-ReqOrRewMoney);
333 }
334
335 player->CompleteQuest(entry);
336 }
337 else
338 {
339 ObjectGuid::LowType guid = playerTarget->GetGUID().GetCounter();
340 QueryResult result = CharacterDatabase.Query("SELECT 1 FROM character_queststatus WHERE guid = {} AND quest = {}", guid, entry);
341
342 if (!result)
343 {
344 handler->SendErrorMessage(LANG_COMMAND_QUEST_NOT_FOUND_IN_LOG, quest->GetTitle(), entry);
345 return false;
346 }
347
348 CharacterDatabaseTransaction trans = CharacterDatabase.BeginTransaction();
349
350 typedef std::pair<uint32, uint32> items;
351 std::vector<items> questItems;
352
353 for (uint8 x = 0; x < QUEST_ITEM_OBJECTIVES_COUNT; ++x)
354 {
355 uint32 id = quest->RequiredItemId[x];
356 uint32 count = quest->RequiredItemCount[x];
357 if (!id || !count)
358 {
359 continue;
360 }
361
362 questItems.emplace_back(id, count);
363 }
364
365 if (!questItems.empty())
366 {
368 // fill mail
369 MailDraft draft(quest->GetTitle(), std::string());
370
371 for (auto const& itr : questItems)
372 {
373 if (Item* item = Item::CreateItem(itr.first, itr.second))
374 {
375 item->SaveToDB(trans);
376 draft.AddItem(item);
377 }
378 }
379
380 draft.SendMailTo(trans, MailReceiver(nullptr, guid), sender);
381 }
382
383 uint8 index = 0;
384
386 stmt->SetData(index++, guid);
387 stmt->SetData(index++, entry);
388 stmt->SetData(index++, 1);
389 stmt->SetData(index++, quest->HasFlag(QUEST_FLAGS_EXPLORATION));
390 stmt->SetData(index++, 0);
391
392 for (uint8 i = 0; i < QUEST_OBJECTIVES_COUNT; i++)
393 {
394 stmt->SetData(index++, quest->RequiredNpcOrGoCount[i]);
395 }
396
397 for (uint8 i = 0; i < QUEST_ITEM_OBJECTIVES_COUNT; i++)
398 {
399 // Will be updated once they loot the items from the mailbox.
400 stmt->SetData(index++, 0);
401 }
402
403 stmt->SetData(index, 0);
404
405 trans->Append(stmt);
406
407 // If the quest requires reputation to complete, set the player rep to the required amount.
408 if (uint32 repFaction = quest->GetRepObjectiveFaction())
409 {
410 uint32 repValue = quest->GetRepObjectiveValue();
411
412 stmt = CharacterDatabase.GetPreparedStatement(CHAR_SEL_CHAR_REP_BY_FACTION);
413 stmt->SetData(0, repFaction);
414 stmt->SetData(1, guid);
415 PreparedQueryResult result = CharacterDatabase.Query(stmt);
416
417 if (result)
418 {
419 Field* fields = result->Fetch();
420 uint32 curRep = fields[0].Get<uint32>();
421
422 if (curRep < repValue)
423 {
424 if (sFactionStore.LookupEntry(repFaction))
425 {
426 stmt = CharacterDatabase.GetPreparedStatement(CHAR_UPD_CHAR_REP_FACTION_CHANGE);
427 stmt->SetData(0, repFaction);
428 stmt->SetData(1, repValue);
429 stmt->SetData(2, repFaction);
430 stmt->SetData(3, guid);
431 trans->Append(stmt);
432 }
433 }
434 }
435 }
436
437 // If the quest requires reputation to complete, set the player rep to the required amount.
438 if (uint32 repFaction = quest->GetRepObjectiveFaction2())
439 {
440 uint32 repValue = quest->GetRepObjectiveValue();
441
442 stmt = CharacterDatabase.GetPreparedStatement(CHAR_SEL_CHAR_REP_BY_FACTION);
443 stmt->SetData(0, repFaction);
444 stmt->SetData(1, guid);
445 PreparedQueryResult result = CharacterDatabase.Query(stmt);
446
447 if (result)
448 {
449 Field* fields = result->Fetch();
450 uint32 curRep = fields[0].Get<uint32>();
451
452 if (curRep < repValue)
453 {
454 if (sFactionStore.LookupEntry(repFaction))
455 {
456 stmt = CharacterDatabase.GetPreparedStatement(CHAR_UPD_CHAR_REP_FACTION_CHANGE);
457 stmt->SetData(0, repFaction);
458 stmt->SetData(1, repValue);
459 stmt->SetData(2, repFaction);
460 stmt->SetData(3, guid);
461 trans->Append(stmt);
462 }
463 }
464 }
465 }
466
467 CharacterDatabase.CommitTransaction(trans);
468 }
469
470 // check if Quest Tracker is enabled
471 if (sWorld->getBoolConfig(CONFIG_QUEST_ENABLE_QUEST_TRACKER))
472 {
473 // prepare Quest Tracker datas
474 auto stmt = CharacterDatabase.GetPreparedStatement(CHAR_UPD_QUEST_TRACK_GM_COMPLETE);
475 stmt->SetData(0, entry);
476 stmt->SetData(1, playerTarget->GetGUID().GetCounter());
477
478 // add to Quest Tracker
479 CharacterDatabase.Execute(stmt);
480 }
481
482 handler->PSendSysMessage(LANG_COMMAND_QUEST_COMPLETE, quest->GetTitle(), entry);
483 handler->SetSentErrorMessage(false);
484 return true;
485 }
@ CHAR_SEL_CHAR_REP_BY_FACTION
Definition CharacterDatabase.h:403
@ CHAR_UPD_QUEST_TRACK_GM_COMPLETE
Definition CharacterDatabase.h:508
@ CHAR_UPD_CHAR_REP_FACTION_CHANGE
Definition CharacterDatabase.h:405
DBCStorage< FactionEntry > sFactionStore(FactionEntryfmt)
SQLTransaction< CharacterDatabaseConnection > CharacterDatabaseTransaction
Definition DatabaseEnvFwd.h:69
std::shared_ptr< PreparedResultSet > PreparedQueryResult
Definition DatabaseEnvFwd.h:45
std::int32_t int32
Definition Define.h:103
std::uint16_t uint16
Definition Define.h:108
@ EQUIP_ERR_OK
Definition Item.h:47
@ NULL_BAG
Definition Item.h:40
@ NULL_SLOT
Definition Item.h:41
@ LANG_COMMAND_QUEST_COMPLETE
Definition Language.h:517
@ LANG_COMMAND_QUEST_NOTFOUND
Definition Language.h:513
@ LANG_COMMAND_QUEST_NOT_FOUND_IN_LOG
Definition Language.h:1137
@ MAIL_STATIONERY_GM
Definition Mail.h:59
@ MAIL_NORMAL
Definition Mail.h:37
std::vector< ItemPosCount > ItemPosCountVec
Definition Player.h:757
@ QUEST_FLAGS_EXPLORATION
Definition QuestDef.h:134
@ QUEST_STATUS_NONE
Definition QuestDef.h:100
@ QUEST_SPECIAL_FLAGS_PLAYER_KILL
Definition QuestDef.h:179
@ CONFIG_QUEST_ENABLE_QUEST_TRACKER
Definition WorldConfig.h:105
Class used to access individual fields of database query result.
Definition Field.h:98
std::enable_if_t< std::is_arithmetic_v< T >, T > Get() const
Definition Field.h:112
Definition Item.h:220
static Item * CreateItem(uint32 item, uint32 count, Player const *player=nullptr, bool clone=false, uint32 randomPropertyId=0)
Definition Item.cpp:1087
virtual void SaveToDB(CharacterDatabaseTransaction trans)
Definition Item.cpp:336
Definition Mail.h:119
Definition Mail.h:105
Definition Mail.h:83
LowType GetCounter() const
Definition ObjectGuid.h:145
static ObjectGuid const Empty
Definition ObjectGuid.h:120
static ObjectGuid GetGUID(Object const *o)
Definition Object.h:114
#define sWorld
Definition World.h:317
Definition CreatureData.h:187
Definition DBCStructure.h:907

References MailDraft::AddItem(), CHAR_REP_CHAR_QUESTSTATUS, CHAR_SEL_CHAR_REP_BY_FACTION, CHAR_UPD_CHAR_REP_FACTION_CHANGE, CHAR_UPD_QUEST_TRACK_GM_COMPLETE, CharacterDatabase, CONFIG_QUEST_ENABLE_QUEST_TRACKER, Item::CreateItem(), ObjectGuid::Empty, EQUIP_ERR_OK, Acore::ChatCommands::PlayerIdentifier::FromTargetOrSelf(), Field::Get(), Quest::GetPlayersSlain(), Quest::GetQuestId(), Quest::GetRepObjectiveFaction(), Quest::GetRepObjectiveFaction2(), Quest::GetRepObjectiveValue(), Quest::GetRepObjectiveValue2(), Quest::GetRewOrReqMoney(), Quest::GetTitle(), Quest::HasFlag(), Quest::HasSpecialFlag(), LANG_COMMAND_QUEST_COMPLETE, LANG_COMMAND_QUEST_NOT_FOUND_IN_LOG, LANG_COMMAND_QUEST_NOTFOUND, LANG_PLAYER_NOT_FOUND, MAIL_NORMAL, MAIL_STATIONERY_GM, NULL_BAG, NULL_SLOT, ChatHandler::PSendSysMessage(), QUEST_FLAGS_EXPLORATION, QUEST_ITEM_OBJECTIVES_COUNT, QUEST_OBJECTIVES_COUNT, QUEST_SPECIAL_FLAGS_PLAYER_KILL, QUEST_STATUS_NONE, Quest::RequiredItemCount, Quest::RequiredItemId, Quest::RequiredNpcOrGo, Quest::RequiredNpcOrGoCount, ChatHandler::SendErrorMessage(), MailDraft::SendMailTo(), PreparedStatementBase::SetData(), ChatHandler::SetSentErrorMessage(), sFactionStore, sObjectMgr, and sWorld.

Referenced by GetCommands().

◆ HandleQuestRemove()

static bool quest_commandscript::HandleQuestRemove ( ChatHandler handler,
Quest const *  quest,
Optional< PlayerIdentifier playerTarget 
)
inlinestatic
132 {
133 if (!playerTarget)
134 {
135 playerTarget = PlayerIdentifier::FromTargetOrSelf(handler);
136 }
137
138 if (!playerTarget)
139 {
141 return false;
142 }
143
144 uint32 entry = quest->GetQuestId();
145
146 if (!quest)
147 {
149 return false;
150 }
151
152 if (Player* player = playerTarget->GetConnectedPlayer())
153 {
154 // remove all quest entries for 'entry' from quest log
155 for (uint8 slot = 0; slot < MAX_QUEST_LOG_SIZE; ++slot)
156 {
157 uint32 logQuest = player->GetQuestSlotQuestId(slot);
158 if (logQuest == entry)
159 {
160 player->SetQuestSlot(slot, 0);
161
162 // we ignore unequippable quest items in this case, its' still be equipped
163 player->TakeQuestSourceItem(logQuest, false);
164
165 if (quest->HasFlag(QUEST_FLAGS_FLAGS_PVP))
166 {
167 player->pvpInfo.IsHostile = player->pvpInfo.IsInHostileArea || player->HasPvPForcingQuest();
168 player->UpdatePvPState();
169 }
170 }
171 }
172
173 player->RemoveRewardedQuest(entry);
174 player->RemoveActiveQuest(entry, false);
175 }
176 else
177 {
178 ObjectGuid::LowType guid = playerTarget->GetGUID().GetCounter();
179 CharacterDatabaseTransaction trans = CharacterDatabase.BeginTransaction();
180
182 stmt->SetData(0, guid);
183 stmt->SetData(1, entry);
184 trans->Append(stmt);
185
186 stmt = CharacterDatabase.GetPreparedStatement(CHAR_DEL_CHAR_QUESTSTATUS_BY_QUEST);
187 stmt->SetData(0, guid);
188 stmt->SetData(1, entry);
189 trans->Append(stmt);
190
191 for (uint32 const& requiredItem : quest->RequiredItemId)
192 {
194 stmt->SetData(0, requiredItem);
195 stmt->SetData(1, guid);
196
197 PreparedQueryResult result = CharacterDatabase.Query(stmt);
198
199 if (result)
200 {
201 Field* fields = result->Fetch();
202
203 stmt = CharacterDatabase.GetPreparedStatement(CHAR_DEL_CHAR_INVENTORY_BY_ITEM);
204 stmt->SetData(0, fields[0].Get<uint32>());
205 trans->Append(stmt);
206
207 stmt = CharacterDatabase.GetPreparedStatement(CHAR_DEL_ITEM_INSTANCE);
208 stmt->SetData(0, fields[0].Get<uint32>());
209 trans->Append(stmt);
210 }
211 }
212
213 CharacterDatabase.CommitTransaction(trans);
214 }
215
216 handler->PSendSysMessage(LANG_COMMAND_QUEST_REMOVED, quest->GetTitle(), entry);
217 handler->SetSentErrorMessage(false);
218 return true;
219 }
@ CHAR_DEL_CHAR_QUESTSTATUS_REWARDED_BY_QUEST
Definition CharacterDatabase.h:445
@ CHAR_DEL_ITEM_INSTANCE
Definition CharacterDatabase.h:127
@ CHAR_DEL_CHAR_INVENTORY_BY_ITEM
Definition CharacterDatabase.h:439
@ CHAR_SEL_CHAR_INVENTORY_ITEM_BY_ENTRY_AND_OWNER
Definition CharacterDatabase.h:363
@ CHAR_DEL_CHAR_QUESTSTATUS_BY_QUEST
Definition CharacterDatabase.h:443
@ LANG_COMMAND_QUEST_REMOVED
Definition Language.h:515
@ QUEST_FLAGS_FLAGS_PVP
Definition QuestDef.h:145
#define MAX_QUEST_LOG_SIZE
Definition QuestDef.h:33

References CHAR_DEL_CHAR_INVENTORY_BY_ITEM, CHAR_DEL_CHAR_QUESTSTATUS_BY_QUEST, CHAR_DEL_CHAR_QUESTSTATUS_REWARDED_BY_QUEST, CHAR_DEL_ITEM_INSTANCE, CHAR_SEL_CHAR_INVENTORY_ITEM_BY_ENTRY_AND_OWNER, CharacterDatabase, Acore::ChatCommands::PlayerIdentifier::FromTargetOrSelf(), Quest::GetQuestId(), Quest::GetTitle(), Quest::HasFlag(), LANG_COMMAND_QUEST_NOTFOUND, LANG_COMMAND_QUEST_REMOVED, LANG_PLAYER_NOT_FOUND, MAX_QUEST_LOG_SIZE, ChatHandler::PSendSysMessage(), QUEST_FLAGS_FLAGS_PVP, Quest::RequiredItemId, ChatHandler::SendErrorMessage(), PreparedStatementBase::SetData(), and ChatHandler::SetSentErrorMessage().

Referenced by GetCommands().

◆ HandleQuestReward()

static bool quest_commandscript::HandleQuestReward ( ChatHandler handler,
Quest const *  quest,
Optional< PlayerIdentifier playerTarget 
)
inlinestatic
488 {
489 if (!playerTarget)
490 {
491 playerTarget = PlayerIdentifier::FromTargetOrSelf(handler);
492 }
493
494 if (!playerTarget)
495 {
497 return false;
498 }
499
500 uint32 entry = quest->GetQuestId();
501
502 if (Player* player = playerTarget->GetConnectedPlayer())
503 {
504 // If player doesn't have the quest
505 if (player->GetQuestStatus(entry) != QUEST_STATUS_COMPLETE)
506 {
508 return false;
509 }
510
511 player->RewardQuest(quest, 0, player);
512 }
513 else
514 {
515 // Achievement criteria updates correctly the next time a quest is rewarded.
516 // Titles are already awarded correctly the next time they login (only one quest awards title - 11549).
517 // Rewarded talent points (Death Knights) and spells (e.g Druid forms) are also granted on login.
518 // No reputation gains - too troublesome to calculate them when the player is offline.
519
520 ObjectGuid::LowType guid = playerTarget->GetGUID().GetCounter();
521 uint8 charLevel = sCharacterCache->GetCharacterLevelByGuid(ObjectGuid(HighGuid::Player, guid));
522 CharacterDatabaseTransaction trans = CharacterDatabase.BeginTransaction();
524
525 QueryResult result = CharacterDatabase.Query("SELECT 1 FROM character_queststatus WHERE guid = {} AND quest = {} AND status = 1", guid, entry);
526
527 if (!result)
528 {
530 return false;
531 }
532
533 for (uint32 const& requiredItem : quest->RequiredItemId)
534 {
536 stmt->SetData(0, requiredItem);
537 stmt->SetData(1, guid);
538
539 PreparedQueryResult result = CharacterDatabase.Query(stmt);
540
541 if (result)
542 {
543 Field* fields = result->Fetch();
544
545 stmt = CharacterDatabase.GetPreparedStatement(CHAR_DEL_CHAR_INVENTORY_BY_ITEM);
546 stmt->SetData(0, fields[0].Get<uint32>());
547 trans->Append(stmt);
548
549 stmt = CharacterDatabase.GetPreparedStatement(CHAR_DEL_ITEM_INSTANCE);
550 stmt->SetData(0, fields[0].Get<uint32>());
551 trans->Append(stmt);
552 }
553 }
554
555 for (uint32 const& sourceItem : quest->ItemDrop)
556 {
558 stmt->SetData(0, sourceItem);
559 stmt->SetData(1, guid);
560
561 PreparedQueryResult result = CharacterDatabase.Query(stmt);
562
563 if (result)
564 {
565 Field* fields = result->Fetch();
566
567 stmt = CharacterDatabase.GetPreparedStatement(CHAR_DEL_CHAR_INVENTORY_BY_ITEM);
568 stmt->SetData(0, fields[0].Get<uint32>());
569 trans->Append(stmt);
570
571 stmt = CharacterDatabase.GetPreparedStatement(CHAR_DEL_ITEM_INSTANCE);
572 stmt->SetData(0, fields[0].Get<uint32>());
573 trans->Append(stmt);
574 }
575 }
576
577 typedef std::pair<uint32, uint32> items;
578 std::vector<items> questRewardItems;
579
580 if (quest->GetRewChoiceItemsCount())
581 {
582 for (uint32 const& itemId : quest->RewardChoiceItemId)
583 {
584 uint8 index = 0;
585 questRewardItems.emplace_back(itemId, quest->RewardChoiceItemCount[index++]);
586 }
587 }
588
589 if (quest->GetRewItemsCount())
590 {
591 for (uint32 const& itemId : quest->RewardItemId)
592 {
593 uint8 index = 0;
594 questRewardItems.emplace_back(itemId, quest->RewardItemIdCount[index++]);
595 }
596 }
597
598 if (!questRewardItems.empty())
599 {
601 // fill mail
602 MailDraft draft(quest->GetTitle(), "This quest has been manually rewarded to you. This mail contains your quest rewards.");
603
604 for (auto const& itr : questRewardItems)
605 {
606 if (!itr.first || !itr.second)
607 {
608 continue;
609 }
610
611 // Skip invalid items.
612 if (!sObjectMgr->GetItemTemplate(itr.first))
613 {
614 continue;
615 }
616
617 if (Item* item = Item::CreateItem(itr.first, itr.second))
618 {
619 item->SaveToDB(trans);
620 draft.AddItem(item);
621 }
622 }
623
624 draft.SendMailTo(trans, MailReceiver(nullptr, guid), sender);
625 }
626
627 // Send quest giver mail, if any.
628 if (uint32 mail_template_id = quest->GetRewMailTemplateId())
629 {
630 if (quest->GetRewMailSenderEntry() != 0)
631 {
632 MailDraft(mail_template_id).SendMailTo(trans, MailReceiver(nullptr, guid), quest->GetRewMailSenderEntry(), MAIL_CHECK_MASK_HAS_BODY, quest->GetRewMailDelaySecs());
633 }
634 }
635
636 if (quest->IsDaily() || quest->IsDFQuest())
637 {
638 stmt = CharacterDatabase.GetPreparedStatement(CHAR_INS_CHARACTER_DAILYQUESTSTATUS);
639 stmt->SetData(0, guid);
640 stmt->SetData(1, entry);
641 stmt->SetData(2, GameTime::GetGameTime().count());
642 trans->Append(stmt);
643 }
644 else if (quest->IsWeekly())
645 {
646 stmt = CharacterDatabase.GetPreparedStatement(CHAR_INS_CHARACTER_WEEKLYQUESTSTATUS);
647 stmt->SetData(0, guid);
648 stmt->SetData(1, entry);
649 trans->Append(stmt);
650 }
651 else if (quest->IsMonthly())
652 {
653 stmt = CharacterDatabase.GetPreparedStatement(CHAR_INS_CHARACTER_MONTHLYQUESTSTATUS);
654 stmt->SetData(0, guid);
655 stmt->SetData(1, entry);
656 trans->Append(stmt);
657 }
658 else if (quest->IsSeasonal())
659 {
660 // We can't know which event is the quest linked to, so we can't do anything about this.
661 /* stmt = CharacterDatabase.GetPreparedStatement(CHAR_INS_CHARACTER_SEASONALQUESTSTATUS);
662 stmt->SetData(0, guid);
663 stmt->SetData(1, entry);
664 stmt->SetData(2, event_id);
665 trans->Append(stmt);*/
666 }
667
668 if (uint32 honor = quest->CalculateHonorGain(charLevel))
669 {
671 stmt->SetData(0, honor);
672 stmt->SetData(1, guid);
673 trans->Append(stmt);
674 }
675
676 if (quest->GetRewArenaPoints())
677 {
679 stmt->SetData(0, quest->GetRewArenaPoints());
680 stmt->SetData(1, guid);
681 trans->Append(stmt);
682 }
683
684 int32 rewMoney = 0;
685
686 if (charLevel >= sWorld->getIntConfig(CONFIG_MAX_PLAYER_LEVEL))
687 {
688 rewMoney = quest->GetRewMoneyMaxLevel();
689 }
690 else
691 {
692 // Some experience might get lost on level up.
693 uint32 xp = uint32(quest->XPValue(charLevel) * sWorld->getRate(RATE_XP_QUEST));
694 stmt = CharacterDatabase.GetPreparedStatement(CHAR_UPD_XP_ACCUMULATIVE);
695 stmt->SetData(0, xp);
696 stmt->SetData(1, guid);
697 trans->Append(stmt);
698 }
699
700 if (int32 rewOrReqMoney = quest->GetRewOrReqMoney(charLevel))
701 {
702 rewMoney += rewOrReqMoney;
703 }
704
705 // Only reward money, don't subtract, let's not cause an overflow...
706 if (rewMoney > 0)
707 {
709 stmt->SetData(0, rewMoney);
710 stmt->SetData(1, guid);
711 trans->Append(stmt);
712 }
713
714 stmt = CharacterDatabase.GetPreparedStatement(CHAR_INS_CHAR_QUESTSTATUS_REWARDED);
715 stmt->SetData(0, guid);
716 stmt->SetData(1, entry);
717 trans->Append(stmt);
718
719 stmt = CharacterDatabase.GetPreparedStatement(CHAR_DEL_CHAR_QUESTSTATUS_BY_QUEST);
720 stmt->SetData(0, guid);
721 stmt->SetData(1, entry);
722 trans->Append(stmt);
723
724 CharacterDatabase.CommitTransaction(trans);
725 }
726
727 handler->PSendSysMessage(LANG_COMMAND_QUEST_REWARDED, quest->GetTitle(), entry);
728 handler->SetSentErrorMessage(false);
729 return true;
730 }
#define sCharacterCache
Definition CharacterCache.h:83
@ CHAR_INS_CHARACTER_WEEKLYQUESTSTATUS
Definition CharacterDatabase.h:75
@ CHAR_INS_CHARACTER_MONTHLYQUESTSTATUS
Definition CharacterDatabase.h:76
@ CHAR_UDP_CHAR_MONEY_ACCUMULATIVE
Definition CharacterDatabase.h:434
@ CHAR_UDP_CHAR_HONOR_POINTS_ACCUMULATIVE
Definition CharacterDatabase.h:428
@ CHAR_UPD_XP_ACCUMULATIVE
Definition CharacterDatabase.h:299
@ CHAR_INS_CHARACTER_DAILYQUESTSTATUS
Definition CharacterDatabase.h:74
@ CHAR_UDP_CHAR_ARENA_POINTS_ACCUMULATIVE
Definition CharacterDatabase.h:430
@ CHAR_INS_CHAR_QUESTSTATUS_REWARDED
Definition CharacterDatabase.h:444
@ LANG_COMMAND_QUEST_REWARDED
Definition Language.h:516
@ LANG_COMMAND_QUEST_NOT_COMPLETE
Definition Language.h:1138
@ MAIL_CHECK_MASK_HAS_BODY
Definition Mail.h:51
@ QUEST_STATUS_COMPLETE
Definition QuestDef.h:101
@ CONFIG_MAX_PLAYER_LEVEL
Definition WorldConfig.h:189
@ RATE_XP_QUEST
Definition WorldConfig.h:436
void SendMailTo(CharacterDatabaseTransaction trans, MailReceiver const &receiver, MailSender const &sender, MailCheckMask checked=MAIL_CHECK_MASK_NONE, uint32 deliver_delay=0, uint32 custom_expiration=0, bool deleteMailItemsFromDB=false, bool sendMail=true)
Definition Mail.cpp:185
Definition ObjectGuid.h:118
Seconds GetGameTime()
Definition GameTime.cpp:38

References MailDraft::AddItem(), Quest::CalculateHonorGain(), CHAR_DEL_CHAR_INVENTORY_BY_ITEM, CHAR_DEL_CHAR_QUESTSTATUS_BY_QUEST, CHAR_DEL_ITEM_INSTANCE, CHAR_INS_CHAR_QUESTSTATUS_REWARDED, CHAR_INS_CHARACTER_DAILYQUESTSTATUS, CHAR_INS_CHARACTER_MONTHLYQUESTSTATUS, CHAR_INS_CHARACTER_WEEKLYQUESTSTATUS, CHAR_SEL_CHAR_INVENTORY_ITEM_BY_ENTRY_AND_OWNER, CHAR_UDP_CHAR_ARENA_POINTS_ACCUMULATIVE, CHAR_UDP_CHAR_HONOR_POINTS_ACCUMULATIVE, CHAR_UDP_CHAR_MONEY_ACCUMULATIVE, CHAR_UPD_XP_ACCUMULATIVE, CharacterDatabase, CONFIG_MAX_PLAYER_LEVEL, Item::CreateItem(), Acore::ChatCommands::PlayerIdentifier::FromTargetOrSelf(), GameTime::GetGameTime(), Quest::GetQuestId(), Quest::GetRewArenaPoints(), Quest::GetRewChoiceItemsCount(), Quest::GetRewItemsCount(), Quest::GetRewMailDelaySecs(), Quest::GetRewMailSenderEntry(), Quest::GetRewMailTemplateId(), Quest::GetRewMoneyMaxLevel(), Quest::GetRewOrReqMoney(), Quest::GetTitle(), Quest::IsDaily(), Quest::IsDFQuest(), Quest::IsMonthly(), Quest::IsSeasonal(), Quest::IsWeekly(), Quest::ItemDrop, LANG_COMMAND_QUEST_NOT_COMPLETE, LANG_COMMAND_QUEST_NOTFOUND, LANG_COMMAND_QUEST_REWARDED, LANG_PLAYER_NOT_FOUND, MAIL_CHECK_MASK_HAS_BODY, MAIL_NORMAL, MAIL_STATIONERY_GM, Player, ChatHandler::PSendSysMessage(), QUEST_STATUS_COMPLETE, RATE_XP_QUEST, Quest::RequiredItemId, Quest::RewardChoiceItemCount, Quest::RewardChoiceItemId, Quest::RewardItemId, Quest::RewardItemIdCount, sCharacterCache, ChatHandler::SendErrorMessage(), MailDraft::SendMailTo(), PreparedStatementBase::SetData(), ChatHandler::SetSentErrorMessage(), sObjectMgr, sWorld, and Quest::XPValue().

Referenced by GetCommands().

◆ HandleQuestStatus()

static bool quest_commandscript::HandleQuestStatus ( ChatHandler handler,
Quest const *  quest,
Optional< PlayerIdentifier playerTarget 
)
inlinestatic
733 {
734 if (!playerTarget)
735 playerTarget = PlayerIdentifier::FromTargetOrSelf(handler);
736
737 if (!playerTarget)
738 {
740 return false;
741 }
742
743 uint32 entry = quest->GetQuestId();
744 std::string status;
745 if (Player* player = playerTarget->GetConnectedPlayer())
746 {
747 QuestStatus qs = player->GetQuestStatus(entry);
748 switch (qs)
749 {
751 status = "Not Taken";
752 break;
754 status = "Complete";
755 break;
757 status = "Incomplete";
758 break;
760 status = "Failed";
761 break;
763 status = "Rewarded";
764 break;
765 default:
766 status = "Unknown";
767 break;
768 }
769
770 handler->PSendSysMessage(LANG_CMD_QUEST_STATUS, quest->GetTitle(), entry, status);
771
772 if (!player->CanTakeQuest(quest, false))
773 {
775
776 if (sDisableMgr->IsDisabledFor(DISABLE_TYPE_QUEST, entry, player))
778
779 if (!player->SatisfyQuestStatus(quest, false))
781
782 if (!player->SatisfyQuestClass(quest, false))
784
785 if (!player->SatisfyQuestRace(quest, false))
787
788 if (player->GetLevel() < quest->GetMinLevel())
789 handler->PSendSysMessage(LANG_CMD_QUEST_STATUS_LOW_LEVEL, quest->GetMinLevel());
790
791 if (quest->GetMaxLevel() > 0 && player->GetLevel() > quest->GetMaxLevel())
792 handler->PSendSysMessage(LANG_CMD_QUEST_STATUS_HIGH_LEVEL, quest->GetMaxLevel());
793
794 if (!player->SatisfyQuestSkill(quest, false))
796
797 if (!player->SatisfyQuestReputation(quest, false))
799
800 if (!player->SatisfyQuestPreviousQuest(quest, false))
802
803 if (!player->SatisfyQuestTimed(quest, false))
805
806 if (!player->SatisfyQuestExclusiveGroup(quest, false))
808
809 if (!player->SatisfyQuestNextChain(quest, false))
811
812 if (!player->SatisfyQuestPrevChain(quest, false))
814
815 if (!player->SatisfyQuestBreadcrumb(quest, false))
817
818 if (!player->SatisfyQuestDay(quest, false))
820
821 if (!player->SatisfyQuestWeek(quest, false))
823
824 if (!player->SatisfyQuestMonth(quest, false))
826
827 if (!player->SatisfyQuestSeasonal(quest, false))
829
830 if (!player->SatisfyQuestConditions(quest, false))
831 {
833
834 ConditionList conditions = sConditionMgr->GetConditionsForNotGroupedEntry(CONDITION_SOURCE_TYPE_QUEST_AVAILABLE, entry);
836 for (Condition* cond : conditions)
837 {
838 if (!cond->Meets(srcInfo))
839 handler->PSendSysMessage(LANG_CMD_QUEST_STATUS_COND_DETAIL, uint32(cond->ConditionType), cond->ConditionValue1, cond->ConditionValue2, cond->ConditionValue3);
840 }
841 }
842
843 if (!player->SatisfyQuestLog(false))
845 }
846 }
847 else
848 {
850 return false;
851 }
852
853 return true;
854 }
#define sConditionMgr
Definition ConditionMgr.h:296
@ CONDITION_SOURCE_TYPE_QUEST_AVAILABLE
Definition ConditionMgr.h:145
std::list< Condition * > ConditionList
Definition ConditionMgr.h:240
#define sDisableMgr
Definition DisableMgr.h:88
@ DISABLE_TYPE_QUEST
Definition DisableMgr.h:29
@ LANG_CMD_QUEST_STATUS_REPUTATION
Definition Language.h:1175
@ LANG_CMD_QUEST_STATUS_CLASS
Definition Language.h:1170
@ LANG_CMD_QUEST_STATUS_COND_DETAIL
Definition Language.h:1188
@ LANG_CMD_QUEST_STATUS_RACE
Definition Language.h:1171
@ LANG_CMD_QUEST_STATUS_PREV_CHAIN
Definition Language.h:1180
@ LANG_CMD_QUEST_STATUS_HIGH_LEVEL
Definition Language.h:1173
@ LANG_CMD_QUEST_STATUS_DAY
Definition Language.h:1182
@ LANG_CMD_QUEST_STATUS_LOG_FULL
Definition Language.h:1187
@ LANG_CMD_QUEST_STATUS_WEEK
Definition Language.h:1183
@ LANG_CMD_QUEST_STATUS_MONTH
Definition Language.h:1184
@ LANG_CMD_QUEST_STATUS_NEXT_CHAIN
Definition Language.h:1179
@ LANG_CMD_QUEST_STATUS_SKILL
Definition Language.h:1174
@ LANG_CMD_QUEST_STATUS_BREADCRUMB
Definition Language.h:1181
@ LANG_CMD_QUEST_STATUS_EXCLUSIVE
Definition Language.h:1178
@ LANG_CMD_QUEST_UNAVAILABLE
Definition Language.h:1167
@ LANG_CMD_QUEST_STATUS_DISABLED
Definition Language.h:1168
@ LANG_CMD_QUEST_STATUS_ALREADY_DONE
Definition Language.h:1169
@ LANG_CMD_QUEST_STATUS_SEASONAL
Definition Language.h:1185
@ LANG_CMD_QUEST_STATUS_PREV_QUEST
Definition Language.h:1176
@ LANG_CMD_QUEST_STATUS_TIMED
Definition Language.h:1177
@ LANG_CMD_QUEST_STATUS_LOW_LEVEL
Definition Language.h:1172
@ LANG_CMD_QUEST_STATUS
Definition Language.h:1166
@ LANG_CMD_QUEST_STATUS_CONDITION
Definition Language.h:1186
QuestStatus
Definition QuestDef.h:99
@ QUEST_STATUS_REWARDED
Definition QuestDef.h:106
@ QUEST_STATUS_FAILED
Definition QuestDef.h:105
@ QUEST_STATUS_INCOMPLETE
Definition QuestDef.h:103
virtual void SendSysMessage(std::string_view str, bool escapeCharacters=false)
Definition Chat.cpp:168
Definition ConditionMgr.h:185
Definition ConditionMgr.h:198

References CONDITION_SOURCE_TYPE_QUEST_AVAILABLE, DISABLE_TYPE_QUEST, Acore::ChatCommands::PlayerIdentifier::FromTargetOrSelf(), Quest::GetMaxLevel(), Quest::GetMinLevel(), Quest::GetQuestId(), Quest::GetTitle(), LANG_CMD_QUEST_STATUS, LANG_CMD_QUEST_STATUS_ALREADY_DONE, LANG_CMD_QUEST_STATUS_BREADCRUMB, LANG_CMD_QUEST_STATUS_CLASS, LANG_CMD_QUEST_STATUS_COND_DETAIL, LANG_CMD_QUEST_STATUS_CONDITION, LANG_CMD_QUEST_STATUS_DAY, LANG_CMD_QUEST_STATUS_DISABLED, LANG_CMD_QUEST_STATUS_EXCLUSIVE, LANG_CMD_QUEST_STATUS_HIGH_LEVEL, LANG_CMD_QUEST_STATUS_LOG_FULL, LANG_CMD_QUEST_STATUS_LOW_LEVEL, LANG_CMD_QUEST_STATUS_MONTH, LANG_CMD_QUEST_STATUS_NEXT_CHAIN, LANG_CMD_QUEST_STATUS_PREV_CHAIN, LANG_CMD_QUEST_STATUS_PREV_QUEST, LANG_CMD_QUEST_STATUS_RACE, LANG_CMD_QUEST_STATUS_REPUTATION, LANG_CMD_QUEST_STATUS_SEASONAL, LANG_CMD_QUEST_STATUS_SKILL, LANG_CMD_QUEST_STATUS_TIMED, LANG_CMD_QUEST_STATUS_WEEK, LANG_CMD_QUEST_UNAVAILABLE, LANG_PLAYER_NOT_FOUND, ChatHandler::PSendSysMessage(), QUEST_STATUS_COMPLETE, QUEST_STATUS_FAILED, QUEST_STATUS_INCOMPLETE, QUEST_STATUS_NONE, QUEST_STATUS_REWARDED, sConditionMgr, sDisableMgr, ChatHandler::SendErrorMessage(), and ChatHandler::SendSysMessage().

Referenced by GetCommands().


The documentation for this class was generated from the following file: