Beispiel #1
0
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;
}
Beispiel #2
0
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;
}
Beispiel #3
0
/**
	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;
}