Skip to content

Commit

Permalink
Another WIP
Browse files Browse the repository at this point in the history
  • Loading branch information
killerwife committed Feb 1, 2025
1 parent fa87819 commit ec168b2
Show file tree
Hide file tree
Showing 15 changed files with 240 additions and 151 deletions.
2 changes: 1 addition & 1 deletion src/game/Entities/Bag.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -161,7 +161,7 @@ void Bag::StoreItem(uint8 slot, Item* pItem)
}
}

void Bag::BuildCreateUpdateBlockForPlayer(UpdateData* data, Player* target) const
void Bag::BuildCreateUpdateBlockForPlayer(UpdateData& data, Player* target) const
{
Item::BuildCreateUpdateBlockForPlayer(data, target);

Expand Down
2 changes: 1 addition & 1 deletion src/game/Entities/Bag.h
Original file line number Diff line number Diff line change
Expand Up @@ -65,7 +65,7 @@ class Bag : public Item
// overwrite virtual Item::DeleteFromDB
void DeleteFromDB() override;

void BuildCreateUpdateBlockForPlayer(UpdateData* data, Player* target) const override;
void BuildCreateUpdateBlockForPlayer(UpdateData& data, Player* target) const override;

protected:

Expand Down
4 changes: 3 additions & 1 deletion src/game/Entities/DynamicObject.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -54,7 +54,7 @@ void DynamicObject::RemoveFromWorld()
GetMap()->GetObjectsStore().erase<DynamicObject>(GetObjectGuid(), (DynamicObject*)nullptr);
}

Object::RemoveFromWorld();
WorldObject::RemoveFromWorld();
}

bool DynamicObject::Create(uint32 guidlow, Unit* caster, uint32 spellId, SpellEffectIndex effIndex, float x, float y, float z, int32 duration, float radius, DynamicObjectType type, SpellTarget target, int32 damage, int32 basePoints)
Expand Down Expand Up @@ -155,6 +155,8 @@ void DynamicObject::Update(const uint32 /*diff*/)
void DynamicObject::Delete()
{
SendObjectDeSpawnAnim(GetObjectGuid());
if (!GetMap()->IsUpdateObjectTick())
DestroyOnClientsIAmAt();
AddObjectToRemoveList();
}

Expand Down
8 changes: 7 additions & 1 deletion src/game/Entities/Item.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -1190,7 +1190,7 @@ bool Item::IsBindedNotWith(Player const* player) const
void Item::AddToClientUpdateList()
{
if (Player* pl = GetOwner())
pl->GetMap()->AddUpdateCreateObject(this);
pl->GetMap()->AddUpdateObject(this);
}

void Item::RemoveFromClientUpdateList()
Expand All @@ -1207,6 +1207,12 @@ void Item::BuildUpdateData(UpdateDataMapType& update_players)
ClearUpdateMask(false);
}

void Item::BuildCreateData(UpdateDataMapType& update_players)
{
if (Player* pl = GetOwner())
BuildCreateDataForPlayer(pl, update_players);
}

uint32 Item::GetTotalAP() const
{
int32 totalAP = 0;
Expand Down
1 change: 1 addition & 0 deletions src/game/Entities/Item.h
Original file line number Diff line number Diff line change
Expand Up @@ -383,6 +383,7 @@ class Item : public Object
void AddToClientUpdateList() override;
void RemoveFromClientUpdateList() override;
void BuildUpdateData(UpdateDataMapType& update_players) override;
void BuildCreateData(UpdateDataMapType& update_players) override;

bool IsUsedInSpell() const { return m_usedInSpell; }
void SetUsedInSpell(bool state) { m_usedInSpell = state; }
Expand Down
114 changes: 100 additions & 14 deletions src/game/Entities/Object.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -146,15 +146,11 @@ void Object::SendForcedObjectUpdate()
// here we allocate a std::vector with a size of 0x10000
for (auto& update_player : update_players)
{
for (size_t i = 0; i < update_player.second.GetPacketCount(); ++i)
{
WorldPacket packet = update_player.second.BuildPacket(i);
update_player.first->GetSession()->SendPacket(packet);
}
update_player.second.SendData(*update_player.first->GetSession());
}
}

