Beispiel #1
0
    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;
    }
Beispiel #3
0
    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;
    }
Beispiel #4
0
    //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;
    }
Beispiel #5
0
    // 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;
    }
Beispiel #6
0
    //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;
    }
Beispiel #7
0
    //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;
    }
Beispiel #8
0
    // 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;
    }
Beispiel #9
0
    // 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;
    }
Beispiel #10
0
    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;
    }
Beispiel #11
0
	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;
	}
Beispiel #12
0
        //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;
        }
Beispiel #13
0
    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;
    }
Beispiel #14
0
//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;
}
Beispiel #15
0
	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;
	}
Beispiel #16
0
    //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;
    }
Beispiel #17
0
	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;
	}
Beispiel #18
0
//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;
}