diff options
Diffstat (limited to 'src/server')
-rw-r--r-- | src/server/game/Entities/Creature/Creature.cpp | 2 | ||||
-rw-r--r-- | src/server/game/Entities/Player/Player.cpp | 161 | ||||
-rw-r--r-- | src/server/game/Entities/Player/Player.h | 28 | ||||
-rw-r--r-- | src/server/game/Entities/Unit/Unit.cpp | 2 | ||||
-rw-r--r-- | src/server/game/Handlers/CharacterHandler.cpp | 70 | ||||
-rw-r--r-- | src/server/game/Handlers/ChatHandler.cpp | 2 | ||||
-rw-r--r-- | src/server/game/Handlers/QuestHandler.cpp | 18 | ||||
-rw-r--r-- | src/server/game/Server/Packets/EquipmentSetPackets.cpp | 43 | ||||
-rw-r--r-- | src/server/game/Server/Packets/EquipmentSetPackets.h | 25 | ||||
-rw-r--r-- | src/server/game/Server/Packets/MovementPackets.cpp | 34 | ||||
-rw-r--r-- | src/server/game/Server/Packets/MovementPackets.h | 2 | ||||
-rw-r--r-- | src/server/game/Server/Packets/QuestPackets.h | 8 | ||||
-rw-r--r-- | src/server/game/Server/Packets/SpellPackets.cpp | 2 | ||||
-rw-r--r-- | src/server/game/Server/Protocol/Opcodes.cpp | 7 | ||||
-rw-r--r-- | src/server/game/Server/WorldSession.h | 7 |
15 files changed, 213 insertions, 198 deletions
diff --git a/src/server/game/Entities/Creature/Creature.cpp b/src/server/game/Entities/Creature/Creature.cpp index 3765c54b42a..3a74d2cc045 100644 --- a/src/server/game/Entities/Creature/Creature.cpp +++ b/src/server/game/Entities/Creature/Creature.cpp @@ -1832,7 +1832,7 @@ void Creature::SendAIReaction(AiReaction reactionType) packet.UnitGUID = GetGUID(); packet.Reaction = reactionType; - ((WorldObject*)this)->SendMessageToSet(packet.Write(), true); + SendMessageToSet(packet.Write(), true); TC_LOG_DEBUG("network", "WORLD: Sent SMSG_AI_REACTION, type %u.", reactionType); } diff --git a/src/server/game/Entities/Player/Player.cpp b/src/server/game/Entities/Player/Player.cpp index a11c75a2c6f..96ab5c860c6 100644 --- a/src/server/game/Entities/Player/Player.cpp +++ b/src/server/game/Entities/Player/Player.cpp @@ -2166,7 +2166,7 @@ bool Player::TeleportTo(uint32 mapid, float x, float y, float z, float orientati packet.Pos = m_teleport_dest; packet.Reason = 16; - GetSession()->SendPacket(packet.Write()); + SendDirectMessage(packet.Write()); SendSavedInstances(); } @@ -6217,7 +6217,7 @@ void Player::SendActionButtons(uint32 state) const packet.Reason = state; - GetSession()->SendPacket(packet.Write()); + SendDirectMessage(packet.Write()); TC_LOG_INFO("network", "Action Buttons for '%s' group '%u' Sent", GetGUID().ToString().c_str(), GetActiveTalentGroup()); } @@ -16745,28 +16745,25 @@ void Player::_LoadEquipmentSets(PreparedQueryResult result) if (!result) return; - uint32 count = 0; do { Field* fields = result->Fetch(); - EquipmentSet eqSet; + EquipmentSetInfo eqSet; - eqSet.Guid = fields[0].GetUInt64(); - uint8 index = fields[1].GetUInt8(); - eqSet.Name = fields[2].GetString(); - eqSet.IconName = fields[3].GetString(); - eqSet.IgnoreMask = fields[4].GetUInt32(); - eqSet.state = EQUIPMENT_SET_UNCHANGED; + eqSet.Data.Guid = fields[0].GetUInt64(); + eqSet.Data.SetID = fields[1].GetUInt8(); + eqSet.Data.SetName = fields[2].GetString(); + eqSet.Data.SetIcon = fields[3].GetString(); + eqSet.Data.IgnoreMask = fields[4].GetUInt32(); + eqSet.State = EQUIPMENT_SET_UNCHANGED; for (uint32 i = 0; i < EQUIPMENT_SLOT_END; ++i) - eqSet.Items[i] = fields[5 + i].GetUInt64(); + eqSet.Data.Pieces[i] = ObjectGuid::Create<HighGuid::Item>(fields[5 + i].GetUInt64()); - m_EquipmentSets[index] = eqSet; - - ++count; + if (eqSet.Data.SetID >= MAX_EQUIPMENT_SET_INDEX) // client limit + continue; - if (count >= MAX_EQUIPMENT_SET_INDEX) // client limit - break; + _equipmentSets[eqSet.Data.SetID] = eqSet; } while (result->NextRow()); } @@ -20463,7 +20460,7 @@ void Player::WhisperAddon(std::string const& text, const std::string& prefix, Pl WorldPackets::Chat::Chat packet; ChatHandler::BuildChatPacket(&packet, CHAT_MSG_WHISPER, LANG_ADDON, this, this, text, 0, "", DEFAULT_LOCALE, prefix); - receiver->GetSession()->SendPacket(packet.Write()); + receiver->SendDirectMessage(packet.Write()); } void Player::Whisper(std::string const& text, Language language, Player* target, bool /*= false*/) @@ -20480,14 +20477,14 @@ void Player::Whisper(std::string const& text, Language language, Player* target, WorldPackets::Chat::Chat packet; ChatHandler::BuildChatPacket(&packet, CHAT_MSG_WHISPER, Language(language), this, this, _text); - target->GetSession()->SendPacket(packet.Write()); + target->SendDirectMessage(packet.Write()); // rest stuff shouldn't happen in case of addon message if (isAddonMessage) return; ChatHandler::BuildChatPacket(&packet, CHAT_MSG_WHISPER_INFORM, Language(language), target, target, _text); - GetSession()->SendPacket(packet.Write()); + SendDirectMessage(packet.Write()); if (!isAcceptWhispers() && !IsGameMaster() && !target->IsGameMaster()) { @@ -20980,7 +20977,7 @@ void Player::SendProficiency(ItemClass itemClass, uint32 itemSubclassMask) WorldPackets::Item::SetProficiency packet; packet.ProficiencyMask = itemSubclassMask; packet.ProficiencyClass = itemClass; - GetSession()->SendPacket(packet.Write()); + SendDirectMessage(packet.Write()); } void Player::RemovePetitionsAndSigns(ObjectGuid guid, uint32 type) @@ -25627,7 +25624,7 @@ void Player::SendTalentsInfoData() packet.Info.TalentGroups.push_back(groupInfoPkt); } - GetSession()->SendPacket(packet.Write()); + SendDirectMessage(packet.Write()); } void Player::BuildEnchantmentsInfoData(WorldPacket* data) @@ -25677,117 +25674,98 @@ void Player::SendEquipmentSetList() { WorldPackets::EquipmentSet::LoadEquipmentSet data; - for (EquipmentSets::iterator itr = m_EquipmentSets.begin(); itr != m_EquipmentSets.end(); ++itr) + for (EquipmentSetContainer::value_type const& eqSet : _equipmentSets) { - if (itr->second.state == EQUIPMENT_SET_DELETED) + if (eqSet.second.State == EQUIPMENT_SET_DELETED) continue; - WorldPackets::EquipmentSet::EquipmentSetData setData; - setData.Guid = itr->second.Guid; - setData.SetID = itr->first; - setData.IgnoreMask = itr->second.IgnoreMask; - setData.SetName = itr->second.Name; - setData.SetIcon = itr->second.IconName; - - for (uint32 i = 0; i < EQUIPMENT_SLOT_END; ++i) - { - if (!(itr->second.IgnoreMask & (1 << i))) - setData.Pieces[i] = ObjectGuid::Create<HighGuid::Item>(itr->second.Items[i]); - } - - data.SetData.emplace_back(setData); + data.SetData.push_back(&eqSet.second.Data); } SendDirectMessage(data.Write()); } -void Player::SetEquipmentSet(uint32 index, EquipmentSet eqset) +void Player::SetEquipmentSet(EquipmentSetInfo::EquipmentSetData&& newEqSet) { - if (eqset.Guid != 0) + if (newEqSet.Guid != 0) { - bool found = false; - - for (EquipmentSets::iterator itr = m_EquipmentSets.begin(); itr != m_EquipmentSets.end(); ++itr) - { - if ((itr->second.Guid == eqset.Guid) && (itr->first == index)) - { - found = true; - break; - } - } - - if (!found) // something wrong... + // something wrong... + EquipmentSetContainer::const_iterator itr = _equipmentSets.find(newEqSet.SetID); + if (itr == _equipmentSets.end() || itr->second.Data.Guid != newEqSet.Guid) { - TC_LOG_ERROR("entities.player", "Player %s tried to save equipment set " UI64FMTD " (index %u), but that equipment set not found!", GetName().c_str(), eqset.Guid, index); + TC_LOG_ERROR("entities.player", "Player %s tried to save equipment set " UI64FMTD " (index: %u), but that equipment set not found!", GetName().c_str(), newEqSet.Guid, newEqSet.SetID); return; } } - EquipmentSet& eqslot = m_EquipmentSets[index]; + EquipmentSetInfo& eqSlot = _equipmentSets[newEqSet.SetID]; - EquipmentSetUpdateState old_state = eqslot.state; + EquipmentSetUpdateState oldState = eqSlot.State; - eqslot = eqset; + eqSlot.Data = newEqSet; - if (eqset.Guid == 0) + if (eqSlot.Data.Guid == 0) { - eqslot.Guid = sObjectMgr->GenerateEquipmentSetGuid(); + eqSlot.Data.Guid = sObjectMgr->GenerateEquipmentSetGuid(); - WorldPacket data(SMSG_EQUIPMENT_SET_SAVED, 4 + 1); - data << uint32(index); - data.AppendPackedUInt64(eqslot.Guid); - GetSession()->SendPacket(&data); + WorldPackets::EquipmentSet::EquipmentSetID data; + data.GUID = eqSlot.Data.Guid; + data.SetID = eqSlot.Data.SetID; + SendDirectMessage(data.Write()); } - eqslot.state = old_state == EQUIPMENT_SET_NEW ? EQUIPMENT_SET_NEW : EQUIPMENT_SET_CHANGED; + eqSlot.State = oldState == EQUIPMENT_SET_NEW ? EQUIPMENT_SET_NEW : EQUIPMENT_SET_CHANGED; } void Player::_SaveEquipmentSets(SQLTransaction& trans) { - for (EquipmentSets::iterator itr = m_EquipmentSets.begin(); itr != m_EquipmentSets.end();) + for (EquipmentSetContainer::iterator itr = _equipmentSets.begin(); itr != _equipmentSets.end();) { - uint32 index = itr->first; - EquipmentSet& eqset = itr->second; - PreparedStatement* stmt = NULL; + EquipmentSetInfo& eqSet = itr->second; + PreparedStatement* stmt = nullptr; uint8 j = 0; - switch (eqset.state) + switch (eqSet.State) { case EQUIPMENT_SET_UNCHANGED: ++itr; break; // nothing do case EQUIPMENT_SET_CHANGED: stmt = CharacterDatabase.GetPreparedStatement(CHAR_UPD_EQUIP_SET); - stmt->setString(j++, eqset.Name.c_str()); - stmt->setString(j++, eqset.IconName.c_str()); - stmt->setUInt32(j++, eqset.IgnoreMask); - for (uint8 i=0; i<EQUIPMENT_SLOT_END; ++i) - stmt->setUInt64(j++, eqset.Items[i]); + stmt->setString(j++, eqSet.Data.SetName); + stmt->setString(j++, eqSet.Data.SetIcon); + stmt->setUInt32(j++, eqSet.Data.IgnoreMask); + + for (uint8 i = 0; i < EQUIPMENT_SLOT_END; ++i) + stmt->setUInt64(j++, eqSet.Data.Pieces[i].GetCounter()); + stmt->setUInt64(j++, GetGUID().GetCounter()); - stmt->setUInt64(j++, eqset.Guid); - stmt->setUInt32(j, index); + stmt->setUInt64(j++, eqSet.Data.Guid); + stmt->setUInt32(j, eqSet.Data.SetID); trans->Append(stmt); - eqset.state = EQUIPMENT_SET_UNCHANGED; + eqSet.State = EQUIPMENT_SET_UNCHANGED; ++itr; break; case EQUIPMENT_SET_NEW: stmt = CharacterDatabase.GetPreparedStatement(CHAR_INS_EQUIP_SET); stmt->setUInt64(j++, GetGUID().GetCounter()); - stmt->setUInt64(j++, eqset.Guid); - stmt->setUInt32(j++, index); - stmt->setString(j++, eqset.Name.c_str()); - stmt->setString(j++, eqset.IconName.c_str()); - stmt->setUInt32(j++, eqset.IgnoreMask); - for (uint8 i=0; i<EQUIPMENT_SLOT_END; ++i) - stmt->setUInt64(j++, eqset.Items[i]); + stmt->setUInt64(j++, eqSet.Data.Guid); + stmt->setUInt32(j++, eqSet.Data.SetID); + stmt->setString(j++, eqSet.Data.SetName); + stmt->setString(j++, eqSet.Data.SetIcon); + stmt->setUInt32(j++, eqSet.Data.IgnoreMask); + + for (uint8 i = 0; i < EQUIPMENT_SLOT_END; ++i) + stmt->setUInt64(j++, eqSet.Data.Pieces[i].GetCounter()); + trans->Append(stmt); - eqset.state = EQUIPMENT_SET_UNCHANGED; + eqSet.State = EQUIPMENT_SET_UNCHANGED; ++itr; break; case EQUIPMENT_SET_DELETED: stmt = CharacterDatabase.GetPreparedStatement(CHAR_DEL_EQUIP_SET); - stmt->setUInt64(0, eqset.Guid); + stmt->setUInt64(0, eqSet.Data.Guid); trans->Append(stmt); - m_EquipmentSets.erase(itr++); + itr = _equipmentSets.erase(itr); break; } } @@ -25816,16 +25794,17 @@ void Player::_SaveBGData(SQLTransaction& trans) void Player::DeleteEquipmentSet(uint64 setGuid) { - for (EquipmentSets::iterator itr = m_EquipmentSets.begin(); itr != m_EquipmentSets.end(); ++itr) + for (EquipmentSetContainer::iterator itr = _equipmentSets.begin(); itr != _equipmentSets.end();) { - if (itr->second.Guid == setGuid) + if (itr->second.Data.Guid == setGuid) { - if (itr->second.state == EQUIPMENT_SET_NEW) - m_EquipmentSets.erase(itr); + if (itr->second.State == EQUIPMENT_SET_NEW) + itr = _equipmentSets.erase(itr); else - itr->second.state = EQUIPMENT_SET_DELETED; + itr->second.State = EQUIPMENT_SET_DELETED; break; } + ++itr; } } @@ -26191,7 +26170,7 @@ void Player::SendTimeSync() WorldPackets::Misc::TimeSyncRequest packet; packet.SequenceIndex = m_timeSyncQueue.back(); - GetSession()->SendPacket(packet.Write()); + SendDirectMessage(packet.Write()); // Schedule next sync in 10 sec m_timeSyncTimer = 10000; diff --git a/src/server/game/Entities/Player/Player.h b/src/server/game/Entities/Player/Player.h index ac3becd987a..165819a5eaf 100644 --- a/src/server/game/Entities/Player/Player.h +++ b/src/server/game/Entities/Player/Player.h @@ -747,24 +747,26 @@ enum EquipmentSetUpdateState EQUIPMENT_SET_DELETED = 3 }; -struct EquipmentSet +struct EquipmentSetInfo { - EquipmentSet() : Guid(0), IgnoreMask(0), state(EQUIPMENT_SET_NEW) + /// Data sent in EquipmentSet related packets + struct EquipmentSetData { - memset(Items, 0, sizeof(Items)); - } + uint64 Guid = 0; ///< Set Identifier + uint32 SetID = 0; ///< Index + uint32 IgnoreMask = 0; ///< Mask of EquipmentSlot + std::string SetName; + std::string SetIcon; + ObjectGuid Pieces[EQUIPMENT_SLOT_END]; + } Data; - uint64 Guid; - std::string Name; - std::string IconName; - uint32 IgnoreMask; - ObjectGuid::LowType Items[EQUIPMENT_SLOT_END]; - EquipmentSetUpdateState state; + /// Server-side data + EquipmentSetUpdateState State = EQUIPMENT_SET_NEW; }; #define MAX_EQUIPMENT_SET_INDEX 10 // client limit -typedef std::map<uint32, EquipmentSet> EquipmentSets; +typedef std::map<uint32, EquipmentSetInfo> EquipmentSetContainer; struct ItemPosCount { @@ -2229,7 +2231,7 @@ class Player : public Unit, public GridObject<Player> void CastItemCombatSpell(Unit* target, WeaponAttackType attType, uint32 procVictim, uint32 procEx, Item* item, ItemTemplate const* proto); void SendEquipmentSetList(); - void SetEquipmentSet(uint32 index, EquipmentSet eqset); + void SetEquipmentSet(EquipmentSetInfo::EquipmentSetData&& newEqSet); void DeleteEquipmentSet(uint64 setGuid); void SendInitWorldStates(uint32 zone, uint32 area); @@ -2842,7 +2844,7 @@ class Player : public Unit, public GridObject<Player> DeclinedName *m_declinedname; Runes *m_runes; - EquipmentSets m_EquipmentSets; + EquipmentSetContainer _equipmentSets; bool CanAlwaysSee(WorldObject const* obj) const override; diff --git a/src/server/game/Entities/Unit/Unit.cpp b/src/server/game/Entities/Unit/Unit.cpp index 77d5a28b1ce..121eed89e3c 100644 --- a/src/server/game/Entities/Unit/Unit.cpp +++ b/src/server/game/Entities/Unit/Unit.cpp @@ -12868,7 +12868,7 @@ void Unit::SendPetAIReaction(ObjectGuid guid) WorldPackets::Combat::AIReaction packet; packet.UnitGUID = guid; packet.Reaction = AI_REACTION_HOSTILE; - owner->ToPlayer()->GetSession()->SendPacket(packet.Write()); + owner->ToPlayer()->SendDirectMessage(packet.Write()); } ///----------End of Pet responses methods---------- diff --git a/src/server/game/Handlers/CharacterHandler.cpp b/src/server/game/Handlers/CharacterHandler.cpp index a2e6f4b0340..42db4f42953 100644 --- a/src/server/game/Handlers/CharacterHandler.cpp +++ b/src/server/game/Handlers/CharacterHandler.cpp @@ -29,6 +29,7 @@ #include "ClientConfigPackets.h" #include "Common.h" #include "DatabaseEnv.h" +#include "EquipmentSetPackets.h" #include "Group.h" #include "Guild.h" #include "GuildFinderMgr.h" @@ -857,6 +858,16 @@ void WorldSession::HandlePlayerLogin(LoginQueryHolder* holder) /// Send FeatureSystemStatus { WorldPackets::System::FeatureSystemStatus features; + + /// START OF DUMMY VALUES + features.ComplaintStatus = 2; + features.ScrollOfResurrectionRequestsRemaining = 1; + features.ScrollOfResurrectionMaxRequestsPerDay = 1; + features.CfgRealmID = 2; + features.CfgRealmRecID = 0; + features.VoiceEnabled = true; + /// END OF DUMMY VALUES + features.CharUndeleteEnabled = sWorld->getBoolConfig(CONFIG_FEATURE_SYSTEM_CHARACTER_UNDELETE_ENABLED); features.BpayStoreEnabled = sWorld->getBoolConfig(CONFIG_FEATURE_SYSTEM_BPAY_STORE_ENABLED); @@ -1525,59 +1536,36 @@ void WorldSession::HandleCharCustomizeCallback(PreparedQueryResult result, World GetAccountId(), GetRemoteAddress().c_str(), oldName.c_str(), customizeInfo->CharGUID.ToString().c_str(), customizeInfo->CharName.c_str()); } -void WorldSession::HandleEquipmentSetSave(WorldPacket& recvData) +void WorldSession::HandleEquipmentSetSave(WorldPackets::EquipmentSet::SaveEquipmentSet& packet) { TC_LOG_DEBUG("network", "CMSG_EQUIPMENT_SET_SAVE"); - uint64 setGuid; - recvData.ReadPackedUInt64(setGuid); - - uint32 index; - recvData >> index; - if (index >= MAX_EQUIPMENT_SET_INDEX) // client set slots amount + if (packet.Set.SetID >= MAX_EQUIPMENT_SET_INDEX) // client set slots amount return; - std::string name; - recvData >> name; - - std::string iconName; - recvData >> iconName; - - EquipmentSet eqSet; - - eqSet.Guid = setGuid; - eqSet.Name = name; - eqSet.IconName = iconName; - eqSet.state = EQUIPMENT_SET_NEW; - - ObjectGuid ignoredItemGuid; - ignoredItemGuid.SetRawValue(0, 1); - - for (uint32 i = 0; i < EQUIPMENT_SLOT_END; ++i) + for (uint8 i = 0; i < EQUIPMENT_SLOT_END; ++i) { - ObjectGuid itemGuid; - recvData >> itemGuid.ReadAsPacked(); - - // equipment manager sends "1" (as raw GUID) for slots set to "ignore" (don't touch slot at equip set) - if (itemGuid == ignoredItemGuid) + if (!(packet.Set.IgnoreMask & (1 << i))) { - // ignored slots saved as bit mask because we have no free special values for Items[i] - eqSet.IgnoreMask |= 1 << i; - continue; - } - - Item* item = _player->GetItemByPos(INVENTORY_SLOT_BAG_0, i); + ObjectGuid const& itemGuid = packet.Set.Pieces[i]; - if (!item && !itemGuid.IsEmpty()) // cheating check 1 - return; + Item* item = _player->GetItemByPos(INVENTORY_SLOT_BAG_0, i); - if (item && item->GetGUID() != itemGuid) // cheating check 2 - return; + /// cheating check 1 (item equipped but sent empty guid) + if (!item && !itemGuid.IsEmpty()) + return; - eqSet.Items[i] = itemGuid.GetCounter(); + /// cheating check 2 (sent guid does not match equipped item) + if (item && item->GetGUID() != itemGuid) + return; + } + else + packet.Set.Pieces[i].Clear(); } - _player->SetEquipmentSet(index, eqSet); + packet.Set.IgnoreMask &= 0x7FFFF; /// clear invalid bits (i > EQUIPMENT_SLOT_END) + + _player->SetEquipmentSet(std::move(packet.Set)); } void WorldSession::HandleEquipmentSetDelete(WorldPacket& recvData) diff --git a/src/server/game/Handlers/ChatHandler.cpp b/src/server/game/Handlers/ChatHandler.cpp index c877a2a19b5..a2485d7854b 100644 --- a/src/server/game/Handlers/ChatHandler.cpp +++ b/src/server/game/Handlers/ChatHandler.cpp @@ -650,7 +650,7 @@ void WorldSession::HandleChatIgnoredOpcode(WorldPacket& recvData) WorldPackets::Chat::Chat packet; ChatHandler::BuildChatPacket(&packet, CHAT_MSG_IGNORED, LANG_UNIVERSAL, _player, _player, GetPlayer()->GetName()); - player->GetSession()->SendPacket(packet.Write()); + player->SendDirectMessage(packet.Write()); } void WorldSession::HandleChannelDeclineInvite(WorldPacket &recvPacket) diff --git a/src/server/game/Handlers/QuestHandler.cpp b/src/server/game/Handlers/QuestHandler.cpp index e259af0b604..f591a5fa988 100644 --- a/src/server/game/Handlers/QuestHandler.cpp +++ b/src/server/game/Handlers/QuestHandler.cpp @@ -642,14 +642,10 @@ void WorldSession::HandleQuestgiverStatusMultipleQuery(WorldPackets::Quest::Ques { TC_LOG_DEBUG("network", "WORLD: Received CMSG_QUESTGIVER_STATUS_MULTIPLE_QUERY"); - uint32 count = 0; - WorldPackets::Quest::QuestGiverStatusMultiple response; 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 @@ -659,12 +655,7 @@ void WorldSession::HandleQuestgiverStatusMultipleQuery(WorldPackets::Quest::Ques if (!questgiver->HasFlag(UNIT_NPC_FLAGS, UNIT_NPC_FLAG_QUESTGIVER)) continue; - questStatus = _player->GetQuestDialogStatus(questgiver); - - WorldPackets::Quest::QuestGiverInfo info; - info.Guid = questgiver->GetGUID(); - info.Status = questStatus; - response.QuestGiver.push_back(info); + response.QuestGiver.emplace_back(questgiver->GetGUID(), _player->GetQuestDialogStatus(questgiver)); } else if (itr->IsGameObject()) { @@ -672,12 +663,7 @@ void WorldSession::HandleQuestgiverStatusMultipleQuery(WorldPackets::Quest::Ques if (!questgiver || questgiver->GetGoType() != GAMEOBJECT_TYPE_QUESTGIVER) continue; - questStatus = _player->GetQuestDialogStatus(questgiver); - - WorldPackets::Quest::QuestGiverInfo info; - info.Guid = questgiver->GetGUID(); - info.Status = questStatus; - response.QuestGiver.push_back(info); + response.QuestGiver.emplace_back(questgiver->GetGUID(), _player->GetQuestDialogStatus(questgiver)); } } diff --git a/src/server/game/Server/Packets/EquipmentSetPackets.cpp b/src/server/game/Server/Packets/EquipmentSetPackets.cpp index ea8df38bcd1..07cab20debf 100644 --- a/src/server/game/Server/Packets/EquipmentSetPackets.cpp +++ b/src/server/game/Server/Packets/EquipmentSetPackets.cpp @@ -17,24 +17,49 @@ #include "EquipmentSetPackets.h" +WorldPacket const* WorldPackets::EquipmentSet::EquipmentSetID::Write() +{ + _worldPacket << uint64(GUID); + _worldPacket << uint32(SetID); + + return &_worldPacket; +} + WorldPacket const* WorldPackets::EquipmentSet::LoadEquipmentSet::Write() { _worldPacket << uint32(SetData.size()); - for (EquipmentSetData const& equipSet : SetData) + for (EquipmentSetInfo::EquipmentSetData const* equipSet : SetData) { - _worldPacket << uint64(equipSet.Guid); - _worldPacket << uint32(equipSet.SetID); - _worldPacket << uint32(equipSet.IgnoreMask); + _worldPacket << uint64(equipSet->Guid); + _worldPacket << uint32(equipSet->SetID); + _worldPacket << uint32(equipSet->IgnoreMask); - for (ObjectGuid const& guid : equipSet.Pieces) + for (ObjectGuid const& guid : equipSet->Pieces) _worldPacket << guid; - _worldPacket.WriteBits(equipSet.SetName.length(), 8); - _worldPacket.WriteBits(equipSet.SetIcon.length(), 9); - _worldPacket.WriteString(equipSet.SetName); - _worldPacket.WriteString(equipSet.SetIcon); + _worldPacket.WriteBits(equipSet->SetName.length(), 8); + _worldPacket.WriteBits(equipSet->SetIcon.length(), 9); + _worldPacket.WriteString(equipSet->SetName); + _worldPacket.WriteString(equipSet->SetIcon); + _worldPacket.FlushBits(); } return &_worldPacket; } + +void WorldPackets::EquipmentSet::SaveEquipmentSet::Read() +{ + _worldPacket >> Set.Guid; + _worldPacket >> Set.SetID; + _worldPacket >> Set.IgnoreMask; + + for (uint8 i = 0; i < EQUIPMENT_SLOT_END; ++i) + _worldPacket >> Set.Pieces[i]; + + uint32 setNameLength = _worldPacket.ReadBits(8); + uint32 setIconLength = _worldPacket.ReadBits(9); + + Set.SetName = _worldPacket.ReadString(setNameLength); + Set.SetIcon = _worldPacket.ReadString(setIconLength); +} diff --git a/src/server/game/Server/Packets/EquipmentSetPackets.h b/src/server/game/Server/Packets/EquipmentSetPackets.h index 530a8b0efad..b01c483f5ac 100644 --- a/src/server/game/Server/Packets/EquipmentSetPackets.h +++ b/src/server/game/Server/Packets/EquipmentSetPackets.h @@ -24,14 +24,15 @@ namespace WorldPackets { namespace EquipmentSet { - struct EquipmentSetData + class EquipmentSetID final : public ServerPacket { - uint64 Guid = 0; ///< Set Identifier + public: + EquipmentSetID() : ServerPacket(SMSG_EQUIPMENT_SET_SAVED, 8 + 4) { } + + WorldPacket const* Write() override; + + uint64 GUID = 0; ///< Set Identifier uint32 SetID = 0; ///< Index - uint32 IgnoreMask = 0; - std::string SetName; - std::string SetIcon; - ObjectGuid Pieces[EQUIPMENT_SLOT_END]; }; class LoadEquipmentSet final : public ServerPacket @@ -41,7 +42,17 @@ namespace WorldPackets WorldPacket const* Write() override; - std::vector<EquipmentSetData> SetData; + std::vector<EquipmentSetInfo::EquipmentSetData const*> SetData; + }; + + class SaveEquipmentSet final : public ClientPacket + { + public: + SaveEquipmentSet(WorldPacket&& packet) : ClientPacket(CMSG_EQUIPMENT_SET_SAVE, std::move(packet)) { } + + void Read() override; + + EquipmentSetInfo::EquipmentSetData Set; }; } } diff --git a/src/server/game/Server/Packets/MovementPackets.cpp b/src/server/game/Server/Packets/MovementPackets.cpp index 010631c0529..659b3eaaf2b 100644 --- a/src/server/game/Server/Packets/MovementPackets.cpp +++ b/src/server/game/Server/Packets/MovementPackets.cpp @@ -18,14 +18,16 @@ #include "MovementPackets.h" #include "MovementTypedefs.h" -ByteBuffer& operator << (ByteBuffer& data, const G3D::Vector3& v) +ByteBuffer& operator<<(ByteBuffer& data, G3D::Vector3 const& v) { data << v.x << v.y << v.z; + return data; } -ByteBuffer& operator >> (ByteBuffer& data, G3D::Vector3& v) +ByteBuffer& operator>>(ByteBuffer& data, G3D::Vector3& v) { data >> v.x >> v.y >> v.z; + return data; } ByteBuffer& operator<<(ByteBuffer& data, MovementInfo& movementInfo) @@ -53,8 +55,6 @@ ByteBuffer& operator<<(ByteBuffer& data, MovementInfo& movementInfo) data << ObjectGuid; }*/ - data.FlushBits(); - data.WriteBits(movementInfo.flags, 30); data.WriteBits(movementInfo.flags2, 15); @@ -86,8 +86,6 @@ ByteBuffer& operator<<(ByteBuffer& data, MovementInfo& movementInfo) data << movementInfo.jump.fallTime; data << movementInfo.jump.zspeed; - data.FlushBits(); - data.WriteBit(hasFallDirection); if (hasFallDirection) { @@ -98,6 +96,8 @@ ByteBuffer& operator<<(ByteBuffer& data, MovementInfo& movementInfo) } data.FlushBits(); + + return data; } ByteBuffer& operator>>(ByteBuffer& data, MovementInfo& movementInfo) @@ -161,6 +161,8 @@ ByteBuffer& operator>>(ByteBuffer& data, MovementInfo& movementInfo) data >> movementInfo.jump.xyspeed; } } + + return data; } void WorldPackets::Movement::ClientPlayerMovement::Read() @@ -172,6 +174,8 @@ ByteBuffer& operator<<(ByteBuffer& data, WorldPackets::Movement::MonsterSplineFi { data << monsterSplineFilterKey.Idx; data << monsterSplineFilterKey.Speed; + + return data; } ByteBuffer& operator<<(ByteBuffer& data, WorldPackets::Movement::MonsterSplineFilter& monsterSplineFilter) @@ -183,8 +187,10 @@ ByteBuffer& operator<<(ByteBuffer& data, WorldPackets::Movement::MonsterSplineFi for (WorldPackets::Movement::MonsterSplineFilterKey& filterKey : monsterSplineFilter.FilterKeys) data << filterKey; data << monsterSplineFilter.AddedToStart; - data.FlushBits(); data.WriteBits(monsterSplineFilter.FilterFlags, 2); + data.FlushBits(); + + return data; } ByteBuffer& operator<<(ByteBuffer& data, WorldPackets::Movement::MovementSpline& movementSpline) @@ -202,13 +208,14 @@ ByteBuffer& operator<<(ByteBuffer& data, WorldPackets::Movement::MovementSpline& data << movementSpline.TransportGUID; data << movementSpline.VehicleSeat; data << int32(movementSpline.PackedDeltas.size()); - for (G3D::Vector3& pos : movementSpline.Points) + for (G3D::Vector3 const& pos : movementSpline.Points) data << pos; - for (G3D::Vector3& pos : movementSpline.PackedDeltas) + for (G3D::Vector3 const& pos : movementSpline.PackedDeltas) data.appendPackXYZ(pos.x, pos.y, pos.z); - data.FlushBits(); data.WriteBits(movementSpline.Face, 2); data.WriteBit(movementSpline.SplineFilter.HasValue); + data.FlushBits(); + switch (movementSpline.Face) { case MONSTER_MOVE_FACING_SPOT: @@ -222,8 +229,11 @@ ByteBuffer& operator<<(ByteBuffer& data, WorldPackets::Movement::MovementSpline& data << movementSpline.FaceDirection; break; } + if (movementSpline.SplineFilter.HasValue) data << movementSpline.SplineFilter.value; + + return data; } ByteBuffer& operator<<(ByteBuffer& data, WorldPackets::Movement::MovementMonsterSpline& movementMonsterSpline) @@ -231,8 +241,10 @@ ByteBuffer& operator<<(ByteBuffer& data, WorldPackets::Movement::MovementMonster data << movementMonsterSpline.ID; data << movementMonsterSpline.Destination; data << movementMonsterSpline.Move; - data.FlushBits(); data.WriteBit(movementMonsterSpline.CrzTeleport); + data.FlushBits(); + + return data; } WorldPacket const* WorldPackets::Movement::MonsterMove::Write() diff --git a/src/server/game/Server/Packets/MovementPackets.h b/src/server/game/Server/Packets/MovementPackets.h index 8aebb1db9fc..ee8a4d12c01 100644 --- a/src/server/game/Server/Packets/MovementPackets.h +++ b/src/server/game/Server/Packets/MovementPackets.h @@ -148,7 +148,7 @@ namespace WorldPackets } } -ByteBuffer& operator<<(ByteBuffer& data, const G3D::Vector3& v); +ByteBuffer& operator<<(ByteBuffer& data, G3D::Vector3 const& v); ByteBuffer& operator>>(ByteBuffer& data, G3D::Vector3& v); ByteBuffer& operator>>(ByteBuffer& data, MovementInfo& movementInfo); diff --git a/src/server/game/Server/Packets/QuestPackets.h b/src/server/game/Server/Packets/QuestPackets.h index c656662761d..8fc5fe000f1 100644 --- a/src/server/game/Server/Packets/QuestPackets.h +++ b/src/server/game/Server/Packets/QuestPackets.h @@ -41,11 +41,15 @@ namespace WorldPackets public: QuestGiverStatusMultipleQuery(WorldPacket&& packet) : ClientPacket(CMSG_QUESTGIVER_STATUS_MULTIPLE_QUERY, std::move(packet)) { } - void Read() override {}; + void Read() override { } }; struct QuestGiverInfo { + QuestGiverInfo() { } + QuestGiverInfo(ObjectGuid const& guid, uint32 status) + : Guid(guid), Status(status) { } + ObjectGuid Guid; uint32 Status = DIALOG_STATUS_NONE; }; @@ -53,7 +57,7 @@ namespace WorldPackets class QuestGiverStatus final : public ServerPacket { public: - QuestGiverStatus() : ServerPacket(SMSG_QUESTGIVER_STATUS, 12) { } + QuestGiverStatus() : ServerPacket(SMSG_QUESTGIVER_STATUS, 22) { } WorldPacket const* Write() override; diff --git a/src/server/game/Server/Packets/SpellPackets.cpp b/src/server/game/Server/Packets/SpellPackets.cpp index 37738f4033c..2e345d5b9a4 100644 --- a/src/server/game/Server/Packets/SpellPackets.cpp +++ b/src/server/game/Server/Packets/SpellPackets.cpp @@ -78,5 +78,7 @@ ByteBuffer& operator<<(ByteBuffer& data, WorldPackets::Spell::SpellCastLogData& data.WriteBit(false); // data << float // Unk data if bit is true data.FlushBits(); + + return data; } diff --git a/src/server/game/Server/Protocol/Opcodes.cpp b/src/server/game/Server/Protocol/Opcodes.cpp index ab4b768cfd4..de9b3d0746b 100644 --- a/src/server/game/Server/Protocol/Opcodes.cpp +++ b/src/server/game/Server/Protocol/Opcodes.cpp @@ -23,6 +23,7 @@ #include "Packets/ChatPackets.h" #include "Packets/ClientConfigPackets.h" #include "Packets/CombatPackets.h" +#include "Packets/EquipmentSetPackets.h" #include "Packets/GuildPackets.h" #include "Packets/MiscPackets.h" #include "Packets/MovementPackets.h" @@ -278,7 +279,7 @@ void OpcodeTable::Initialize() DEFINE_OPCODE_HANDLER_OLD(CMSG_ENABLETAXI, STATUS_UNHANDLED, PROCESS_THREADSAFE, &WorldSession::HandleTaxiQueryAvailableNodes ); DEFINE_OPCODE_HANDLER_OLD(CMSG_ENABLE_NAGLE, STATUS_NEVER, PROCESS_INPLACE, &WorldSession::Handle_EarlyProccess ); DEFINE_OPCODE_HANDLER_OLD(CMSG_EQUIPMENT_SET_DELETE, STATUS_UNHANDLED, PROCESS_THREADUNSAFE, &WorldSession::HandleEquipmentSetDelete ); - DEFINE_OPCODE_HANDLER_OLD(CMSG_EQUIPMENT_SET_SAVE, STATUS_UNHANDLED, PROCESS_THREADUNSAFE, &WorldSession::HandleEquipmentSetSave ); + DEFINE_HANDLER(CMSG_EQUIPMENT_SET_SAVE, STATUS_LOGGEDIN, PROCESS_THREADUNSAFE, WorldPackets::EquipmentSet::SaveEquipmentSet, &WorldSession::HandleEquipmentSetSave); DEFINE_OPCODE_HANDLER_OLD(CMSG_EQUIPMENT_SET_USE, STATUS_UNHANDLED, PROCESS_THREADUNSAFE, &WorldSession::HandleEquipmentSetUse ); DEFINE_OPCODE_HANDLER_OLD(CMSG_FACTION_BONUS_INFO, STATUS_UNHANDLED, PROCESS_INPLACE, &WorldSession::Handle_NULL ); DEFINE_OPCODE_HANDLER_OLD(CMSG_FAR_SIGHT, STATUS_UNHANDLED, PROCESS_THREADUNSAFE, &WorldSession::HandleFarSightOpcode ); @@ -889,8 +890,8 @@ void OpcodeTable::Initialize() DEFINE_SERVER_OPCODE_HANDLER(SMSG_ENABLE_BARBER_SHOP, STATUS_UNHANDLED); DEFINE_SERVER_OPCODE_HANDLER(SMSG_ENCHANTMENTLOG, STATUS_UNHANDLED); DEFINE_SERVER_OPCODE_HANDLER(SMSG_ENVIRONMENTALDAMAGELOG, STATUS_UNHANDLED); - DEFINE_SERVER_OPCODE_HANDLER(SMSG_EQUIPMENT_SET_LIST, STATUS_UNHANDLED); - DEFINE_SERVER_OPCODE_HANDLER(SMSG_EQUIPMENT_SET_SAVED, STATUS_UNHANDLED); + DEFINE_SERVER_OPCODE_HANDLER(SMSG_EQUIPMENT_SET_LIST, STATUS_NEVER); + DEFINE_SERVER_OPCODE_HANDLER(SMSG_EQUIPMENT_SET_SAVED, STATUS_NEVER); DEFINE_SERVER_OPCODE_HANDLER(SMSG_EQUIPMENT_SET_USE_RESULT, STATUS_UNHANDLED); DEFINE_SERVER_OPCODE_HANDLER(SMSG_EXPECTED_SPAM_RECORDS, STATUS_UNHANDLED); DEFINE_SERVER_OPCODE_HANDLER(SMSG_EXPLORATION_EXPERIENCE, STATUS_UNHANDLED); diff --git a/src/server/game/Server/WorldSession.h b/src/server/game/Server/WorldSession.h index c176bf5a3b1..eae081f2b74 100644 --- a/src/server/game/Server/WorldSession.h +++ b/src/server/game/Server/WorldSession.h @@ -126,6 +126,11 @@ namespace WorldPackets class AttackStop; } + namespace EquipmentSet + { + class SaveEquipmentSet; + } + namespace Guild { class QueryGuildInfo; @@ -1095,7 +1100,7 @@ class WorldSession void HandleRemoveGlyph(WorldPacket& recvData); void HandleQueryInspectAchievements(WorldPacket& recvData); void HandleGuildAchievementProgressQuery(WorldPacket& recvData); - void HandleEquipmentSetSave(WorldPacket& recvData); + void HandleEquipmentSetSave(WorldPackets::EquipmentSet::SaveEquipmentSet& packet); void HandleEquipmentSetDelete(WorldPacket& recvData); void HandleEquipmentSetUse(WorldPacket& recvData); void HandleWorldStateUITimerUpdate(WorldPacket& recvData); |