Code:
* This file is provided AS IS with NO WARRANTY OF ANY KIND, INCLUDING THE
* WARRANTY OF DESIGN, MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE.
*
* These definitions need to be added to the Chat.cpp:
* ===================================================
static ChatCommand questCommandTable[] =
{
{ "lookup", '2', &ChatHandler::HandleQuestLookupCommand, "Looks up quest string x", NULL, 0, 0, 0},
{ "status", '2', &ChatHandler::HandleQuestStatusCommand, "Lists the status of quest <id>", NULL, 0, 0, 0},
{ "addstart", '2', &ChatHandler::HandleQuestAddStartCommand, "Add quest <id> to the targeted NPC as starter", NULL, 0, 0, 0},
{ "addfinish", '2', &ChatHandler::HandleQuestAddFinishCommand, "Add quest <id> to the targeted NPC as finisher", NULL, 0, 0, 0},
{ "addboth", '2', &ChatHandler::HandleQuestAddBothCommand, "Add quest <id> to the targeted NPC as start & finish", NULL, 0, 0, 0},
{ "delstart", '2', &ChatHandler::HandleQuestDelStartCommand, "Delete quest <id> from the targeted NPC as starter", NULL, 0, 0, 0},
{ "delfinish", '2', &ChatHandler::HandleQuestDelFinishCommand, "Delete quest <id> from the targeted NPC as finisher", NULL, 0, 0, 0},
{ "delboth", '2', &ChatHandler::HandleQuestDelBothCommand, "Delete quest <id> from the targeted NPC as start & finish", NULL, 0, 0, 0},
{ "start", '2', &ChatHandler::HandleQuestStartCommand, "Starts quest <id>", NULL, 0, 0, 0},
{ "finish", '2', &ChatHandler::HandleQuestFinishCommand, "Finish quest <id>", NULL, 0, 0, 0},
{ "item", '2', &ChatHandler::HandleQuestItemCommand, "Lookup itemid necessary for quest <id>", NULL, 0, 0, 0},
{ "giver", '2', &ChatHandler::HandleQuestGiverCommand, "Lookup quest giver for quest <id>", NULL, 0, 0, 0},
{ "list", '2', &ChatHandler::HandleQuestListCommand, "Lists the quests for the npc <id>", NULL, 0, 0, 0},
{ "finisher", '2', &ChatHandler::HandleQuestFinisherCommand, "Lookup quest finisher for quest <id>", NULL, 0, 0, 0},
{ "spawn", '2', &ChatHandler::HandleQuestSpawnCommand, "Port to spawn location for quest <id>", NULL, 0, 0, 0},
{ NULL, 0, NULL, "", NULL, 0, 0, 0},
};
dupe_command_table(questCommandTable, _questCommandTable);
*
* These definitions need to be added to the Chat.h:
* ==================================================
bool HandleQuestLookupCommand(const char * args, WorldSession * m_session);
bool HandleQuestStatusCommand(const char * args, WorldSession * m_session);
bool HandleQuestAddStartCommand(const char * args, WorldSession * m_session);
bool HandleQuestAddFinishCommand(const char * args, WorldSession * m_session);
bool HandleQuestAddBothCommand(const char * args, WorldSession * m_session);
bool HandleQuestDelStartCommand(const char * args, WorldSession * m_session);
bool HandleQuestDelFinishCommand(const char * args, WorldSession * m_session);
bool HandleQuestDelBothCommand(const char * args, WorldSession * m_session);
bool HandleQuestStartCommand(const char * args, WorldSession * m_session);
bool HandleQuestFinishCommand(const char * args, WorldSession * m_session);
bool HandleQuestItemCommand(const char * args, WorldSession * m_session);
bool HandleQuestGiverCommand(const char * args, WorldSession * m_session);
bool HandleQuestListCommand(const char * args, WorldSession * m_session);
bool HandleQuestFinisherCommand(const char * args, WorldSession * m_session);
bool HandleQuestSpawnCommand(const char * args, WorldSession * m_session);
*/
#include "StdAfx.h"
inline std::string MyConvertIntToString(const int arg)
{
string str;
stringstream out;
out << arg;
return out.str();
}
inline std::string MyConvertFloatToString(const float arg)
{
string str;
stringstream out;
out << arg;
return out.str();
}
bool ChatHandler::HandleQuestLookupCommand(const char * args, WorldSession * m_session)
{
if(!*args) return false;
string x = string(args);
transform(x.begin(), x.end(), x.begin(), towlower);
if(x.length() < 4)
{
RedSystemMessage(m_session, "Your search string must be at least 5 characters long.");
return true;
}
BlueSystemMessage(m_session, "Starting search of quests `%s`...", x.c_str());
uint32 t = getMSTime();
StorageContainerIterator<Quest> * itr = QuestStorage.MakeIterator();
Quest * i;
uint32 count = 0;
string y;
string recout;
while(!itr->AtEnd())
{
i = itr->Get();
y = string(i->title);
transform(y.begin(), y.end(), y.begin(), towlower);
if(FindXinYString(x, y))
{
string questid = MyConvertIntToString(i->id);
const char * questtitle = i->title;
recout = "|cff00ccff";
recout += questid.c_str();
recout += ": ";
recout += questtitle;
recout += "n";
SendMultilineMessage(m_session, recout.c_str());
++count;
if(count == 25)
{
RedSystemMessage(m_session, "More than 25 results returned. aborting.");
break;
}
}
if(!itr->Inc())
break;
}
itr->Destruct();
if (count == 0)
{
recout = "|cff00ccffNo matches found.nn";
SendMultilineMessage(m_session, recout.c_str());
}
BlueSystemMessage(m_session, "Search completed in %u ms.", getMSTime() - t);
return true;
}
bool ChatHandler::HandleQuestStatusCommand(const char * args, WorldSession * m_session)
{
if(!*args) return false;
Player *plr = getSelectedChar(m_session, true);
if(!plr)
{
plr = m_session->GetPlayer();
SystemMessage(m_session, "Auto-targeting self.");
}
std::string recout = "|cff00ff00";
if (plr->HasFinishedQuest(atol(args)))
recout += "Player has already completed that quest.";
else
{
QuestLogEntry * IsPlrOnQuest = plr->GetQuestLogForEntry(atol(args));
if (IsPlrOnQuest)
recout += "Player is currently on that quest.";
else
recout += "Player has NOT finished that quest.";
}
recout += "nn";
SendMultilineMessage(m_session, recout.c_str());
return true;
}
bool ChatHandler::HandleQuestStartCommand(const char * args, WorldSession * m_session)
{
if(!*args) return false;
Player *plr = getSelectedChar(m_session, true);
if(!plr)
{
plr = m_session->GetPlayer();
SystemMessage(m_session, "Auto-targeting self.");
}
uint32 quest_id = atol(args);
std::string recout = "|cff00ff00";
if (plr->HasFinishedQuest(quest_id))
recout += "Player has already completed that quest.";
else
{
QuestLogEntry * IsPlrOnQuest = plr->GetQuestLogForEntry(quest_id);
if (IsPlrOnQuest)
recout += "Player is currently on that quest.";
else
{
int32 open_slot = plr->GetOpenQuestSlot();
if (open_slot == -1)
recout += "Player's quest log is full.";
else
{
Quest * qst = QuestStorage.LookupEntry(quest_id);
QuestLogEntry *qle = new QuestLogEntry();
qle->Init(qst, plr, open_slot);
qle->UpdatePlayerFields();
// If the quest should give any items on begin, give them the items.
for(uint32 i = 0; i < 4; ++i)
{
if(qst->receive_items[i])
{
Item *item = objmgr.CreateItem( qst->receive_items[i], plr);
if(!plr->GetItemInterface()->AddItemToFreeSlot(item))
{
delete item;
}
}
}
if(qst->srcitem && qst->srcitem != qst->receive_items[0])
{
Item * item = objmgr.CreateItem( qst->srcitem, plr);
if(item)
{
item->SetUInt32Value(ITEM_FIELD_STACK_COUNT, qst->srcitemcount ? qst->srcitemcount : 1);
if(!plr->GetItemInterface()->AddItemToFreeSlot(item))
delete item;
}
}
//if(qst->count_required_item || qst_giver->GetTypeId() == TYPEID_GAMEOBJECT) // gameobject quests deactivate
// plr->UpdateNearbyGameObjects();
//ScriptSystem->OnQuestEvent(qst, ((Creature*)qst_giver), _player, QUEST_EVENT_ON_ACCEPT);
sHookInterface.OnQuestAccept(plr, qst);
recout += "Quest has been added to the player's quest log.";
}
}
}
recout += "nn";
SendMultilineMessage(m_session, recout.c_str());
return true;
}
bool ChatHandler::HandleQuestFinishCommand(const char * args, WorldSession * m_session)
{
if(!*args) return false;
uint32 quest_id = atol(args);
Player *plr = getSelectedChar(m_session, true);
if(!plr)
{
plr = m_session->GetPlayer();
SystemMessage(m_session, "Auto-targeting self.");
}
std::string recout = "|cff00ff00";
if (plr->HasFinishedQuest(quest_id))
recout += "Player has already completed that quest.nn";
else
{
QuestLogEntry * IsPlrOnQuest = plr->GetQuestLogForEntry(quest_id);
if (IsPlrOnQuest)
{
std::string my_query = "SELECT id FROM gameobject_quest_starter WHERE quest = " + string(args);
QueryResult *objectResult = WorldDatabase.Query(my_query.c_str());
Quest * qst = QuestStorage.LookupEntry(quest_id);
if(objectResult)
{
Field *fields = objectResult->Fetch();
Creature *quest_giver = plr->GetMapMgr()->GetCreature(fields[0].GetUInt32());
if(quest_giver)
{
Object *qst_giver =(Object*)quest_giver;
uint32 status = sQuestMgr.CalcQuestStatus(qst_giver, plr, qst, quest_giver->GetQuestRelation(qst->id), false);
WorldPacket data;
sQuestMgr.BuildOfferReward(&data, qst, qst_giver, 1);
m_session->SendPacket(&data);
sQuestMgr.GiveQuestRewardReputation(plr, qst, qst_giver);
}
else
SystemMessage(m_session, "Unable to find quest giver object.");
}
sQuestMgr.GenerateQuestXP(plr, qst);
sQuestMgr.BuildQuestComplete(plr, qst);
IsPlrOnQuest->Finish();
recout += "Player was on that quest, but has now completed it.";
}
else
recout += "The quest has now been completed for that player.";
plr->AddToFinishedQuests(atol(args));
}
recout += "nn";
SendMultilineMessage(m_session, recout.c_str());
return true;
}
bool ChatHandler::HandleQuestItemCommand(const char * args, WorldSession * m_session)
{
if(!*args) return false;
std::string my_item_lookup = "SELECT item_id, item_count FROM gameobject_quest_item_binding WHERE quest_id = " + string(args);
QueryResult *result = WorldDatabase.Query(my_item_lookup.c_str());
std::string recout;
if(!result)
{
recout = "|cff00ccffNo matches found.nn";
SendMultilineMessage(m_session, recout.c_str());
return true;
}
recout = "|cff00ff00Quest item matches: itemid: count -> Namenn";
SendMultilineMessage(m_session, recout.c_str());
uint32 count = 0;
do
{
Field *fields = result->Fetch();
uint32 id = fields[0].GetUInt32();
string itemid = MyConvertIntToString(id);
string itemcnt = MyConvertIntToString(fields[1].GetUInt32());
ItemPrototype* tmpItem = ItemPrototypeStorage.LookupEntry(id);
recout = "|cff00ccff";
recout += itemid.c_str();
recout += ": ";
recout += itemcnt.c_str();
recout += " -> ";
recout += tmpItem->Name1;
recout += "n";
SendMultilineMessage(m_session, recout.c_str());
count++;
if(count == 25)
{
RedSystemMessage(m_session, "More than 25 results returned. aborting.");
break;
}
}while (result->NextRow());
delete result;
if (count == 0)
{
recout = "|cff00ccffNo matches found.nn";
SendMultilineMessage(m_session, recout.c_str());
}
return true;
}
bool ChatHandler::HandleQuestGiverCommand(const char * args, WorldSession * m_session)
{
if(!*args) return false;
std::string recout;
std::string my_query = "SELECT id FROM gameobject_quest_starter WHERE quest = " + string(args);
QueryResult *objectResult = WorldDatabase.Query(my_query.c_str());
string starterId;
if(objectResult)
{
Field *fields = objectResult->Fetch();
starterId = MyConvertIntToString(fields[0].GetUInt32());
}
else
{
recout = "|cff00ccffNo quest starters found.nn";
SendMultilineMessage(m_session, recout.c_str());
return true;
}
delete objectResult;
my_query = "SELECT creature_name FROM creature_names WHERE entry = " + starterId;
QueryResult *creatureResult = WorldDatabase.Query(my_query.c_str());
string starterName;
if(creatureResult)
{
Field *fields = creatureResult->Fetch();
starterName = fields[0].GetString();
}
else
{
recout = "|cff00ccffNo quest starter info found.nn";
SendMultilineMessage(m_session, recout.c_str());
return true;
}
delete creatureResult;
my_query = "SELECT id FROM creature_spawns WHERE entry = " + starterId;
QueryResult *spawnResult = WorldDatabase.Query(my_query.c_str());
string spawnId;
if(spawnResult)
{
Field *fields = spawnResult->Fetch();
spawnId = fields[0].GetString();
}
else
spawnId = "N/A";
delete spawnResult;
recout = "|cff00ccffQuest Starter/Giver found: id, spawnid, namenn";
SendMultilineMessage(m_session, recout.c_str());
recout = "|cff00ccff";
recout += starterId.c_str();
recout += ", ";
recout += spawnId.c_str();
recout += ", ";
recout += starterName.c_str();
recout += "nn";
SendMultilineMessage(m_session, recout.c_str());
return true;
}
bool ChatHandler::HandleQuestListCommand(const char * args, WorldSession * m_session)
{
string quest_giver;
if(*args)
quest_giver = string(args);
else
{
uint64 guid = m_session->GetPlayer()->GetSelection();
if (guid == 0)
{
SystemMessage(m_session, "You must target an npc or specify an id.");
return true;
}
Creature *unit = m_session->GetPlayer()->GetMapMgr()->GetCreature(guid);
if(!unit)
{
SystemMessage(m_session, "You must target an npc or specify an id.");
return true;
}
if (!unit->HasQuests())
{
SystemMessage(m_session, "NPC does not have any quests.");
return true;
}
quest_giver = MyConvertIntToString(unit->GetEntry());
}
std::string recout;
std::string my_query = "SELECT quest FROM gameobject_quest_starter WHERE id = " + quest_giver;
QueryResult *objectResult = WorldDatabase.Query(my_query.c_str());
if(!objectResult)
{
recout = "|cff00ccffNo quests found for the specified NPC id.nn";
SendMultilineMessage(m_session, recout.c_str());
return true;
}
uint32 count = 0;
recout = "|cff00ff00Quest matches: id: titlenn";
SendMultilineMessage(m_session, recout.c_str());
do
{
Field *fields = objectResult->Fetch();
uint32 quest_id = fields[0].GetUInt32();
Quest * qst = QuestStorage.LookupEntry(quest_id);
string qid = MyConvertIntToString(quest_id);
const char * qname = qst->title;
recout = "|cff00ccff";
recout += qid.c_str();
recout += ": ";
recout += qname;
recout += "n";
SendMultilineMessage(m_session, recout.c_str());
count++;
if(count == 25)
{
RedSystemMessage(m_session, "More than 25 results returned. aborting.");
break;
}
}while (objectResult->NextRow());
delete objectResult;
if (count == 0)
{
recout = "|cff00ccffNo matches found.nn";
SendMultilineMessage(m_session, recout.c_str());
}
return true;
}
bool ChatHandler::HandleQuestAddStartCommand(const char * args, WorldSession * m_session)
{
if(!*args)
return false;
uint64 guid = m_session->GetPlayer()->GetSelection();
if (guid == 0)
{
SystemMessage(m_session, "You must target an npc.");
return false;
}
Creature *unit = m_session->GetPlayer()->GetMapMgr()->GetCreature(guid);
if(!unit)
{
SystemMessage(m_session, "You must target an npc.");
return false;
}
if (!unit->isQuestGiver())
{
SystemMessage(m_session, "Unit is not a valid quest giver.");
return false;
}
uint32 quest_id = atol(args);
Quest * qst = QuestStorage.LookupEntry(quest_id);
if (qst == NULL)
{
SystemMessage(m_session, "Invalid Quest selected, unable to add quest to the specified NPC.");
return false;
}
std::string quest_giver = MyConvertIntToString(unit->GetEntry());
std::string my_query1 = "SELECT id FROM gameobject_quest_starter WHERE id = " + quest_giver + " AND quest = " + string(args);
QueryResult *selectResult1 = WorldDatabase.Query(my_query1.c_str());
if (selectResult1)
{
delete selectResult1;
SystemMessage(m_session, "Quest was already found for the specified NPC.");
}
else
{
std::string my_insert1 = "INSERT INTO gameobject_quest_starter (id, quest) VALUES (" + quest_giver + "," + string(args) + ")";
QueryResult *insertResult1 = WorldDatabase.Query(my_insert1.c_str());
if (insertResult1)
delete insertResult1;
}
std::string my_query2 = "SELECT id FROM creature_quest_starter WHERE id = " + quest_giver + " AND quest = " + string(args);
QueryResult *selectResult2 = WorldDatabase.Query(my_query2.c_str());
if (selectResult2)
delete selectResult2;
else
{
std::string my_insert2 = "INSERT INTO creature_quest_starter (id, quest) VALUES (" + quest_giver + "," + string(args) + ")";
QueryResult *insertResult2 = WorldDatabase.Query(my_insert2.c_str());
if (insertResult2)
delete insertResult2;
}
sQuestMgr.LoadExtraQuestStuff();
QuestRelation *qstrel = new QuestRelation;
qstrel->qst = qst;
qstrel->type = QUESTGIVER_QUEST_START;
uint16 qstrelid = unit->GetQuestRelation(quest_id);
unit->FindQuest(quest_id, qstrelid);
unit->AddQuest(qstrel);
unit->_LoadQuests();
const char * qname = qst->title;
std::string recout = "|cff00ff00Added Quest to NPC as starter: ";
recout += "|cff00ccff";
recout += qname;
recout += "nn";
SendMultilineMessage(m_session, recout.c_str());
return true;
}
bool ChatHandler::HandleQuestAddFinishCommand(const char * args, WorldSession * m_session)
{
if(!*args)
return false;
uint64 guid = m_session->GetPlayer()->GetSelection();
if (guid == 0)
{
SystemMessage(m_session, "You must target an npc.");
return false;
}
Creature *unit = m_session->GetPlayer()->GetMapMgr()->GetCreature(guid);
if(!unit)
{
SystemMessage(m_session, "You must target an npc.");
return false;
}
if (!unit->isQuestGiver())
{
SystemMessage(m_session, "Unit is not a valid quest giver.");
return false;
}
uint32 quest_id = atol(args);
Quest * qst = QuestStorage.LookupEntry(quest_id);
if (qst == NULL)
{
SystemMessage(m_session, "Invalid Quest selected, unable to add quest to the specified NPC.");
return false;
}
std::string quest_giver = MyConvertIntToString(unit->GetEntry());
std::string my_query1 = "SELECT id FROM gameobject_quest_finisher WHERE id = " + quest_giver + " AND quest = " + string(args);
QueryResult *selectResult1 = WorldDatabase.Query(my_query1.c_str());
if (selectResult1)
{
delete selectResult1;
SystemMessage(m_session, "Quest was already found for the specified NPC.");
}
else
{
std::string my_insert1 = "INSERT INTO gameobject_quest_finisher (id, quest) VALUES (" + quest_giver + "," + string(args) + ")";
QueryResult *insertResult1 = WorldDatabase.Query(my_insert1.c_str());
if (insertResult1)
delete insertResult1;
}
std::string my_query2 = "SELECT id FROM creature_quest_finisher WHERE id = " + quest_giver + " AND quest = " + string(args);
QueryResult *selectResult2 = WorldDatabase.Query(my_query2.c_str());
if (selectResult2)
delete selectResult2;
else
{
std:string my_insert2 = "INSERT INTO creature_quest_finisher (id, quest) VALUES (" + quest_giver + "," + string(args) + ")";
QueryResult *insertResult2 = WorldDatabase.Query(my_insert2.c_str());
if (insertResult2)
delete insertResult2;
}
sQuestMgr.LoadExtraQuestStuff();
QuestRelation *qstrel = new QuestRelation;
qstrel->qst = qst;
qstrel->type = QUESTGIVER_QUEST_END;
uint16 qstrelid = unit->GetQuestRelation(quest_id);
unit->FindQuest(quest_id, qstrelid);
unit->AddQuest(qstrel);
unit->_LoadQuests();
const char * qname = qst->title;
std::string recout = "|cff00ff00Added Quest to NPC as finisher: ";
recout += "|cff00ccff";
recout += qname;
recout += "nn";
SendMultilineMessage(m_session, recout.c_str());
return true;
}
bool ChatHandler::HandleQuestAddBothCommand(const char * args, WorldSession * m_session)
{
if(!*args)
return false;
bool bValid = ChatHandler::HandleQuestAddStartCommand(args, m_session);
if (bValid)
ChatHandler::HandleQuestAddFinishCommand(args, m_session);
return true;
}
bool ChatHandler::HandleQuestDelStartCommand(const char * args, WorldSession * m_session)
{
if(!*args)
return false;
uint64 guid = m_session->GetPlayer()->GetSelection();
if (guid == 0)
{
SystemMessage(m_session, "You must target an npc.");
return false;
}
Creature *unit = m_session->GetPlayer()->GetMapMgr()->GetCreature(guid);
if(!unit)
{
SystemMessage(m_session, "You must target an npc.");
return false;
}
if (!unit->isQuestGiver())
{
SystemMessage(m_session, "Unit is not a valid quest giver.");
return false;
}
uint32 quest_id = atol(args);
Quest * qst = QuestStorage.LookupEntry(quest_id);
if (qst == NULL)
{
SystemMessage(m_session, "Invalid Quest selected.");
return false;
}
std::string quest_giver = MyConvertIntToString(unit->GetEntry());
std::string my_query1 = "SELECT id FROM gameobject_quest_starter WHERE id = " + quest_giver + " AND quest = " + string(args);
QueryResult *selectResult1 = WorldDatabase.Query(my_query1.c_str());
if (selectResult1)
delete selectResult1;
else
{
SystemMessage(m_session, "Quest was NOT found for the specified NPC.");
return false;
}
std::string my_delete1 = "DELETE FROM gameobject_quest_starter WHERE id = " + quest_giver + " AND quest = " + string(args);
QueryResult *deleteResult1 = WorldDatabase.Query(my_delete1.c_str());
if (deleteResult1)
delete deleteResult1;
std::string my_query2 = "SELECT id FROM creature_quest_starter WHERE id = " + quest_giver + " AND quest = " + string(args);
QueryResult *selectResult2 = WorldDatabase.Query(my_query2.c_str());
if (selectResult2)
{
delete selectResult2;
std::string my_delete2 = "DELETE FROM creaure_quest_starter WHERE id = " + quest_giver + " AND quest = " + string(args);
QueryResult *deleteResult2 = WorldDatabase.Query(my_delete2.c_str());
if (deleteResult2)
delete deleteResult2;
}
sQuestMgr.LoadExtraQuestStuff();
QuestRelation *qstrel = new QuestRelation;
qstrel->qst = qst;
qstrel->type = QUESTGIVER_QUEST_START;
uint16 qstrelid = unit->GetQuestRelation(quest_id);
unit->FindQuest(quest_id, qstrelid);
unit->DeleteQuest(qstrel);
unit->_LoadQuests();
const char * qname = qst->title;
std::string recout = "|cff00ff00Deleted Quest from NPC: ";
recout += "|cff00ccff";
recout += qname;
recout += "nn";
SendMultilineMessage(m_session, recout.c_str());
return true;
}
bool ChatHandler::HandleQuestDelFinishCommand(const char * args, WorldSession * m_session)
{
if(!*args)
return false;
uint64 guid = m_session->GetPlayer()->GetSelection();
if (guid == 0)
{
SystemMessage(m_session, "You must target an npc.");
return false;
}
Creature *unit = m_session->GetPlayer()->GetMapMgr()->GetCreature(guid);
if(!unit)
{
SystemMessage(m_session, "You must target an npc.");
return false;
}
if (!unit->isQuestGiver())
{
SystemMessage(m_session, "Unit is not a valid quest giver.");
return false;
}
uint32 quest_id = atol(args);
Quest * qst = QuestStorage.LookupEntry(quest_id);
if (qst == NULL)
{
SystemMessage(m_session, "Invalid Quest selected.");
return false;
}
std::string quest_giver = MyConvertIntToString(unit->GetEntry());
std::string my_query1 = "SELECT id FROM gameobject_quest_finisher WHERE id = " + quest_giver + " AND quest = " + string(args);
QueryResult *selectResult1 = WorldDatabase.Query(my_query1.c_str());
if (selectResult1)
delete selectResult1;
else
{
SystemMessage(m_session, "Quest was NOT found for the specified NPC.");
return true;
}
std::string my_delete1 = "DELETE FROM gameobject_quest_finisher WHERE id = " + quest_giver + " AND quest = " + string(args);
QueryResult *deleteResult1 = WorldDatabase.Query(my_delete1.c_str());
if (deleteResult1)
delete deleteResult1;
std::string my_query2 = "SELECT id FROM creature_quest_finisher WHERE id = " + quest_giver + " AND quest = " + string(args);
QueryResult *selectResult2 = WorldDatabase.Query(my_query2.c_str());
if (selectResult2)
{
delete selectResult2;
std::string my_delete2 = "DELETE FROM creature_quest_finisher WHERE id = " + quest_giver + " AND quest = " + string(args);
QueryResult *deleteResult2 = WorldDatabase.Query(my_delete2.c_str());
if (deleteResult2)
delete deleteResult2;
}
sQuestMgr.LoadExtraQuestStuff();
QuestRelation *qstrel = new QuestRelation;
qstrel->qst = qst;
qstrel->type = QUESTGIVER_QUEST_END;
uint16 qstrelid = unit->GetQuestRelation(quest_id);
unit->FindQuest(quest_id, qstrelid);
unit->DeleteQuest(qstrel);
unit->_LoadQuests();
const char * qname = qst->title;
std::string recout = "|cff00ff00Deleted Quest from NPC: ";
recout += "|cff00ccff";
recout += qname;
recout += "nn";
SendMultilineMessage(m_session, recout.c_str());
return true;
}
bool ChatHandler::HandleQuestDelBothCommand(const char * args, WorldSession * m_session)
{
if(!*args)
return false;
bool bValid = ChatHandler::HandleQuestDelStartCommand(args, m_session);
if (bValid)
ChatHandler::HandleQuestDelFinishCommand(args, m_session);
return true;
}
bool ChatHandler::HandleQuestFinisherCommand(const char * args, WorldSession * m_session)
{
if(!*args) return false;
std::string recout;
std::string my_query = "SELECT id FROM gameobject_quest_finisher WHERE quest = " + string(args);
QueryResult *objectResult = WorldDatabase.Query(my_query.c_str());
string finisherId;
if(objectResult)
{
Field *fields = objectResult->Fetch();
finisherId = MyConvertIntToString(fields[0].GetUInt32());
}
else
{
recout = "|cff00ccffNo quest finishers found.nn";
SendMultilineMessage(m_session, recout.c_str());
return true;
}
delete objectResult;
my_query = "SELECT creature_name FROM creature_names WHERE entry = " + finisherId;
QueryResult *creatureResult = WorldDatabase.Query(my_query.c_str());
string finisherName;
if(creatureResult)
{
Field *fields = creatureResult->Fetch();
finisherName = fields[0].GetString();
}
else
{
recout = "|cff00ccffNo quest finisher info found.nn";
SendMultilineMessage(m_session, recout.c_str());
return true;
}
delete creatureResult;
my_query = "SELECT id FROM creature_spawns WHERE entry = " + finisherId;
QueryResult *spawnResult = WorldDatabase.Query(my_query.c_str());
string spawnId;
if(spawnResult)
{
Field *fields = spawnResult->Fetch();
spawnId = fields[0].GetString();
}
else
spawnId = "N/A";
delete spawnResult;
recout = "|cff00ccffQuest Finisher found: id, spawnid, namenn";
SendMultilineMessage(m_session, recout.c_str());
recout = "|cff00ccff";
recout += finisherId.c_str();
recout += ", ";
recout += spawnId.c_str();
recout += ", ";
recout += finisherName.c_str();
recout += "nn";
SendMultilineMessage(m_session, recout.c_str());
return true;
}
bool ChatHandler::HandleQuestSpawnCommand(const char * args, WorldSession * m_session)
{
if(!*args) return false;
std::string recout;
std::string my_query = "SELECT id FROM gameobject_quest_starter WHERE quest = " + string(args);
QueryResult *objectResult = WorldDatabase.Query(my_query.c_str());
string starterId;
if(objectResult)
{
Field *fields = objectResult->Fetch();
starterId = MyConvertIntToString(fields[0].GetUInt32());
}
else
{
recout = "|cff00ccffNo quest starters found.nn";
SendMultilineMessage(m_session, recout.c_str());
return true;
}
delete objectResult;
my_query = "SELECT creature_name FROM creature_names WHERE entry = " + starterId;
QueryResult *creatureResult = WorldDatabase.Query(my_query.c_str());
string starterName;
if(creatureResult)
{
Field *fields = creatureResult->Fetch();
starterName = fields[0].GetString();
}
else
{
recout = "|cff00ccffNo quest starter info found.nn";
SendMultilineMessage(m_session, recout.c_str());
return true;
}
delete creatureResult;
my_query = "SELECT map, x, y, z FROM creature_spawns WHERE entry = " + starterId;
QueryResult *spawnResult = WorldDatabase.Query(my_query.c_str());
if(!spawnResult)
{
recout = "|cff00ccffNo spawn location for quest starter was found.nn";
SendMultilineMessage(m_session, recout.c_str());
return true;
}
Field *fields = spawnResult->Fetch();
uint32 locmap = fields[0].GetUInt32();
float x = fields[1].GetFloat();
float y = fields[2].GetFloat();
float z = fields[3].GetFloat();
delete spawnResult;
recout = "|cff00ccffPorting to Quest Starter/Giver: id, namenn";
SendMultilineMessage(m_session, recout.c_str());
recout = "|cff00ccff";
recout += starterId.c_str();
recout += ", ";
recout += starterName.c_str();
recout += "nn";
SendMultilineMessage(m_session, recout.c_str());
m_session->GetPlayer()->SafeTeleport(locmap, 0, LocationVector(x, y, z));
return true;
}
This time I created a duplicate Ascent respository with unchanged Ascent code, applied my changes and created a fresh patch, so I changed the upload link since the original patch didn't work very well (I'm just getting used to the TortoiseSVN).