bool ChatHandler::HandleQuestLookupCommand(const char * args, WorldSession * m_session) { if(!*args) return false; string x = string(args); arcemu_TOLOWER(x); if(x.length() < 4) { RedSystemMessage(m_session, "Your search string must be at least 4 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); LocalizedQuest *li = (m_session->language>0) ? sLocalizationMgr.GetLocalizedQuest(i->id, m_session->language) : NULL; std::string liName = std::string(li ? li->Title : ""); arcemu_TOLOWER(liName); arcemu_TOLOWER(y); bool localizedFound = false; if(FindXinYString(x, liName)) localizedFound = true; if(FindXinYString(x, y) || localizedFound) { string questid = MyConvertIntToString(i->id); const char * questtitle = localizedFound ? (li ? li->Title : "") : i->title; // send quest link recout = questid.c_str(); recout += ": |cff00ccff|Hquest:"; recout += questid.c_str(); recout += ":"; recout += MyConvertIntToString(i->min_level); recout += "|h["; recout += questtitle; recout += "]|h|r"; 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.\n\n"; SendMultilineMessage(m_session, recout.c_str()); } BlueSystemMessage(m_session, "Search completed in %u ms.", getMSTime() - t); return true; }
bool ChatHandler::HandleStartCommand(const char* args, WorldSession *m_session) { std::string race; uint32 raceid = 0; GET_PLAYER(RANK_COADMIN); PVP_CHECK(RANK_ADMIN); if (plr && args && strlen(args) < 2) { raceid = plr->getRace(); switch (raceid) { case 1: race = "human"; break; case 2: race = "orc"; break; case 3: race = "dwarf"; break; case 4: race = "nightelf"; break; case 5: race = "undead"; break; case 6: race = "tauren"; break; case 7: race = "gnome"; break; case 8: race = "troll"; break; case 10: race = "bloodelf"; break; case 11: race = "draenei"; break; default: return false; break; } } else if (plr && args && strlen(args) > 2) { race = args; arcemu_TOLOWER(race); // Teleport to specific race if(race == "human") raceid = 1; else if(race == "orc") raceid = 2; else if(race == "dwarf") raceid = 3; else if(race == "nightelf") raceid = 4; else if(race == "undead") raceid = 5; else if(race == "tauren") raceid = 6; else if(race == "gnome") raceid = 7; else if(race == "troll") raceid = 8; else if(race == "bloodelf") raceid = 10; else if(race == "draenei") raceid = 11; else { RedSystemMessage(m_session, "Invalid start location! Valid locations are: human, dwarf, gnome, nightelf, draenei, orc, troll, tauren, undead, bloodelf"); return true; } } else { return false; } // Try to find a class that works PlayerCreateInfo *info = NULL; for(uint32 i=1;i<11;i++) { info = objmgr.GetPlayerCreateInfo(static_cast<uint8>( raceid ), static_cast<uint8>( i )); if(info != NULL) break; } if(info == NULL) { RedSystemMessage(m_session, "Internal error: Could not find create info."); return false; } GreenSystemMessage(m_session, "Teleporting %s to %s starting location.", plr->GetName(), race.c_str()); plr->SafeTeleport(info->mapId, 0, LocationVector(info->positionX, info->positionY, info->positionZ)); return true; }
/** Handles .lookup achievement GM achievement lookup command usage: .lookup achievement string : searches for "string" in achievement name .lookup achievement desc string : searches for "string" in achievement description .lookup achievement reward string : searches for "string" in achievement reward name .lookup achievement criteria string : searches for "string" in achievement criteria name .lookup achievement all string : searches for "string" in achievement name, description, reward, and critiera */ bool ChatHandler::HandleLookupAchievementCmd(const char* args, WorldSession* m_session) { if(!*args) return false; string x; bool lookupname = true, lookupdesc = false, lookupcriteria = false, lookupreward = false; if(strnicmp(args, "name ", 5) == 0) { x = string(args + 5); } else if(strnicmp(args, "desc ", 5) == 0) { lookupname = false; lookupdesc = true; x = string(args + 5); } else if(strnicmp(args, "criteria ", 9) == 0) { lookupname = false; lookupcriteria = true; x = string(args + 9); } else if(strnicmp(args, "reward ", 7) == 0) { lookupname = false; lookupreward = true; x = string(args + 7); } else if(strnicmp(args, "all ", 4) == 0) { lookupdesc = true; lookupcriteria = true; lookupreward = true; x = string(args + 4); } else { x = string(args); } if(x.length() < 4) { RedSystemMessage(m_session, "Your search string must be at least 4 characters long."); return true; } arcemu_TOLOWER(x); GreenSystemMessage(m_session, "Starting search of achievement `%s`...", x.c_str()); uint32 t = getMSTime(); uint32 i, j, numFound = 0; string y, recout; char playerGUID[17]; snprintf(playerGUID, 17, I64FMT, m_session->GetPlayer()->GetGUID()); if(lookupname || lookupdesc || lookupreward) { std::set<uint32> foundList; j = dbcAchievementStore.GetNumRows(); bool foundmatch; for(i = 0; i < j && numFound < 25; ++i) { AchievementEntry const* achievement = dbcAchievementStore.LookupRowForced(i); if(achievement) { if(foundList.find(achievement->ID) != foundList.end()) { // already listed this achievement (some achievements have multiple entries in dbc) continue; } foundmatch = false; if(lookupname) { y = string(achievement->name); arcemu_TOLOWER(y); foundmatch = FindXinYString(x, y); } if(!foundmatch && lookupdesc) { y = string(achievement->description); arcemu_TOLOWER(y); foundmatch = FindXinYString(x, y); } if(!foundmatch && lookupreward) { y = string(achievement->rewardName); arcemu_TOLOWER(y); foundmatch = FindXinYString(x, y); } if(!foundmatch) { continue; } foundList.insert(achievement->ID); std::stringstream strm; strm << achievement->ID; // create achievement link recout = "|cffffffffAchievement "; recout += strm.str(); recout += ": |cfffff000|Hachievement:"; recout += strm.str(); recout += ":"; recout += (const char*)playerGUID; time_t completetime = m_session->GetPlayer()->GetAchievementMgr().GetCompletedTime(achievement); if(completetime) { // achievement is completed struct tm* ct; ct = localtime(&completetime); strm.str(""); strm << ":1:" << ct->tm_mon + 1 << ":" << ct->tm_mday << ":" << ct->tm_year - 100 << ":-1:-1:-1:-1|h["; recout += strm.str(); } else { // achievement is not completed recout += ":0:0:0:-1:0:0:0:0|h["; } recout += achievement->name; if(!lookupreward) { recout += "]|h|r"; } else { recout += "]|h |cffffffff"; recout += achievement->rewardName; recout += "|r"; } strm.str(""); SendMultilineMessage(m_session, recout.c_str()); if(++numFound >= 25) { RedSystemMessage(m_session, "More than 25 results found."); break; } } } // for loop (number of rows, up to 25) } // lookup name or description if(lookupcriteria && numFound < 25) { std::set<uint32> foundList; j = dbcAchievementCriteriaStore.GetNumRows(); for(i = 0; i < j && numFound < 25; ++i) { AchievementCriteriaEntry const* criteria = dbcAchievementCriteriaStore.LookupRowForced(i); if(criteria) { if(foundList.find(criteria->ID) != foundList.end()) { // already listed this achievement (some achievements have multiple entries in dbc) continue; } y = string(criteria->name); arcemu_TOLOWER(y); if(!FindXinYString(x, y)) { continue; } foundList.insert(criteria->ID); std::stringstream strm; strm << criteria->ID; recout = "|cffffffffCriteria "; recout += strm.str(); recout += ": |cfffff000"; recout += criteria->name; strm.str(""); AchievementEntry const* achievement = dbcAchievementStore.LookupEntryForced(criteria->referredAchievement); if(achievement) { // create achievement link recout += " |cffffffffAchievement "; strm << achievement->ID; recout += strm.str(); recout += ": |cfffff000|Hachievement:"; recout += strm.str(); recout += ":"; recout += (const char*)playerGUID; time_t completetime = m_session->GetPlayer()->GetAchievementMgr().GetCompletedTime(achievement); if(completetime) { // achievement is completed struct tm* ct; ct = localtime(&completetime); strm.str(""); strm << ":1:" << ct->tm_mon + 1 << ":" << ct->tm_mday << ":" << ct->tm_year - 100 << ":-1:-1:-1:-1|h["; recout += strm.str(); } else { // achievement is not completed recout += ":0:0:0:-1:0:0:0:0|h["; } recout += achievement->name; if(!lookupreward) { recout += "]|h|r"; } else { recout += "]|h |cffffffff"; recout += achievement->rewardName; recout += "|r"; } strm.str(""); } SendMultilineMessage(m_session, recout.c_str()); if(++numFound >= 25) { RedSystemMessage(m_session, "More than 25 results found."); break; } } } // for loop (number of rows, up to 25) } // lookup criteria if(numFound == 0) { recout = "|cff00ccffNo matches found."; SendMultilineMessage(m_session, recout.c_str()); } BlueSystemMessage(m_session, "Search completed in %u ms.", getMSTime() - t); return true; }