diff options
| author | Shauren <shauren.trinity@gmail.com> | 2014-10-29 21:13:21 +0100 |
|---|---|---|
| committer | Shauren <shauren.trinity@gmail.com> | 2025-10-03 18:12:05 +0200 |
| commit | f9fd80251c2e82fc46f822c1d65d57828bf0b690 (patch) | |
| tree | 887b4e046b17234b7d3c5a5e4960c9fdb2349fe6 /src/server | |
| parent | 1a67fea2c415ef0bca464f102624ef754d6bad19 (diff) | |
Core/Entites: ObjectGuid construction refactor
(cherry picked from commit 15fbb6f46fb24fdc6f91786543b32f247e6525fc)
Diffstat (limited to 'src/server')
38 files changed, 173 insertions, 177 deletions
diff --git a/src/server/game/Accounts/AccountMgr.cpp b/src/server/game/Accounts/AccountMgr.cpp index a0b7bf1e23d..2b3b9da3116 100644 --- a/src/server/game/Accounts/AccountMgr.cpp +++ b/src/server/game/Accounts/AccountMgr.cpp @@ -95,7 +95,7 @@ AccountOpResult AccountMgr::DeleteAccount(uint32 accountId) { do { - ObjectGuid guid(HighGuid::Player, (*result)[0].GetUInt32()); + ObjectGuid guid = ObjectGuid::Create<HighGuid::Player>((*result)[0].GetUInt32()); // Kick if player is online if (Player* p = ObjectAccessor::FindConnectedPlayer(guid)) diff --git a/src/server/game/AuctionHouse/AuctionHouseMgr.cpp b/src/server/game/AuctionHouse/AuctionHouseMgr.cpp index cd3e61a6fcf..04683c746a3 100644 --- a/src/server/game/AuctionHouse/AuctionHouseMgr.cpp +++ b/src/server/game/AuctionHouse/AuctionHouseMgr.cpp @@ -126,7 +126,7 @@ void AuctionHouseMgr::SendAuctionWonMail(AuctionEntry* auction, CharacterDatabas return; uint32 bidderAccId = 0; - ObjectGuid bidderGuid(HighGuid::Player, auction->bidder); + ObjectGuid bidderGuid = ObjectGuid::Create<HighGuid::Player>(auction->bidder); Player* bidder = ObjectAccessor::FindConnectedPlayer(bidderGuid); // data for gm.log std::string bidderName; @@ -147,7 +147,7 @@ void AuctionHouseMgr::SendAuctionWonMail(AuctionEntry* auction, CharacterDatabas if (logGmTrade) { - ObjectGuid ownerGuid = ObjectGuid(HighGuid::Player, auction->owner); + ObjectGuid ownerGuid = ObjectGuid::Create<HighGuid::Player>(auction->owner); std::string ownerName; if (!sCharacterCache->GetCharacterNameByGuid(ownerGuid, ownerName)) ownerName = sObjectMgr->GetTrinityStringForDBCLocale(LANG_UNKNOWN); @@ -188,7 +188,7 @@ void AuctionHouseMgr::SendAuctionWonMail(AuctionEntry* auction, CharacterDatabas void AuctionHouseMgr::SendAuctionSalePendingMail(AuctionEntry* auction, CharacterDatabaseTransaction trans) { - ObjectGuid owner_guid(HighGuid::Player, auction->owner); + ObjectGuid owner_guid = ObjectGuid::Create<HighGuid::Player>(auction->owner); Player* owner = ObjectAccessor::FindConnectedPlayer(owner_guid); uint32 owner_accId = sCharacterCache->GetCharacterAccountIdByGuid(owner_guid); // owner exist (online or offline) @@ -209,7 +209,7 @@ void AuctionHouseMgr::SendAuctionSalePendingMail(AuctionEntry* auction, Characte //call this method to send mail to auction owner, when auction is successful, it does not clear ram void AuctionHouseMgr::SendAuctionSuccessfulMail(AuctionEntry* auction, CharacterDatabaseTransaction trans) { - ObjectGuid owner_guid(HighGuid::Player, auction->owner); + ObjectGuid owner_guid = ObjectGuid::Create<HighGuid::Player>(auction->owner); Player* owner = ObjectAccessor::FindConnectedPlayer(owner_guid); uint32 owner_accId = sCharacterCache->GetCharacterAccountIdByGuid(owner_guid); // owner exist @@ -240,7 +240,7 @@ void AuctionHouseMgr::SendAuctionExpiredMail(AuctionEntry* auction, CharacterDat if (!pItem) return; - ObjectGuid owner_guid(HighGuid::Player, auction->owner); + ObjectGuid owner_guid = ObjectGuid::Create<HighGuid::Player>(auction->owner); Player* owner = ObjectAccessor::FindConnectedPlayer(owner_guid); uint32 owner_accId = sCharacterCache->GetCharacterAccountIdByGuid(owner_guid); // owner exist @@ -263,7 +263,7 @@ void AuctionHouseMgr::SendAuctionExpiredMail(AuctionEntry* auction, CharacterDat //this function sends mail to old bidder void AuctionHouseMgr::SendAuctionOutbiddedMail(AuctionEntry* auction, uint32 newPrice, Player* newBidder, CharacterDatabaseTransaction trans) { - ObjectGuid oldBidder_guid(HighGuid::Player, auction->bidder); + ObjectGuid oldBidder_guid = ObjectGuid::Create<HighGuid::Player>(auction->bidder); Player* oldBidder = ObjectAccessor::FindConnectedPlayer(oldBidder_guid); uint32 oldBidder_accId = 0; @@ -285,7 +285,7 @@ void AuctionHouseMgr::SendAuctionOutbiddedMail(AuctionEntry* auction, uint32 new //this function sends mail, when auction is cancelled to old bidder void AuctionHouseMgr::SendAuctionCancelledToBidderMail(AuctionEntry* auction, CharacterDatabaseTransaction trans, Item* item) { - ObjectGuid bidder_guid = ObjectGuid(HighGuid::Player, auction->bidder); + ObjectGuid bidder_guid = ObjectGuid::Create<HighGuid::Player>(auction->bidder); Player* bidder = ObjectAccessor::FindConnectedPlayer(bidder_guid); uint32 bidder_accId = 0; diff --git a/src/server/game/Battlegrounds/ArenaTeam.cpp b/src/server/game/Battlegrounds/ArenaTeam.cpp index 82cf70a1ff6..414fb49eb81 100644 --- a/src/server/game/Battlegrounds/ArenaTeam.cpp +++ b/src/server/game/Battlegrounds/ArenaTeam.cpp @@ -195,7 +195,7 @@ bool ArenaTeam::LoadArenaTeamFromDB(QueryResult result) TeamId = fields[0].GetUInt32(); TeamName = fields[1].GetString(); - CaptainGuid = ObjectGuid(HighGuid::Player, fields[2].GetUInt32()); + CaptainGuid = ObjectGuid::Create<HighGuid::Player>(fields[2].GetUInt32()); Type = fields[3].GetUInt8(); BackgroundColor = fields[4].GetUInt32(); EmblemStyle = fields[5].GetUInt8(); @@ -234,7 +234,7 @@ bool ArenaTeam::LoadMembersFromDB(QueryResult result) break; ArenaTeamMember newMember; - newMember.Guid = ObjectGuid(HighGuid::Player, fields[1].GetUInt32()); + newMember.Guid = ObjectGuid::Create<HighGuid::Player>(fields[1].GetUInt32()); newMember.WeekGames = fields[2].GetUInt16(); newMember.WeekWins = fields[3].GetUInt16(); newMember.SeasonGames = fields[4].GetUInt16(); @@ -890,7 +890,7 @@ void ArenaTeam::MemberWon(Player* player, uint32 againstMatchmakerRating, int32 } } -void ArenaTeam::UpdateArenaPointsHelper(std::map<uint32, uint32>& playerPoints) +void ArenaTeam::UpdateArenaPointsHelper(std::map<ObjectGuid, uint32>& playerPoints) { // Called after a match has ended and the stats are already modified // Helper function for arena point distribution (this way, when distributing, no actual calculation is required, just a few comparisons) @@ -908,15 +908,15 @@ void ArenaTeam::UpdateArenaPointsHelper(std::map<uint32, uint32>& playerPoints) if (itr->WeekGames >= requiredGames) pointsToAdd = GetPoints(itr->PersonalRating); - std::map<uint32, uint32>::iterator plr_itr = playerPoints.find(itr->Guid.GetCounter()); + std::map<ObjectGuid, uint32>::iterator plr_itr = playerPoints.find(itr->Guid); if (plr_itr != playerPoints.end()) { // Check if there is already more points if (plr_itr->second < pointsToAdd) - playerPoints[itr->Guid.GetCounter()] = pointsToAdd; + playerPoints[itr->Guid] = pointsToAdd; } else - playerPoints[itr->Guid.GetCounter()] = pointsToAdd; + playerPoints[itr->Guid] = pointsToAdd; } } diff --git a/src/server/game/Battlegrounds/ArenaTeam.h b/src/server/game/Battlegrounds/ArenaTeam.h index c6ee45a5125..67940e6be0d 100644 --- a/src/server/game/Battlegrounds/ArenaTeam.h +++ b/src/server/game/Battlegrounds/ArenaTeam.h @@ -179,7 +179,7 @@ class TC_GAME_API ArenaTeam void MemberLost(Player* player, uint32 againstMatchmakerRating, int32 MatchmakerRatingChange = -12); void OfflineMemberLost(ObjectGuid guid, uint32 againstMatchmakerRating, int32 MatchmakerRatingChange = -12); - void UpdateArenaPointsHelper(std::map<uint32, uint32> & PlayerPoints); + void UpdateArenaPointsHelper(std::map<ObjectGuid, uint32> & PlayerPoints); bool FinishWeek(); // returns true if arena team played this week void FinishGame(int32 mod); diff --git a/src/server/game/Battlegrounds/ArenaTeamMgr.cpp b/src/server/game/Battlegrounds/ArenaTeamMgr.cpp index 0e96a915918..7a69a6d410c 100644 --- a/src/server/game/Battlegrounds/ArenaTeamMgr.cpp +++ b/src/server/game/Battlegrounds/ArenaTeamMgr.cpp @@ -143,7 +143,7 @@ void ArenaTeamMgr::DistributeArenaPoints() sWorld->SendWorldText(LANG_DIST_ARENA_POINTS_ONLINE_START); // Temporary structure for storing maximum points to add values for all players - std::map<uint32, uint32> PlayerPoints; + std::map<ObjectGuid, uint32> PlayerPoints; // At first update all points for all team members for (auto [teamId, team] : ArenaTeamStore) @@ -154,16 +154,16 @@ void ArenaTeamMgr::DistributeArenaPoints() CharacterDatabasePreparedStatement* stmt; // Cycle that gives points to all players - for (std::map<uint32, uint32>::iterator playerItr = PlayerPoints.begin(); playerItr != PlayerPoints.end(); ++playerItr) + for (std::map<ObjectGuid, uint32>::iterator playerItr = PlayerPoints.begin(); playerItr != PlayerPoints.end(); ++playerItr) { // Add points to player if online - if (Player* player = ObjectAccessor::FindConnectedPlayer(ObjectGuid(HighGuid::Player, playerItr->first))) + if (Player* player = ObjectAccessor::FindConnectedPlayer(playerItr->first)) player->ModifyArenaPoints(playerItr->second, trans); else // Update database { stmt = CharacterDatabase.GetPreparedStatement(CHAR_UPD_ADD_CHAR_ARENA_POINTS); stmt->setUInt32(0, playerItr->second); - stmt->setUInt32(1, playerItr->first); + stmt->setUInt32(1, playerItr->first.GetCounter()); trans->Append(stmt); } } diff --git a/src/server/game/Chat/Channels/Channel.cpp b/src/server/game/Chat/Channels/Channel.cpp index 0669b966826..73837d61448 100644 --- a/src/server/game/Chat/Channels/Channel.cpp +++ b/src/server/game/Chat/Channels/Channel.cpp @@ -76,7 +76,8 @@ Channel::Channel(std::string const& name, uint32 team /*= 0*/, std::string const { for (std::string_view guid : Trinity::Tokenize(banList, ' ', false)) { - ObjectGuid banned(Trinity::StringTo<uint64>(guid).value_or(0)); + ObjectGuid banned; + banned.SetRawValue(Trinity::StringTo<uint64>(guid).value_or(0)); if (!banned) continue; diff --git a/src/server/game/Conditions/ConditionMgr.cpp b/src/server/game/Conditions/ConditionMgr.cpp index e79f6605fb1..37ec4388560 100644 --- a/src/server/game/Conditions/ConditionMgr.cpp +++ b/src/server/game/Conditions/ConditionMgr.cpp @@ -260,7 +260,7 @@ bool Condition::Meets(ConditionSourceInfo& sourceInfo) const condMeets = instance->GetData(ConditionValue1) == ConditionValue2; break; case INSTANCE_INFO_GUID_DATA: - condMeets = instance->GetGuidData(ConditionValue1) == ObjectGuid(uint64(ConditionValue2)); + condMeets = instance->GetGuidData(ConditionValue1).GetRawValue() == uint64(ConditionValue2); break; case INSTANCE_INFO_BOSS_STATE: condMeets = instance->GetBossState(ConditionValue1) == EncounterState(ConditionValue2); diff --git a/src/server/game/DungeonFinding/LFGMgr.cpp b/src/server/game/DungeonFinding/LFGMgr.cpp index 96ae15543b8..5befeb341a5 100644 --- a/src/server/game/DungeonFinding/LFGMgr.cpp +++ b/src/server/game/DungeonFinding/LFGMgr.cpp @@ -76,7 +76,7 @@ void LFGMgr::_LoadFromDB(Field* fields, ObjectGuid guid) if (!guid.IsGroup()) return; - SetLeader(guid, ObjectGuid(HighGuid::Player, fields[0].GetUInt32())); + SetLeader(guid, ObjectGuid::Create<HighGuid::Player>(fields[0].GetUInt32())); uint32 dungeon = fields[17].GetUInt32(); uint8 state = fields[18].GetUInt8(); diff --git a/src/server/game/Entities/Corpse/Corpse.cpp b/src/server/game/Entities/Corpse/Corpse.cpp index 8fe0383633c..642ab421d5f 100644 --- a/src/server/game/Entities/Corpse/Corpse.cpp +++ b/src/server/game/Entities/Corpse/Corpse.cpp @@ -65,7 +65,7 @@ void Corpse::RemoveFromWorld() bool Corpse::Create(ObjectGuid::LowType guidlow) { - Object::_Create(guidlow, 0, HighGuid::Corpse); + Object::_Create(ObjectGuid::Create<HighGuid::Corpse>(guidlow)); return true; } @@ -82,7 +82,8 @@ bool Corpse::Create(ObjectGuid::LowType guidlow, Player* owner) return false; } - WorldObject::_Create(guidlow, HighGuid::Corpse, owner->GetPhaseMask()); + Object::_Create(ObjectGuid::Create<HighGuid::Corpse>(guidlow)); + SetPhaseMask(owner->GetPhaseMask(), false); SetObjectScale(1.0f); SetGuidValue(CORPSE_FIELD_OWNER, owner->GetGUID()); @@ -159,7 +160,7 @@ bool Corpse::LoadCorpseFromDB(ObjectGuid::LowType guid, Field* fields) float o = fields[3].GetFloat(); uint32 mapId = fields[4].GetUInt16(); - Object::_Create(guid, 0, HighGuid::Corpse); + Object::_Create(ObjectGuid::Create<HighGuid::Corpse>(guid)); SetObjectScale(1.0f); SetUInt32Value(CORPSE_FIELD_DISPLAY_ID, fields[5].GetUInt32()); diff --git a/src/server/game/Entities/Creature/Creature.cpp b/src/server/game/Entities/Creature/Creature.cpp index 9e13f3d295b..efa1c3216f6 100644 --- a/src/server/game/Entities/Creature/Creature.cpp +++ b/src/server/game/Entities/Creature/Creature.cpp @@ -700,7 +700,7 @@ void Creature::Update(uint32 diff) break; // Will be rechecked on next Update call after delay expires } - ObjectGuid dbtableHighGuid(HighGuid::Unit, GetEntry(), m_spawnId); + ObjectGuid dbtableHighGuid = ObjectGuid::Create<HighGuid::Unit>(GetEntry(), m_spawnId); time_t linkedRespawnTime = GetMap()->GetLinkedRespawnTime(dbtableHighGuid); if (!linkedRespawnTime) // Can respawn Respawn(); @@ -1568,7 +1568,10 @@ bool Creature::CreateFromProto(ObjectGuid::LowType guidlow, uint32 entry, Creatu SetOriginalEntry(entry); - Object::_Create(guidlow, entry, (vehId || cinfo->VehicleId) ? HighGuid::Vehicle : HighGuid::Unit); + if (vehId || cinfo->VehicleId) + Object::_Create(ObjectGuid::Create<HighGuid::Vehicle>(entry, guidlow)); + else + Object::_Create(ObjectGuid::Create<HighGuid::Unit>(entry, guidlow)); if (!UpdateEntry(entry, data)) return false; diff --git a/src/server/game/Entities/DynamicObject/DynamicObject.cpp b/src/server/game/Entities/DynamicObject/DynamicObject.cpp index 017b79e5ffa..505aba37e5f 100644 --- a/src/server/game/Entities/DynamicObject/DynamicObject.cpp +++ b/src/server/game/Entities/DynamicObject/DynamicObject.cpp @@ -92,10 +92,11 @@ bool DynamicObject::CreateDynamicObject(ObjectGuid::LowType guidlow, Unit* caste return false; } - WorldObject::_Create(guidlow, HighGuid::DynamicObject, caster->GetPhaseMask()); + WorldObject::_Create(ObjectGuid::Create<HighGuid::DynamicObject>(guidlow)); + SetPhaseMask(caster->GetPhaseMask(), false); SetEntry(spell->Id); - SetObjectScale(1); + SetObjectScale(1.0f); SetGuidValue(DYNAMICOBJECT_CASTER, caster->GetGUID()); SetByteValue(DYNAMICOBJECT_BYTES, 0, type); SetUInt32Value(DYNAMICOBJECT_SPELLID, spell->Id); diff --git a/src/server/game/Entities/GameObject/GameObject.cpp b/src/server/game/Entities/GameObject/GameObject.cpp index 1b3b30e5dc2..962efe036c5 100644 --- a/src/server/game/Entities/GameObject/GameObject.cpp +++ b/src/server/game/Entities/GameObject/GameObject.cpp @@ -296,7 +296,7 @@ bool GameObject::Create(ObjectGuid::LowType guidlow, uint32 name_id, Map* map, u if (goinfo->type == GAMEOBJECT_TYPE_TRANSPORT) m_updateFlag = (m_updateFlag | UPDATEFLAG_TRANSPORT) & ~UPDATEFLAG_POSITION; - Object::_Create(guidlow, goinfo->entry, HighGuid::GameObject); + Object::_Create(ObjectGuid::Create<HighGuid::GameObject>(goinfo->entry, guidlow)); m_goInfo = goinfo; m_goTemplateAddon = sObjectMgr->GetGameObjectTemplateAddon(name_id); @@ -574,7 +574,7 @@ void GameObject::Update(uint32 diff) time_t now = GameTime::GetGameTime(); if (m_respawnTime <= now) // timer expired { - ObjectGuid dbtableHighGuid(HighGuid::GameObject, GetEntry(), m_spawnId); + ObjectGuid dbtableHighGuid = ObjectGuid::Create<HighGuid::GameObject>(GetEntry(), m_spawnId); time_t linkedRespawntime = GetMap()->GetLinkedRespawnTime(dbtableHighGuid); if (linkedRespawntime) // Can't respawn, the master is dead { diff --git a/src/server/game/Entities/Item/Container/Bag.cpp b/src/server/game/Entities/Item/Container/Bag.cpp index 814cc01ec89..31485ac6471 100644 --- a/src/server/game/Entities/Item/Container/Bag.cpp +++ b/src/server/game/Entities/Item/Container/Bag.cpp @@ -75,7 +75,7 @@ bool Bag::Create(ObjectGuid::LowType guidlow, uint32 itemid, Player const* owner if (!itemProto || itemProto->ContainerSlots > MAX_BAG_SIZE) return false; - Object::_Create(guidlow, 0, HighGuid::Container); + Object::_Create(ObjectGuid::Create<HighGuid::Container>(guidlow)); SetEntry(itemid); SetObjectScale(1.0f); diff --git a/src/server/game/Entities/Item/Item.cpp b/src/server/game/Entities/Item/Item.cpp index 23fd96789b2..4480ab0dbd7 100644 --- a/src/server/game/Entities/Item/Item.cpp +++ b/src/server/game/Entities/Item/Item.cpp @@ -266,7 +266,7 @@ Item::Item() bool Item::Create(ObjectGuid::LowType guidlow, uint32 itemId, Player const* owner) { - Object::_Create(guidlow, 0, HighGuid::Item); + Object::_Create(ObjectGuid::Create<HighGuid::Item>(guidlow)); SetEntry(itemId); SetObjectScale(1.0f); @@ -413,7 +413,7 @@ bool Item::LoadFromDB(ObjectGuid::LowType guid, ObjectGuid owner_guid, Field* fi // create item before any checks for store correct guid // and allow use "FSetState(ITEM_REMOVED); SaveToDB();" for deleting item from DB - Object::_Create(guid, 0, HighGuid::Item); + Object::_Create(ObjectGuid::Create<HighGuid::Item>(guid)); // Set entry, MUST be before proto check SetEntry(entry); @@ -431,8 +431,10 @@ bool Item::LoadFromDB(ObjectGuid::LowType guid, ObjectGuid owner_guid, Field* fi SetOwnerGUID(owner_guid); bool need_save = false; // need explicit save data at load fixes - SetGuidValue(ITEM_FIELD_CREATOR, ObjectGuid(HighGuid::Player, fields[0].GetUInt32())); - SetGuidValue(ITEM_FIELD_GIFTCREATOR, ObjectGuid(HighGuid::Player, fields[1].GetUInt32())); + if (uint32 creator = fields[0].GetUInt32()) + SetGuidValue(ITEM_FIELD_CREATOR, ObjectGuid::Create<HighGuid::Player>(creator)); + if (uint32 giftCreator = fields[1].GetUInt32()) + SetGuidValue(ITEM_FIELD_GIFTCREATOR, ObjectGuid::Create<HighGuid::Player>(giftCreator)); SetCount(fields[2].GetUInt32()); uint32 duration = fields[3].GetUInt32(); diff --git a/src/server/game/Entities/Object/Object.cpp b/src/server/game/Entities/Object/Object.cpp index f5d7ae63f4d..91c8b83a720 100644 --- a/src/server/game/Entities/Object/Object.cpp +++ b/src/server/game/Entities/Object/Object.cpp @@ -106,11 +106,10 @@ void Object::_InitValues() m_objectUpdated = false; } -void Object::_Create(ObjectGuid::LowType guidlow, uint32 entry, HighGuid guidhigh) +void Object::_Create(ObjectGuid const& guid) { if (!m_uint32Values) _InitValues(); - ObjectGuid guid(guidhigh, entry, guidlow); SetGuidValue(OBJECT_FIELD_GUID, guid); SetUInt32Value(OBJECT_FIELD_TYPE, m_objectType); m_PackGUID.Set(guid); @@ -1026,12 +1025,6 @@ void WorldObject::CleanupsBeforeDelete(bool /*finalCleanup*/) transport->RemovePassenger(this); } -void WorldObject::_Create(ObjectGuid::LowType guidlow, HighGuid guidhigh, uint32 phaseMask) -{ - Object::_Create(guidlow, 0, guidhigh); - m_phaseMask = phaseMask; -} - void WorldObject::UpdatePositionData() { PositionFullTerrainStatus data; diff --git a/src/server/game/Entities/Object/Object.h b/src/server/game/Entities/Object/Object.h index f9587e64f4d..c161f221e54 100644 --- a/src/server/game/Entities/Object/Object.h +++ b/src/server/game/Entities/Object/Object.h @@ -219,7 +219,7 @@ class TC_GAME_API Object Object(); void _InitValues(); - void _Create(ObjectGuid::LowType guidlow, uint32 entry, HighGuid guidhigh); + void _Create(ObjectGuid const& guid); std::string _ConcatFields(uint16 startIndex, uint16 size) const; [[nodiscard]] bool _LoadIntoDataField(std::string const& data, uint32 startOffset, uint32 count); @@ -341,7 +341,6 @@ class TC_GAME_API WorldObject : public Object, public WorldLocation virtual void Update(uint32 /*time_diff*/) { } - void _Create(ObjectGuid::LowType guidlow, HighGuid guidhigh, uint32 phaseMask); void AddToWorld() override; void RemoveFromWorld() override; diff --git a/src/server/game/Entities/Object/ObjectGuid.cpp b/src/server/game/Entities/Object/ObjectGuid.cpp index cb0f4e5ab4d..07161787eeb 100644 --- a/src/server/game/Entities/Object/ObjectGuid.cpp +++ b/src/server/game/Entities/Object/ObjectGuid.cpp @@ -117,17 +117,7 @@ std::string ObjectGuid::ToHexString() const return Trinity::StringFormat("0x{:016X}", _guid); } -ObjectGuid ObjectGuid::Global(HighGuid type, LowType counter) -{ - return ObjectGuid(type, counter); -} - -ObjectGuid ObjectGuid::MapSpecific(HighGuid type, uint32 entry, LowType counter) -{ - return ObjectGuid(type, entry, counter); -} - -void PackedGuid::Set(ObjectGuid guid) +void PackedGuid::Set(ObjectGuid const& guid) { _packedSize = 1; uint64 raw = guid.GetRawValue(); diff --git a/src/server/game/Entities/Object/ObjectGuid.h b/src/server/game/Entities/Object/ObjectGuid.h index 4c26d2a87cd..5674a9bf7ee 100644 --- a/src/server/game/Entities/Object/ObjectGuid.h +++ b/src/server/game/Entities/Object/ObjectGuid.h @@ -15,14 +15,14 @@ * with this program. If not, see <http://www.gnu.org/licenses/>. */ -#ifndef ObjectGuid_h__ -#define ObjectGuid_h__ +#ifndef TRINITYCORE_OBJECT_GUID_H +#define TRINITYCORE_OBJECT_GUID_H #include "Define.h" +#include "EnumFlag.h" #include <array> #include <functional> #include <list> -#include <memory> #include <set> #include <stdexcept> #include <string> @@ -76,39 +76,47 @@ enum class HighGuid Group = 0x1F50, }; +enum class ObjectGuidSequenceSource +{ + None = 0x0, + Global = 0x1, + Map = 0x2 +}; + +DEFINE_ENUM_FLAG(ObjectGuidSequenceSource); + +enum class ObjectGuidFormatType +{ + OnlyCounter, + CounterAndEntry +}; + template<HighGuid high> struct ObjectGuidTraits { - static bool const Global = false; - static bool const MapSpecific = false; + static constexpr EnumFlag<ObjectGuidSequenceSource> SequenceSource = ObjectGuidSequenceSource::None; + using Format = std::integral_constant<ObjectGuidFormatType, ObjectGuidFormatType::OnlyCounter>; }; -#define GUID_TRAIT_GLOBAL(highguid) \ - template<> struct ObjectGuidTraits<highguid> \ +#define MAKE_GUID_TRAIT(high, sequence, format) \ + template<> struct ObjectGuidTraits<high> \ { \ - static bool const Global = true; \ - static bool const MapSpecific = false; \ - }; + static constexpr EnumFlag<ObjectGuidSequenceSource> SequenceSource = sequence; \ + using Format = std::integral_constant<ObjectGuidFormatType, format>; \ + } -#define GUID_TRAIT_MAP_SPECIFIC(highguid) \ - template<> struct ObjectGuidTraits<highguid> \ - { \ - static bool const Global = false; \ - static bool const MapSpecific = true; \ - }; - -GUID_TRAIT_GLOBAL(HighGuid::Player) -GUID_TRAIT_GLOBAL(HighGuid::Item) -GUID_TRAIT_GLOBAL(HighGuid::Mo_Transport) -GUID_TRAIT_GLOBAL(HighGuid::Group) -GUID_TRAIT_GLOBAL(HighGuid::Instance) -GUID_TRAIT_MAP_SPECIFIC(HighGuid::Transport) -GUID_TRAIT_MAP_SPECIFIC(HighGuid::Unit) -GUID_TRAIT_MAP_SPECIFIC(HighGuid::Vehicle) -GUID_TRAIT_MAP_SPECIFIC(HighGuid::Pet) -GUID_TRAIT_MAP_SPECIFIC(HighGuid::GameObject) -GUID_TRAIT_MAP_SPECIFIC(HighGuid::DynamicObject) -GUID_TRAIT_MAP_SPECIFIC(HighGuid::Corpse) +MAKE_GUID_TRAIT(HighGuid::Item, ObjectGuidSequenceSource::Global, ObjectGuidFormatType::OnlyCounter); +MAKE_GUID_TRAIT(HighGuid::Player, ObjectGuidSequenceSource::Global, ObjectGuidFormatType::OnlyCounter); +MAKE_GUID_TRAIT(HighGuid::GameObject, ObjectGuidSequenceSource::Map, ObjectGuidFormatType::CounterAndEntry); +MAKE_GUID_TRAIT(HighGuid::Transport, ObjectGuidSequenceSource::Map, ObjectGuidFormatType::OnlyCounter); +MAKE_GUID_TRAIT(HighGuid::Unit, ObjectGuidSequenceSource::Map, ObjectGuidFormatType::CounterAndEntry); +MAKE_GUID_TRAIT(HighGuid::Pet, ObjectGuidSequenceSource::Map, ObjectGuidFormatType::CounterAndEntry); +MAKE_GUID_TRAIT(HighGuid::Vehicle, ObjectGuidSequenceSource::Map, ObjectGuidFormatType::CounterAndEntry); +MAKE_GUID_TRAIT(HighGuid::DynamicObject, ObjectGuidSequenceSource::Map, ObjectGuidFormatType::OnlyCounter); +MAKE_GUID_TRAIT(HighGuid::Corpse, ObjectGuidSequenceSource::Map, ObjectGuidFormatType::OnlyCounter); +MAKE_GUID_TRAIT(HighGuid::Mo_Transport, ObjectGuidSequenceSource::Global, ObjectGuidFormatType::OnlyCounter); +MAKE_GUID_TRAIT(HighGuid::Instance, ObjectGuidSequenceSource::Global, ObjectGuidFormatType::OnlyCounter); +MAKE_GUID_TRAIT(HighGuid::Group, ObjectGuidSequenceSource::Global, ObjectGuidFormatType::OnlyCounter); class ByteBuffer; class ObjectGuid; @@ -133,16 +141,7 @@ class TC_GAME_API ObjectGuid typedef uint32 LowType; - template<HighGuid type> - static typename std::enable_if<ObjectGuidTraits<type>::Global, ObjectGuid>::type Create(LowType counter) { return Global(type, counter); } - - template<HighGuid type> - static typename std::enable_if<ObjectGuidTraits<type>::MapSpecific, ObjectGuid>::type Create(uint32 entry, LowType counter) { return MapSpecific(type, entry, counter); } - - ObjectGuid() : _guid(0) { } - explicit ObjectGuid(uint64 guid) : _guid(guid) { } - ObjectGuid(HighGuid hi, uint32 entry, LowType counter) : _guid(counter ? uint64(counter) | (uint64(entry) << 24) | (uint64(hi) << 48) : 0) { } - ObjectGuid(HighGuid hi, LowType counter) : _guid(counter ? uint64(counter) | (uint64(hi) << 48) : 0) { } + constexpr ObjectGuid() = default; PackedGuidReader ReadAsPacked() { return PackedGuidReader(*this); } @@ -221,8 +220,14 @@ class TC_GAME_API ObjectGuid std::string ToString() const; std::string ToHexString() const; + template<HighGuid type, std::enable_if_t<ObjectGuidTraits<type>::Format::value == ObjectGuidFormatType::OnlyCounter, int32> = 0> + static constexpr ObjectGuid Create(LowType counter) { return ObjectGuid(counter ? uint64(counter) | (uint64(type) << 48) : 0); } + + template<HighGuid type, std::enable_if_t<ObjectGuidTraits<type>::Format::value == ObjectGuidFormatType::CounterAndEntry, int32> = 0> + static constexpr ObjectGuid Create(uint32 entry, LowType counter) { return ObjectGuid(counter ? uint64(counter) | (uint64(entry) << 24) | (uint64(type) << 48) : 0); } + private: - static bool HasEntry(HighGuid high) + static constexpr bool HasEntry(HighGuid high) { switch (high) { @@ -246,14 +251,9 @@ class TC_GAME_API ObjectGuid bool HasEntry() const { return HasEntry(GetHigh()); } - static ObjectGuid Global(HighGuid type, LowType counter); - static ObjectGuid MapSpecific(HighGuid type, uint32 entry, LowType counter); - - explicit ObjectGuid(uint32 const&) = delete; // no implementation, used to catch wrong type assignment - ObjectGuid(HighGuid, uint32, uint64 counter) = delete; // no implementation, used to catch wrong type assignment - ObjectGuid(HighGuid, uint64 counter) = delete; // no implementation, used to catch wrong type assignment + explicit ObjectGuid(uint64 guid) : _guid(guid) { } - uint64 _guid; + uint64 _guid = 0; }; // Some Shared defines @@ -273,7 +273,7 @@ class TC_GAME_API PackedGuid explicit PackedGuid() : _packedSize(1), _packedGuid() { } explicit PackedGuid(ObjectGuid guid) { Set(guid); } - void Set(ObjectGuid guid); + void Set(ObjectGuid const& guid); std::size_t size() const { return _packedSize; } @@ -343,4 +343,5 @@ struct formatter<ObjectGuid, char, void> }; } } -#endif // ObjectGuid_h__ + +#endif // TRINITYCORE_OBJECT_GUID_H diff --git a/src/server/game/Entities/Pet/Pet.cpp b/src/server/game/Entities/Pet/Pet.cpp index e2855e6fdce..23cd4626355 100644 --- a/src/server/game/Entities/Pet/Pet.cpp +++ b/src/server/game/Entities/Pet/Pet.cpp @@ -222,9 +222,7 @@ bool Pet::LoadPetFromDB(Player* owner, uint32 petEntry, uint32 petnumber, bool c } Map* map = owner->GetMap(); - ObjectGuid::LowType guid = map->GenerateLowGuid<HighGuid::Pet>(); - - if (!Create(guid, map, owner->GetPhaseMask(), petInfo->CreatureId, petInfo->PetNumber)) + if (!Create(map->GenerateLowGuid<HighGuid::Pet>(), map, owner->GetPhaseMask(), petInfo->CreatureId, petInfo->PetNumber)) return false; setPetType(petInfo->Type); @@ -1232,6 +1230,7 @@ void Pet::_LoadAuras(PreparedQueryResult result, uint32 timediff) { TC_LOG_DEBUG("entities.pet", "Loading auras for pet {}", GetGUID().ToString()); + ObjectGuid casterGuid; if (result) { do @@ -1239,10 +1238,10 @@ void Pet::_LoadAuras(PreparedQueryResult result, uint32 timediff) int32 damage[3]; int32 baseDamage[3]; Field* fields = result->Fetch(); - ObjectGuid caster_guid(fields[0].GetUInt64()); + casterGuid.SetRawValue(fields[0].GetUInt64()); // NULL guid stored - pet is the caster of the spell - see Pet::_SaveAuras - if (!caster_guid) - caster_guid = GetGUID(); + if (!casterGuid) + casterGuid = GetGUID(); uint32 spellid = fields[1].GetUInt32(); uint8 effmask = fields[2].GetUInt8(); uint8 recalculatemask = fields[3].GetUInt8(); @@ -1286,7 +1285,7 @@ void Pet::_LoadAuras(PreparedQueryResult result, uint32 timediff) AuraCreateInfo createInfo(spellInfo, effmask, this); createInfo - .SetCasterGUID(caster_guid) + .SetCasterGUID(casterGuid) .SetBaseAmount(baseDamage); if (Aura* aura = Aura::TryCreate(createInfo)) @@ -1878,7 +1877,7 @@ bool Pet::Create(ObjectGuid::LowType guidlow, Map* map, uint32 phaseMask, uint32 SetMap(map); SetPhaseMask(phaseMask, false); - Object::_Create(guidlow, petId, HighGuid::Pet); + Object::_Create(ObjectGuid::Create<HighGuid::Pet>(petId, guidlow)); m_originalEntry = Entry; diff --git a/src/server/game/Entities/Player/Player.cpp b/src/server/game/Entities/Player/Player.cpp index 05b3ffa9d06..3ecaad3a1c6 100644 --- a/src/server/game/Entities/Player/Player.cpp +++ b/src/server/game/Entities/Player/Player.cpp @@ -430,7 +430,7 @@ bool Player::Create(ObjectGuid::LowType guidlow, CharacterCreateInfo* createInfo //FIXME: outfitId not used in player creating /// @todo need more checks against packet modifications - Object::_Create(guidlow, 0, HighGuid::Player); + Object::_Create(ObjectGuid::Create<HighGuid::Player>(guidlow)); m_name = createInfo->Name; @@ -1353,7 +1353,7 @@ bool Player::BuildEnumData(PreparedQueryResult result, WorldPacket* data) Field* fields = result->Fetch(); - ObjectGuid::LowType guid = fields[0].GetUInt32(); + ObjectGuid guid = ObjectGuid::Create<HighGuid::Player>(fields[0].GetUInt32()); uint8 playerRace = fields[2].GetUInt8(); uint8 playerClass = fields[3].GetUInt8(); uint8 gender = fields[4].GetUInt8(); @@ -1370,7 +1370,7 @@ bool Player::BuildEnumData(PreparedQueryResult result, WorldPacket* data) return false; } - *data << ObjectGuid(HighGuid::Player, guid); + *data << guid; *data << fields[1].GetString(); // name *data << uint8(playerRace); // race *data << uint8(playerClass); // class @@ -1395,7 +1395,7 @@ bool Player::BuildEnumData(PreparedQueryResult result, WorldPacket* data) { CharacterDatabasePreparedStatement* stmt = CharacterDatabase.GetPreparedStatement(CHAR_UPD_ADD_AT_LOGIN_FLAG); stmt->setUInt16(0, uint16(AT_LOGIN_CUSTOMIZE)); - stmt->setUInt32(1, guid); + stmt->setUInt32(1, guid.GetCounter()); CharacterDatabase.Execute(stmt); atLoginFlags |= AT_LOGIN_CUSTOMIZE; } @@ -4098,7 +4098,7 @@ void Player::DeleteFromDB(ObjectGuid playerguid, uint32 accountId, bool updateRe { do { - if (Player* playerFriend = ObjectAccessor::FindPlayer(ObjectGuid(HighGuid::Player, 0, (*resultFriends)[0].GetUInt32()))) + if (Player* playerFriend = ObjectAccessor::FindPlayer(ObjectGuid::Create<HighGuid::Player>((*resultFriends)[0].GetUInt32()))) { playerFriend->GetSocial()->RemoveFromSocialList(playerguid, SOCIAL_FLAG_ALL); sSocialMgr->SendFriendStatus(playerFriend, FRIEND_REMOVED, playerguid); @@ -4335,7 +4335,7 @@ void Player::DeleteOldCharacters(uint32 keepDays) do { Field* fields = result->Fetch(); - Player::DeleteFromDB(ObjectGuid(HighGuid::Player, fields[0].GetUInt32()), fields[1].GetUInt32(), true, true); + Player::DeleteFromDB(ObjectGuid::Create<HighGuid::Player>(fields[0].GetUInt32()), fields[1].GetUInt32(), true, true); } while (result->NextRow()); } @@ -17018,7 +17018,7 @@ bool Player::LoadFromDB(ObjectGuid guid, CharacterDatabaseQueryHolder const& hol return false; } - Object::_Create(guid.GetCounter(), 0, HighGuid::Player); + Object::_Create(guid); m_name = fields[2].GetString(); @@ -17246,7 +17246,7 @@ bool Player::LoadFromDB(ObjectGuid guid, CharacterDatabaseQueryHolder const& hol // currently we do not support transport in bg else if (transLowGUID) { - ObjectGuid transGUID(HighGuid::Mo_Transport, transLowGUID); + ObjectGuid transGUID = ObjectGuid::Create<HighGuid::Mo_Transport>(transLowGUID); Transport* transport = nullptr; if (Transport* go = HashMapHolder<Transport>::Find(transGUID)) @@ -17938,8 +17938,8 @@ void Player::_LoadInventory(PreparedQueryResult result, uint32 timeDiff) { uint32 zoneId = GetZoneId(); - std::map<ObjectGuid::LowType, Bag*> bagMap; // fast guid lookup for bags - std::map<ObjectGuid::LowType, Item*> invalidBagMap; // fast guid lookup for bags + std::map<ObjectGuid, Bag*> bagMap; // fast guid lookup for bags + std::map<ObjectGuid, Item*> invalidBagMap; // fast guid lookup for bags std::list<Item*> problematicItems; CharacterDatabaseTransaction trans = CharacterDatabase.BeginTransaction(); @@ -17950,7 +17950,7 @@ void Player::_LoadInventory(PreparedQueryResult result, uint32 timeDiff) Field* fields = result->Fetch(); if (Item* item = _LoadItem(trans, zoneId, timeDiff, fields)) { - ObjectGuid::LowType bagGuid = fields[11].GetUInt32(); + ObjectGuid bagGuid = fields[11].GetUInt32() ? ObjectGuid::Create<HighGuid::Item>(fields[11].GetUInt32()) : ObjectGuid::Empty; uint8 slot = fields[12].GetUInt8(); InventoryResult err = EQUIP_ERR_OK; @@ -17987,18 +17987,18 @@ void Player::_LoadInventory(PreparedQueryResult result, uint32 timeDiff) { if (IsBagPos(item->GetPos())) if (Bag* pBag = item->ToBag()) - bagMap[item->GetGUID().GetCounter()] = pBag; + bagMap[item->GetGUID()] = pBag; } else if (IsBagPos(item->GetPos())) if (item->IsBag()) - invalidBagMap[item->GetGUID().GetCounter()] = item; + invalidBagMap[item->GetGUID()] = item; } else { item->SetSlot(NULL_SLOT); // Item is in the bag, find the bag - std::map<ObjectGuid::LowType, Bag*>::iterator itr = bagMap.find(bagGuid); + std::map<ObjectGuid, Bag*>::iterator itr = bagMap.find(bagGuid); if (itr != bagMap.end()) { ItemPosCountVec dest; @@ -18008,7 +18008,7 @@ void Player::_LoadInventory(PreparedQueryResult result, uint32 timeDiff) } else if (invalidBagMap.find(bagGuid) != invalidBagMap.end()) { - std::map<ObjectGuid::LowType, Item*>::iterator invalidBagItr = invalidBagMap.find(bagGuid); + std::map<ObjectGuid, Item*>::iterator invalidBagItr = invalidBagMap.find(bagGuid); if (std::find(problematicItems.begin(), problematicItems.end(), invalidBagItr->second) != problematicItems.end()) err = EQUIP_ERR_INTERNAL_BAG_ERROR; } @@ -25585,6 +25585,13 @@ void Player::SendEquipmentSetList() size_t count_pos = data.wpos(); data << uint32(count); // count placeholder + static ObjectGuid const IgnoredSlot = [] + { + ObjectGuid guid; + guid.SetRawValue(1); + return guid; + }(); + for (EquipmentSetContainer::value_type const& eqSet : _equipmentSets) { if (eqSet.second.State == EQUIPMENT_SET_DELETED) @@ -25599,7 +25606,7 @@ void Player::SendEquipmentSetList() { // ignored slots stored in IgnoreMask, client wants "1" as raw GUID, so no HighGuid::Item if (eqSet.second.Data.IgnoreMask & (1 << i)) - data << ObjectGuid(UI64LIT(1)).WriteAsPacked(); + data << IgnoredSlot.WriteAsPacked(); else data << eqSet.second.Data.Pieces[i].WriteAsPacked(); } diff --git a/src/server/game/Entities/Transport/Transport.cpp b/src/server/game/Entities/Transport/Transport.cpp index 0dd8860bf58..b37a554adc9 100644 --- a/src/server/game/Entities/Transport/Transport.cpp +++ b/src/server/game/Entities/Transport/Transport.cpp @@ -57,7 +57,7 @@ bool Transport::Create(ObjectGuid::LowType guidlow, uint32 entry, uint32 mapid, return false; } - Object::_Create(guidlow, 0, HighGuid::Mo_Transport); + Object::_Create(ObjectGuid::Create<HighGuid::Mo_Transport>(guidlow)); GameObjectTemplate const* goinfo = sObjectMgr->GetGameObjectTemplate(entry); if (!goinfo) diff --git a/src/server/game/Globals/ObjectAccessor.cpp b/src/server/game/Globals/ObjectAccessor.cpp index 3de4d0e22a5..d80e7408ec9 100644 --- a/src/server/game/Globals/ObjectAccessor.cpp +++ b/src/server/game/Globals/ObjectAccessor.cpp @@ -250,7 +250,7 @@ Player* ObjectAccessor::FindPlayerByName(std::string_view name) Player* ObjectAccessor::FindPlayerByLowGUID(ObjectGuid::LowType lowguid) { - ObjectGuid guid(HighGuid::Player, lowguid); + ObjectGuid guid = ObjectGuid::Create<HighGuid::Player>(lowguid); return ObjectAccessor::FindPlayer(guid); } diff --git a/src/server/game/Globals/ObjectMgr.cpp b/src/server/game/Globals/ObjectMgr.cpp index 6fa4f1788d9..089c3cdf05d 100644 --- a/src/server/game/Globals/ObjectMgr.cpp +++ b/src/server/game/Globals/ObjectMgr.cpp @@ -1892,8 +1892,8 @@ void ObjectMgr::LoadLinkedRespawn() break; } - guid = ObjectGuid(HighGuid::Unit, slave->id, guidLow); - linkedGuid = ObjectGuid(HighGuid::Unit, master->id, linkedGuidLow); + guid = ObjectGuid::Create<HighGuid::Unit>(slave->id, guidLow); + linkedGuid = ObjectGuid::Create<HighGuid::Unit>(master->id, linkedGuidLow); break; } case LINKED_RESPAWN_CREATURE_TO_GO: @@ -1929,8 +1929,8 @@ void ObjectMgr::LoadLinkedRespawn() break; } - guid = ObjectGuid(HighGuid::Unit, slave->id, guidLow); - linkedGuid = ObjectGuid(HighGuid::GameObject, master->id, linkedGuidLow); + guid = ObjectGuid::Create<HighGuid::Unit>(slave->id, guidLow); + linkedGuid = ObjectGuid::Create<HighGuid::GameObject>(master->id, linkedGuidLow); break; } case LINKED_RESPAWN_GO_TO_GO: @@ -1966,8 +1966,8 @@ void ObjectMgr::LoadLinkedRespawn() break; } - guid = ObjectGuid(HighGuid::GameObject, slave->id, guidLow); - linkedGuid = ObjectGuid(HighGuid::GameObject, master->id, linkedGuidLow); + guid = ObjectGuid::Create<HighGuid::GameObject>(slave->id, guidLow); + linkedGuid = ObjectGuid::Create<HighGuid::GameObject>(master->id, linkedGuidLow); break; } case LINKED_RESPAWN_GO_TO_CREATURE: @@ -2003,8 +2003,8 @@ void ObjectMgr::LoadLinkedRespawn() break; } - guid = ObjectGuid(HighGuid::GameObject, slave->id, guidLow); - linkedGuid = ObjectGuid(HighGuid::Unit, master->id, linkedGuidLow); + guid = ObjectGuid::Create<HighGuid::GameObject>(slave->id, guidLow); + linkedGuid = ObjectGuid::Create<HighGuid::Unit>(master->id, linkedGuidLow); break; } } @@ -2024,7 +2024,7 @@ bool ObjectMgr::SetCreatureLinkedRespawn(ObjectGuid::LowType guidLow, ObjectGuid CreatureData const* master = GetCreatureData(guidLow); ASSERT(master); - ObjectGuid guid(HighGuid::Unit, master->id, guidLow); + ObjectGuid guid = ObjectGuid::Create<HighGuid::Unit>(master->id, guidLow); if (!linkedGuidLow) // we're removing the linking { @@ -2056,7 +2056,7 @@ bool ObjectMgr::SetCreatureLinkedRespawn(ObjectGuid::LowType guidLow, ObjectGuid return false; } - ObjectGuid linkedGuid(HighGuid::Unit, slave->id, linkedGuidLow); + ObjectGuid linkedGuid = ObjectGuid::Create<HighGuid::Unit>(slave->id, linkedGuidLow); _linkedRespawnStore[guid] = linkedGuid; WorldDatabasePreparedStatement* stmt = WorldDatabase.GetPreparedStatement(WORLD_REP_LINKED_RESPAWN); @@ -6443,7 +6443,7 @@ void ObjectMgr::ReturnOrDeleteOldMails(bool serverUp) { Field* fields = result->Fetch(); ObjectGuid::LowType receiver = fields[3].GetUInt32(); - if (serverUp && ObjectAccessor::FindConnectedPlayer(ObjectGuid(HighGuid::Player, receiver))) + if (serverUp && ObjectAccessor::FindConnectedPlayer(ObjectGuid::Create<HighGuid::Player>(receiver))) continue; Mail* m = new Mail; diff --git a/src/server/game/Globals/ObjectMgr.h b/src/server/game/Globals/ObjectMgr.h index ca43d66d9c8..162feb35b3e 100644 --- a/src/server/game/Globals/ObjectMgr.h +++ b/src/server/game/Globals/ObjectMgr.h @@ -1251,7 +1251,8 @@ class TC_GAME_API ObjectMgr template<HighGuid type> ObjectGuidGenerator& GetGenerator() { - static_assert(ObjectGuidTraits<type>::Global, "Only global guid can be generated in ObjectMgr context"); + static_assert(ObjectGuidTraits<type>::SequenceSource.HasFlag(ObjectGuidSequenceSource::Global), + "Only global guid can be generated in ObjectMgr context"); return GetGuidSequenceGenerator(type); } diff --git a/src/server/game/Groups/Group.cpp b/src/server/game/Groups/Group.cpp index ca11a2fe24e..c9993f95f40 100644 --- a/src/server/game/Groups/Group.cpp +++ b/src/server/game/Groups/Group.cpp @@ -152,7 +152,7 @@ bool Group::Create(Player* leader) { ObjectGuid leaderGuid = leader->GetGUID(); - m_guid = ObjectGuid(HighGuid::Group, sGroupMgr->GenerateGroupId()); + m_guid = ObjectGuid::Create<HighGuid::Group>(sGroupMgr->GenerateGroupId()); m_leaderGuid = leaderGuid; m_leaderName = leader->GetName(); leader->SetFlag(PLAYER_FLAGS, PLAYER_FLAGS_GROUP_LEADER); @@ -221,15 +221,15 @@ bool Group::Create(Player* leader) void Group::LoadGroupFromDB(Field* fields) { m_dbStoreId = fields[16].GetUInt32(); - m_guid = ObjectGuid(HighGuid::Group, sGroupMgr->GenerateGroupId()); - m_leaderGuid = ObjectGuid(HighGuid::Player, fields[0].GetUInt32()); + m_guid = ObjectGuid::Create<HighGuid::Group>(sGroupMgr->GenerateGroupId()); + m_leaderGuid = ObjectGuid::Create<HighGuid::Player>(fields[0].GetUInt32()); // group leader not exist if (!sCharacterCache->GetCharacterNameByGuid(m_leaderGuid, m_leaderName)) return; m_lootMethod = LootMethod(fields[1].GetUInt8()); - m_looterGuid = ObjectGuid(HighGuid::Player, fields[2].GetUInt32()); + m_looterGuid = ObjectGuid::Create<HighGuid::Player>(fields[2].GetUInt32()); m_lootThreshold = ItemQualities(fields[3].GetUInt8()); for (uint8 i = 0; i < TARGET_ICONS_COUNT; ++i) @@ -251,7 +251,7 @@ void Group::LoadGroupFromDB(Field* fields) else m_raidDifficulty = Difficulty(r_diff); - m_masterLooterGuid = ObjectGuid(HighGuid::Player, fields[15].GetUInt32()); + m_masterLooterGuid = fields[15].GetUInt32() ? ObjectGuid::Create<HighGuid::Player>(fields[15].GetUInt32()) : ObjectGuid::Empty; if (m_groupType & GROUPTYPE_LFG) sLFGMgr->_LoadFromDB(fields, GetGUID()); @@ -260,7 +260,7 @@ void Group::LoadGroupFromDB(Field* fields) void Group::LoadMemberFromDB(ObjectGuid::LowType guidLow, uint8 memberFlags, uint8 subgroup, uint8 roles) { MemberSlot member; - member.guid = ObjectGuid(HighGuid::Player, guidLow); + member.guid = ObjectGuid::Create<HighGuid::Player>(guidLow); // skip non-existed member if (!sCharacterCache->GetCharacterNameByGuid(member.guid, member.name)) @@ -1084,7 +1084,6 @@ void Group::GroupLoot(Loot* loot, WorldObject* pLootedObject) if (item->Quality >= uint32(m_lootThreshold)) { ObjectGuid newitemGUID = ObjectGuid::Create<HighGuid::Item>(sObjectMgr->GetGenerator<HighGuid::Item>().Generate()); - Roll* r = new Roll(newitemGUID, *i); //a vector is filled with only near party members @@ -1169,7 +1168,6 @@ void Group::GroupLoot(Loot* loot, WorldObject* pLootedObject) } ObjectGuid newitemGUID = ObjectGuid::Create<HighGuid::Item>(sObjectMgr->GetGenerator<HighGuid::Item>().Generate()); - Roll* r = new Roll(newitemGUID, *i); //a vector is filled with only near party members @@ -1235,7 +1233,6 @@ void Group::NeedBeforeGreed(Loot* loot, WorldObject* lootedObject) if (item->Quality >= uint32(m_lootThreshold)) { ObjectGuid newitemGUID = ObjectGuid::Create<HighGuid::Item>(sObjectMgr->GetGenerator<HighGuid::Item>().Generate()); - Roll* r = new Roll(newitemGUID, *i); for (GroupReference* itr = GetFirstMember(); itr != nullptr; itr = itr->next()) @@ -1309,7 +1306,6 @@ void Group::NeedBeforeGreed(Loot* loot, WorldObject* lootedObject) item = sObjectMgr->GetItemTemplate(i->itemid); ObjectGuid newitemGUID = ObjectGuid::Create<HighGuid::Item>(sObjectMgr->GetGenerator<HighGuid::Item>().Generate()); - Roll* r = new Roll(newitemGUID, *i); for (GroupReference* itr = GetFirstMember(); itr != nullptr; itr = itr->next()) diff --git a/src/server/game/Guilds/Guild.cpp b/src/server/game/Guilds/Guild.cpp index 5598ec01707..59bf3314f1b 100644 --- a/src/server/game/Guilds/Guild.cpp +++ b/src/server/game/Guilds/Guild.cpp @@ -1917,7 +1917,7 @@ bool Guild::LoadFromDB(Field* fields) { m_id = fields[0].GetUInt32(); m_name = fields[1].GetString(); - m_leaderGuid = ObjectGuid(HighGuid::Player, fields[2].GetUInt32()); + m_leaderGuid = ObjectGuid::Create<HighGuid::Player>(fields[2].GetUInt32()); m_emblemInfo.LoadFromDB(fields); m_info = fields[8].GetString(); m_motd = fields[9].GetString(); @@ -1947,7 +1947,7 @@ void Guild::LoadRankFromDB(Field* fields) bool Guild::LoadMemberFromDB(Field* fields) { ObjectGuid::LowType lowguid = fields[1].GetUInt32(); - ObjectGuid playerGuid(HighGuid::Player, lowguid); + ObjectGuid playerGuid(ObjectGuid::Create<HighGuid::Player>(lowguid)); auto [memberIt, isNew] = m_members.try_emplace(playerGuid, m_id, playerGuid, fields[2].GetUInt8()); if (!isNew) diff --git a/src/server/game/Handlers/AuctionHouseHandler.cpp b/src/server/game/Handlers/AuctionHouseHandler.cpp index 1880194278d..fa6020ad84d 100644 --- a/src/server/game/Handlers/AuctionHouseHandler.cpp +++ b/src/server/game/Handlers/AuctionHouseHandler.cpp @@ -489,7 +489,7 @@ void WorldSession::HandleAuctionPlaceBid(WorldPacket& recvData) } // impossible have online own another character (use this for speedup check in case online owner) - ObjectGuid ownerGuid(HighGuid::Player, auction->owner); + ObjectGuid ownerGuid = ObjectGuid::Create<HighGuid::Player>(auction->owner); Player* auction_owner = ObjectAccessor::FindPlayer(ownerGuid); if (!auction_owner && sCharacterCache->GetCharacterAccountIdByGuid(ownerGuid) == player->GetSession()->GetAccountId()) { diff --git a/src/server/game/Handlers/CharacterHandler.cpp b/src/server/game/Handlers/CharacterHandler.cpp index 98adad41a51..88a7fd0d9d4 100644 --- a/src/server/game/Handlers/CharacterHandler.cpp +++ b/src/server/game/Handlers/CharacterHandler.cpp @@ -229,7 +229,7 @@ void WorldSession::HandleCharEnum(PreparedQueryResult result) { do { - ObjectGuid guid(HighGuid::Player, (*result)[0].GetUInt32()); + ObjectGuid guid = ObjectGuid::Create<HighGuid::Player>((*result)[0].GetUInt32()); TC_LOG_INFO("network", "Loading {} from account {}.", guid.ToString(), GetAccountId()); if (Player::BuildEnumData(result, &data)) { diff --git a/src/server/game/Handlers/MailHandler.cpp b/src/server/game/Handlers/MailHandler.cpp index 951a5cfe808..e3f5cbd8a7b 100644 --- a/src/server/game/Handlers/MailHandler.cpp +++ b/src/server/game/Handlers/MailHandler.cpp @@ -440,7 +440,7 @@ void WorldSession::HandleMailTakeItem(WorldPackets::Mail::MailTakeItem& takeItem if (m->COD > 0) //if there is COD, take COD money from player and send them to sender by mail { - ObjectGuid sender_guid(HighGuid::Player, m->sender); + ObjectGuid sender_guid = ObjectGuid::Create<HighGuid::Player>(m->sender); Player* receiver = ObjectAccessor::FindConnectedPlayer(sender_guid); uint32 sender_accId = 0; @@ -588,7 +588,7 @@ void WorldSession::HandleMailCreateTextItem(WorldPackets::Mail::MailCreateTextIt bodyItem->SetText(m->body); if (m->messageType == MAIL_NORMAL) - bodyItem->SetGuidValue(ITEM_FIELD_CREATOR, ObjectGuid(HighGuid::Player, m->sender)); + bodyItem->SetGuidValue(ITEM_FIELD_CREATOR, ObjectGuid::Create<HighGuid::Player>(m->sender)); bodyItem->SetFlag(ITEM_FIELD_FLAGS, ITEM_FLAG_MAIL_TEXT_MASK); diff --git a/src/server/game/Mails/Mail.cpp b/src/server/game/Mails/Mail.cpp index c580d794426..2ccac032ad9 100644 --- a/src/server/game/Mails/Mail.cpp +++ b/src/server/game/Mails/Mail.cpp @@ -144,7 +144,7 @@ void MailDraft::deleteIncludedItems(CharacterDatabaseTransaction trans, bool inD void MailDraft::SendReturnToSender(uint32 sender_acc, ObjectGuid::LowType sender_guid, ObjectGuid::LowType receiver_guid, CharacterDatabaseTransaction trans) { - ObjectGuid receiverGuid(HighGuid::Player, receiver_guid); + ObjectGuid receiverGuid = ObjectGuid::Create<HighGuid::Player>(receiver_guid); Player* receiver = ObjectAccessor::FindConnectedPlayer(receiverGuid); uint32 rc_account = 0; diff --git a/src/server/game/Maps/Map.cpp b/src/server/game/Maps/Map.cpp index bf4a8d1b197..5f65a14f262 100644 --- a/src/server/game/Maps/Map.cpp +++ b/src/server/game/Maps/Map.cpp @@ -3082,7 +3082,9 @@ bool Map::CheckRespawn(RespawnInfo* info) } // next, check linked respawn time - ObjectGuid thisGUID = ObjectGuid((info->type == SPAWN_TYPE_GAMEOBJECT) ? HighGuid::GameObject : HighGuid::Unit, info->entry, info->spawnId); + ObjectGuid thisGUID = info->type == SPAWN_TYPE_GAMEOBJECT + ? ObjectGuid::Create<HighGuid::GameObject>(info->entry, info->spawnId) + : ObjectGuid::Create<HighGuid::Unit>(info->entry, info->spawnId); if (time_t linkedTime = GetLinkedRespawnTime(thisGUID)) { time_t now = GameTime::GetGameTime(); diff --git a/src/server/game/Maps/Map.h b/src/server/game/Maps/Map.h index f82420e49e3..05d55cbacc8 100644 --- a/src/server/game/Maps/Map.h +++ b/src/server/game/Maps/Map.h @@ -586,14 +586,14 @@ class TC_GAME_API Map : public GridRefManager<NGridType> template<HighGuid high> inline ObjectGuid::LowType GenerateLowGuid() { - static_assert(ObjectGuidTraits<high>::MapSpecific, "Only map specific guid can be generated in Map context"); + static_assert(ObjectGuidTraits<high>::SequenceSource.HasFlag(ObjectGuidSequenceSource::Map), "Only map specific guid can be generated in Map context"); return GetGuidSequenceGenerator(high).Generate(); } template<HighGuid high> inline ObjectGuid::LowType GetMaxLowGuid() { - static_assert(ObjectGuidTraits<high>::MapSpecific, "Only map specific guid can be retrieved in Map context"); + static_assert(ObjectGuidTraits<high>::SequenceSource.HasFlag(ObjectGuidSequenceSource::Map), "Only map specific guid can be generated in Map context"); return GetGuidSequenceGenerator(high).GetNextAfterMaxUsed(); } diff --git a/src/server/game/Pools/PoolMgr.cpp b/src/server/game/Pools/PoolMgr.cpp index 5d5a3d52728..d4a8a23cfbe 100644 --- a/src/server/game/Pools/PoolMgr.cpp +++ b/src/server/game/Pools/PoolMgr.cpp @@ -464,7 +464,7 @@ void PoolMgr::LoadFromDB() { Field* fields = result->Fetch(); - ObjectGuid::LowType guid = fields[0].GetUInt32(); + ObjectGuid::LowType guid = fields[0].GetUInt32(); uint32 pool_id = fields[1].GetUInt32(); float chance = fields[2].GetFloat(); diff --git a/src/server/game/Tickets/TicketMgr.cpp b/src/server/game/Tickets/TicketMgr.cpp index 84b68176f21..dc935cda33b 100644 --- a/src/server/game/Tickets/TicketMgr.cpp +++ b/src/server/game/Tickets/TicketMgr.cpp @@ -68,7 +68,7 @@ bool GmTicket::LoadFromDB(Field* fields) uint8 index = 0; _id = fields[ index].GetUInt32(); _type = TicketType(fields[++index].GetUInt8()); - _playerGuid = ObjectGuid(HighGuid::Player, fields[++index].GetUInt32()); + _playerGuid = ObjectGuid::Create<HighGuid::Player>(fields[++index].GetUInt32()); _playerName = fields[++index].GetString(); _message = fields[++index].GetString(); _createTime = fields[++index].GetUInt32(); @@ -77,8 +77,8 @@ bool GmTicket::LoadFromDB(Field* fields) _posY = fields[++index].GetFloat(); _posZ = fields[++index].GetFloat(); _lastModifiedTime = fields[++index].GetUInt32(); - _closedBy = ObjectGuid(uint64(fields[++index].GetInt32())); - _assignedTo = ObjectGuid(HighGuid::Player, fields[++index].GetUInt32()); + _closedBy = fields[++index].GetUInt32() ? ObjectGuid::Create<HighGuid::Player>(fields[index].GetUInt32()) : ObjectGuid::Empty; + _assignedTo = fields[++index].GetUInt32() ? ObjectGuid::Create<HighGuid::Player>(fields[index].GetUInt32()) : ObjectGuid::Empty; _comment = fields[++index].GetString(); _response = fields[++index].GetString(); _completed = fields[++index].GetBool(); @@ -105,7 +105,7 @@ void GmTicket::SaveToDB(CharacterDatabaseTransaction trans) const stmt->setFloat (++index, _posY); stmt->setFloat (++index, _posZ); stmt->setUInt32(++index, uint32(_lastModifiedTime)); - stmt->setInt32 (++index, int32(_closedBy.GetCounter())); + stmt->setUInt32(++index, _closedBy.GetCounter()); stmt->setUInt32(++index, _assignedTo.GetCounter()); stmt->setString(++index, _comment); stmt->setString(++index, _response); diff --git a/src/server/game/Tools/PlayerDump.cpp b/src/server/game/Tools/PlayerDump.cpp index d9e78dadf4c..dc47910c3f1 100644 --- a/src/server/game/Tools/PlayerDump.cpp +++ b/src/server/game/Tools/PlayerDump.cpp @@ -953,7 +953,7 @@ DumpReturn PlayerDumpReader::LoadDump(std::istream& input, uint32 account, std:: CharacterDatabase.CommitTransaction(trans); // in case of name conflict player has to rename at login anyway - sCharacterCache->AddCharacterCacheEntry(ObjectGuid(HighGuid::Player, guid), account, name, gender, race, playerClass, level); + sCharacterCache->AddCharacterCacheEntry(ObjectGuid::Create<HighGuid::Player>(guid), account, name, gender, race, playerClass, level); sObjectMgr->GetGenerator<HighGuid::Item>().Set(sObjectMgr->GetGenerator<HighGuid::Item>().GetNextAfterMaxUsed() + items.size()); sObjectMgr->_mailId += mails.size(); diff --git a/src/server/scripts/Commands/cs_character.cpp b/src/server/scripts/Commands/cs_character.cpp index aef0b9a73bf..58b9614f65e 100644 --- a/src/server/scripts/Commands/cs_character.cpp +++ b/src/server/scripts/Commands/cs_character.cpp @@ -140,7 +140,7 @@ public: DeletedInfo info; - info.guid = ObjectGuid(HighGuid::Player, fields[0].GetUInt32()); + info.guid = ObjectGuid::Create<HighGuid::Player>(fields[0].GetUInt32()); info.name = fields[1].GetString(); info.accountId = fields[2].GetUInt32(); @@ -946,7 +946,7 @@ public: if (characterGUID) { - if (sCharacterCache->GetCharacterCacheByGuid(ObjectGuid(HighGuid::Player, *characterGUID))) + if (sCharacterCache->GetCharacterCacheByGuid(ObjectGuid::Create<HighGuid::Player>(*characterGUID))) { handler->PSendSysMessage(LANG_CHARACTER_GUID_IN_USE, *characterGUID); handler->SetSentErrorMessage(true); diff --git a/src/server/scripts/Commands/cs_debug.cpp b/src/server/scripts/Commands/cs_debug.cpp index a99ad2e8752..37e3db1aac9 100644 --- a/src/server/scripts/Commands/cs_debug.cpp +++ b/src/server/scripts/Commands/cs_debug.cpp @@ -1055,7 +1055,7 @@ public: static bool HandleDebugGetItemValueCommand(ChatHandler* handler, ObjectGuid::LowType guid, uint32 index) { - Item* i = handler->GetPlayer()->GetItemByGuid(ObjectGuid(HighGuid::Item, 0, guid)); + Item* i = handler->GetPlayer()->GetItemByGuid(ObjectGuid::Create<HighGuid::Item>(guid)); if (!i) return false; @@ -1072,7 +1072,7 @@ public: static bool HandleDebugSetItemValueCommand(ChatHandler* handler, ObjectGuid::LowType guid, uint32 index, uint32 value) { - Item* i = handler->GetPlayer()->GetItemByGuid(ObjectGuid(HighGuid::Item, 0, guid)); + Item* i = handler->GetPlayer()->GetItemByGuid(ObjectGuid::Create<HighGuid::Item>(guid)); if (!i) return false; @@ -1087,7 +1087,7 @@ public: static bool HandleDebugItemExpireCommand(ChatHandler* handler, ObjectGuid::LowType guid) { - Item* i = handler->GetPlayer()->GetItemByGuid(ObjectGuid(HighGuid::Item, guid)); + Item* i = handler->GetPlayer()->GetItemByGuid(ObjectGuid::Create<HighGuid::Item>(guid)); if (!i) return false; diff --git a/src/server/scripts/Commands/cs_ticket.cpp b/src/server/scripts/Commands/cs_ticket.cpp index 80d7f6f576f..5db99bdca31 100644 --- a/src/server/scripts/Commands/cs_ticket.cpp +++ b/src/server/scripts/Commands/cs_ticket.cpp @@ -159,7 +159,7 @@ public: return true; } - sTicketMgr->ResolveAndCloseTicket(ticket->GetId(), player ? player->GetGUID() : ObjectGuid(uint64(0))); + sTicketMgr->ResolveAndCloseTicket(ticket->GetId(), Object::GetGUID(player)); sTicketMgr->UpdateLastChange(); std::string msg = ticket->FormatMessageString(*handler, player ? player->GetName().c_str() : "Console", nullptr, nullptr, nullptr, nullptr); @@ -262,7 +262,7 @@ public: Player* gm = handler->GetSession() ? handler->GetSession()->GetPlayer() : nullptr; CharacterDatabaseTransaction trans = CharacterDatabaseTransaction(nullptr); - ticket->SetResolvedBy(gm ? gm->GetGUID() : ObjectGuid(uint64(0))); + ticket->SetResolvedBy(Object::GetGUID(gm)); ticket->SetCompleted(); ticket->SaveToDB(trans); |
