Skip to content

Commit

Permalink
Make first prototype work
Browse files Browse the repository at this point in the history
  • Loading branch information
killerwife committed Feb 9, 2025
1 parent e83256c commit 647ecf5
Show file tree
Hide file tree
Showing 22 changed files with 149 additions and 158 deletions.
2 changes: 0 additions & 2 deletions src/game/AI/ScriptDevAI/scripts/kalimdor/ungoro_crater.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -569,12 +569,10 @@ struct npc_simone_seductressAI : public ScriptedAI
{
pPrecious->SetVisibility(VISIBILITY_OFF);
pPrecious->ForcedDespawn();
pPrecious->RemoveFromWorld();
}

m_creature->SetVisibility(VISIBILITY_OFF);
m_creature->ForcedDespawn();
m_creature->RemoveFromWorld();
}

void SpellHit(Unit* /*pCaster*/, const SpellEntry* pSpell) override
Expand Down
19 changes: 14 additions & 5 deletions src/game/Entities/Camera.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -49,7 +49,7 @@ void Camera::UpdateForCurrentViewPoint()
if (GridType* grid = m_source->GetViewPoint().m_grid)
grid->AddWorldObject(this);

UpdateVisibilityForOwner();
m_source->GetMap()->AddUpdateCreateObject(m_source);
}

void Camera::SetView(WorldObject* obj, bool update_far_sight_field /*= true*/)
Expand Down Expand Up @@ -100,13 +100,14 @@ void Camera::ResetView(bool update_far_sight_field /*= true*/)
SetView(&m_owner, update_far_sight_field);
}

void Camera::Event_AddedToWorld(UpdateData& data)
void Camera::Event_AddedToWorld(UpdateData* data)
{
GridType* grid = m_source->GetViewPoint().m_grid;
MANGOS_ASSERT(grid);
grid->AddWorldObject(this);

UpdateVisibilityForOwner(true, data);
if (data)
UpdateVisibilityForOwner(true, *data);
}

void Camera::Event_RemovedFromWorld()
Expand Down Expand Up @@ -143,9 +144,17 @@ template void Camera::UpdateVisibilityOf(Corpse*, UpdateData&, WorldObjectSet&);
template void Camera::UpdateVisibilityOf(GameObject*, UpdateData&, WorldObjectSet&);
template void Camera::UpdateVisibilityOf(DynamicObject*, UpdateData&, WorldObjectSet&);

void Camera::UpdateVisibilityForOwner()
void Camera::UpdateVisibilityForOwner(UpdateDataMapType& update_players)
{
m_owner.GetMap()->AddUpdateCreateObject(&m_owner);
UpdateDataMapType::iterator iter = update_players.find(GetOwner());

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

void Camera::UpdateVisibilityForOwner(bool addToWorld, UpdateData& data)
Expand Down
10 changes: 5 additions & 5 deletions src/game/Entities/Camera.h
Original file line number Diff line number Diff line change
Expand Up @@ -54,14 +54,14 @@ class Camera
void ReceivePacket(WorldPacket const& data) const;

// updates visibility of worldobjects around viewpoint for camera's owner
void UpdateVisibilityForOwner();
void UpdateVisibilityForOwner(UpdateDataMapType& update_players);
void UpdateVisibilityForOwner(bool addToWorld, UpdateData& data);

bool IsSendInProgress() const { return m_sendInProgress; }

private:
// called when viewpoint changes visibility state
void Event_AddedToWorld(UpdateData& data);
void Event_AddedToWorld(UpdateData* data);
void Event_RemovedFromWorld();
void Event_Moved();
void Event_ViewPointVisibilityChanged();
Expand Down Expand Up @@ -113,7 +113,7 @@ class ViewPoint
bool hasViewers() const { return !m_cameras.empty(); }

// these events are called when viewpoint changes visibility state
void Event_AddedToWorld(GridType* grid, UpdateData& data)
void Event_AddedToWorld(GridType* grid, UpdateData* data)
{
m_grid = grid;
CameraCall([&](Camera* c) { c->Event_AddedToWorld(data); });
Expand All @@ -136,9 +136,9 @@ class ViewPoint
CameraCall([&](Camera* c) { c->Event_ViewPointVisibilityChanged(); });
}

void Call_UpdateVisibilityForOwner()
void Call_UpdateVisibilityForOwner(UpdateDataMapType& update_players)
{
CameraCall([&](Camera* c) { c->UpdateVisibilityForOwner(); });
CameraCall([&](Camera* c) { c->UpdateVisibilityForOwner(update_players); });
}
};

Expand Down
4 changes: 4 additions & 0 deletions src/game/Entities/Creature.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -159,6 +159,10 @@ Creature::Creature(CreatureSubtype subtype) : Unit(),

Creature::~Creature()
{
if (m_uint32Values && (GetEntry() == 34925 || GetEntry() == 31243))
printf("");
if (GetVisibilityData().IsLargeVisibility())
printf("");
CleanupsBeforeDelete();
}

