static bool HandleGoTriggerCommand(ChatHandler* handler, char const* args) { Player* player = handler->GetSession()->GetPlayer(); if (!*args) return false; char* id = strtok((char*)args, " "); if (!id) return false; int32 areaTriggerId = atoi(id); if (!areaTriggerId) return false; AreaTriggerEntry const* at = sAreaTriggerStore.LookupEntry(areaTriggerId); if (!at) { handler->PSendSysMessage(LANG_COMMAND_GOAREATRNOTFOUND, areaTriggerId); handler->SetSentErrorMessage(true); return false; } if (!MapManager::IsValidMapCoord(at->mapid, at->x, at->y, at->z)) { handler->PSendSysMessage(LANG_INVALID_TARGET_COORD, at->x, at->y, at->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(at->mapid, at->x, at->y, at->z, player->GetOrientation()); return true; }
static bool HandleGoGraveyardCommand(ChatHandler* handler, char const* args) { Player* player = handler->GetSession()->GetPlayer(); if (!*args) return false; char* gyId = strtok((char*)args, " "); if (!gyId) return false; int32 graveyardId = atoi(gyId); if (!graveyardId) return false; WorldSafeLocsEntry const* gy = sWorldSafeLocsStore.LookupEntry(graveyardId); if (!gy) { handler->PSendSysMessage(LANG_COMMAND_GRAVEYARDNOEXIST, graveyardId); handler->SetSentErrorMessage(true); return false; } if (!MapManager::IsValidMapCoord(gy->map_id, gy->x, gy->y, gy->z)) { handler->PSendSysMessage(LANG_INVALID_TARGET_COORD, gy->x, gy->y, gy->map_id); 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(gy->map_id, gy->x, gy->y, gy->z, player->GetOrientation()); return true; }
static bool HandleGoTaxinodeCommand(ChatHandler* handler, char const* args) { Player* player = handler->GetSession()->GetPlayer(); if (!*args) return false; char* id = handler->extractKeyFromLink((char*)args, "Htaxinode"); if (!id) return false; int32 nodeId = atoi(id); if (!nodeId) return false; TaxiNodesEntry const* node = sTaxiNodesStore.LookupEntry(nodeId); if (!node) { handler->PSendSysMessage(LANG_COMMAND_GOTAXINODENOTFOUND, nodeId); handler->SetSentErrorMessage(true); return false; } if ((node->x == 0.0f && node->y == 0.0f && node->z == 0.0f) || !MapManager::IsValidMapCoord(node->map_id, node->x, node->y, node->z)) { handler->PSendSysMessage(LANG_INVALID_TARGET_COORD, node->x, node->y, node->map_id); 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(node->map_id, node->x, node->y, node->z, player->GetOrientation()); return true; }
//teleport to grid static bool HandleGoGridCommand(ChatHandler* handler, char const* args) { if (!*args) return false; Player* player = handler->GetSession()->GetPlayer(); char* gridX = strtok((char*)args, " "); char* gridY = strtok(NULL, " "); char* id = strtok(NULL, " "); if (!gridX || !gridY) return false; uint32 mapId = id ? (uint32)atoi(id) : player->GetMapId(); // center of grid float x = ((float)atof(gridX) - CENTER_GRID_ID + 0.5f) * SIZE_OF_GRIDS; float y = ((float)atof(gridY) - CENTER_GRID_ID + 0.5f) * SIZE_OF_GRIDS; if (!MapManager::IsValidMapCoord(mapId, x, y)) { 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(); Map const* map = sMapMgr->CreateBaseMap(mapId); float z = std::max(map->GetHeight(x, y, MAX_HEIGHT), map->GetWaterLevel(x, y)); player->TeleportTo(mapId, x, y, z, player->GetOrientation()); return true; }
// teleport player to given game_tele.entry static bool HandleTeleNameCommand(ChatHandler* handler, const char* args) { char* nameStr; char* teleStr; handler->extractOptFirstArg((char*)args, &nameStr, &teleStr); if (!teleStr) return false; Player* target; uint64 target_guid; std::string target_name; if (!handler->extractPlayerTarget(nameStr, &target, &target_guid, &target_name)) return false; // id, or string, or [name] Shift-click form |color|Htele:id|h[name]|h|r GameTele const* tele = handler->extractGameTeleFromLink(teleStr); if (!tele) { handler->SendSysMessage(LANG_COMMAND_TELE_NOTFOUND); handler->SetSentErrorMessage(true); return false; } if (target) { // check online security if (handler->HasLowerSecurity(target, 0)) return false; std::string chrNameLink = handler->playerLink(target_name); if (target->IsBeingTeleported() == true) { handler->PSendSysMessage(LANG_IS_TELEPORTED, chrNameLink.c_str()); handler->SetSentErrorMessage(true); return false; } handler->PSendSysMessage(LANG_TELEPORTING_TO, chrNameLink.c_str(), "", tele->name.c_str()); if (handler->needReportToTarget(target)) (ChatHandler(target)).PSendSysMessage(LANG_TELEPORTED_TO_BY, handler->GetNameLink().c_str()); // stop flight if need if (target->isInFlight()) { target->GetMotionMaster()->MovementExpired(); target->CleanupAfterTaxiFlight(); } // save only in non-flight case else target->SaveRecallPosition(); target->TeleportTo(tele->mapId, tele->position_x, tele->position_y, tele->position_z, tele->orientation); } else { // check offline security if (handler->HasLowerSecurity(NULL, target_guid)) return false; std::string nameLink = handler->playerLink(target_name); handler->PSendSysMessage(LANG_TELEPORTING_TO, nameLink.c_str(), handler->GetTrinityString(LANG_OFFLINE), tele->name.c_str()); Player::SavePositionInDB(tele->mapId, tele->position_x, tele->position_y, tele->position_z, tele->orientation, sMapMgr->GetZoneId(tele->mapId, tele->position_x, tele->position_y, tele->position_z), target_guid); } return true; }
//teleport to creature static bool HandleGoCreatureCommand(ChatHandler* handler, char const* args) { if (!*args) return false; Player* player = handler->GetSession()->GetPlayer(); // "id" or number or [name] Shift-click form |color|Hcreature_entry:creature_id|h[name]|h|r char* param1 = handler->extractKeyFromLink((char*)args, "Hcreature"); if (!param1) return false; std::ostringstream whereClause; // User wants to teleport to the NPC's template entry if (strcmp(param1, "id") == 0) { // Get the "creature_template.entry" // number or [name] Shift-click form |color|Hcreature_entry:creature_id|h[name]|h|r char* tail = strtok(NULL, ""); if (!tail) return false; char* id = handler->extractKeyFromLink(tail, "Hcreature_entry"); if (!id) return false; int32 entry = atoi(id); if (!entry) return false; whereClause << "WHERE id = '" << entry << '\''; } else { int32 guid = atoi(param1); // Number is invalid - maybe the user specified the mob's name if (!guid) { std::string name = param1; WorldDatabase.EscapeString(name); whereClause << ", creature_template WHERE creature.id = creature_template.entry AND creature_template.name LIKE '" << name << '\''; } else whereClause << "WHERE guid = '" << guid << '\''; } QueryResult result = WorldDatabase.PQuery("SELECT position_x, position_y, position_z, orientation, map, guid, id FROM creature %s", whereClause.str().c_str()); if (!result) { handler->SendSysMessage(LANG_COMMAND_GOCREATNOTFOUND); handler->SetSentErrorMessage(true); return false; } if (result->GetRowCount() > 1) handler->SendSysMessage(LANG_COMMAND_GOCREATMULTIPLE); Field* fields = result->Fetch(); float x = fields[0].GetFloat(); float y = fields[1].GetFloat(); float z = fields[2].GetFloat(); float ort = fields[3].GetFloat(); int mapId = fields[4].GetUInt16(); uint32 guid = fields[5].GetUInt32(); uint32 id = fields[6].GetUInt32(); // if creature is in same map with caster go at its current location if (Creature* creature = sObjectAccessor->GetCreature(*player, MAKE_NEW_GUID(guid, id, HIGHGUID_UNIT))) { x = creature->GetPositionX(); y = creature->GetPositionY(); z = creature->GetPositionZ(); ort = creature->GetOrientation(); } if (!MapManager::IsValidMapCoord(mapId, x, y, z, ort)) { 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, ort); return true; }
//teleport at coordinates static bool HandleGoZoneXYCommand(ChatHandler* handler, char const* args) { if (!*args) return false; Player* player = handler->GetSession()->GetPlayer(); char* zoneX = strtok((char*)args, " "); char* zoneY = strtok(NULL, " "); char* tail = strtok(NULL, ""); char* id = handler->extractKeyFromLink(tail, "Harea"); // string or [name] Shift-click form |color|Harea:area_id|h[name]|h|r if (!zoneX || !zoneY) return false; float x = (float)atof(zoneX); float y = (float)atof(zoneY); // prevent accept wrong numeric args if ((x == 0.0f && *zoneX != '0') || (y == 0.0f && *zoneY != '0')) return false; uint32 areaId = id ? (uint32)atoi(id) : player->GetZoneId(); AreaTableEntry const* areaEntry = GetAreaEntryByAreaID(areaId); if (x < 0 || x > 100 || y < 0 || y > 100 || !areaEntry) { handler->PSendSysMessage(LANG_INVALID_ZONE_COORD, x, y, areaId); handler->SetSentErrorMessage(true); return false; } // update to parent zone if exist (client map show only zones without parents) AreaTableEntry const* zoneEntry = areaEntry->zone ? GetAreaEntryByAreaID(areaEntry->zone) : areaEntry; Map const* map = sMapMgr->CreateBaseMap(zoneEntry->mapid); if (map->Instanceable()) { handler->PSendSysMessage(LANG_INVALID_ZONE_MAP, areaEntry->ID, areaEntry->area_name, map->GetId(), map->GetMapName()); handler->SetSentErrorMessage(true); return false; } Zone2MapCoordinates(x, y, zoneEntry->ID); if (!MapManager::IsValidMapCoord(zoneEntry->mapid, x, y)) { handler->PSendSysMessage(LANG_INVALID_TARGET_COORD, x, y, zoneEntry->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(); float z = std::max(map->GetHeight(x, y, MAX_HEIGHT), map->GetWaterLevel(x, y)); player->TeleportTo(zoneEntry->mapid, x, y, z, player->GetOrientation()); return true; }
// Summon group of player static bool HandleGroupSummonCommand(ChatHandler* handler, char const* args) { Player* target; if (!handler->extractPlayerTarget((char*)args, &target)) return false; // check online security if (handler->HasLowerSecurity(target, 0)) return false; Group* group = target->GetGroup(); std::string nameLink = handler->GetNameLink(target); if (!group) { handler->PSendSysMessage(LANG_NOT_IN_GROUP, nameLink.c_str()); handler->SetSentErrorMessage(true); return false; } Player* gmPlayer = handler->GetSession()->GetPlayer(); Group* gmGroup = gmPlayer->GetGroup(); Map* gmMap = gmPlayer->GetMap(); bool toInstance = gmMap->Instanceable(); // we are in instance, and can summon only player in our group with us as lead if (toInstance && ( !gmGroup || group->GetLeaderGUID() != gmPlayer->GetGUID() || gmGroup->GetLeaderGUID() != gmPlayer->GetGUID())) // the last check is a bit excessive, but let it be, just in case { handler->SendSysMessage(LANG_CANNOT_SUMMON_TO_INST); handler->SetSentErrorMessage(true); return false; } for (GroupReference* itr = group->GetFirstMember(); itr != NULL; itr = itr->next()) { Player* player = itr->GetSource(); if (!player || player == gmPlayer || !player->GetSession()) continue; // check online security if (handler->HasLowerSecurity(player, 0)) return false; std::string plNameLink = handler->GetNameLink(player); if (player->IsBeingTeleported()) { handler->PSendSysMessage(LANG_IS_TELEPORTED, plNameLink.c_str()); handler->SetSentErrorMessage(true); return false; } if (toInstance) { Map* playerMap = player->GetMap(); if (playerMap->Instanceable() && playerMap->GetInstanceId() != gmMap->GetInstanceId()) { // cannot summon from instance to instance handler->PSendSysMessage(LANG_CANNOT_SUMMON_TO_INST, plNameLink.c_str()); handler->SetSentErrorMessage(true); return false; } } handler->PSendSysMessage(LANG_SUMMONING, plNameLink.c_str(), ""); if (handler->needReportToTarget(player)) ChatHandler(player->GetSession()).PSendSysMessage(LANG_SUMMONED_BY, handler->GetNameLink().c_str()); // stop flight if need if (player->IsInFlight()) { player->GetMotionMaster()->MovementExpired(); player->CleanupAfterTaxiFlight(); } // save only in non-flight case else player->SaveRecallPosition(); // before GM float x, y, z; gmPlayer->GetClosePoint(x, y, z, player->GetObjectSize()); player->TeleportTo(gmPlayer->GetMapId(), x, y, z, player->GetOrientation()); } return true; }
// teleport player to given game_tele.entry static bool HandleTeleNameCommand(ChatHandler* handler, const char* args) { char* nameStr; char* teleStr; handler->extractOptFirstArg((char*)args, &nameStr, &teleStr); if (!teleStr) return false; Player* target; uint64 target_guid; std::string target_name; if (!handler->extractPlayerTarget(nameStr, &target, &target_guid, &target_name)) return false; if (strcmp(teleStr, "$home") == 0) // References target's homebind { if (target) target->TeleportTo(target->m_homebindMapId, target->m_homebindX, target->m_homebindY, target->m_homebindZ, target->GetOrientation()); else { PreparedStatement* stmt = CharacterDatabase.GetPreparedStatement(CHAR_SEL_CHAR_HOMEBIND); stmt->setUInt32(0, target_guid); PreparedQueryResult resultDB = CharacterDatabase.Query(stmt); if (resultDB) { Field* fieldsDB = resultDB->Fetch(); uint32 mapId = fieldsDB[0].GetUInt16(); uint32 zoneId = fieldsDB[1].GetUInt16(); float posX = fieldsDB[2].GetFloat(); float posY = fieldsDB[3].GetFloat(); float posZ = fieldsDB[4].GetFloat(); Player::SavePositionInDB(mapId, posX, posY, posZ, 0, zoneId, target_guid); } } return true; } // id, or string, or [name] Shift-click form |color|Htele:id|h[name]|h|r GameTele const* tele = handler->extractGameTeleFromLink(teleStr); if (!tele) { handler->SendSysMessage(LANG_COMMAND_TELE_NOTFOUND); handler->SetSentErrorMessage(true); return false; } if (target) { // check online security if (handler->HasLowerSecurity(target, 0)) return false; std::string chrNameLink = handler->playerLink(target_name); if (target->IsBeingTeleported() == true) { handler->PSendSysMessage(LANG_IS_TELEPORTED, chrNameLink.c_str()); handler->SetSentErrorMessage(true); return false; } handler->PSendSysMessage(LANG_TELEPORTING_TO, chrNameLink.c_str(), "", tele->name.c_str()); if (handler->needReportToTarget(target)) (ChatHandler(target)).PSendSysMessage(LANG_TELEPORTED_TO_BY, handler->GetNameLink().c_str()); // stop flight if need if (target->isInFlight()) { target->GetMotionMaster()->MovementExpired(); target->CleanupAfterTaxiFlight(); } // save only in non-flight case else target->SaveRecallPosition(); target->TeleportTo(tele->mapId, tele->position_x, tele->position_y, tele->position_z, tele->orientation); } else { // check offline security if (handler->HasLowerSecurity(NULL, target_guid)) return false; std::string nameLink = handler->playerLink(target_name); handler->PSendSysMessage(LANG_TELEPORTING_TO, nameLink.c_str(), handler->GetTrinityString(LANG_OFFLINE), tele->name.c_str()); Player::SavePositionInDB(tele->mapId, tele->position_x, tele->position_y, tele->position_z, tele->orientation, sMapMgr->GetZoneId(tele->mapId, tele->position_x, tele->position_y, tele->position_z), target_guid); } return true; }
static bool HandleSpectateCommand(ChatHandler* handler, char const* args) { Player* target; ObjectGuid target_guid; std::string target_name; if (!handler->extractPlayerTarget((char*)args, &target, &target_guid, &target_name)) return false; Player* player = handler->GetSession()->GetPlayer(); if (target == player || target_guid == player->GetGUID()) { handler->PSendSysMessage("Вы не можете смотреть на себя."); handler->SetSentErrorMessage(true); return false; } if (player->IsInCombat()) { handler->PSendSysMessage("Вы находитесь в Бою."); handler->SetSentErrorMessage(true); return false; } if (!target) { handler->PSendSysMessage("Цель не существует."); handler->SetSentErrorMessage(true); return false; } if (player->IsMounted()) { handler->PSendSysMessage("Не можете смотреть сидя верхом."); handler->SetSentErrorMessage(true); return false; } if (target && (target->HasAura(ARENA_PREPARATION) || target->HasAura(ARENA_PREPARATION_2))) { handler->PSendSysMessage("Не могу этого сделать. Арена не началась."); handler->SetSentErrorMessage(true); return false; } if (player->GetPet()) { handler->PSendSysMessage("Вы должны скрыть своего питомца."); handler->SetSentErrorMessage(true); return false; } if (player->GetMap()->IsBattlegroundOrArena() && !player->isSpectator()) { handler->PSendSysMessage("Вы уже находитесь на поле битвы или арене."); handler->SetSentErrorMessage(true); return false; } Map* map = target->GetMap(); if (!map->IsBattleArena()) { handler->PSendSysMessage("Игрок не на арене."); handler->SetSentErrorMessage(true); return false; } if (player->GetMap()->IsBattleground()) { handler->PSendSysMessage("Не могу сделать это, в то время как вы находитесь на поле боя."); handler->SetSentErrorMessage(true); return false; } // all's well, set bg id // when porting out from the bg, it will be reset to 0 player->SetBattlegroundId(target->GetBattlegroundId(), target->GetBattlegroundTypeId()); // remember current position as entry point for return at bg end teleportation if (!player->GetMap()->IsBattlegroundOrArena()) player->SetBattlegroundEntryPoint(); if (target->isSpectator()) { handler->PSendSysMessage("Не могу сделать этого. Ваша цель - зритель."); 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(); // search for two teams Battleground *bGround = target->GetBattleground(); if (bGround->isRated()) { uint32 slot = bGround->GetArenaType() - 2; if (bGround->GetArenaType() > 3) slot = 2; uint32 firstTeamID = target->GetArenaTeamId(slot); uint32 secondTeamID = 0; Player *firstTeamMember = target; Player *secondTeamMember = NULL; for (Battleground::BattlegroundPlayerMap::const_iterator itr = bGround->GetPlayers().begin(); itr != bGround->GetPlayers().end(); ++itr) if (Player* tmpPlayer = ObjectAccessor::FindPlayer(itr->first)) { if (tmpPlayer->isSpectator()) continue; uint32 tmpID = tmpPlayer->GetArenaTeamId(slot); if (tmpID != firstTeamID && tmpID > 0) { secondTeamID = tmpID; secondTeamMember = tmpPlayer; break; } } if (firstTeamID > 0 && secondTeamID > 0 && secondTeamMember) { ArenaTeam *firstTeam = sArenaTeamMgr->GetArenaTeamById(firstTeamID); ArenaTeam *secondTeam = sArenaTeamMgr->GetArenaTeamById(secondTeamID); if (firstTeam && secondTeam) { handler->PSendSysMessage("Вы вошли на Арену."); handler->PSendSysMessage("Команды:"); handler->PSendSysMessage("%s - %s", firstTeam->GetName().c_str(), secondTeam->GetName().c_str()); handler->PSendSysMessage("%u(%u) - %u(%u)", firstTeam->GetRating(), firstTeam->GetAverageMMR(firstTeamMember->GetGroup()), secondTeam->GetRating(), secondTeam->GetAverageMMR(secondTeamMember->GetGroup())); } } } // to point to see at target with same orientation float x, y, z; target->GetContactPoint(player, x, y, z); player->TeleportTo(target->GetMapId(), x, y, z, player->GetAngle(target), TELE_TO_GM_MODE); player->SetPhaseMask(target->GetPhaseMask(), true); player->SetSpectate(true); target->GetBattleground()->AddSpectator(player->GetGUID()); return true; }
static bool HandleSpectateCommand(ChatHandler* handler, char const* args) { Player* target; ObjectGuid target_guid; std::string target_name; if (!handler->extractPlayerTarget((char*)args, &target, &target_guid, &target_name)) return false; Player* player = handler->GetSession()->GetPlayer(); if (target == player || target_guid == player->GetGUID()) { handler->PSendSysMessage("你不能观察你自己."); handler->SetSentErrorMessage(true); return false; } if (player->IsInCombat()) { handler->PSendSysMessage("你在战斗状态."); handler->SetSentErrorMessage(true); return false; } if (!target) { handler->PSendSysMessage("目标不在线或不存在."); handler->SetSentErrorMessage(true); return false; } if (player->GetPet()) { handler->PSendSysMessage("你必须先解散你的宠物."); handler->SetSentErrorMessage(true); return false; } if (player->GetMap()->IsBattlegroundOrArena() && !player->IsSpectator()) { handler->PSendSysMessage("你已经在战场或者竞技场了."); handler->SetSentErrorMessage(true); return false; } Map* cMap = target->GetMap(); if (!cMap->IsBattleArena()) { handler->PSendSysMessage("玩家还不在竞技场里."); handler->SetSentErrorMessage(true); return false; } if (player->GetMap()->IsBattleground()) { handler->PSendSysMessage("你在战场里不能同时观察."); handler->SetSentErrorMessage(true); return false; } if (target->HasAura(32728) || target->HasAura(32727)) { handler->PSendSysMessage("你还不能观察,竞技场还没有开始."); handler->SetSentErrorMessage(true); return false; } if (target->IsSpectator()) { handler->PSendSysMessage("不能进入,目标在观察状态."); handler->SetSentErrorMessage(true); return false; } if (player->IsMounted()) { handler->PSendSysMessage("不能在有坐骑的情况下观察."); handler->SetSentErrorMessage(true); return false; } // all's well, set bg id // when porting out from the bg, it will be reset to 0 player->SetBattlegroundId(target->GetBattlegroundId(), target->GetBattlegroundTypeId()); // remember current position as entry point for return at bg end teleportation if (!player->GetMap()->IsBattlegroundOrArena()) player->SetBattlegroundEntryPoint(); // stop flight if need if (player->IsInFlight()) { player->GetMotionMaster()->MovementExpired(); player->CleanupAfterTaxiFlight(); } // save only in non-flight case else player->SaveRecallPosition(); // search for two teams Battleground *bGround = target->GetBattleground(); if (bGround->isRated()) { uint32 slot = bGround->GetArenaType() - 2; if (bGround->GetArenaType() > 3) slot = 2; uint32 firstTeamID = target->GetArenaTeamId(slot); uint32 secondTeamID = 0; Player *firstTeamMember = target; Player *secondTeamMember = NULL; for (Battleground::BattlegroundPlayerMap::const_iterator itr = bGround->GetPlayers().begin(); itr != bGround->GetPlayers().end(); ++itr) if (Player* tmpPlayer = ObjectAccessor::FindPlayer(itr->first)) { if (tmpPlayer->IsSpectator()) continue; uint32 tmpID = tmpPlayer->GetArenaTeamId(slot); if (tmpID != firstTeamID && tmpID > 0) { secondTeamID = tmpID; secondTeamMember = tmpPlayer; break; } } if (firstTeamID > 0 && secondTeamID > 0 && secondTeamMember) { ArenaTeam *firstTeam = sArenaTeamMgr->GetArenaTeamById(firstTeamID); ArenaTeam *secondTeam = sArenaTeamMgr->GetArenaTeamById(secondTeamID); if (firstTeam && secondTeam) { handler->PSendSysMessage("你进入了竞技场积分赛."); handler->PSendSysMessage("队伍:"); handler->PSendSysMessage("|cFFffffff%s|r vs |cFFffffff%s|r", firstTeam->GetName().c_str(), secondTeam->GetName().c_str()); handler->PSendSysMessage("|cFFffffff%u(%u)|r -- |cFFffffff%u(%u)|r", firstTeam->GetRating(), firstTeam->GetAverageMMR(firstTeamMember->GetGroup()), secondTeam->GetRating(), secondTeam->GetAverageMMR(secondTeamMember->GetGroup())); } } } // to point to see at target with same orientation float x, y, z; target->GetContactPoint(player, x, y, z); player->TeleportTo(target->GetMapId(), x, y, z, player->GetAngle(target), TELE_TO_GM_MODE); player->SetPhaseMask(target->GetPhaseMask(), true); player->SetSpectate(true); target->GetBattleground()->AddSpectator(player->GetGUID()); return true; }
//teleport Player with Name at coordinates, including Z and orientation static bool HandlePTeleportCommand(ChatHandler* handler, const char *args) { if (!*args) return false; char* player_name = strtok((char*)args, " "); char* goX = strtok((char*)NULL, " "); char* goY = strtok((char*)NULL, " "); char* goZ = strtok((char*)NULL, " "); char* id = strtok((char*)NULL, " "); char* port = strtok((char*)NULL, " "); Player* player; uint64 target_guid; if (!handler->extractPlayerTarget(player_name, &player, &target_guid)) return false; //check if the player is online, otherwise the server will crash if (!player) return false; if (!goX || !goY) return false; float x = (float)atof(goX); float y = (float)atof(goY); float z; float ort = port ? (float)atof(port) : player->GetOrientation(); uint32 mapId = id ? (uint32)atoi(id) : player->GetMapId(); if (goZ) { z = (float)atof(goZ); if (!MapManager::IsValidMapCoord(mapId, x, y, z)) { handler->PSendSysMessage(LANG_INVALID_TARGET_COORD, x, y, mapId); handler->SetSentErrorMessage(true); return false; } } else { if (!MapManager::IsValidMapCoord(mapId, x, y)) { handler->PSendSysMessage(LANG_INVALID_TARGET_COORD, x, y, mapId); handler->SetSentErrorMessage(true); return false; } Map const* map = sMapMgr->CreateBaseMap(mapId); z = std::max(map->GetHeight(x, y, MAX_HEIGHT), map->GetWaterLevel(x, y)); } // 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, ort); 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)) { auto data = poiData->front(); mapId = data.MapID; x = data.points.front().X; y = data.points.front().Y; } else { handler->PSendSysMessage(LANG_COMMAND_QUEST_NOTFOUND, questID); handler->SetSentErrorMessage(true); return false; } if (!MapManager::IsValidMapCoord(mapId, x, y) || 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(); Map const* map = sMapMgr->CreateBaseMap(mapId); z = std::max(map->GetHeight(x, y, MAX_HEIGHT), map->GetWaterLevel(x, y)); player->TeleportTo(mapId, x, y, z, 0.0f); return true; }
//Summon group of player bool ChatHandler::HandleGroupSummonCommand(const char* args) { Player* target; if (!extractPlayerTarget((char*)args, &target)) return false; // check online security if (HasLowerSecurity(target, 0)) return false; Group *grp = target->GetGroup(); std::string nameLink = GetNameLink(target); if (!grp) { PSendSysMessage(LANG_NOT_IN_GROUP, nameLink.c_str()); SetSentErrorMessage(true); return false; } Map* gmMap = m_session->GetPlayer()->GetMap(); bool to_instance = gmMap->Instanceable(); // we are in instance, and can summon only player in our group with us as lead if (to_instance && ( !m_session->GetPlayer()->GetGroup() || (grp->GetLeaderGUID() != m_session->GetPlayer()->GetGUID()) || (m_session->GetPlayer()->GetGroup()->GetLeaderGUID() != m_session->GetPlayer()->GetGUID()))) // the last check is a bit excessive, but let it be, just in case { SendSysMessage(LANG_CANNOT_SUMMON_TO_INST); SetSentErrorMessage(true); return false; } for (GroupReference *itr = grp->GetFirstMember(); itr != NULL; itr = itr->next()) { Player *pl = itr->getSource(); if (!pl || pl == m_session->GetPlayer() || !pl->GetSession()) continue; // check online security if (HasLowerSecurity(pl, 0)) return false; std::string plNameLink = GetNameLink(pl); if (pl->IsBeingTeleported() == true) { PSendSysMessage(LANG_IS_TELEPORTED, plNameLink.c_str()); SetSentErrorMessage(true); return false; } if (to_instance) { Map* plMap = pl->GetMap(); if (plMap->Instanceable() && plMap->GetInstanceId() != gmMap->GetInstanceId()) { // cannot summon from instance to instance PSendSysMessage(LANG_CANNOT_SUMMON_TO_INST, plNameLink.c_str()); SetSentErrorMessage(true); return false; } } PSendSysMessage(LANG_SUMMONING, plNameLink.c_str(), ""); if (needReportToTarget(pl)) ChatHandler(pl).PSendSysMessage(LANG_SUMMONED_BY, GetNameLink().c_str()); // stop flight if need if (pl->isInFlight()) { pl->GetMotionMaster()->MovementExpired(); pl->CleanupAfterTaxiFlight(); } // save only in non-flight case else pl->SaveRecallPosition(); if (pl->IsMounted()) { pl->Unmount(); pl->RemoveAurasByType(SPELL_AURA_MOUNTED); } // before GM float x, y, z; m_session->GetPlayer()->GetClosePoint(x, y, z, pl->GetObjectSize()); pl->TeleportTo(m_session->GetPlayer()->GetMapId(), x, y, z, pl->GetOrientation()); } return true; }
static bool HandleSpectateCommand(ChatHandler* handler, char const* args) { Player* target; ObjectGuid target_guid; std::string target_name; if (!handler->extractPlayerTarget((char*)args, &target, &target_guid, &target_name)) return false; Player* player = handler->GetSession()->GetPlayer(); if (target == player || target_guid == player->GetGUID()) { handler->PSendSysMessage("You can't spectate yourself."); handler->SetSentErrorMessage(true); return false; } if (player->IsInCombat()) { handler->PSendSysMessage("You are in combat."); handler->SetSentErrorMessage(true); return false; } if (!target) { handler->PSendSysMessage("Target is not online or does not exist."); handler->SetSentErrorMessage(true); return false; } if (player->GetPet()) { handler->PSendSysMessage("You must hide your pet."); handler->SetSentErrorMessage(true); return false; } if (player->GetMap()->IsBattlegroundOrArena() && !player->IsSpectator()) { handler->PSendSysMessage("You are already in a battleground or arena."); handler->SetSentErrorMessage(true); return false; } Map* cMap = target->GetMap(); if (!cMap->IsBattleArena()) { handler->PSendSysMessage("Player is not in an Arena match."); handler->SetSentErrorMessage(true); return false; } if (player->GetMap()->IsBattleground()) { handler->PSendSysMessage("You can't do that while in a battleground."); handler->SetSentErrorMessage(true); return false; } if (target->HasAura(32728) || target->HasAura(32727)) { handler->PSendSysMessage("You can't do that. The Arena match didn't start yet."); handler->SetSentErrorMessage(true); return false; } if (target->IsSpectator()) { handler->PSendSysMessage("You can't do that. Your target is a spectator."); handler->SetSentErrorMessage(true); return false; } if (player->IsMounted()) { handler->PSendSysMessage("Cannot Spectate while mounted."); handler->SetSentErrorMessage(true); return false; } // all's well, set bg id // when porting out from the bg, it will be reset to 0 player->SetBattlegroundId(target->GetBattlegroundId(), target->GetBattlegroundTypeId()); // remember current position as entry point for return at bg end teleportation if (!player->GetMap()->IsBattlegroundOrArena()) player->SetBattlegroundEntryPoint(); // stop flight if need if (player->IsInFlight()) { player->GetMotionMaster()->MovementExpired(); player->CleanupAfterTaxiFlight(); } // save only in non-flight case else player->SaveRecallPosition(); // search for two teams Battleground *bGround = target->GetBattleground(); if (bGround->isRated()) { uint32 slot = bGround->GetArenaType() - 2; if (bGround->GetArenaType() > 3) slot = 2; uint32 firstTeamID = target->GetArenaTeamId(slot); uint32 secondTeamID = 0; Player *firstTeamMember = target; Player *secondTeamMember = NULL; for (Battleground::BattlegroundPlayerMap::const_iterator itr = bGround->GetPlayers().begin(); itr != bGround->GetPlayers().end(); ++itr) if (Player* tmpPlayer = ObjectAccessor::FindPlayer(itr->first)) { if (tmpPlayer->IsSpectator()) continue; uint32 tmpID = tmpPlayer->GetArenaTeamId(slot); if (tmpID != firstTeamID && tmpID > 0) { secondTeamID = tmpID; secondTeamMember = tmpPlayer; break; } } if (firstTeamID > 0 && secondTeamID > 0 && secondTeamMember) { ArenaTeam *firstTeam = sArenaTeamMgr->GetArenaTeamById(firstTeamID); ArenaTeam *secondTeam = sArenaTeamMgr->GetArenaTeamById(secondTeamID); if (firstTeam && secondTeam) { handler->PSendSysMessage("You entered a Rated Arena."); handler->PSendSysMessage("Teams:"); handler->PSendSysMessage("|cFFffffff%s|r vs |cFFffffff%s|r", firstTeam->GetName().c_str(), secondTeam->GetName().c_str()); handler->PSendSysMessage("|cFFffffff%u(%u)|r -- |cFFffffff%u(%u)|r", firstTeam->GetRating(), firstTeam->GetAverageMMR(firstTeamMember->GetGroup()), secondTeam->GetRating(), secondTeam->GetAverageMMR(secondTeamMember->GetGroup())); } } } // to point to see at target with same orientation float x, y, z; target->GetContactPoint(player, x, y, z); player->TeleportTo(target->GetMapId(), x, y, z, player->GetAngle(target), TELE_TO_GM_MODE); player->SetPhaseMask(target->GetPhaseMask(), true); player->SetSpectate(true); target->GetBattleground()->AddSpectator(player->GetGUID()); return true; }
//Teleport group to given game_tele.entry static bool HandleTeleGroupCommand(ChatHandler* handler, const char* args) { if (!*args) return false; Player* player = handler->getSelectedPlayer(); if (!player) { handler->SendSysMessage(LANG_NO_CHAR_SELECTED); handler->SetSentErrorMessage(true); return false; } // check online security if (handler->HasLowerSecurity(player, 0)) return false; // id, or string, or [name] Shift-click form |color|Htele:id|h[name]|h|r GameTele const* tele = handler->extractGameTeleFromLink((char*)args); if (!tele) { handler->SendSysMessage(LANG_COMMAND_TELE_NOTFOUND); handler->SetSentErrorMessage(true); return false; } MapEntry const* map = sMapStore.LookupEntry(tele->mapId); if (!map || map->IsBattlegroundOrArena()) { handler->SendSysMessage(LANG_CANNOT_TELE_TO_BG); handler->SetSentErrorMessage(true); return false; } std::string nameLink = handler->GetNameLink(player); Group* grp = player->GetGroup(); if (!grp) { handler->PSendSysMessage(LANG_NOT_IN_GROUP, nameLink.c_str()); handler->SetSentErrorMessage(true); return false; } for (GroupReference* itr = grp->GetFirstMember(); itr != NULL; itr = itr->next()) { Player* pl = itr->getSource(); if (!pl || !pl->GetSession()) continue; // check online security if (handler->HasLowerSecurity(pl, 0)) return false; std::string plNameLink = handler->GetNameLink(pl); if (pl->IsBeingTeleported()) { handler->PSendSysMessage(LANG_IS_TELEPORTED, plNameLink.c_str()); continue; } handler->PSendSysMessage(LANG_TELEPORTING_TO, plNameLink.c_str(), "", tele->name.c_str()); if (handler->needReportToTarget(pl)) (ChatHandler(pl)).PSendSysMessage(LANG_TELEPORTED_TO_BY, nameLink.c_str()); // stop flight if need if (pl->isInFlight()) { pl->GetMotionMaster()->MovementExpired(); pl->CleanupAfterTaxiFlight(); } // save only in non-flight case else pl->SaveRecallPosition(); pl->TeleportTo(tele->mapId, tele->position_x, tele->position_y, tele->position_z, tele->orientation); } return true; }
bool OnGossipSelect(Player * pPlayer, Creature * pCreature, uint32 sender, uint32 uiAction) { pPlayer->PlayerTalkClass->ClearMenus(); Group * group = pPlayer->GetGroup(); int randomPlace = urand(1, 8); // Dont let players use teleporter in combat if (pPlayer->IsInCombat()) { pPlayer->Whisper("You should be out of combat!", LANG_UNIVERSAL, pPlayer); pPlayer->CLOSE_GOSSIP_MENU(); return false; } switch (uiAction) { case 0: // VIP mall pPlayer->ADD_GOSSIP_ITEM_EXTENDED(GOSSIP_ICON_INTERACT_1, "|TInterface/ICONS/Achievement_Zone_Ironforge:35:35|t|cffffff00Teleport to VIP Mall", GOSSIP_SENDER_MAIN, 13, "Are you sure you want to go to VIP Mall?", 0, false); pPlayer->ADD_GOSSIP_ITEM_EXTENDED(GOSSIP_ICON_INTERACT_1, "|TInterface/ICONS/Achievement_Zone_Tanaris_01:35:35|t|cffffff00Teleport to VIP Que Island", GOSSIP_SENDER_MAIN, 14, "Are you sure you want to go to VIP Island?", 0, false); pPlayer->ADD_GOSSIP_ITEM(GOSSIP_ICON_CHAT, "|TInterface/ICONS/ACHIEVEMENT_GUILDPERK_FASTTRACK:35:35|t|cffff0000Previous Page", GOSSIP_SENDER_MAIN, 15); pPlayer->SEND_GOSSIP_MENU(60020, pCreature->GetGUID()); break; case 1: // Darnassus Mall pPlayer->TeleportTo(1, 9949.658203f, 2374.083252f, 1330.001345f, 4.731387f); break; case 1337: // Neutral Mall pPlayer->TeleportTo(530, 4174.775391f, 3009.921631f, 339.042175f, 3.100940f); break; case 2: // Stormwind Mall pPlayer->TeleportTo(0, -8850.778320f, 649.876648f, 96.325790f, 5.354052f); break; case 3: // Silvermoon Mall pPlayer->TeleportTo(530, 9490.633789f, -7277.810059f, 14.296535f, 5.896964f); break; case 4: // Orgrimmar Mall pPlayer->TeleportTo(1, 1501.500000f, -4415.439941f, 22.078300f, 0.104575f); break; case 5: // Professions Place pPlayer->TeleportTo(571, 5831.356445f, -3099.036133f, 300.452850f, 5.150246f); break; case 6: // Dueling Zone pPlayer->TeleportTo(1, 6562.940918f, -4048.786621f, 658.326782f, 1.849663f); break; case 7: // Custom Jump Event pPlayer->TeleportTo(1, -6933.268066f, -4905.634766f, 0.714660f, 4.703444f); break; case 72: // Custom Maze Event pPlayer->TeleportTo(209, -637.5766f, 622.435f, 4.79333f, 3.13651f); break; case 62: // Neutral Gear Vendor pPlayer->TeleportTo(530, -2720.322021f, 8336.484375f, -80.789917f, 4.708626f); break; case 8: // Random queue places as group if (!group) // If the player isn't in a group, then... { pPlayer->GetSession()->SendAreaTriggerMessage("You are not in group!"); pPlayer->CLOSE_GOSSIP_MENU(); return false; } switch (randomPlace) { case 1: // Moonglade pPlayer->TeleportTo(1, 7565.310059f, -2931.850098f, 466.323090f, 4.646120f); for (GroupReference* itr = group->GetFirstMember(); itr != NULL; itr = itr->next()) { Player * plr = itr->GetSource(); if (!plr || !plr->GetSession()) continue; if (plr->GetGUID() == pPlayer->GetGUID()) continue; if (plr->IsBeingTeleported()) // If is being teleported.. continue; if (plr->IsInFlight()) // Is the player in flight? { plr->GetMotionMaster()->MovementExpired(); plr->CleanupAfterTaxiFlight(); } else plr->SaveRecallPosition(); plr->SetSummonPoint(1, 7565.310059f, -2931.850098f, 466.323090f); WorldPacket data(SMSG_SUMMON_REQUEST, 8 + 4 + 4); data << uint64(pPlayer->GetGUID()); // summoner guid data << uint32(493); // Moonglade data << uint32(MAX_PLAYER_SUMMON_DELAY*IN_MILLISECONDS); // auto decline after msecs plr->GetSession()->SendPacket(&data); } break; case 2: // Nagrand pPlayer->TeleportTo(530, -632.664978f, 8638.459961f, 312.444000f, 2.385210f); for (GroupReference* itr = group->GetFirstMember(); itr != NULL; itr = itr->next()) { Player * plr = itr->GetSource(); if (!plr || !plr->GetSession()) continue; if (plr->GetGUID() == pPlayer->GetGUID()) continue; if (plr->IsBeingTeleported()) // If is being teleported.. continue; if (plr->IsInFlight()) // Is the player in flight? { plr->GetMotionMaster()->MovementExpired(); plr->CleanupAfterTaxiFlight(); } else plr->SaveRecallPosition(); plr->SetSummonPoint(530, -632.664978f, 8638.459961f, 312.444000f); WorldPacket data(SMSG_SUMMON_REQUEST, 8 + 4 + 4); data << uint64(pPlayer->GetGUID()); // summoner guid data << uint32(3518); // Nagrand data << uint32(MAX_PLAYER_SUMMON_DELAY*IN_MILLISECONDS); // auto decline after msecs plr->GetSession()->SendPacket(&data); } break; case 3: // Old Ironforge pPlayer->TeleportTo(0, -4821.729980f, -976.239014f, 464.709991f, 0.659974f); for (GroupReference* itr = group->GetFirstMember(); itr != NULL; itr = itr->next()) { Player * plr = itr->GetSource(); if (!plr || !plr->GetSession()) continue; if (plr->GetGUID() == pPlayer->GetGUID()) continue; if (plr->IsBeingTeleported()) // If is being teleported.. continue; if (plr->IsInFlight()) // Is the player in flight? { plr->GetMotionMaster()->MovementExpired(); plr->CleanupAfterTaxiFlight(); } else plr->SaveRecallPosition(); plr->SetSummonPoint(0, -4821.729980f, -976.239014f, 464.709991f); WorldPacket data(SMSG_SUMMON_REQUEST, 8 + 4 + 4); data << uint64(pPlayer->GetGUID()); // summoner guid data << uint32(1537); // summoner zone data << uint32(MAX_PLAYER_SUMMON_DELAY*IN_MILLISECONDS); // auto decline after msecs plr->GetSession()->SendPacket(&data); } break; case 4: // Ashenvale pPlayer->TeleportTo(1, 1786.410034f, -1240.949951f, 147.964996f, 1.537370f); for (GroupReference* itr = group->GetFirstMember(); itr != NULL; itr = itr->next()) { Player * plr = itr->GetSource(); if (!plr || !plr->GetSession()) continue; if (plr->GetGUID() == pPlayer->GetGUID()) continue; if (plr->IsBeingTeleported()) // If is being teleported.. continue; if (plr->IsInFlight()) // Is the player in flight? { plr->GetMotionMaster()->MovementExpired(); plr->CleanupAfterTaxiFlight(); } else plr->SaveRecallPosition(); plr->SetSummonPoint(1, 1786.410034f, -1240.949951f, 147.964996f); WorldPacket data(SMSG_SUMMON_REQUEST, 8 + 4 + 4); data << uint64(pPlayer->GetGUID()); // summoner guid data << uint32(331); // summoner zone data << uint32(MAX_PLAYER_SUMMON_DELAY*IN_MILLISECONDS); // auto decline after msecs plr->GetSession()->SendPacket(&data); } break; case 5: // The Barrens pPlayer->TeleportTo(1, -1677.339966f, -4331.270020f, 2.787450f, 2.379600f); for (GroupReference* itr = group->GetFirstMember(); itr != NULL; itr = itr->next()) { Player * plr = itr->GetSource(); if (!plr || !plr->GetSession()) continue; if (plr->GetGUID() == pPlayer->GetGUID()) continue; if (plr->IsBeingTeleported()) // If is being teleported.. continue; if (plr->IsInFlight()) // Is the player in flight? { plr->GetMotionMaster()->MovementExpired(); plr->CleanupAfterTaxiFlight(); } else plr->SaveRecallPosition(); plr->SetSummonPoint(1, -1677.339966f, -4331.270020f, 2.787450f); WorldPacket data(SMSG_SUMMON_REQUEST, 8 + 4 + 4); data << uint64(pPlayer->GetGUID()); // summoner guid data << uint32(17); // summoner zone data << uint32(MAX_PLAYER_SUMMON_DELAY*IN_MILLISECONDS); // auto decline after msecs plr->GetSession()->SendPacket(&data); } break; case 6: // Forge Camp pPlayer->TeleportTo(530, -1376.510010f, 9030.580078f, 53.928398f, 4.707840f); for (GroupReference* itr = group->GetFirstMember(); itr != NULL; itr = itr->next()) { Player * plr = itr->GetSource(); if (!plr || !plr->GetSession()) continue; if (plr->GetGUID() == pPlayer->GetGUID()) continue; if (plr->IsBeingTeleported()) // If is being teleported.. continue; if (plr->IsInFlight()) // Is the player in flight? { plr->GetMotionMaster()->MovementExpired(); plr->CleanupAfterTaxiFlight(); } else plr->SaveRecallPosition(); plr->SetSummonPoint(530, -1376.510010f, 9030.580078f, 53.928398f); WorldPacket data(SMSG_SUMMON_REQUEST, 8 + 4 + 4); data << uint64(pPlayer->GetGUID()); // summoner guid data << uint32(3518); // summoner zone data << uint32(MAX_PLAYER_SUMMON_DELAY*IN_MILLISECONDS); // auto decline after msecs plr->GetSession()->SendPacket(&data); } break; case 7: // Telaar pPlayer->TeleportTo(530, -2718.120117f, 7300.051270f, 88.628456f, 5.855799f); for (GroupReference* itr = group->GetFirstMember(); itr != NULL; itr = itr->next()) { Player * plr = itr->GetSource(); if (!plr || !plr->GetSession()) continue; if (plr->GetGUID() == pPlayer->GetGUID()) continue; if (plr->IsBeingTeleported()) // If is being teleported.. continue; if (plr->IsInFlight()) // Is the player in flight? { plr->GetMotionMaster()->MovementExpired(); plr->CleanupAfterTaxiFlight(); } else plr->SaveRecallPosition(); plr->SetSummonPoint(530, -2718.120117f, 7300.051270f, 88.628456f); WorldPacket data(SMSG_SUMMON_REQUEST, 8 + 4 + 4); data << uint64(pPlayer->GetGUID()); // summoner guid data << uint32(3518); // summoner zone data << uint32(MAX_PLAYER_SUMMON_DELAY*IN_MILLISECONDS); // auto decline after msecs plr->GetSession()->SendPacket(&data); } break; case 8: // Nagrand Arena pPlayer->TeleportTo(530, -2104.031982f, 6564.698730f, 5.153860f, 3.481085f); for (GroupReference* itr = group->GetFirstMember(); itr != NULL; itr = itr->next()) { Player * plr = itr->GetSource(); if (!plr || !plr->GetSession()) continue; if (plr->GetGUID() == pPlayer->GetGUID()) continue; if (plr->IsBeingTeleported()) // If is being teleported.. continue; if (plr->IsInFlight()) // Is the player in flight? { plr->GetMotionMaster()->MovementExpired(); plr->CleanupAfterTaxiFlight(); } else plr->SaveRecallPosition(); plr->SetSummonPoint(530, -2104.031982f, 6564.698730f, 5.153860f); WorldPacket data(SMSG_SUMMON_REQUEST, 8 + 4 + 4); data << uint64(pPlayer->GetGUID()); // summoner guid data << uint32(3518); // summoner zone data << uint32(MAX_PLAYER_SUMMON_DELAY*IN_MILLISECONDS); // auto decline after msecs plr->GetSession()->SendPacket(&data); } break; } return true; break; case 9: // Ironforge Mall pPlayer->TeleportTo(0, -4935.559570f, -937.766174f, 502.960754f, 5.400695f); break; case 10: // Desolace Mall pPlayer->TeleportTo(1, 170.343735f, 1206.189819f, 166.235794f, 2.639121f); break; case 11: // Thunder Bluff Mall pPlayer->TeleportTo(1, -1208.136597f, -96.185158f, 162.373642f, 1.586078f); break; case 12: // Undercity Mall pPlayer->TeleportTo(0, 1289.703125f, 314.571381f, -57.320896f, 1.272796f); break; case 13: // VIP Mall pPlayer->TeleportTo(37, -18.558054f, 982.330017f, 348.330963f, 4.032752f); // Azshara Crater break; case 14: // VIP Island pPlayer->TeleportTo(1, -11810.799805f, -4754.740234f, 6.293820f, 2.159030f); break; case 15: // Main Page OnGossipHello(pPlayer, pCreature); break; case 16: // Arena-Queue Places switch (randomPlace) { case 1: pPlayer->TeleportTo(1, 7565.310059f, -2931.850098f, 466.323090f, 4.646120f); // Moonglade break; case 2: pPlayer->TeleportTo(530, -632.664978f, 8638.459961f, 312.444000f, 2.385210f); // Nagrand break; case 3: pPlayer->TeleportTo(0, -4821.729980f, -976.239014f, 464.709991f, 0.659974f); // Old Ironforge break; case 4: pPlayer->TeleportTo(1, 1786.410034f, -1240.949951f, 147.964996f, 1.537370f); // Ashenvale break; case 5: pPlayer->TeleportTo(1, -1677.339966f, -4331.270020f, 2.787450f, 2.379600f); // The Barrens break; case 6: pPlayer->TeleportTo(530, -1376.510010f, 9030.580078f, 53.928398f, 4.707840f); // Forge Camp break; case 7: pPlayer->TeleportTo(530, -2718.120117f, 7300.051270f, 88.628456f, 5.855799f); // Telaar break; case 8: pPlayer->TeleportTo(530, -2104.031982f, 6564.698730f, 5.153860f, 3.481085f); // Nagrand Arena break; } return true; break; case 17: // Stranglethorn Vale pPlayer->TeleportTo(0, -13265.961914f, 156.842224f, 35.670128f, 4.207355f); break; case 33: // ICC Dungeons - Coming Soon pPlayer->GetSession()->SendAreaTriggerMessage("ICC Dungeons will be available soon!"); pPlayer->CLOSE_GOSSIP_MENU(); break; case 18: // Transmogrification Place pPlayer->TeleportTo(571, 5773.749512f, 641.840881f, 562.136536f, 4.794876f); break; case 19: // Hunter's Tame Pet Zone pPlayer->TeleportTo(0, -11196.299805f, -2196.830078f, 20.282400f, 6.186680f); pPlayer->GetSession()->SendAreaTriggerMessage("Only hunters can see the menu Hunter's Tame Pet Zone in the teleporter."); break; case 20: // Buffs //pPlayer->ADD_GOSSIP_ITEM(GOSSIP_ICON_INTERACT_1, "|TInterface/ICONS/Achievement_Reputation_AshtongueDeathsworn:35:35|t|cff0000ffNative Morphs", GOSSIP_SENDER_MAIN, 21); //pPlayer->ADD_GOSSIP_ITEM(GOSSIP_ICON_INTERACT_1, "|TInterface/ICONS/Achievement_Reputation_KirinTor:35:35|t|cff0000ffGive me buffs", GOSSIP_SENDER_MAIN, 22); pPlayer->ADD_GOSSIP_ITEM_EXTENDED(GOSSIP_ICON_INTERACT_1, "|TInterface/ICONS/Achievement_General_StayClassy:35:35|t|cff0000ffReset my talents", GOSSIP_SENDER_MAIN, 31, "Are you sure you want to reset your talent points?", 0, false); pPlayer->ADD_GOSSIP_ITEM(GOSSIP_ICON_CHAT, "|TInterface/ICONS/Ability_Mage_NetherWindPresence:35:35|t|cffff0000Previous Page", GOSSIP_SENDER_MAIN, 15); pPlayer->SEND_GOSSIP_MENU(60022, pCreature->GetGUID()); break; case 21: // Native morphs pPlayer->ADD_GOSSIP_ITEM(GOSSIP_ICON_INTERACT_1, "|TInterface/ICONS/Achievement_Character_Tauren_Male:35:35|t|cff0000ffTauren Female", GOSSIP_SENDER_MAIN, 23); pPlayer->ADD_GOSSIP_ITEM(GOSSIP_ICON_INTERACT_1, "|TInterface/ICONS/Achievement_Character_Tauren_Female:35:35|t|cff0000ffTauren Male", GOSSIP_SENDER_MAIN, 24); pPlayer->ADD_GOSSIP_ITEM(GOSSIP_ICON_INTERACT_1, "|TInterface/ICONS/Achievement_Character_Gnome_Female:35:35|t|cff0000ffGnome Female", GOSSIP_SENDER_MAIN, 25); pPlayer->ADD_GOSSIP_ITEM(GOSSIP_ICON_INTERACT_1, "|TInterface/ICONS/Achievement_Character_Gnome_Male:35:35|t|cff0000ffGnome Male", GOSSIP_SENDER_MAIN, 26); pPlayer->ADD_GOSSIP_ITEM(GOSSIP_ICON_INTERACT_1, "|TInterface/ICONS/Achievement_Character_Bloodelf_Female:35:35|t|cff0000ffBlood Elf Female", GOSSIP_SENDER_MAIN, 27); pPlayer->ADD_GOSSIP_ITEM(GOSSIP_ICON_INTERACT_1, "|TInterface/ICONS/Achievement_Character_Bloodelf_Male:35:35|t|cff0000ffBlood Elf Male", GOSSIP_SENDER_MAIN, 28); pPlayer->ADD_GOSSIP_ITEM(GOSSIP_ICON_INTERACT_1, "|TInterface/ICONS/Achievement_Character_Human_Female:35:35|t|cff0000ffHuman Female", GOSSIP_SENDER_MAIN, 29); pPlayer->ADD_GOSSIP_ITEM(GOSSIP_ICON_INTERACT_1, "|TInterface/ICONS/Achievement_Character_Human_Male:35:35|t|cff0000ffHuman Male", GOSSIP_SENDER_MAIN, 30); pPlayer->ADD_GOSSIP_ITEM(GOSSIP_ICON_CHAT, "|TInterface/ICONS/ACHIEVEMENT_GUILDPERK_FASTTRACK:35:35|t|cffff0000Previous Page", GOSSIP_SENDER_MAIN, 20); pPlayer->SEND_GOSSIP_MENU(60021, pCreature->GetGUID()); break; case 22: // Buff pPlayer->CastSpell(pPlayer, 48102, true); // Stamina pPlayer->CastSpell(pPlayer, 48073, true); // Divine Spirit pPlayer->CastSpell(pPlayer, 48169, true); // Shadow Protection pPlayer->CastSpell(pPlayer, 48161, true); // PW:F pPlayer->CastSpell(pPlayer, 20217, true); // Blessing of Kings pPlayer->CastSpell(pPlayer, 42995, true); // Arcane Intellect pPlayer->CastSpell(pPlayer, 48469, true); // Mark of the Wild pPlayer->CLOSE_GOSSIP_MENU(); break; case 23: // Tauren Female pCreature->CastSpell(pPlayer, 37811, true); pPlayer->CastSpell(pPlayer, 24222, true); pPlayer->CLOSE_GOSSIP_MENU(); break; case 24: // Tauren Male pCreature->CastSpell(pPlayer, 37810, true); pPlayer->CastSpell(pPlayer, 24222, true); pPlayer->CLOSE_GOSSIP_MENU(); break; case 25: // Gnome Female pCreature->CastSpell(pPlayer, 37809, true); pPlayer->CastSpell(pPlayer, 24222, true); pPlayer->CLOSE_GOSSIP_MENU(); break; case 26: // Gnome Male pCreature->CastSpell(pPlayer, 37808, true); pPlayer->CastSpell(pPlayer, 24222, true); pPlayer->CLOSE_GOSSIP_MENU(); break; case 27: // Blood Elf Female pCreature->CastSpell(pPlayer, 37806, true); pPlayer->CastSpell(pPlayer, 24222, true); pPlayer->CLOSE_GOSSIP_MENU(); break; case 28: // Blood Elf Male pCreature->CastSpell(pPlayer, 37807, true); pPlayer->CastSpell(pPlayer, 24222, true); pPlayer->CLOSE_GOSSIP_MENU(); break; case 29: // Human Female pCreature->CastSpell(pPlayer, 37805, true); pPlayer->CastSpell(pPlayer, 24222, true); pPlayer->CLOSE_GOSSIP_MENU(); break; case 30: // Human Male pCreature->CastSpell(pPlayer, 35466, true); pPlayer->CastSpell(pPlayer, 24222, true); pPlayer->CLOSE_GOSSIP_MENU(); break; case 31: // Reset talents pPlayer->ResetTalents(true); pPlayer->SendTalentsInfoData(false); pPlayer->GetSession()->SendAreaTriggerMessage("Your talents has been reset."); pPlayer->CastSpell(pPlayer, 24222, true); pPlayer->CLOSE_GOSSIP_MENU(); break; case 35: // Ravenholdt Manor Mall pPlayer->TeleportTo(0, 1.827456f, -1620.976807f, 196.651855f, 1.151698f); break; case 36: // Dueling Zone (Ravenholdt Manor Mall) pPlayer->TeleportTo(0, 70.579247f, -1506.760986f, 174.295914f, 4.210823f); break; case 40: // Already in zone pPlayer->GetSession()->SendAreaTriggerMessage("You're already in this zone!"); pPlayer->CLOSE_GOSSIP_MENU(); break; case 41: // Already in Dueling zone / Mall pPlayer->GetSession()->SendAreaTriggerMessage("You're already in Dueling Zone! It's just outside."); pPlayer->CLOSE_GOSSIP_MENU(); break; case 42: // you're not a hunter pPlayer->GetSession()->SendAreaTriggerMessage("You're not a hunter!"); pPlayer->CLOSE_GOSSIP_MENU(); break; case 43: // Goldenmist Village - Alliance pPlayer->TeleportTo(530, 7739.864258f, -6075.500488f, 19.238945f, 6.100757f); break; case 44: // Goldenmist Village - Horde pPlayer->TeleportTo(530, 8001.195801f, -6227.183105f, 22.003067f, 2.688986f); break; case 45: // Dueling Zone (AT) pPlayer->TeleportTo(1, 5210.732422f, -4815.695313f, 701.046265f, 0.678023f); break; case 46: // Nagrand Arena pPlayer->TeleportTo(530, -2104.031982f, 6564.698730f, 5.153860f, 3.481085f); break; case 47: // Elwynn Forest pPlayer->TeleportTo(0, -9103.945313f, 407.655640f, 92.646919f, 3.781690f); break; case 48: // Durotar pPlayer->TeleportTo(1, 1359.506348f, -4369.427246f, 26.164385f, 3.450796f); break; case 49: // Raid for Orgrimmar { if (!group) // If the player isn't in a group, then... { pPlayer->GetSession()->SendAreaTriggerMessage("You are not in group!"); pPlayer->CLOSE_GOSSIP_MENU(); return false; } pPlayer->TeleportTo(1, 1076.446167f, -4380.293945f, 21.868385f, 3.140767f); for (GroupReference* itr = group->GetFirstMember(); itr != NULL; itr = itr->next()) { Player * plr = itr->GetSource(); if (!plr || !plr->GetSession()) continue; if (plr->GetGUID() == pPlayer->GetGUID()) continue; if (plr->IsBeingTeleported()) // If is being teleported.. continue; if (plr->IsInFlight()) // Is the player in flight? { plr->GetMotionMaster()->MovementExpired(); plr->CleanupAfterTaxiFlight(); } else plr->SaveRecallPosition(); plr->SetSummonPoint(1, 1076.446167f, -4380.293945f, 21.868385f); WorldPacket data(SMSG_SUMMON_REQUEST, 8 + 4 + 4); data << uint64(pPlayer->GetGUID()); // summoner guid data << uint32(14); // summoner zone data << uint32(MAX_PLAYER_SUMMON_DELAY*IN_MILLISECONDS); // auto decline after msecs plr->GetSession()->SendPacket(&data); std::string msg = ""; msg += "|cffff6060[CITY WAR] "; msg += "|cfffaeb00The Alliance are raiding Orgrimmar! Defend Orgrimmar!"; sWorld->SendServerMessage(SERVER_MSG_STRING, msg.c_str(), plr); } } break; case 50: // Raid for Stormwind { if (!group) // If the player isn't in a group, then... { pPlayer->GetSession()->SendAreaTriggerMessage("You are not in group!"); pPlayer->CLOSE_GOSSIP_MENU(); return false; } pPlayer->TeleportTo(0, -9533.540039f, 98.611000f, 58.882198f, 1.858551f); for (GroupReference* itr = group->GetFirstMember(); itr != NULL; itr = itr->next()) { Player * plr = itr->GetSource(); if (!plr || !plr->GetSession()) continue; if (plr->GetGUID() == pPlayer->GetGUID()) continue; if (plr->IsBeingTeleported()) // If is being teleported.. continue; if (plr->IsInFlight()) // Is the player in flight? { plr->GetMotionMaster()->MovementExpired(); plr->CleanupAfterTaxiFlight(); } else plr->SaveRecallPosition(); plr->SetSummonPoint(0, -9533.540039f, 98.611000f, 58.882198f); WorldPacket data(SMSG_SUMMON_REQUEST, 8 + 4 + 4); data << uint64(pPlayer->GetGUID()); // summoner guid data << uint32(12); // summoner zone data << uint32(MAX_PLAYER_SUMMON_DELAY*IN_MILLISECONDS); // auto decline after msecs plr->GetSession()->SendPacket(&data); std::string msg = ""; msg += "|cffff6060[CITY WAR] "; msg += "|cfffaeb00The Horde are raiding Stormwind! Defend Stormwind!"; sWorld->SendServerMessage(SERVER_MSG_STRING, msg.c_str(), plr); } } break; } return true; }
//Summon Player bool ChatHandler::HandleSummonCommand(const char* args) { Player* target; uint64 target_guid; std::string target_name; if (!extractPlayerTarget((char*)args, &target, &target_guid, &target_name)) return false; Player* _player = m_session->GetPlayer(); if (target == _player || target_guid == _player->GetGUID()) { PSendSysMessage(LANG_CANT_TELEPORT_SELF); SetSentErrorMessage(true); return false; } if (target) { std::string nameLink = playerLink(target_name); // check online security if (HasLowerSecurity(target, 0)) return false; if (target->IsBeingTeleported()) { PSendSysMessage(LANG_IS_TELEPORTED, nameLink.c_str()); SetSentErrorMessage(true); return false; } Map* map = m_session->GetPlayer()->GetMap(); if (map->IsBattlegroundOrArena()) { // only allow if gm mode is on if (!_player->isGameMaster()) { PSendSysMessage(LANG_CANNOT_GO_TO_BG_GM, nameLink.c_str()); SetSentErrorMessage(true); return false; } // if both players are in different bgs else if (target->GetBattlegroundId() && m_session->GetPlayer()->GetBattlegroundId() != target->GetBattlegroundId()) target->LeaveBattleground(false); // Note: should be changed so target gets no Deserter debuff // all's well, set bg id // when porting out from the bg, it will be reset to 0 target->SetBattlegroundId(m_session->GetPlayer()->GetBattlegroundId(), m_session->GetPlayer()->GetBattlegroundTypeId()); // remember current position as entry point for return at bg end teleportation if (!target->GetMap()->IsBattlegroundOrArena()) target->SetBattlegroundEntryPoint(); } else if (map->IsDungeon()) { Map* cMap = target->GetMap(); if (cMap->Instanceable() && cMap->GetInstanceId() != map->GetInstanceId()) target->UnbindInstance(map->GetInstanceId(), target->GetDungeonDifficulty(), true); // we are in instance, and can summon only player in our group with us as lead if (!m_session->GetPlayer()->GetGroup() || !target->GetGroup() || (target->GetGroup()->GetLeaderGUID() != m_session->GetPlayer()->GetGUID()) || (m_session->GetPlayer()->GetGroup()->GetLeaderGUID() != m_session->GetPlayer()->GetGUID())) // the last check is a bit excessive, but let it be, just in case { PSendSysMessage(LANG_CANNOT_SUMMON_TO_INST, nameLink.c_str()); SetSentErrorMessage(true); return false; } } PSendSysMessage(LANG_SUMMONING, nameLink.c_str(), ""); if (needReportToTarget(target)) ChatHandler(target).PSendSysMessage(LANG_SUMMONED_BY, playerLink(_player->GetName()).c_str()); // stop flight if need if (target->isInFlight()) { target->GetMotionMaster()->MovementExpired(); target->CleanupAfterTaxiFlight(); } // save only in non-flight case else target->SaveRecallPosition(); // before GM float x, y, z; m_session->GetPlayer()->GetClosePoint(x, y, z, target->GetObjectSize()); target->TeleportTo(m_session->GetPlayer()->GetMapId(), x, y, z, target->GetOrientation()); target->SetPhaseMask(m_session->GetPlayer()->GetPhaseMask(), true); } else { // check offline security if (HasLowerSecurity(NULL, target_guid)) return false; std::string nameLink = playerLink(target_name); PSendSysMessage(LANG_SUMMONING, nameLink.c_str(), GetSkyFireString(LANG_OFFLINE)); // in point where GM stay Player::SavePositionInDB(m_session->GetPlayer()->GetMapId(), m_session->GetPlayer()->GetPositionX(), m_session->GetPlayer()->GetPositionY(), m_session->GetPlayer()->GetPositionZ(), m_session->GetPlayer()->GetOrientation(), m_session->GetPlayer()->GetZoneId(), target_guid); } return true; }