aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--sql/updates/auth/2015_05_02_00_auth.sql7
-rw-r--r--sql/updates/world/2015_05_02_00_world.sql3
-rw-r--r--src/server/game/Accounts/RBAC.h2
-rw-r--r--src/server/scripts/Commands/cs_go.cpp70
4 files changed, 81 insertions, 1 deletions
diff --git a/sql/updates/auth/2015_05_02_00_auth.sql b/sql/updates/auth/2015_05_02_00_auth.sql
new file mode 100644
index 00000000000..08b574a9068
--- /dev/null
+++ b/sql/updates/auth/2015_05_02_00_auth.sql
@@ -0,0 +1,7 @@
+DELETE FROM `rbac_permissions` WHERE `id`=12;
+INSERT INTO `rbac_permissions` (`id`, `name`) VALUES
+(12, 'Command: go quest');
+
+DELETE FROM `rbac_linked_permissions` WHERE `linkedId`=12;
+INSERT INTO `rbac_linked_permissions` (`id`, `linkedId`) VALUES
+(198, 12);
diff --git a/sql/updates/world/2015_05_02_00_world.sql b/sql/updates/world/2015_05_02_00_world.sql
new file mode 100644
index 00000000000..3d4e830f086
--- /dev/null
+++ b/sql/updates/world/2015_05_02_00_world.sql
@@ -0,0 +1,3 @@
+DELETE FROM `command` WHERE `name` LIKE '%go quest%';
+INSERT INTO `command` (`name`, `permission`, `help`) VALUES
+('go quest', 12, 'Syntax: .go quest #quest_id\r\n\r\nTeleport your character to first quest poi with id #quest_id.');
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();