Expand Down
3 changes: 3 additions & 0 deletions src/game/Entities/EntitiesMgr.h
Original file line number Diff line number Diff line change
Expand Up @@ -36,6 +36,7 @@ class Player;
class Pet;
class DynamicObject;
class Corpse;
class UpdateData;
struct CreatureData;
struct GameObjectData;

Expand All @@ -54,4 +55,6 @@ typedef std::map<uint32, GameObject*> GameObjectsMap;
typedef std::map<uint32, DynamicObject*> DynamicObjectsMap;
typedef std::map<uint32, Corpse*> PlayerCorpsesMap;

typedef std::unordered_map<Player*, UpdateData> UpdateDataMapType;

#endif
4 changes: 0 additions & 4 deletions src/game/Entities/GameObject.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -1131,10 +1131,6 @@ bool GameObject::isVisibleForInState(Player const* u, WorldObject const* viewPoi
if (!GetGOInfo()->displayId)
return false;

// Transport always visible at this step implementation
if (IsMoTransport() && IsInMap(u))
return true;

// quick check visibility false cases for non-GM-mode
if (!u->IsGameMaster())
{
Expand Down
2 changes: 1 addition & 1 deletion src/game/Entities/Item.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -1207,7 +1207,7 @@ void Item::BuildUpdateData(UpdateDataMapType& update_players)
ClearUpdateMask(false);
}

void Item::UpdateVisibility()
void Item::UpdateVisibility(UpdateDataMapType& /*update_players*/)
{
if (Player* pl = GetOwner())
pl->GetMap()->AddCreateAtClientObject(pl, this);
Expand Down
2 changes: 1 addition & 1 deletion src/game/Entities/Item.h
Original file line number Diff line number Diff line change
Expand Up @@ -383,7 +383,7 @@ class Item : public Object
void AddToClientUpdateList() override;
void RemoveFromClientUpdateList() override;
void BuildUpdateData(UpdateDataMapType& update_players) override;
void UpdateVisibility() override;
void UpdateVisibility(UpdateDataMapType& update_players) override;

bool IsUsedInSpell() const { return m_usedInSpell; }
void SetUsedInSpell(bool state) { m_usedInSpell = state; }
Expand Down
78 changes: 14 additions & 64 deletions src/game/Entities/Object.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -1306,12 +1306,6 @@ void Object::RemoveFromClientUpdateList()
MANGOS_ASSERT(false);
}

void Object::BuildUpdateData(UpdateDataMapType& /*update_players */)
{
sLog.outError("Unexpected call of Object::BuildUpdateData for object (TypeId: %u Update fields: %u)", GetTypeId(), m_valuesCount);
MANGOS_ASSERT(false);
}

void Object::MarkForClientUpdate()
{
if (m_inWorld)
Expand Down Expand Up @@ -2679,17 +2673,7 @@ void WorldObject::HandlePlayPacketSettings(WorldPacket& msg, PlayPacketParameter

void WorldObject::UpdateVisibilityAndView()
{
GetViewPoint().Call_UpdateVisibilityForOwner();
UpdateObjectVisibility();
GetViewPoint().Event_ViewPointVisibilityChanged();
}

void WorldObject::UpdateObjectVisibility()
{
CellPair p = MaNGOS::ComputeCellPair(GetPositionX(), GetPositionY());
Cell cell(p);

GetMap()->UpdateObjectVisibility(this, cell, p);
GetMap()->AddUpdateCreateObject(this);
}

void WorldObject::AddToClientUpdateList()
Expand All @@ -2702,46 +2686,6 @@ void WorldObject::RemoveFromClientUpdateList()
GetMap()->RemoveUpdateObject(this);
}

struct WorldObjectChangeAccumulator
{
UpdateDataMapType& i_updateDatas;
WorldObject& i_object;
WorldObjectChangeAccumulator(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.BuildUpdateDataForPlayer((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.BuildUpdateDataForPlayer(owner, i_updateDatas);
#ifdef ENABLE_PLAYERBOTS
}
#endif
}
}

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

struct WorldObjectCreateAccumulator
{
WorldObject& i_object;
Expand Down Expand Up @@ -2776,19 +2720,25 @@ struct WorldObjectCreateAccumulator

void WorldObject::BuildUpdateData(UpdateDataMapType& update_players)
{
WorldObjectChangeAccumulator notifier(*this, update_players);
Cell::VisitWorldObjects(this, notifier, GetVisibilityData().GetVisibilityDistance());
if (IsPlayer())
BuildUpdateDataForPlayer((Player*)this, update_players);

for (auto& iter : m_clientGUIDsIAmAt)
{
if (Player* player = GetMap()->GetPlayer(iter))
if (player != this && player->HasAtClient(this))
BuildUpdateDataForPlayer(player, update_players);
}

ClearUpdateMask(false);
}

void WorldObject::UpdateVisibility()
void WorldObject::UpdateVisibility(UpdateDataMapType& update_players)
{
if (ItsNewObject())
{
UpdateData updateData;
obj->GetViewPoint().Event_AddedToWorld(&(*grid)(cell.CellX(), cell.CellY()), updateData);
}
GetMap()->AddCameraToWorld(this);

GetViewPoint().Call_UpdateVisibilityForOwner(update_players);

WorldObjectCreateAccumulator notifier(*this);
Cell::VisitWorldObjects(this, notifier, GetVisibilityData().GetVisibilityDistance());
Expand Down
11 changes: 3 additions & 8 deletions src/game/Entities/Object.h
Original file line number Diff line number Diff line change
Expand Up @@ -121,8 +121,6 @@ struct SpellEntry;
class Spell;
class GenericTransport;

typedef std::unordered_map<Player*, UpdateData> UpdateDataMapType;

// Spell cooldown flags sent in SMSG_SPELL_COOLDOWN
enum SpellCooldownFlags
{
Expand Down Expand Up @@ -420,8 +418,8 @@ class Object
// must be overwrite in appropriate subclasses (WorldObject, Item currently), or will crash
virtual void AddToClientUpdateList();
virtual void RemoveFromClientUpdateList();
virtual void UpdateVisibility() = 0;
virtual void BuildUpdateData(UpdateDataMapType& update_players);
virtual void UpdateVisibility(UpdateDataMapType& update_players) = 0;
virtual void BuildUpdateData(UpdateDataMapType& update_players) = 0;
void MarkForClientUpdate();
void SendForcedObjectUpdate();

Expand Down Expand Up @@ -686,7 +684,6 @@ class Object
bool PrintEntryError(char const* descr) const;
};

struct WorldObjectChangeAccumulator;
struct WorldObjectCreateAccumulator;

struct TempSpawnSettings
Expand Down Expand Up @@ -943,7 +940,6 @@ inline ByteBuffer& operator>> (ByteBuffer& buf, MovementInfo& mi)

class WorldObject : public Object
{
friend struct WorldObjectChangeAccumulator;
friend struct WorldObjectCreateAccumulator;

public:
Expand Down Expand Up @@ -1156,7 +1152,6 @@ class WorldObject : public Object
virtual void SaveRespawnTime() {}
void AddObjectToRemoveList();

void UpdateObjectVisibility();
virtual void UpdateVisibilityAndView(); // update visibility for object and object for all around

// main visibility check function in normal case (ignore grey zone distance check)
Expand All @@ -1176,7 +1171,7 @@ class WorldObject : public Object
void AddToClientUpdateList() override;
void RemoveFromClientUpdateList() override;
void BuildUpdateData(UpdateDataMapType&) override;
void UpdateVisibility() override;
void UpdateVisibility(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
5 changes: 5 additions & 0 deletions src/game/Entities/ObjectVisibility.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -55,6 +55,11 @@ bool VisibilityData::IsInfiniteVisibility() const
return m_visibilityDistanceOverride > VISIBILITY_DISTANCE_GIGANTIC;
}

bool VisibilityData::IsLargeVisibility() const
{
return m_visibilityDistanceOverride >= VISIBILITY_DISTANCE_LARGE;
}

float VisibilityData::GetVisibilityDistance() const
{
if (IsVisibilityOverridden())
Expand Down
1 change: 1 addition & 0 deletions src/game/Entities/ObjectVisibility.h
Original file line number Diff line number Diff line change
Expand Up @@ -59,6 +59,7 @@ class VisibilityData
bool IsVisibilityOverridden() const { return m_visibilityDistanceOverride != 0.f; }
void SetVisibilityDistanceOverride(VisibilityDistanceType type);
bool IsInfiniteVisibility() const;
bool IsLargeVisibility() const;

float GetVisibilityDistance() const;
float GetVisibilityDistanceFor(WorldObject* obj) const;
Expand Down
Loading

1 comment on commit 647ecf5

@insunaa
Copy link
Contributor

@insunaa insunaa commented on 647ecf5 Feb 9, 2025

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

diff --git a/src/game/Maps/Map.cpp b/src/game/Maps/Map.cpp
index e8d81560c..70721b3f8 100644
--- a/src/game/Maps/Map.cpp
+++ b/src/game/Maps/Map.cpp
@@ -2734,7 +2734,7 @@ void Map::SendObjectUpdates()
                 WorldPacket packet = Player::BuildAurasForTarget(static_cast<Unit const*>(visData.first));
                 for (Player* player : visData.second)
                 {
-                    auto& updateDataData = update_players.find(player); // always exist after previous loop
+                    auto updateDataData = update_players.find(player); // always exist after previous loop
                     updateDataData->second.AddAfterCreatePacket(packet);
                 }
             }

or

diff --git a/src/game/Maps/Map.cpp b/src/game/Maps/Map.cpp
index e8d81560c..450cf3d43 100644
--- a/src/game/Maps/Map.cpp
+++ b/src/game/Maps/Map.cpp
@@ -2734,7 +2734,7 @@ void Map::SendObjectUpdates()
                 WorldPacket packet = Player::BuildAurasForTarget(static_cast<Unit const*>(visData.first));
                 for (Player* player : visData.second)
                 {
-                    auto& updateDataData = update_players.find(player); // always exist after previous loop
+                    const auto& updateDataData = update_players.find(player); // always exist after previous loop
                     updateDataData->second.AddAfterCreatePacket(packet);
                 }
             }

to fix linux/clang builds. it doesn't like non-const lvalue iterators

Please sign in to comment.