void Object::BuildMovementUpdateBlock(UpdateData* data, uint16 flags) const
void Object::BuildMovementUpdateBlock(UpdateData& data, uint16 flags) const
{
ByteBuffer buf(500);

Expand All @@ -163,10 +159,10 @@ void Object::BuildMovementUpdateBlock(UpdateData* data, uint16 flags) const

BuildMovementUpdate(&buf, flags);

data->AddUpdateBlock(buf);
data.AddUpdateBlock(buf);
}

void Object::BuildCreateUpdateBlockForPlayer(UpdateData* data, Player* target) const
void Object::BuildCreateUpdateBlockForPlayer(UpdateData& data, Player* target) const
{
if (!target)
return;
Expand Down Expand Up @@ -215,13 +211,13 @@ void Object::BuildCreateUpdateBlockForPlayer(UpdateData* data, Player* target) c
updateMask.SetCount(m_valuesCount);
_SetCreateBits(updateMask, target);
BuildValuesUpdate(updatetype, &buf, &updateMask, target);
data->AddUpdateBlock(buf);
data.AddUpdateBlock(buf);
}

void Object::SendCreateUpdateToPlayer(Player* player, UpdateData& data) const
{
// send create update to player
BuildCreateUpdateBlockForPlayer(&data, player);
BuildCreateUpdateBlockForPlayer(data, player);
}

void Object::BuildValuesUpdateBlockForPlayer(UpdateData& data, Player* target) const
Expand Down Expand Up @@ -254,7 +250,7 @@ void Object::BuildValuesUpdateBlockForPlayer(UpdateData& data, UpdateMask& updat
data.AddUpdateBlock(buf);
}

