aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorVincent-Michael <Vincent_Michael@gmx.de>2015-05-02 01:27:48 +0200
committerVincent-Michael <Vincent_Michael@gmx.de>2015-05-02 01:28:18 +0200
commit2c8b7850d7aacf61c770153e8e468ae7aa847f09 (patch)
tree7b4f32bd62ae83a332d1dec8021fda472a6bd5b1 /src
parent48ee1f003347910a48183f768501c1080fc40269 (diff)
Core/Commands: Added .go quest command to teleport your character to first quest poi
Diffstat (limited to 'src')
-rw-r--r--src/server/game/Accounts/RBAC.h2
-rw-r--r--src/server/scripts/Commands/cs_go.cpp70
2 files changed, 71 insertions, 1 deletions
diff --git a/src/server/game/Accounts/RBAC.h b/src/server/game/Accounts/RBAC.h
index 2a499db8fdb..d643bdc765f 100644
--- a/src/server/game/Accounts/RBAC.h
+++ b/src/server/game/Accounts/RBAC.h
@@ -61,7 +61,7 @@ enum RBACPermissions
// 9 - reuse
RBAC_PERM_USE_CHARACTER_TEMPLATES = 10,
RBAC_PERM_LOG_GM_TRADE = 11,
- // 12 - reuse
+ RBAC_PERM_COMMAND_GO_QUEST = 12,
RBAC_PERM_SKIP_CHECK_INSTANCE_REQUIRED_BOSSES = 13,
RBAC_PERM_SKIP_CHECK_CHARACTER_CREATION_TEAMMASK = 14,
RBAC_PERM_SKIP_CHECK_CHARACTER_CREATION_CLASSMASK = 15,
diff --git a/src/server/scripts/Commands/cs_go.cpp b/src/server/scripts/Commands/cs_go.cpp
index c12c9b5d43e..08fd8b66c51 100644
--- a/src/server/scripts/Commands/cs_go.cpp
+++ b/src/server/scripts/Commands/cs_go.cpp
@@ -44,6 +44,7 @@ public:
{ "graveyard", rbac::RBAC_PERM_COMMAND_GO_GRAVEYARD, false, &HandleGoGraveyardCommand, "", NULL },
{ "grid", rbac::RBAC_PERM_COMMAND_GO_GRID, false, &HandleGoGridCommand, "", NULL },
{ "object", rbac::RBAC_PERM_COMMAND_GO_OBJECT, false, &HandleGoObjectCommand, "", NULL },
+ { "quest", rbac::RBAC_PERM_COMMAND_GO_QUEST, false, &HandleGoQuestCommand, "", NULL },
{ "taxinode", rbac::RBAC_PERM_COMMAND_GO_TAXINODE, false, &HandleGoTaxinodeCommand, "", NULL },
{ "trigger", rbac::RBAC_PERM_COMMAND_GO_TRIGGER, false, &HandleGoTriggerCommand, "", NULL },
{ "zonexy", rbac::RBAC_PERM_COMMAND_GO_ZONEXY, false, &HandleGoZoneXYCommand, "", NULL },
@@ -315,6 +316,75 @@ public:
return true;
}
+ static bool HandleGoQuestCommand(ChatHandler* handler, char const* args)
+ {
+ if (!*args)
+ return false;
+
+ Player* player = handler->GetSession()->GetPlayer();
+
+ char* id = handler->extractKeyFromLink((char*)args, "Hquest");
+ if (!id)
+ return false;
+
+ uint32 questID = atoi(id);
+ if (!questID)
+ return false;
+
+ if (!sObjectMgr->GetQuestTemplate(questID))
+ {
+ handler->PSendSysMessage(LANG_COMMAND_QUEST_NOTFOUND, questID);
+ handler->SetSentErrorMessage(true);
+ return false;
+ }
+
+ float x, y, z;
+ uint32 mapId;
+
+ if (QuestPOIVector const* poiData = sObjectMgr->GetQuestPOIVector(questID))
+ {
+ for (auto data = poiData->begin(); data != poiData->end(); ++data)
+ {
+ mapId = data->MapID;
+
+ for (auto points = data->points.begin(); points != data->points.end(); ++points)
+ {
+ x = points->X;
+ y = points->Y;
+ if (Map const* map = sMapMgr->CreateBaseMap(mapId))
+ z = std::max(map->GetHeight(x, y, MAX_HEIGHT), map->GetWaterLevel(x, y));
+ break;
+ }
+ }
+ }
+ else
+ {
+ handler->PSendSysMessage(LANG_COMMAND_QUEST_NOTFOUND, questID);
+ handler->SetSentErrorMessage(true);
+ return false;
+ }
+
+ if (!MapManager::IsValidMapCoord(mapId, x, y, z) || sObjectMgr->IsTransportMap(mapId))
+ {
+ handler->PSendSysMessage(LANG_INVALID_TARGET_COORD, x, y, mapId);
+ handler->SetSentErrorMessage(true);
+ return false;
+ }
+
+ // stop flight if need
+ if (player->IsInFlight())
+ {
+ player->GetMotionMaster()->MovementExpired();
+ player->CleanupAfterTaxiFlight();
+ }
+ // save only in non-flight case
+ else
+ player->SaveRecallPosition();
+
+ player->TeleportTo(mapId, x, y, z, 0.0f);
+ return true;
+ }
+
static bool HandleGoTaxinodeCommand(ChatHandler* handler, char const* args)
{
Player* player = handler->GetSession()->GetPlayer();