aboutsummaryrefslogtreecommitdiff
path: root/src/server/game/Entities
diff options
context:
space:
mode:
authorShauren <shauren.trinity@gmail.com>2025-12-29 00:28:20 +0100
committerShauren <shauren.trinity@gmail.com>2025-12-29 00:28:20 +0100
commitd93f1a63c094f85da7ed6b07de3b3fe51bd11d03 (patch)
treef5f2bb70c64d3f34f6a5250beb3e0bcc532a9c8e /src/server/game/Entities
parent405e1a3b27e8419ee69d6331b053650ce1eb1a65 (diff)
Core/Objects: Added new visible object type - bnet account with HousingStorageData
Diffstat (limited to 'src/server/game/Entities')
-rw-r--r--src/server/game/Entities/Account/Account.cpp86
-rw-r--r--src/server/game/Entities/Account/Account.h54
-rw-r--r--src/server/game/Entities/Item/Item.cpp2
-rw-r--r--src/server/game/Entities/Object/Object.cpp2
-rw-r--r--src/server/game/Entities/Player/Player.cpp7
-rw-r--r--src/server/game/Entities/Transport/Transport.cpp2
6 files changed, 150 insertions, 3 deletions
diff --git a/src/server/game/Entities/Account/Account.cpp b/src/server/game/Entities/Account/Account.cpp
new file mode 100644
index 00000000000..1de478212b7
--- /dev/null
+++ b/src/server/game/Entities/Account/Account.cpp
@@ -0,0 +1,86 @@
+/*
+* This file is part of the TrinityCore Project. See AUTHORS file for Copyright information
+*
+* This program is free software; you can redistribute it and/or modify it
+* under the terms of the GNU General Public License as published by the
+* Free Software Foundation; either version 2 of the License, or (at your
+* option) any later version.
+*
+* This program is distributed in the hope that it will be useful, but WITHOUT
+* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+* FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
+* more details.
+*
+* You should have received a copy of the GNU General Public License along
+* with this program. If not, see <http://www.gnu.org/licenses/>.
+*/
+
+#include "Account.h"
+#include "Map.h"
+#include "Player.h"
+#include "StringFormat.h"
+#include "WorldSession.h"
+
+namespace Battlenet
+{
+Account::Account(WorldSession* session, ObjectGuid guid, std::string&& name) : m_session(session), m_name(std::move(name))
+{
+ _Create(guid);
+
+ m_entityFragments.Add(WowCS::EntityFragment::FHousingStorage_C, false, WowCS::FragmentSerializationTraits<&Account::m_housingStorageData>{});
+
+ // Default value
+ SetUpdateFieldValue(m_values.ModifyValue(&Account::m_housingStorageData).ModifyValue(&UF::HousingStorageData::DecorMaxOwnedCount), 5000);
+}
+
+void Account::ClearUpdateMask(bool remove)
+{
+ m_values.ClearChangesMask(&Account::m_housingStorageData);
+ BaseEntity::ClearUpdateMask(remove);
+}
+
+std::string Account::GetNameForLocaleIdx(LocaleConstant /*locale*/) const
+{
+ return m_name;
+}
+
+void Account::BuildUpdate(UpdateDataMapType& data_map)
+{
+ BuildUpdateChangesMask();
+
+ if (Player* owner = m_session->GetPlayer())
+ BuildFieldsUpdate(owner, data_map);
+
+ ClearUpdateMask(false);
+}
+
+std::string Account::GetDebugInfo() const
+{
+ return Trinity::StringFormat("{}\nName: {}", BaseEntity::GetDebugInfo(), m_name);
+}
+
+UF::UpdateFieldFlag Account::GetUpdateFieldFlagsFor(Player const* target) const
+{
+ if (*target->m_playerData->BnetAccount == GetGUID())
+ return UF::UpdateFieldFlag::Owner;
+
+ return UF::UpdateFieldFlag::None;
+}
+
+bool Account::AddToObjectUpdate()
+{
+ if (Player* owner = m_session->GetPlayer(); owner && owner->IsInWorld())
+ {
+ owner->GetMap()->AddUpdateObject(this);
+ return true;
+ }
+
+ return false;
+}
+
+void Account::RemoveFromObjectUpdate()
+{
+ if (Player* owner = m_session->GetPlayer(); owner && owner->IsInWorld())
+ owner->GetMap()->RemoveUpdateObject(this);
+}
+}
diff --git a/src/server/game/Entities/Account/Account.h b/src/server/game/Entities/Account/Account.h
new file mode 100644
index 00000000000..3e6f1360e98
--- /dev/null
+++ b/src/server/game/Entities/Account/Account.h
@@ -0,0 +1,54 @@
+/*
+* This file is part of the TrinityCore Project. See AUTHORS file for Copyright information
+*
+* This program is free software; you can redistribute it and/or modify it
+* under the terms of the GNU General Public License as published by the
+* Free Software Foundation; either version 2 of the License, or (at your
+* option) any later version.
+*
+* This program is distributed in the hope that it will be useful, but WITHOUT
+* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+* FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
+* more details.
+*
+* You should have received a copy of the GNU General Public License along
+* with this program. If not, see <http://www.gnu.org/licenses/>.
+*/
+
+#ifndef TRINITYCORE_ACCOUNT_H
+#define TRINITYCORE_ACCOUNT_H
+
+#include "BaseEntity.h"
+
+class WorldSession;
+
+namespace Battlenet
+{
+class Account final : public BaseEntity
+{
+public:
+ explicit Account(WorldSession* session, ObjectGuid guid, std::string&& name);
+
+ void ClearUpdateMask(bool remove) override;
+
+ std::string GetNameForLocaleIdx(LocaleConstant locale) const override;
+
+ void BuildUpdate(UpdateDataMapType& data_map) override;
+
+ std::string GetDebugInfo() const override;
+
+ UF::UpdateField<UF::HousingStorageData, int32(WowCS::EntityFragment::FHousingStorage_C), 0> m_housingStorageData;
+
+protected:
+ UF::UpdateFieldFlag GetUpdateFieldFlagsFor(Player const* target) const override;
+
+ bool AddToObjectUpdate() override;
+ void RemoveFromObjectUpdate() override;
+
+private:
+ WorldSession* m_session;
+ std::string m_name;
+};
+}
+
+#endif // TRINITYCORE_ACCOUNT_H
diff --git a/src/server/game/Entities/Item/Item.cpp b/src/server/game/Entities/Item/Item.cpp
index e6536e3c91e..5bbd1b81edb 100644
--- a/src/server/game/Entities/Item/Item.cpp
+++ b/src/server/game/Entities/Item/Item.cpp
@@ -1786,7 +1786,7 @@ bool Item::IsBindedNotWith(Player const* player) const
void Item::BuildUpdate(UpdateDataMapType& data_map)
{
- Object::BuildUpdateChangesMask();
+ BuildUpdateChangesMask();
if (Player* owner = GetOwner())
BuildFieldsUpdate(owner, data_map);
diff --git a/src/server/game/Entities/Object/Object.cpp b/src/server/game/Entities/Object/Object.cpp
index 148f0ceca21..33fc45d5617 100644
--- a/src/server/game/Entities/Object/Object.cpp
+++ b/src/server/game/Entities/Object/Object.cpp
@@ -3117,7 +3117,7 @@ struct WorldObjectChangeAccumulator
void WorldObject::BuildUpdate(UpdateDataMapType& data_map)
{
- Object::BuildUpdateChangesMask();
+ BuildUpdateChangesMask();
WorldObjectChangeAccumulator notifier(*this, data_map);
WorldObjectVisibleChangeVisitor visitor(notifier);
diff --git a/src/server/game/Entities/Player/Player.cpp b/src/server/game/Entities/Player/Player.cpp
index 68013f65654..4eb409c8b12 100644
--- a/src/server/game/Entities/Player/Player.cpp
+++ b/src/server/game/Entities/Player/Player.cpp
@@ -17,6 +17,7 @@
#include "Player.h"
#include "AreaTrigger.h"
+#include "Account.h"
#include "AccountMgr.h"
#include "AchievementMgr.h"
#include "ArenaTeam.h"
@@ -1540,6 +1541,8 @@ void Player::AddToWorld()
for (uint8 i = PLAYER_SLOT_START; i < PLAYER_SLOT_END; ++i)
if (m_items[i])
m_items[i]->AddToWorld();
+
+ GetSession()->GetBattlenetAccount().AddToWorld();
}
void Player::RemoveFromWorld()
@@ -1559,6 +1562,8 @@ void Player::RemoveFromWorld()
sBattlefieldMgr->HandlePlayerLeaveZone(this, m_zoneUpdateId);
}
+ GetSession()->GetBattlenetAccount().RemoveFromWorld();
+
// Remove items from world before self - player must be found in Item::RemoveFromObjectUpdate
for (uint8 i = PLAYER_SLOT_START; i < PLAYER_SLOT_END; ++i)
if (m_items[i])
@@ -3592,6 +3597,8 @@ void Player::BuildCreateUpdateBlockForPlayer(UpdateData* data, Player* target) c
for (Item* item : m_items)
if (item)
item->BuildCreateUpdateBlockForPlayer(data, target);
+
+ GetSession()->GetBattlenetAccount().BuildCreateUpdateBlockForPlayer(data, target);
}
Unit::BuildCreateUpdateBlockForPlayer(data, target);
diff --git a/src/server/game/Entities/Transport/Transport.cpp b/src/server/game/Entities/Transport/Transport.cpp
index b17921d3840..81733d625fd 100644
--- a/src/server/game/Entities/Transport/Transport.cpp
+++ b/src/server/game/Entities/Transport/Transport.cpp
@@ -689,7 +689,7 @@ void Transport::UpdatePassengerPositions(PassengerSet const& passengers)
void Transport::BuildUpdate(UpdateDataMapType& data_map)
{
- Object::BuildUpdateChangesMask();
+ BuildUpdateChangesMask();
for (MapReference const& playerReference : GetMap()->GetPlayers())
if (playerReference.GetSource()->InSamePhase(this))