void Object::BuildForcedValuesUpdateBlockForPlayer(UpdateData* data, Player* target) const
void Object::BuildForcedValuesUpdateBlockForPlayer(UpdateData& data, Player* target) const
{
ByteBuffer buf(500);

Expand All @@ -267,12 +263,12 @@ void Object::BuildForcedValuesUpdateBlockForPlayer(UpdateData* data, Player* tar
_SetCreateBits(updateMask, target);
BuildValuesUpdate(UPDATETYPE_VALUES, &buf, &updateMask, target);

data->AddUpdateBlock(buf);
data.AddUpdateBlock(buf);
}

void Object::BuildOutOfRangeUpdateBlock(UpdateData* data) const
void Object::BuildOutOfRangeUpdateBlock(UpdateData& data) const
{
data->AddOutOfRangeGUID(GetObjectGuid());
data.AddOutOfRangeGUID(GetObjectGuid());
}

void Object::DestroyForPlayer(Player* target, bool anim) const
Expand Down Expand Up @@ -1273,6 +1269,34 @@ void Object::BuildUpdateDataForPlayer(Player* pl, UpdateDataMapType& update_play
BuildValuesUpdateBlockForPlayer(iter->second, iter->first);
}

void Object::BuildCreateDataForPlayer(Player* pl, UpdateDataMapType& update_players) const
{
UpdateDataMapType::iterator iter = update_players.find(pl);

if (iter == update_players.end())
{
std::pair<UpdateDataMapType::iterator, bool> p = update_players.insert(UpdateDataMapType::value_type(pl, UpdateData()));
MANGOS_ASSERT(p.second);
iter = p.first;
}

BuildCreateUpdateBlockForPlayer(iter->second, iter->first);
}

void Object::BuildOutOfRangeDataForPlayer(Player* pl, UpdateDataMapType& update_players, ObjectGuid oorObject)
{
UpdateDataMapType::iterator iter = update_players.find(pl);

if (iter == update_players.end())
{
std::pair<UpdateDataMapType::iterator, bool> p = update_players.insert(UpdateDataMapType::value_type(pl, UpdateData()));
MANGOS_ASSERT(p.second);
iter = p.first;
}

iter->second.AddOutOfRangeGUID(oorObject);
}

void Object::AddToClientUpdateList()
{
sLog.outError("Unexpected call of Object::AddToClientUpdateList for object (TypeId: %u Update fields: %u)", GetTypeId(), m_valuesCount);
Expand Down Expand Up @@ -2721,6 +2745,49 @@ struct WorldObjectChangeAccumulator
template<class SKIP> void Visit(GridRefManager<SKIP>&) {}
};

struct WorldObjectCreateAccumulator
{
UpdateDataMapType& i_updateDatas;
WorldObject& i_object;
WorldObjectCreateAccumulator(WorldObject& obj, UpdateDataMapType& d) : i_updateDatas(d), i_object(obj)
{
// send self fields changes in another way, otherwise
// with new camera system when player's camera too far from player, camera wouldn't receive packets and changes from player
if (i_object.isType(TYPEMASK_PLAYER))
#ifdef ENABLE_PLAYERBOTS
{
Player* plr = static_cast<Player*>(&i_object);
if (plr->isRealPlayer())
#endif
i_object.BuildCreateDataForPlayer((Player*)&i_object, i_updateDatas);
#ifdef ENABLE_PLAYERBOTS
}
#endif
}

void Visit(CameraMapType& m)
{
for (auto& iter : m)
{
Player* owner = iter.getSource()->GetOwner();
#ifdef ENABLE_PLAYERBOTS
if (owner->isRealPlayer())
{
#endif
if (owner != &i_object && !owner->HasAtClient(&i_object) && i_object.isVisibleForInState(owner, owner->GetCamera().GetBody(), false))
{
owner->AddAtClient(&i_object);
i_object.BuildCreateDataForPlayer(owner, i_updateDatas);
}
#ifdef ENABLE_PLAYERBOTS
}
#endif
}
}

template<class SKIP> void Visit(GridRefManager<SKIP>&) {}
};

void WorldObject::BuildUpdateData(UpdateDataMapType& update_players)
{
WorldObjectChangeAccumulator notifier(*this, update_players);
Expand All @@ -2729,6 +2796,14 @@ void WorldObject::BuildUpdateData(UpdateDataMapType& update_players)
ClearUpdateMask(false);
}

void WorldObject::BuildCreateData(UpdateDataMapType& update_players)
{
WorldObjectChangeAccumulator notifier(*this, update_players);
Cell::VisitWorldObjects(this, notifier, GetVisibilityData().GetVisibilityDistance());

ClearUpdateMask(false);
}

bool WorldObject::IsControlledByPlayer() const
{
switch (GetTypeId())
Expand Down Expand Up @@ -3355,6 +3430,17 @@ void WorldObject::RemoveClientIAmAt(Player const* player)
m_clientGUIDsIAmAt.erase(player->GetObjectGuid());
}

void WorldObject::DestroyOnClientsIAmAt()
{
if (IsInWorld())
{
for (ObjectGuid guid : m_clientGUIDsIAmAt)
if (Player* player = GetMap()->GetPlayer(guid))
player->RemoveAtClient(this, true);
m_clientGUIDsIAmAt.clear();
}
}

bool WorldObject::CheckAndIncreaseCastCounter()
{
uint32 maxCasts = sWorld.getConfig(CONFIG_UINT32_MAX_SPELL_CASTS_IN_CHAIN);
Expand Down
18 changes: 14 additions & 4 deletions src/game/Entities/Object.h
Original file line number Diff line number Diff line change
Expand Up @@ -415,22 +415,23 @@ class Object
uint8 GetTypeMask() const { return m_objectType; }
bool isType(TypeMask mask) const { return (mask & m_objectType) != 0; }

virtual void BuildCreateUpdateBlockForPlayer(UpdateData* data, Player* target) const;
virtual void BuildCreateUpdateBlockForPlayer(UpdateData& data, Player* target) const;
void SendCreateUpdateToPlayer(Player* player, UpdateData& data) const;

// must be overwrite in appropriate subclasses (WorldObject, Item currently), or will crash
virtual void AddToClientUpdateList();
virtual void RemoveFromClientUpdateList();
virtual void BuildCreateData(UpdateDataMapType& update_players) = 0;
virtual void BuildUpdateData(UpdateDataMapType& update_players);
void MarkForClientUpdate();
void SendForcedObjectUpdate();

void BuildValuesUpdateBlockForPlayer(UpdateData& data, Player* target) const;
void BuildValuesUpdateBlockForPlayerWithFlags(UpdateData& data, Player* target, UpdateFieldFlags flags) const;
void BuildValuesUpdateBlockForPlayer(UpdateData& data, UpdateMask& updateMask, Player* target) const;
void BuildForcedValuesUpdateBlockForPlayer(UpdateData* data, Player* target) const;
void BuildOutOfRangeUpdateBlock(UpdateData* data) const;
void BuildMovementUpdateBlock(UpdateData* data, uint16 flags = 0) const;
void BuildForcedValuesUpdateBlockForPlayer(UpdateData& data, Player* target) const;
void BuildOutOfRangeUpdateBlock(UpdateData& data) const;
void BuildMovementUpdateBlock(UpdateData& data, uint16 flags = 0) const;

virtual void DestroyForPlayer(Player* target, bool anim = false) const;

Expand Down Expand Up @@ -631,6 +632,8 @@ class Object

MaNGOS::unique_weak_ptr<Object> GetWeakPtr() const { return m_scriptRef; }

static void BuildOutOfRangeDataForPlayer(Player* pl, UpdateDataMapType& update_players, ObjectGuid oorObject);

protected:
Object();

Expand All @@ -644,6 +647,7 @@ class Object
void BuildMovementUpdate(ByteBuffer* data, uint16 updateFlags) const;
void BuildValuesUpdate(uint8 updatetype, ByteBuffer* data, UpdateMask* updateMask, Player* target) const;
void BuildUpdateDataForPlayer(Player* pl, UpdateDataMapType& update_players) const;
void BuildCreateDataForPlayer(Player* pl, UpdateDataMapType& update_players) const;

uint16 m_objectType;

Expand Down Expand Up @@ -684,6 +688,7 @@ class Object
};

struct WorldObjectChangeAccumulator;
struct WorldObjectCreateAccumulator;

struct TempSpawnSettings
{
Expand Down Expand Up @@ -940,6 +945,7 @@ inline ByteBuffer& operator>> (ByteBuffer& buf, MovementInfo& mi)
class WorldObject : public Object
{
friend struct WorldObjectChangeAccumulator;
friend struct WorldObjectCreateAccumulator;

public:
virtual ~WorldObject() {}
Expand Down Expand Up @@ -1171,6 +1177,7 @@ class WorldObject : public Object
void AddToClientUpdateList() override;
void RemoveFromClientUpdateList() override;
void BuildUpdateData(UpdateDataMapType&) override;
void BuildCreateData(UpdateDataMapType& update_players) override;

static Creature* SummonCreature(TempSpawnSettings settings, Map* map, uint32 phaseMask);
Creature* SummonCreature(uint32 id, float x, float y, float z, float ang, TempSpawnType spwtype, uint32 despwtime, bool asActiveObject = false, bool setRun = false, uint32 pathId = 0, uint32 faction = 0, uint32 modelId = 0, bool spawnCounting = false, bool forcedOnTop = false);
Expand Down Expand Up @@ -1255,6 +1262,8 @@ class WorldObject : public Object
void RemoveClientIAmAt(Player const* player);
GuidSet& GetClientGuidsIAmAt() { return m_clientGUIDsIAmAt; }

void DestroyOnClientsIAmAt();

// Event handler
EventProcessor m_events;

Expand Down Expand Up @@ -1315,6 +1324,7 @@ class WorldObject : public Object
bool m_isActiveObject;
uint64 m_debugFlags;

GuidVector m_pendingViewers; // list of players that spotted me this map tick
GuidSet m_clientGUIDsIAmAt;

// Spell System compliance
Expand Down
Loading

0 comments on commit ec168b2

Please sign in to comment.