From abff9de719ac189fc82da87f077a24dba69cfdbb Mon Sep 17 00:00:00 2001 From: joschiwald Date: Wed, 19 Nov 2014 21:09:30 +0100 Subject: Core/Packets: updated EquipmentSet save packets --- src/server/game/Entities/Creature/Creature.cpp | 2 +- src/server/game/Entities/Player/Player.cpp | 161 +++++++++++-------------- src/server/game/Entities/Player/Player.h | 28 +++-- src/server/game/Entities/Unit/Unit.cpp | 2 +- 4 files changed, 87 insertions(+), 106 deletions(-) (limited to 'src/server/game/Entities') 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(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(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; isetUInt64(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; isetUInt64(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 EquipmentSets; +typedef std::map EquipmentSetContainer; struct ItemPosCount { @@ -2229,7 +2231,7 @@ class Player : public Unit, public GridObject 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 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---------- -- cgit v1.2.3