void WorldSession::HandleTurnInPetitionOpcode(WorldPacket& recvData) { TC_LOG_DEBUG("network", "Received opcode CMSG_TURN_IN_PETITION"); // Get petition guid from packet WorldPacket data; uint64 petitionGuid; recvData >> petitionGuid; // Check if player really has the required petition charter Item* item = _player->GetItemByGuid(petitionGuid); if (!item) return; TC_LOG_DEBUG("network", "Petition %u turned in by %u", GUID_LOPART(petitionGuid), _player->GetGUIDLow()); // Get petition data from db uint32 ownerguidlo; uint32 type; std::string name; PreparedStatement* stmt = CharacterDatabase.GetPreparedStatement(CHAR_SEL_PETITION); stmt->setUInt32(0, GUID_LOPART(petitionGuid)); PreparedQueryResult result = CharacterDatabase.Query(stmt); if (result) { Field* fields = result->Fetch(); ownerguidlo = fields[0].GetUInt32(); name = fields[1].GetString(); type = fields[2].GetUInt8(); } else { TC_LOG_ERROR("network", "Player %s (guid: %u) tried to turn in petition (guid: %u) that is not present in the database", _player->GetName().c_str(), _player->GetGUIDLow(), GUID_LOPART(petitionGuid)); return; } // Only the petition owner can turn in the petition if (_player->GetGUIDLow() != ownerguidlo) return; // Petition type (guild/arena) specific checks if (type == GUILD_CHARTER_TYPE) { // Check if player is already in a guild if (_player->GetGuildId()) { data.Initialize(SMSG_TURN_IN_PETITION_RESULTS, 4); data << (uint32)PETITION_TURN_ALREADY_IN_GUILD; _player->GetSession()->SendPacket(&data); return; } // Check if guild name is already taken if (sGuildMgr->GetGuildByName(name)) { Guild::SendCommandResult(this, GUILD_COMMAND_CREATE, ERR_GUILD_NAME_EXISTS_S, name); return; } } else { // Check for valid arena bracket (2v2, 3v3, 5v5) uint8 slot = ArenaTeam::GetSlotByType(type); if (slot >= MAX_ARENA_SLOT) return; // Check if player is already in an arena team if (_player->GetArenaTeamId(slot)) { SendArenaTeamCommandResult(ERR_ARENA_TEAM_CREATE_S, name, "", ERR_ALREADY_IN_ARENA_TEAM); return; } // Check if arena team name is already taken if (sArenaTeamMgr->GetArenaTeamByName(name)) { SendArenaTeamCommandResult(ERR_ARENA_TEAM_CREATE_S, name, "", ERR_ARENA_TEAM_NAME_EXISTS_S); return; } } // Get petition signatures from db uint8 signatures; stmt = CharacterDatabase.GetPreparedStatement(CHAR_SEL_PETITION_SIGNATURE); stmt->setUInt32(0, GUID_LOPART(petitionGuid)); result = CharacterDatabase.Query(stmt); if (result) signatures = uint8(result->GetRowCount()); else signatures = 0; uint32 requiredSignatures; if (type == GUILD_CHARTER_TYPE) requiredSignatures = sWorld->getIntConfig(CONFIG_MIN_PETITION_SIGNS); else requiredSignatures = type-1; // Notify player if signatures are missing if (signatures < requiredSignatures) { data.Initialize(SMSG_TURN_IN_PETITION_RESULTS, 4); data << (uint32)PETITION_TURN_NEED_MORE_SIGNATURES; SendPacket(&data); return; } // Proceed with guild/arena team creation // Delete charter item _player->DestroyItem(item->GetBagSlot(), item->GetSlot(), true); if (type == GUILD_CHARTER_TYPE) { // Create guild Guild* guild = new Guild; if (!guild->Create(_player, name)) { delete guild; return; } // Register guild and add guild master sGuildMgr->AddGuild(guild); Guild::SendCommandResult(this, GUILD_COMMAND_CREATE, ERR_GUILD_COMMAND_SUCCESS, name); // Add members from signatures for (uint8 i = 0; i < signatures; ++i) { Field* fields = result->Fetch(); guild->AddMember(MAKE_NEW_GUID(fields[0].GetUInt32(), 0, HIGHGUID_PLAYER)); result->NextRow(); } } else { // Receive the rest of the packet in arena team creation case uint32 background, icon, iconcolor, border, bordercolor; recvData >> background >> icon >> iconcolor >> border >> bordercolor; // Create arena team ArenaTeam* arenaTeam = new ArenaTeam(); if (!arenaTeam->Create(_player->GetGUID(), type, name, background, icon, iconcolor, border, bordercolor)) { delete arenaTeam; return; } // Register arena team sArenaTeamMgr->AddArenaTeam(arenaTeam); TC_LOG_DEBUG("network", "PetitonsHandler: Arena team (guid: %u) added to ObjectMgr", arenaTeam->GetId()); // Add members for (uint8 i = 0; i < signatures; ++i) { Field* fields = result->Fetch(); uint32 memberGUID = fields[0].GetUInt32(); TC_LOG_DEBUG("network", "PetitionsHandler: Adding arena team (guid: %u) member %u", arenaTeam->GetId(), memberGUID); arenaTeam->AddMember(MAKE_NEW_GUID(memberGUID, 0, HIGHGUID_PLAYER)); result->NextRow(); } } SQLTransaction trans = CharacterDatabase.BeginTransaction(); stmt = CharacterDatabase.GetPreparedStatement(CHAR_DEL_PETITION_BY_GUID); stmt->setUInt32(0, GUID_LOPART(petitionGuid)); trans->Append(stmt); stmt = CharacterDatabase.GetPreparedStatement(CHAR_DEL_PETITION_SIGNATURE_BY_GUID); stmt->setUInt32(0, GUID_LOPART(petitionGuid)); trans->Append(stmt); CharacterDatabase.CommitTransaction(trans); // created TC_LOG_DEBUG("network", "TURN IN PETITION GUID %u", GUID_LOPART(petitionGuid)); data.Initialize(SMSG_TURN_IN_PETITION_RESULTS, 4); data << (uint32)PETITION_TURN_OK; SendPacket(&data); }
bool VehicleKit::AddPassenger(Unit *passenger, int8 seatId) { SeatMap::iterator seat; if (seatId < 0) // no specific seat requirement { for (seat = m_Seats.begin(); seat != m_Seats.end(); ++seat) if (!seat->second.passenger && (seat->second.seatInfo->IsUsable() || (seat->second.seatInfo->m_flags & SEAT_FLAG_UNCONTROLLED))) break; if (seat == m_Seats.end()) // no available seat return false; } else { seat = m_Seats.find(seatId); if (seat == m_Seats.end()) return false; if (seat->second.passenger) return false; } seat->second.passenger = passenger; passenger->addUnitState(UNIT_STAT_ON_VEHICLE); m_pBase->SetPhaseMask(passenger->GetPhaseMask(), true); VehicleSeatEntry const *seatInfo = seat->second.seatInfo; passenger->m_movementInfo.AddMovementFlag(MOVEFLAG_ONTRANSPORT); passenger->m_movementInfo.SetTransportData(m_pBase->GetGUID(), seatInfo->m_attachmentOffsetX, seatInfo->m_attachmentOffsetY, seatInfo->m_attachmentOffsetZ, seatInfo->m_passengerYaw, WorldTimer::getMSTime(), seat->first, seatInfo); if (passenger->GetTypeId() == TYPEID_PLAYER) { ((Player*)passenger)->UnsummonPetTemporaryIfAny(); ((Player*)passenger)->GetCamera().SetView(m_pBase); WorldPacket data(SMSG_FORCE_MOVE_ROOT, 8+4); data << passenger->GetPackGUID(); data << uint32((passenger->m_movementInfo.GetVehicleSeatFlags() & SEAT_FLAG_CAN_CAST) ? 2 : 0); passenger->SendMessageToSet(&data, true); } if (seat->second.seatInfo->m_flags & SEAT_FLAG_UNATTACKABLE || seat->second.seatInfo->m_flags & SEAT_FLAG_CAN_CONTROL) { passenger->SetFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NON_ATTACKABLE); passenger->RemoveSpellsCausingAura(SPELL_AURA_MOD_SHAPESHIFT); } if (seatInfo->m_flags & SEAT_FLAG_CAN_CONTROL) { m_pBase->StopMoving(); m_pBase->GetMotionMaster()->Clear(); m_pBase->CombatStop(true); m_pBase->DeleteThreatList(); m_pBase->getHostileRefManager().deleteReferences(); m_pBase->SetCharmerGuid(passenger->GetObjectGuid()); m_pBase->addUnitState(UNIT_STAT_CONTROLLED); passenger->SetCharm(m_pBase); if(m_pBase->HasAuraType(SPELL_AURA_FLY) || m_pBase->HasAuraType(SPELL_AURA_MOD_FLIGHT_SPEED) || ((Creature*)m_pBase)->CanFly()) { WorldPacket data; data.Initialize(SMSG_MOVE_SET_CAN_FLY, 12); data << m_pBase->GetPackGUID(); data << (uint32)(0); m_pBase->SendMessageToSet(&data,false); } if (passenger->GetTypeId() == TYPEID_PLAYER) { m_pBase->SetFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_PLAYER_CONTROLLED); if(m_pBase->GetMap() && !m_pBase->GetMap()->IsBattleGround()) m_pBase->setFaction(passenger->getFaction()); if (CharmInfo* charmInfo = m_pBase->InitCharmInfo(m_pBase)) { charmInfo->InitVehicleCreateSpells(); charmInfo->SetReactState(REACT_PASSIVE); } Player* player = (Player*)passenger; player->SetMover(m_pBase); player->SetClientControl(m_pBase, 1); player->VehicleSpellInitialize(); } if(!(((Creature*)m_pBase)->GetCreatureInfo()->flags_extra & CREATURE_FLAG_EXTRA_KEEP_AI)) ((Creature*)m_pBase)->AIM_Initialize(); if(m_pBase->HasFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_DISABLE_MOVE)) { WorldPacket data2(SMSG_FORCE_MOVE_ROOT, 8+4); data2 << m_pBase->GetPackGUID(); data2 << (uint32)(2); m_pBase->SendMessageToSet(&data2,false); } } passenger->SendMonsterMoveTransport(m_pBase, SPLINETYPE_FACINGANGLE, SPLINEFLAG_UNKNOWN5, 0, 0.0f); RelocatePassengers(m_pBase->GetPositionX(), m_pBase->GetPositionY(), m_pBase->GetPositionZ()+0.5f, m_pBase->GetOrientation()); UpdateFreeSeatCount(); if (m_pBase->GetTypeId() == TYPEID_UNIT) { if (((Creature*)m_pBase)->AI()) ((Creature*)m_pBase)->AI()->PassengerBoarded(passenger, seat->first, true); } return true; }
bool ChatHandler::HandleModifyMountCommand(const char* args) { if(!*args) return false; uint16 mId = 1147; float speed = (float)15; uint32 num = 0; num = atoi((char*)args); switch(num) { case 1: mId=14340; break; case 2: mId=4806; break; case 3: mId=6471; break; case 4: mId=12345; break; case 5: mId=6472; break; case 6: mId=6473; break; case 7: mId=10670; break; case 8: mId=10719; break; case 9: mId=10671; break; case 10: mId=10672; break; case 11: mId=10720; break; case 12: mId=14349; break; case 13: mId=11641; break; case 14: mId=12244; break; case 15: mId=12242; break; case 16: mId=14578; break; case 17: mId=14579; break; case 18: mId=14349; break; case 19: mId=12245; break; case 20: mId=14335; break; case 21: mId=207; break; case 22: mId=2328; break; case 23: mId=2327; break; case 24: mId=2326; break; case 25: mId=14573; break; case 26: mId=14574; break; case 27: mId=14575; break; case 28: mId=604; break; case 29: mId=1166; break; case 30: mId=2402; break; case 31: mId=2410; break; case 32: mId=2409; break; case 33: mId=2408; break; case 34: mId=2405; break; case 35: mId=14337; break; case 36: mId=6569; break; case 37: mId=10661; break; case 38: mId=10666; break; case 39: mId=9473; break; case 40: mId=9476; break; case 41: mId=9474; break; case 42: mId=14374; break; case 43: mId=14376; break; case 44: mId=14377; break; case 45: mId=2404; break; case 46: mId=2784; break; case 47: mId=2787; break; case 48: mId=2785; break; case 49: mId=2736; break; case 50: mId=2786; break; case 51: mId=14347; break; case 52: mId=14346; break; case 53: mId=14576; break; case 54: mId=9695; break; case 55: mId=9991; break; case 56: mId=6448; break; case 57: mId=6444; break; case 58: mId=6080; break; case 59: mId=6447; break; case 60: mId=4805; break; case 61: mId=9714; break; case 62: mId=6448; break; case 63: mId=6442; break; case 64: mId=14632; break; case 65: mId=14332; break; case 66: mId=14331; break; case 67: mId=8469; break; case 68: mId=2830; break; case 69: mId=2346; break; default: SendSysMessage(LANG_NO_MOUNT); return true; } Player *chr = getSelectedPlayer(); if (chr == NULL) { SendSysMessage(LANG_NO_CHAR_SELECTED); return true; } PSendSysMessage(LANG_YOU_GIVE_MOUNT, chr->GetName()); WorldPacket data; char buf[256]; sprintf((char*)buf,LANG_MOUNT_GIVED, m_session->GetPlayer()->GetName()); FillSystemMessageData(&data, m_session, buf); chr->GetSession()->SendPacket(&data); chr->SetUInt32Value( UNIT_FIELD_FLAGS , 0x001000 ); chr->Mount(mId); data.Initialize( SMSG_FORCE_RUN_SPEED_CHANGE, (8+4+4) ); data.append(chr->GetPackGUID()); data << (uint32)0; data << float(speed); chr->SendMessageToSet( &data, true ); data.Initialize( SMSG_FORCE_SWIM_SPEED_CHANGE, (8+4+4) ); data.append(chr->GetPackGUID()); data << (uint32)0; data << float(speed); chr->SendMessageToSet( &data, true ); return true; }
void WorldSession::HandleTurnInPetitionOpcode(WorldPacket & recvData) { sLog->outDebug(LOG_FILTER_NETWORKIO, "Received opcode CMSG_TURN_IN_PETITION"); // Get petition guid from packet WorldPacket data; uint64 petitionGuid; recvData >> petitionGuid; // Check if player really has the required petition charter Item* item = _player->GetItemByGuid(petitionGuid); if (!item) return; sLog->outDebug(LOG_FILTER_NETWORKIO, "Petition %u turned in by %u", GUID_LOPART(petitionGuid), _player->GetGUIDLow()); // Get petition data from db uint32 ownerguidlo; uint32 type; std::string name; PreparedStatement* stmt = CharacterDatabase.GetPreparedStatement(CHAR_SEL_PETITION); stmt->setUInt32(0, GUID_LOPART(petitionGuid)); PreparedQueryResult result = CharacterDatabase.Query(stmt); if (result) { Field* fields = result->Fetch(); ownerguidlo = fields[0].GetUInt32(); name = fields[1].GetString(); type = fields[2].GetUInt8(); } else { sLog->outError(LOG_FILTER_NETWORKIO, "Player %s (guid: %u) tried to turn in petition (guid: %u) that is not present in the database", _player->GetName(), _player->GetGUIDLow(), GUID_LOPART(petitionGuid)); return; } // Only the petition owner can turn in the petition if (_player->GetGUIDLow() != ownerguidlo) return; // Check if player is already in a guild if (_player->GetGuildId()) { data.Initialize(SMSG_TURN_IN_PETITION_RESULTS, 4); data << (uint32)PETITION_TURN_ALREADY_IN_GUILD; _player->GetSession()->SendPacket(&data); return; } // Check if guild name is already taken if (sGuildMgr->GetGuildByName(name)) { Guild::SendCommandResult(this, GUILD_CREATE_S, ERR_GUILD_NAME_EXISTS_S, name); return; } // Get petition signatures from db uint8 signatures; stmt = CharacterDatabase.GetPreparedStatement(CHAR_SEL_PETITION_SIGNATURE); stmt->setUInt32(0, GUID_LOPART(petitionGuid)); result = CharacterDatabase.Query(stmt); if (result) signatures = uint8(result->GetRowCount()); else signatures = 0; uint32 requiredSignatures; requiredSignatures = sWorld->getIntConfig(CONFIG_MIN_PETITION_SIGNS); // Notify player if signatures are missing if (signatures < requiredSignatures) { data.Initialize(SMSG_TURN_IN_PETITION_RESULTS, 4); data << (uint32)PETITION_TURN_NEED_MORE_SIGNATURES; SendPacket(&data); return; } // Proceed with guild/arena team creation // Delete charter item _player->DestroyItem(item->GetBagSlot(), item->GetSlot(), true); // Create guild Guild* guild = new Guild; if (!guild->Create(_player, name)) { delete guild; return; } // Register guild and add guild master sGuildMgr->AddGuild(guild); // Add members from signatures for (uint8 i = 0; i < signatures; ++i) { Field* fields = result->Fetch(); guild->AddMember(MAKE_NEW_GUID(fields[0].GetUInt32(), 0, HIGHGUID_PLAYER)); result->NextRow(); } SQLTransaction trans = CharacterDatabase.BeginTransaction(); stmt = CharacterDatabase.GetPreparedStatement(CHAR_DEL_PETITION_BY_GUID); stmt->setUInt32(0, GUID_LOPART(petitionGuid)); trans->Append(stmt); stmt = CharacterDatabase.GetPreparedStatement(CHAR_DEL_PETITION_SIGNATURE_BY_GUID); stmt->setUInt32(0, GUID_LOPART(petitionGuid)); trans->Append(stmt); CharacterDatabase.CommitTransaction(trans); // created sLog->outDebug(LOG_FILTER_NETWORKIO, "TURN IN PETITION GUID %u", GUID_LOPART(petitionGuid)); data.Initialize(SMSG_TURN_IN_PETITION_RESULTS, 4); data << (uint32)PETITION_TURN_OK; SendPacket(&data); }
void WorldSession::HandleTurnInPetitionOpcode(WorldPacket & recv_data) { sLog->outDebug(LOG_FILTER_NETWORKIO, "Received opcode CMSG_TURN_IN_PETITION"); // ok //recv_data.hexlike(); WorldPacket data; uint64 petitionguid; uint32 ownerguidlo; uint32 type; std::string name; recv_data >> petitionguid; sLog->outDebug(LOG_FILTER_NETWORKIO, "Petition %u turned in by %u", GUID_LOPART(petitionguid), _player->GetGUIDLow()); // data QueryResult result = CharacterDatabase.PQuery("SELECT ownerguid, name, type FROM petition WHERE petitionguid = '%u'", GUID_LOPART(petitionguid)); if (result) { Field *fields = result->Fetch(); ownerguidlo = fields[0].GetUInt32(); name = fields[1].GetString(); type = fields[2].GetUInt8(); } else { sLog->outError("petition table has broken data!"); return; } if (type == GUILD_CHARTER_TYPE) { if (_player->GetGuildId()) { data.Initialize(SMSG_TURN_IN_PETITION_RESULTS, 4); data << (uint32)PETITION_TURN_ALREADY_IN_GUILD; // already in guild _player->GetSession()->SendPacket(&data); return; } } else { uint8 slot = ArenaTeam::GetSlotByType(type); if (slot >= MAX_ARENA_SLOT) return; if (_player->GetArenaTeamId(slot)) { //data.Initialize(SMSG_TURN_IN_PETITION_RESULTS, 4); //data << (uint32)PETITION_TURN_ALREADY_IN_GUILD; // already in guild //_player->GetSession()->SendPacket(&data); SendArenaTeamCommandResult(ERR_ARENA_TEAM_CREATE_S, name, "", ERR_ALREADY_IN_ARENA_TEAM); return; } } if (_player->GetGUIDLow() != ownerguidlo) return; // signs uint8 signs; result = CharacterDatabase.PQuery("SELECT playerguid FROM petition_sign WHERE petitionguid = '%u'", GUID_LOPART(petitionguid)); if (result) signs = uint8(result->GetRowCount()); else signs = 0; uint32 count; //if (signs < sWorld->getIntConfig(CONFIG_MIN_PETITION_SIGNS)) if (type == GUILD_CHARTER_TYPE) count = sWorld->getIntConfig(CONFIG_MIN_PETITION_SIGNS); else count = type-1; if (signs < count) { data.Initialize(SMSG_TURN_IN_PETITION_RESULTS, 4); data << (uint32)PETITION_TURN_NEED_MORE_SIGNATURES; // need more signatures... SendPacket(&data); return; } if (type == GUILD_CHARTER_TYPE) { if (sObjectMgr->GetGuildByName(name)) { Guild::SendCommandResult(this, GUILD_CREATE_S, ERR_GUILD_NAME_EXISTS_S, name); return; } } else { if (sObjectMgr->GetArenaTeamByName(name)) { SendArenaTeamCommandResult(ERR_ARENA_TEAM_CREATE_S, name, "", ERR_ARENA_TEAM_NAME_EXISTS_S); return; } } // and at last charter item check Item *item = _player->GetItemByGuid(petitionguid); if (!item) return; // OK! // delete charter item _player->DestroyItem(item->GetBagSlot(),item->GetSlot(), true); if (type == GUILD_CHARTER_TYPE) // create guild { Guild* guild = new Guild; if (!guild->Create(_player, name)) { delete guild; return; } // register guild and add guildmaster sObjectMgr->AddGuild(guild); // add members for (uint8 i = 0; i < signs; ++i) { Field* fields = result->Fetch(); guild->AddMember(fields[0].GetUInt64()); result->NextRow(); } } else // or arena team { ArenaTeam* at = new ArenaTeam; if (!at->Create(_player->GetGUID(), type, name)) { sLog->outError("PetitionsHandler: arena team create failed."); delete at; return; } uint32 icon, iconcolor, border, bordercolor, backgroud; recv_data >> backgroud >> icon >> iconcolor >> border >> bordercolor; at->SetEmblem(backgroud, icon, iconcolor, border, bordercolor); // register team and add captain sObjectMgr->AddArenaTeam(at); sLog->outDebug(LOG_FILTER_NETWORKIO, "PetitonsHandler: arena team added to objmrg"); // add members for (uint8 i = 0; i < signs; ++i) { Field* fields = result->Fetch(); uint64 memberGUID = fields[0].GetUInt64(); sLog->outDebug(LOG_FILTER_NETWORKIO, "PetitionsHandler: adding arena member %u", GUID_LOPART(memberGUID)); at->AddMember(memberGUID); result->NextRow(); } } SQLTransaction trans = CharacterDatabase.BeginTransaction(); trans->PAppend("DELETE FROM petition WHERE petitionguid = '%u'", GUID_LOPART(petitionguid)); trans->PAppend("DELETE FROM petition_sign WHERE petitionguid = '%u'", GUID_LOPART(petitionguid)); CharacterDatabase.CommitTransaction(trans); // created sLog->outDebug(LOG_FILTER_NETWORKIO, "TURN IN PETITION GUID %u", GUID_LOPART(petitionguid)); data.Initialize(SMSG_TURN_IN_PETITION_RESULTS, 4); data << (uint32)PETITION_TURN_OK; SendPacket(&data); }
void Group::UpdateOutOfRangePlayer(Player* pPlayer, uint32 Flags, bool Distribute, WorldPacket* Packet) { uint8 member_flags = 0x01; WorldPacket* data = Packet; if(!Packet) data = new WorldPacket(SMSG_PARTY_MEMBER_STATS, 500); if(pPlayer->GetPowerType() != POWER_TYPE_MANA) Flags |= GROUP_UPDATE_FLAG_POWER_TYPE; if( pPlayer->GetCurrentVehicle() != NULL ) Flags |= GROUP_UPDATE_FLAG_VEHICLE_SEAT; /*Flags |= GROUP_UPDATE_FLAG_PET_NAME; Flags |= GROUP_UPDATE_FLAG_PET_UNK_1;*/ data->Initialize(SMSG_PARTY_MEMBER_STATS); if((Flags & GROUP_UPDATE_TYPE_FULL_REQUEST_REPLY) == GROUP_UPDATE_TYPE_FULL_REQUEST_REPLY) *data << uint8(0); *data << pPlayer->GetNewGUID(); *data << Flags; if(Flags & GROUP_UPDATE_FLAG_ONLINE) { if(pPlayer->IsPvPFlagged()) member_flags |= 0x02; if(pPlayer->getDeathState() == CORPSE) member_flags |= 0x08; else if(pPlayer->IsDead()) member_flags |= 0x10; *data << member_flags << uint8(0); } if(Flags & GROUP_UPDATE_FLAG_HEALTH) *data << uint32(pPlayer->GetHealth()); if(Flags & GROUP_UPDATE_FLAG_MAXHEALTH) *data << uint32(pPlayer->GetMaxHealth()); if(Flags & GROUP_UPDATE_FLAG_POWER_TYPE) *data << uint8(pPlayer->GetPowerType()); if(Flags & GROUP_UPDATE_FLAG_POWER) *data << uint16(pPlayer->GetPower(pPlayer->GetPowerType())); if(Flags & GROUP_UPDATE_FLAG_MAXPOWER) *data << uint16(pPlayer->GetMaxPower(pPlayer->GetPowerType())); if(Flags & GROUP_UPDATE_FLAG_LEVEL) *data << uint16(pPlayer->getLevel()); if(Flags & GROUP_UPDATE_FLAG_ZONEID) { *data << uint16(pPlayer->GetAreaID()); } if(Flags & GROUP_UPDATE_FLAG_POSITION) { *data << int16(pPlayer->GetPositionX()) << int16(pPlayer->GetPositionY()); // wtf packed floats? O.o pPlayer->m_last_group_position = pPlayer->GetPosition(); } if( Flags & GROUP_UPDATE_FLAG_VEHICLE_SEAT ){ if( pPlayer->GetCurrentVehicle() != NULL ) *data << uint32( pPlayer->GetCurrentVehicle()->GetSeatEntryForPassenger( pPlayer ) ); } if(Flags & GROUP_UPDATE_TYPE_FULL_REQUEST_REPLY) { *data << uint64(0xFF00000000000000ULL); *data << uint8(0); *data << uint64(0xFF00000000000000ULL); } if(Distribute && pPlayer->IsInWorld()) { Player* plr; float dist = pPlayer->GetMapMgr()->m_UpdateDistance; m_groupLock.Acquire(); for(uint32 i = 0; i < m_SubGroupCount; ++i) { if(m_SubGroups[i] == NULL) continue; for(GroupMembersSet::iterator itr = m_SubGroups[i]->GetGroupMembersBegin(); itr != m_SubGroups[i]->GetGroupMembersEnd();) { plr = (*itr)->m_loggedInPlayer; ++itr; if(plr && plr != pPlayer) { if(plr->GetDistance2dSq(pPlayer) > dist) plr->GetSession()->SendPacket(data); } } } m_groupLock.Release(); } if(!Packet) delete data; }
size_t ChatHandler::BuildChatPacket(WorldPacket& data, ChatMsg chatType, Language language, ObjectGuid senderGUID, ObjectGuid receiverGUID, std::string const& message, uint8 chatTag, std::string const& senderName /*= ""*/, std::string const& receiverName /*= ""*/, uint32 achievementId /*= 0*/, bool gmMessage /*= false*/, std::string const& channelName /*= ""*/) { size_t receiverGUIDPos = 0; data.Initialize(!gmMessage ? SMSG_MESSAGECHAT : SMSG_GM_MESSAGECHAT); data << uint8(chatType); data << int32(language); data << uint64(senderGUID); data << uint32(0); // some flags switch (chatType) { case CHAT_MSG_MONSTER_SAY: case CHAT_MSG_MONSTER_PARTY: case CHAT_MSG_MONSTER_YELL: case CHAT_MSG_MONSTER_WHISPER: case CHAT_MSG_MONSTER_EMOTE: case CHAT_MSG_RAID_BOSS_EMOTE: case CHAT_MSG_RAID_BOSS_WHISPER: case CHAT_MSG_BATTLENET: data << uint32(senderName.length() + 1); data << senderName; receiverGUIDPos = data.wpos(); data << uint64(receiverGUID); if (receiverGUID && !receiverGUID.IsPlayer() && !receiverGUID.IsPet()) { data << uint32(receiverName.length() + 1); data << receiverName; } break; case CHAT_MSG_WHISPER_FOREIGN: data << uint32(senderName.length() + 1); data << senderName; receiverGUIDPos = data.wpos(); data << uint64(receiverGUID); break; case CHAT_MSG_BG_SYSTEM_NEUTRAL: case CHAT_MSG_BG_SYSTEM_ALLIANCE: case CHAT_MSG_BG_SYSTEM_HORDE: receiverGUIDPos = data.wpos(); data << uint64(receiverGUID); if (receiverGUID && !receiverGUID.IsPlayer()) { data << uint32(receiverName.length() + 1); data << receiverName; } break; case CHAT_MSG_ACHIEVEMENT: case CHAT_MSG_GUILD_ACHIEVEMENT: receiverGUIDPos = data.wpos(); data << uint64(receiverGUID); break; default: if (gmMessage) { data << uint32(senderName.length() + 1); data << senderName; } if (chatType == CHAT_MSG_CHANNEL) { ASSERT(channelName.length() > 0); data << channelName; } receiverGUIDPos = data.wpos(); data << uint64(receiverGUID); break; } data << uint32(message.length() + 1); data << message; data << uint8(chatTag); if (chatType == CHAT_MSG_ACHIEVEMENT || chatType == CHAT_MSG_GUILD_ACHIEVEMENT) data << uint32(achievementId); return receiverGUIDPos; }
void Group::Disband(bool hideDestroy) { Player* player; for (member_citerator citr = m_memberSlots.begin(); citr != m_memberSlots.end(); ++citr) { player = sObjectMgr.GetPlayer(citr->guid); if (!player) continue; // we cannot call _removeMember because it would invalidate member iterator // if we are removing player from battleground raid if (isBGGroup()) player->RemoveFromBattleGroundRaid(); else { // we can remove player who is in battleground from his original group if (player->GetOriginalGroup() == this) player->SetOriginalGroup(nullptr); else player->SetGroup(nullptr); } // quest related GO state dependent from raid membership if (isRaidGroup()) player->UpdateForQuestWorldObjects(); if (!player->GetSession()) continue; WorldPacket data; if (!hideDestroy) { data.Initialize(SMSG_GROUP_DESTROYED, 0); player->GetSession()->SendPacket(&data); } // we already removed player from group and in player->GetGroup() is his original group, send update if (Group* group = player->GetGroup()) { group->SendUpdate(); } else { data.Initialize(SMSG_GROUP_LIST, 24); data << uint64(0) << uint64(0) << uint64(0); player->GetSession()->SendPacket(&data); } _homebindIfInstance(player); } m_memberSlots.clear(); RemoveAllInvites(); if (!isBGGroup()) { CharacterDatabase.BeginTransaction(); CharacterDatabase.PExecute("DELETE FROM groups WHERE groupId='%u'", m_Id); CharacterDatabase.PExecute("DELETE FROM group_member WHERE groupId='%u'", m_Id); CharacterDatabase.CommitTransaction(); ResetInstances(INSTANCE_RESET_GROUP_DISBAND, nullptr); } m_leaderGuid.Clear(); m_leaderName.clear(); }
void WorldSession::BuildPartyMemberStatsChangedPacket(Player* player, WorldPacket& data) { uint32 mask = player->GetGroupUpdateFlag(); if (mask & GROUP_UPDATE_FLAG_POWER_TYPE) // if update power type, update current/max power also mask |= (GROUP_UPDATE_FLAG_CUR_POWER | GROUP_UPDATE_FLAG_MAX_POWER); if (mask & GROUP_UPDATE_FLAG_PET_POWER_TYPE) // same for pets mask |= (GROUP_UPDATE_FLAG_PET_CUR_POWER | GROUP_UPDATE_FLAG_PET_MAX_POWER); uint32 byteCount = 0; for (int i = 1; i < GROUP_UPDATE_FLAGS_COUNT; ++i) if (mask & (1 << i)) byteCount += GroupUpdateLength[i]; data.Initialize(SMSG_PARTY_MEMBER_STATS, 8 + 4 + byteCount); data << player->GetPackGUID(); data << uint32(mask); if (mask & GROUP_UPDATE_FLAG_STATUS) data << uint16(GetGroupMemberStatus(player)); if (mask & GROUP_UPDATE_FLAG_CUR_HP) data << uint32(player->GetHealth()); if (mask & GROUP_UPDATE_FLAG_MAX_HP) data << uint32(player->GetMaxHealth()); Powers powerType = player->GetPowerType(); if (mask & GROUP_UPDATE_FLAG_POWER_TYPE) data << uint8(powerType); if (mask & GROUP_UPDATE_FLAG_CUR_POWER) data << uint16(player->GetPower(powerType)); if (mask & GROUP_UPDATE_FLAG_MAX_POWER) data << uint16(player->GetMaxPower(powerType)); if (mask & GROUP_UPDATE_FLAG_LEVEL) data << uint16(player->getLevel()); if (mask & GROUP_UPDATE_FLAG_ZONE) data << uint16(player->GetZoneId()); if (mask & GROUP_UPDATE_FLAG_POSITION) data << uint16(player->GetPositionX()) << uint16(player->GetPositionY()); if (mask & GROUP_UPDATE_FLAG_AURAS) { const uint64& auramask = player->GetAuraUpdateMask(); data << uint64(auramask); for (uint32 i = 0; i < MAX_AURAS; ++i) { if (auramask & (uint64(1) << i)) { data << uint32(player->GetVisibleAura(i)); data << uint8(1); } } } Pet* pet = player->GetPet(); if (mask & GROUP_UPDATE_FLAG_PET_GUID) data << (pet ? pet->GetObjectGuid() : ObjectGuid()); if (mask & GROUP_UPDATE_FLAG_PET_NAME) { if (pet) data << pet->GetName(); else data << uint8(0); } if (mask & GROUP_UPDATE_FLAG_PET_MODEL_ID) { if (pet) data << uint16(pet->GetDisplayId()); else data << uint16(0); } if (mask & GROUP_UPDATE_FLAG_PET_CUR_HP) { if (pet) data << uint32(pet->GetHealth()); else data << uint32(0); } if (mask & GROUP_UPDATE_FLAG_PET_MAX_HP) { if (pet) data << uint32(pet->GetMaxHealth()); else data << uint32(0); } if (mask & GROUP_UPDATE_FLAG_PET_POWER_TYPE) { if (pet) data << uint8(pet->GetPowerType()); else data << uint8(0); } if (mask & GROUP_UPDATE_FLAG_PET_CUR_POWER) { if (pet) data << uint16(pet->GetPower(pet->GetPowerType())); else data << uint16(0); } if (mask & GROUP_UPDATE_FLAG_PET_MAX_POWER) { if (pet) data << uint16(pet->GetMaxPower(pet->GetPowerType())); else data << uint16(0); } if (mask & GROUP_UPDATE_FLAG_PET_AURAS) { if (pet) { const uint64& auramask = pet->GetAuraUpdateMask(); data << uint64(auramask); for (uint32 i = 0; i < MAX_AURAS; ++i) { if (auramask & (uint64(1) << i)) { data << uint32(pet->GetVisibleAura(i)); data << uint8(1); } } } else data << uint64(0); } if (mask & GROUP_UPDATE_FLAG_VEHICLE_SEAT) { if (player->GetTransportInfo()) data << uint32(((Unit*)player->GetTransportInfo()->GetTransport())->GetVehicleInfo()->GetVehicleEntry()->m_seatID[player->GetTransportInfo()->GetTransportSeat()]); else data << uint32(0); } }