diff options
author | Vincent-Michael <Vincent_Michael@gmx.de> | 2015-05-02 01:27:48 +0200 |
---|---|---|
committer | Vincent-Michael <Vincent_Michael@gmx.de> | 2015-05-02 01:28:18 +0200 |
commit | 2c8b7850d7aacf61c770153e8e468ae7aa847f09 (patch) | |
tree | 7b4f32bd62ae83a332d1dec8021fda472a6bd5b1 /src | |
parent | 48ee1f003347910a48183f768501c1080fc40269 (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.h | 2 | ||||
-rw-r--r-- | src/server/scripts/Commands/cs_go.cpp | 70 |
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(); |