void WorldSession::HandleQuestgiverStatusMultipleQuery(WorldPackets::Quest::QuestGiverStatusMultipleQuery& /*packet*/) { TC_LOG_DEBUG("network", "WORLD: Received CMSG_QUESTGIVER_STATUS_MULTIPLE_QUERY"); WorldPackets::Quest::QuestGiverStatusMultiple response; for (GuidSet::const_iterator itr = _player->m_clientGUIDs.begin(); itr != _player->m_clientGUIDs.end(); ++itr) { if (itr->IsAnyTypeCreature()) { // need also pet quests case support Creature* questgiver = ObjectAccessor::GetCreatureOrPetOrVehicle(*GetPlayer(), *itr); if (!questgiver || questgiver->IsHostileTo(_player)) continue; if (!questgiver->HasFlag(UNIT_NPC_FLAGS, UNIT_NPC_FLAG_QUESTGIVER)) continue; response.QuestGiver.emplace_back(questgiver->GetGUID(), _player->GetQuestDialogStatus(questgiver)); } else if (itr->IsGameObject()) { GameObject* questgiver = GetPlayer()->GetMap()->GetGameObject(*itr); if (!questgiver || questgiver->GetGoType() != GAMEOBJECT_TYPE_QUESTGIVER) continue; response.QuestGiver.emplace_back(questgiver->GetGUID(), _player->GetQuestDialogStatus(questgiver)); } } SendPacket(response.Write()); }
void VisibleNotifier::Notify() { Player& player = *i_camera.GetOwner(); // at this moment i_clientGUIDs have guids that not iterate at grid level checks // but exist one case when this possible and object not out of range: transports if(Transport* transport = player.GetTransport()) { for(Transport::PlayerSet::const_iterator itr = transport->GetPassengers().begin();itr!=transport->GetPassengers().end();++itr) { if (i_clientGUIDs.find((*itr)->GetObjectGuid()) != i_clientGUIDs.end()) { // ignore far sight case (*itr)->UpdateVisibilityOf(*itr, &player); player.UpdateVisibilityOf(&player, *itr, i_data, i_visibleNow); i_clientGUIDs.erase((*itr)->GetObjectGuid()); } } } // generate outOfRange for not iterate objects i_data.AddOutOfRangeGUID(i_clientGUIDs); for(GuidSet::iterator itr = i_clientGUIDs.begin();itr!=i_clientGUIDs.end();++itr) { player.m_clientGUIDs.erase(*itr); DEBUG_FILTER_LOG(LOG_FILTER_VISIBILITY_CHANGES, "%s is out of range (no in active cells set) now for %s", itr->GetString().c_str(), player.GetGuidStr().c_str()); } if (i_data.HasData()) { // send create/outofrange packet to player (except player create updates that already sent using SendUpdateToPlayer) WorldPacket packet; i_data.BuildPacket(&packet); player.GetSession()->SendPacket(&packet); // send out of range to other players if need GuidSet const& oor = i_data.GetOutOfRangeGUIDs(); for(GuidSet::const_iterator iter = oor.begin(); iter != oor.end(); ++iter) { if (!iter->IsPlayer()) continue; if (Player* plr = ObjectAccessor::FindPlayer(*iter)) plr->UpdateVisibilityOf(plr->GetCamera().GetBody(), &player); } } // Now do operations that required done at object visibility change to visible // send data at target visibility change (adding to client) for(std::set<WorldObject*>::const_iterator vItr = i_visibleNow.begin(); vItr != i_visibleNow.end(); ++vItr) { // target aura duration for caster show only if target exist at caster client if ((*vItr) != &player && (*vItr)->isType(TYPEMASK_UNIT)) player.SendAuraDurationsForTarget((Unit*)(*vItr)); } }
void VisibleNotifier::SendToSelf() { // at this moment i_clientGUIDs have guids that not iterate at grid level checks // but exist one case when this possible and object not out of range: transports if (Transport* transport = i_player.GetTransport()) { for (Transport::PassengerSet::const_iterator itr = transport->GetPassengers().begin(); itr != transport->GetPassengers().end(); ++itr) { if (vis_guids.find((*itr)->GetGUID()) != vis_guids.end()) { vis_guids.erase((*itr)->GetGUID()); switch ((*itr)->GetTypeId()) { case TYPEID_GAMEOBJECT: i_player.UpdateVisibilityOf((*itr)->ToGameObject(), i_data, i_visibleNow); break; case TYPEID_PLAYER: i_player.UpdateVisibilityOf((*itr)->ToPlayer(), i_data, i_visibleNow); if (!(*itr)->isNeedNotify(NOTIFY_VISIBILITY_CHANGED)) (*itr)->ToPlayer()->UpdateVisibilityOf(&i_player); break; case TYPEID_UNIT: i_player.UpdateVisibilityOf((*itr)->ToCreature(), i_data, i_visibleNow); break; case TYPEID_DYNAMICOBJECT: i_player.UpdateVisibilityOf((*itr)->ToDynObject(), i_data, i_visibleNow); break; default: break; } } } } for (GuidSet::const_iterator it = vis_guids.begin(); it != vis_guids.end(); ++it) { i_player.m_clientGUIDs.erase(*it); i_data.AddOutOfRangeGUID(*it); if (it->IsPlayer()) { Player* player = ObjectAccessor::FindPlayer(*it); if (player && !player->isNeedNotify(NOTIFY_VISIBILITY_CHANGED)) player->UpdateVisibilityOf(&i_player); } } if (!i_data.HasData()) return; WorldPacket packet; i_data.BuildPacket(&packet); i_player.GetSession()->SendPacket(&packet); for (std::set<Unit*>::const_iterator it = i_visibleNow.begin(); it != i_visibleNow.end(); ++it) i_player.SendInitialVisiblePackets(*it); }
Group* Battlefield::GetGroupPlayer(ObjectGuid guid, TeamId TeamId) { for (GuidSet::const_iterator itr = m_Groups[TeamId].begin(); itr != m_Groups[TeamId].end(); ++itr) if (Group* group = sGroupMgr->GetGroupByGUID(itr->GetCounter())) if (group->IsMember(guid)) return group; return NULL; }
// **************************************************** // ******************* Group System ******************* // **************************************************** Group* Battlefield::GetFreeBfRaid(TeamId TeamId) { for (GuidSet::const_iterator itr = m_Groups[TeamId].begin(); itr != m_Groups[TeamId].end(); ++itr) if (Group* group = sGroupMgr->GetGroupByGUID(itr->GetCounter())) if (!group->IsFull()) return group; return NULL; }
void WorldSession::HandleQuestgiverStatusMultipleQuery(WorldPacket& /*recvPacket*/) { DEBUG_LOG("WORLD: Received CMSG_QUESTGIVER_STATUS_MULTIPLE_QUERY"); uint32 count = 0; WorldPacket data(SMSG_QUESTGIVER_STATUS_MULTIPLE, 4); data << uint32(count); // placeholder for(GuidSet::const_iterator itr = _player->m_clientGUIDs.begin(); itr != _player->m_clientGUIDs.end(); ++itr) { uint8 dialogStatus = DIALOG_STATUS_NONE; if (itr->IsAnyTypeCreature()) { // need also pet quests case support Creature *questgiver = GetPlayer()->GetMap()->GetAnyTypeCreature(*itr); if (!questgiver || questgiver->IsHostileTo(_player)) continue; if (!questgiver->HasFlag(UNIT_NPC_FLAGS, UNIT_NPC_FLAG_QUESTGIVER)) continue; dialogStatus = sScriptMgr.GetDialogStatus(_player, questgiver); if (dialogStatus > DIALOG_STATUS_REWARD_REP) dialogStatus = getDialogStatus(_player, questgiver, DIALOG_STATUS_NONE); data << questgiver->GetObjectGuid(); data << uint8(dialogStatus); ++count; } else if (itr->IsGameObject()) { GameObject *questgiver = GetPlayer()->GetMap()->GetGameObject(*itr); if (!questgiver) continue; if (questgiver->GetGoType() != GAMEOBJECT_TYPE_QUESTGIVER) continue; dialogStatus = sScriptMgr.GetDialogStatus(_player, questgiver); if (dialogStatus > DIALOG_STATUS_REWARD_REP) dialogStatus = getDialogStatus(_player, questgiver, DIALOG_STATUS_NONE); data << questgiver->GetObjectGuid(); data << uint8(dialogStatus); ++count; } } data.put<uint32>(0, count); // write real count SendPacket(&data); }
void GuildAchievementMgr::SaveToDB(SQLTransaction& trans) { PreparedStatement* stmt; std::ostringstream guidstr; for (auto itr = _completedAchievements.begin(); itr != _completedAchievements.end(); ++itr) { if (!itr->second.Changed) continue; stmt = CharacterDatabase.GetPreparedStatement(CHAR_DEL_GUILD_ACHIEVEMENT); stmt->setUInt64(0, _owner->GetId()); stmt->setUInt32(1, itr->first); trans->Append(stmt); stmt = CharacterDatabase.GetPreparedStatement(CHAR_INS_GUILD_ACHIEVEMENT); stmt->setUInt64(0, _owner->GetId()); stmt->setUInt32(1, itr->first); stmt->setUInt32(2, uint32(itr->second.Date)); for (GuidSet::const_iterator gItr = itr->second.CompletingPlayers.begin(); gItr != itr->second.CompletingPlayers.end(); ++gItr) guidstr << gItr->GetCounter() << ','; stmt->setString(3, guidstr.str()); trans->Append(stmt); guidstr.str(""); } for (auto itr = _criteriaProgress.begin(); itr != _criteriaProgress.end(); ++itr) { if (!itr->second.Changed) continue; stmt = CharacterDatabase.GetPreparedStatement(CHAR_DEL_GUILD_ACHIEVEMENT_CRITERIA); stmt->setUInt64(0, _owner->GetId()); stmt->setUInt32(1, itr->first); trans->Append(stmt); stmt = CharacterDatabase.GetPreparedStatement(CHAR_INS_GUILD_ACHIEVEMENT_CRITERIA); stmt->setUInt64(0, _owner->GetId()); stmt->setUInt32(1, itr->first); stmt->setUInt64(2, itr->second.Counter); stmt->setUInt32(3, uint32(itr->second.Date)); stmt->setUInt64(4, itr->second.PlayerGUID.GetCounter()); trans->Append(stmt); } }
/** Given a list of guids returns the concatenation using | as delimiter @param[in] check list of guids @returns Concatenated string */ std::string ConcatenateGuids(GuidList const& check) { if (check.empty()) return ""; // need the guids in order to avoid duplicates GuidSet guids(check.begin(), check.end()); std::ostringstream o; GuidSet::const_iterator it = guids.begin(); o << it->GetRawValue(); for (++it; it != guids.end(); ++it) o << '|' << it->GetRawValue(); return o.str(); }
void WorldSession::HandleQuestgiverStatusMultipleQuery(WorldPacket& /*recvPacket*/) { TC_LOG_DEBUG("network", "WORLD: Received CMSG_QUESTGIVER_STATUS_MULTIPLE_QUERY"); uint32 count = 0; WorldPacket data(SMSG_QUESTGIVER_STATUS_MULTIPLE, 4); data << uint32(count); // placeholder for (GuidSet::const_iterator itr = _player->m_clientGUIDs.begin(); itr != _player->m_clientGUIDs.end(); ++itr) { uint32 questStatus = DIALOG_STATUS_NONE; if (itr->IsAnyTypeCreature()) { // need also pet quests case support Creature* questgiver = ObjectAccessor::GetCreatureOrPetOrVehicle(*GetPlayer(), *itr); if (!questgiver || questgiver->IsHostileTo(_player)) continue; if (!questgiver->HasFlag(UNIT_NPC_FLAGS, UNIT_NPC_FLAG_QUESTGIVER)) continue; questStatus = _player->GetQuestDialogStatus(questgiver); data << uint64(questgiver->GetGUID()); data << uint8(questStatus); ++count; } else if (itr->IsGameObject()) { GameObject* questgiver = GetPlayer()->GetMap()->GetGameObject(*itr); if (!questgiver || questgiver->GetGoType() != GAMEOBJECT_TYPE_QUESTGIVER) continue; questStatus = _player->GetQuestDialogStatus(questgiver); data << uint64(questgiver->GetGUID()); data << uint8(questStatus); ++count; } } data.put<uint32>(0, count); // write real count SendPacket(&data); }
bool UpdateData::BuildPacket(WorldPacket* packet, bool hasTransport) { MANGOS_ASSERT(packet->empty()); // shouldn't happen ByteBuffer buf(4 + 1 + (m_outOfRangeGUIDs.empty() ? 0 : 1 + 4 + 9 * m_outOfRangeGUIDs.size()) + m_data.wpos()); buf << (uint32)(!m_outOfRangeGUIDs.empty() ? m_blockCount + 1 : m_blockCount); buf << (uint8)(hasTransport ? 1 : 0); if (!m_outOfRangeGUIDs.empty()) { buf << (uint8) UPDATETYPE_OUT_OF_RANGE_OBJECTS; buf << (uint32) m_outOfRangeGUIDs.size(); for (GuidSet::const_iterator i = m_outOfRangeGUIDs.begin(); i != m_outOfRangeGUIDs.end(); ++i) buf << i->WriteAsPacked(); } buf.append(m_data); size_t pSize = buf.wpos(); // use real used data size if (pSize > 100) // compress large packets { uint32 destsize = compressBound(pSize); packet->resize(destsize + sizeof(uint32)); packet->put<uint32>(0, pSize); Compress(const_cast<uint8*>(packet->contents()) + sizeof(uint32), &destsize, (void*)buf.contents(), pSize); if (destsize == 0) return false; packet->resize(destsize + sizeof(uint32)); packet->SetOpcode(SMSG_COMPRESSED_UPDATE_OBJECT); } else // send small packets without compression { packet->append(buf); packet->SetOpcode(SMSG_UPDATE_OBJECT); } return true; }