fix(Core/Movement): (#7008)

- Get zone/area IDs from vmap data in the liquid update
- Add new method Map::getFullVMapDataForPosition to get area info and liquid info in a single vmap lookup
- Adjust GetZoneId/GetAreaId on WorldObject to always return these cached fields.
- Clean up liquid state handling on Unit and Player
- Implemented getting area id from gameobject spawns.
- Removed old core related to getting movement flags dependent on environment.
- Movement flags are now processed more precisely and dynamically.

Original source: TrinityCore.

- Closes #5086
- Updates #2208.
This commit is contained in:
UltraNix
2021-08-25 12:41:20 +02:00
committed by GitHub
parent 909c3e5799
commit a8c0a2cc89
47 changed files with 1086 additions and 883 deletions

View File

@@ -69,6 +69,8 @@ class Transport;
class StaticTransport;
class MotionTransport;
struct PositionFullTerrainStatus;
typedef std::unordered_map<Player*, UpdateData> UpdateDataMapType;
typedef GuidUnorderedSet UpdatePlayerSet;
@@ -750,15 +752,8 @@ public:
#endif
void _Create(ObjectGuid::LowType guidlow, HighGuid guidhigh, uint32 phaseMask);
void RemoveFromWorld() override
{
if (!IsInWorld())
return;
DestroyForNearbyPlayers();
Object::RemoveFromWorld();
}
void AddToWorld() override;
void RemoveFromWorld() override;
#ifdef ELUNA
ElunaEventProcessor* elunaEvents;
@@ -817,9 +812,11 @@ public:
bool InSamePhase(WorldObject const* obj) const { return InSamePhase(obj->GetPhaseMask()); }
[[nodiscard]] bool InSamePhase(uint32 phasemask) const { return m_useCombinedPhases ? GetPhaseMask() & phasemask : GetPhaseMask() == phasemask; }
[[nodiscard]] virtual uint32 GetZoneId(bool forceRecalc = false) const;
[[nodiscard]] virtual uint32 GetAreaId(bool forceRecalc = false) const;
virtual void GetZoneAndAreaId(uint32& zoneid, uint32& areaid, bool forceRecalc = false) const;
[[nodiscard]] uint32 GetZoneId() const;
[[nodiscard]] uint32 GetAreaId() const;
void GetZoneAndAreaId(uint32& zoneid, uint32& areaid) const;
[[nodiscard]] bool IsOutdoors() const;
LiquidData const& GetLiquidData() const;
InstanceScript* GetInstanceScript();
@@ -948,9 +945,6 @@ public:
[[nodiscard]] Map* FindMap() const { return m_currMap; }
//used to check all object's GetMap() calls when object is not in world!
//this function should be removed in nearest time...
[[nodiscard]] Map const* GetBaseMap() const;
void SetZoneScript();
void ClearZoneScript();
[[nodiscard]] ZoneScript* GetZoneScript() const { return m_zoneScript; }
@@ -984,6 +978,9 @@ public:
void BuildUpdate(UpdateDataMapType& data_map, UpdatePlayerSet& player_set) override;
void GetCreaturesWithEntryInRange(std::list<Creature*>& creatureList, float radius, uint32 entry);
void SetPositionDataUpdate();
void UpdatePositionData();
void AddToObjectUpdate() override;
void RemoveFromObjectUpdate() override;
@@ -1060,7 +1057,13 @@ protected:
const bool m_isWorldObject;
ZoneScript* m_zoneScript;
float m_staticFloorZ;
virtual void ProcessPositionDataChanged(PositionFullTerrainStatus const& data);
uint32 _zoneId;
uint32 _areaId;
float _floorZ;
bool _outdoors;
LiquidData _liquidData;
bool _updatePositionData;
// transports
Transport* m_transport;