[Release] Custom Quest Commands/Subcommands menu

User Tag List

Results 1 to 10 of 10
  1. #1
    wowcomputer's Avatar Member
    Reputation
    28
    Join Date
    Aug 2007
    Posts
    53
    Thanks G/R
    0/0
    Trade Feedback
    0 (0%)
    Mentioned
    0 Post(s)
    Tagged
    0 Thread(s)

    [Release] Custom Quest Commands/Subcommands

    I created QuestCommands.cpp

    I placed this in the same folder as RecallCommands.cpp (Ascent\Src\Game) and in the same filter for the Chat Handler.

    The patch file contains changes to Chat.cpp, Chat.h and game.vcproj as well as the QuestCommands.cpp.

    Edit: this is NOT the original upload file: (updated link 2007/08/16 - 9:23pm)

    Filebeam - Free Fast File Hosting

    It implements these commands:

    .lookupquest (string) -> Looks up quest string x
    .quest lookup (string) -> Looks up quest string x
    .quest status (id) -> Lists the status of quest <id>
    .quest addstart (id) -> Add quest <id> to the targeted NPC as starter
    .quest addfinish (id) -> Add quest <id> to the targeted NPC as finisher
    .quest addboth (id) -> Add quest <id> to the targeted NPC as start & finish
    .quest delstart (id) -> Delete quest <id> from the targeted NPC as starter
    .quest delfinish (id) -> Delete quest <id> from the targeted NPC as finisher
    .quest delboth (id) -> Delete quest <id> from the targeted NPC as start & finish
    .quest start (id) -> Starts quest <id>
    .quest finish (id) -> Finishes quest <id>
    .quest done (id) -> Completes quest <id>
    .quest item (id) -> Lookup itemid needed for quest <id>
    .quest giver (id) -> Lookup quest giver for quest <id>
    .quest finisher (id) -> Lookup quest finisher for quest <id>
    .quest spawn (id) -> Port to spawn location for quest <id>
    .quest list -> Lists the quests for the npc <id>

    QuestCommands.cpp

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

    The post was getting too long with the QuestCommands.cpp, so I had to remove the Chat.cpp and Chat.h files.

    When I re-compiled and tested the commands they worked as intended when applied against a clean (ie. reverted Ascent SVN).

    Sorry if anyone tried to download and apply the original combination of patches, this should work.
    Last edited by wowcomputer; 12-28-2007 at 08:02 PM.

    [Release] Custom Quest Commands/Subcommands
  2. #2
    Steph's Avatar Member
    Reputation
    166
    Join Date
    Dec 2007
    Posts
    695
    Thanks G/R
    0/0
    Trade Feedback
    0 (0%)
    Mentioned
    0 Post(s)
    Tagged
    0 Thread(s)
    Wow :O
    <Filler>

  3. #3
    Cursed's Avatar Contributor
    Reputation
    270
    Join Date
    Jun 2007
    Posts
    1,380
    Thanks G/R
    0/0
    Trade Feedback
    0 (0%)
    Mentioned
    0 Post(s)
    Tagged
    0 Thread(s)
    Saw it on ascentemu.com few days ago. Another copy&pasta of wowcomputer

    Link: Thread he copied

  4. #4
    knaur's Avatar Elite User
    Reputation
    400
    Join Date
    Nov 2007
    Posts
    634
    Thanks G/R
    0/0
    Trade Feedback
    0 (0%)
    Mentioned
    0 Post(s)
    Tagged
    0 Thread(s)
    i sent a message to the real creator of this release.
    he will be happy to see that other tryes to steal credits for hes work hehe
    ------------------------------------------------------
    Knaur - Founder of The Norwegian Elite Team

  5. #5
    King Shaun's Avatar Member
    Reputation
    419
    Join Date
    Dec 2007
    Posts
    1,305
    Thanks G/R
    0/0
    Trade Feedback
    0 (0%)
    Mentioned
    0 Post(s)
    Tagged
    0 Thread(s)
    Hehe, good one!


    Threads of the Week: [Errage] [Blizzard] [Rapidshare]

  6. #6
    Le Froid's Avatar Contributor
    Reputation
    172
    Join Date
    Mar 2007
    Posts
    1,327
    Thanks G/R
    0/0
    Trade Feedback
    0 (0%)
    Mentioned
    0 Post(s)
    Tagged
    0 Thread(s)
    This was
    1) repost
    2) copy paste
    3) ALREADY ADDED TO CORE!!

  7. #7
    King Shaun's Avatar Member
    Reputation
    419
    Join Date
    Dec 2007
    Posts
    1,305
    Thanks G/R
    0/0
    Trade Feedback
    0 (0%)
    Mentioned
    0 Post(s)
    Tagged
    0 Thread(s)
    Uhmm, you don't half get some idiots these days! Here is some advice wowcomputer..

    Don't post again if you copy off others and say it is yours!


    Threads of the Week: [Errage] [Blizzard] [Rapidshare]

  8. #8
    Illidan1's Avatar Banned
    Reputation
    244
    Join Date
    Jul 2007
    Posts
    2,251
    Thanks G/R
    0/1
    Trade Feedback
    0 (0%)
    Mentioned
    0 Post(s)
    Tagged
    0 Thread(s)
    Indeed, all you are doing is Copying Stuff from other Sites so Gtfo, or Stop reposting
    Last edited by Illidan1; 12-29-2007 at 05:34 PM.

  9. #9
    Le Froid's Avatar Contributor
    Reputation
    172
    Join Date
    Mar 2007
    Posts
    1,327
    Thanks G/R
    0/0
    Trade Feedback
    0 (0%)
    Mentioned
    0 Post(s)
    Tagged
    0 Thread(s)
    Lol something copy pasted AND added to the core that YOU posted here makes everyone a "stupid retard"

    edit: and possibly if these werent reposts AND if you gave credit you would be respected

    You said in your other post you don't take credit...look at this
    Originally Posted by a_retard
    I created QuestCommands.cpp
    Last edited by Le Froid; 12-29-2007 at 05:41 PM.

  10. #10
    Illidan1's Avatar Banned
    Reputation
    244
    Join Date
    Jul 2007
    Posts
    2,251
    Thanks G/R
    0/1
    Trade Feedback
    0 (0%)
    Mentioned
    0 Post(s)
    Tagged
    0 Thread(s)
    Also you did not give ANy Credit to the Owner, this has been Posted here on MMOwned
    and alot of your other REPOST! (do you know what that means?), It means that it
    has been Posted and we do not wont more of the Same post to increase the Forums latency

Similar Threads

  1. Release: Custom Battle Front Zone! Quests, Items, Epic Warfare, and More!
    By freeride474 in forum WoW EMU General Releases
    Replies: 21
    Last Post: 10-09-2008, 04:35 PM
  2. Custom Quests
    By TheLoneWolf in forum WoW EMU Guides & Tutorials
    Replies: 8
    Last Post: 01-10-2008, 04:58 PM
  3. [Release] Custom 25 Man Raid Boss / Quest.
    By Drop_Warcrack in forum World of Warcraft Emulator Servers
    Replies: 15
    Last Post: 01-03-2008, 08:00 AM
  4. Replies: 0
    Last Post: 11-20-2007, 10:42 PM
  5. Custom quest creator!
    By Relentlesserv in forum World of Warcraft Emulator Servers
    Replies: 13
    Last Post: 10-31-2007, 08:15 PM
All times are GMT -5. The time now is 09:38 AM. Powered by vBulletin® Version 4.2.3
Copyright © 2024 vBulletin Solutions, Inc. All rights reserved. User Alert System provided by Advanced User Tagging (Pro) - vBulletin Mods & Addons Copyright © 2024 DragonByte Technologies Ltd.
Digital Point modules: Sphinx-based search