diff options
| author | Shauren <shauren.trinity@gmail.com> | 2021-01-30 16:26:31 +0100 |
|---|---|---|
| committer | Shauren <shauren.trinity@gmail.com> | 2021-01-30 18:10:21 +0100 |
| commit | 7851cd3a9618b245c9b425dcaf71bbadbfecd054 (patch) | |
| tree | 576a6c2632537cbb44305a97d7573ad4a307afd1 /src/server/game/Entities | |
| parent | 0417c5ff5fd68cd3344dede35afaab364870561b (diff) | |
Core/AreaTriggers: Code cleanup
Diffstat (limited to 'src/server/game/Entities')
4 files changed, 59 insertions, 63 deletions
diff --git a/src/server/game/Entities/AreaTrigger/AreaTrigger.cpp b/src/server/game/Entities/AreaTrigger/AreaTrigger.cpp index 19807a7a5b2..2e9d2a2daf9 100644 --- a/src/server/game/Entities/AreaTrigger/AreaTrigger.cpp +++ b/src/server/game/Entities/AreaTrigger/AreaTrigger.cpp @@ -39,13 +39,10 @@ #include "UpdateData.h" #include <G3D/AABox.h> -AreaTrigger::AreaTrigger() : WorldObject(false), MapObject(), - _targetGuid(), _aurEff(nullptr), +AreaTrigger::AreaTrigger() : WorldObject(false), MapObject(), _aurEff(nullptr), _duration(0), _totalDuration(0), _timeSinceCreated(0), _previousCheckOrientation(std::numeric_limits<float>::infinity()), - _isRemoved(false), _rollPitchYaw(), _targetRollPitchYaw(), _polygonVertices(), _spline(), - _reachedDestination(true), _lastSplineIndex(0), _movementTime(0), - _orbitInfo(), _areaTriggerMiscTemplate(nullptr), _insideUnits(), _ai(), - _areaTriggerTemplate(nullptr) + _isRemoved(false), _reachedDestination(true), _lastSplineIndex(0), _movementTime(0), + _areaTriggerMiscTemplate(nullptr), _areaTriggerTemplate(nullptr) { m_objectType |= TYPEMASK_AREATRIGGER; m_objectTypeId = TYPEID_AREATRIGGER; @@ -110,9 +107,9 @@ bool AreaTrigger::Create(uint32 spellMiscId, Unit* caster, Unit* target, SpellIn _areaTriggerTemplate = _areaTriggerMiscTemplate->Template; - Object::_Create(ObjectGuid::Create<HighGuid::AreaTrigger>(GetMapId(), GetTemplate()->Id, caster->GetMap()->GenerateLowGuid<HighGuid::AreaTrigger>())); + Object::_Create(ObjectGuid::Create<HighGuid::AreaTrigger>(GetMapId(), GetTemplate()->Id.Id, caster->GetMap()->GenerateLowGuid<HighGuid::AreaTrigger>())); - SetEntry(GetTemplate()->Id); + SetEntry(GetTemplate()->Id.Id); SetDuration(duration); SetObjectScale(1.0f); @@ -218,45 +215,47 @@ AreaTrigger* AreaTrigger::CreateAreaTrigger(uint32 spellMiscId, Unit* caster, Un return at; } -bool AreaTrigger::LoadFromDB(uint32 spawnId, Map* map, bool /*addToMap*/, bool /*allowDuplicate*/) +bool AreaTrigger::LoadFromDB(ObjectGuid::LowType spawnId, Map* map, bool /*addToMap*/, bool /*allowDuplicate*/) { - AreaTriggerServerPosition const* position = sAreaTriggerDataStore->GetAreaTriggerServerPosition(spawnId); + AreaTriggerSpawn const* position = sAreaTriggerDataStore->GetAreaTriggerSpawn(spawnId); if (!position) return false; - AreaTriggerTemplate const* areaTriggerTemplate = sAreaTriggerDataStore->GetAreaTriggerServerTemplate(position->Id); + AreaTriggerTemplate const* areaTriggerTemplate = sAreaTriggerDataStore->GetAreaTriggerTemplate(position->Id); if (!areaTriggerTemplate) return false; return CreateServer(map, areaTriggerTemplate, *position); } -bool AreaTrigger::CreateServer(Map* map, AreaTriggerTemplate const* areaTriggerTemplate, AreaTriggerServerPosition const& position) +bool AreaTrigger::CreateServer(Map* map, AreaTriggerTemplate const* areaTriggerTemplate, AreaTriggerSpawn const& position) { SetMap(map); Relocate(position.Location); if (!IsPositionValid()) { - TC_LOG_ERROR("entities.areatrigger", "AreaTriggerServer (id %u) not created. Invalid coordinates (X: %f Y: %f)", areaTriggerTemplate->Id, GetPositionX(), GetPositionY()); + TC_LOG_ERROR("entities.areatrigger", "AreaTriggerServer (id %u) not created. Invalid coordinates (X: %f Y: %f)", + areaTriggerTemplate->Id.Id, GetPositionX(), GetPositionY()); return false; } _areaTriggerTemplate = areaTriggerTemplate; - Object::_Create(ObjectGuid::Create<HighGuid::AreaTrigger>(GetMapId(), - areaTriggerTemplate->Id, GetMap()->GenerateLowGuid<HighGuid::AreaTrigger>())); + Object::_Create(ObjectGuid::Create<HighGuid::AreaTrigger>(GetMapId(), areaTriggerTemplate->Id.Id, GetMap()->GenerateLowGuid<HighGuid::AreaTrigger>())); - SetEntry(areaTriggerTemplate->Id); + SetEntry(areaTriggerTemplate->Id.Id); SetObjectScale(1.0f); - if (position.PhaseId || position.PhaseGroup || position.PhaseUseFlags) + if (position.PhaseUseFlags || position.PhaseId || position.PhaseGroup) PhasingHandler::InitDbPhaseShift(GetPhaseShift(), position.PhaseUseFlags, position.PhaseId, position.PhaseGroup); UpdateShape(); AI_Initialize(); + _ai->OnCreate(); + return true; } @@ -265,33 +264,30 @@ void AreaTrigger::Update(uint32 diff) WorldObject::Update(diff); _timeSinceCreated += diff; - if (IsServerSide()) - { - UpdateTargetList(); - return; - } - - // "If" order matter here, Orbit > Attached > Splines - if (HasOrbit()) + if (!IsServerSide()) { - UpdateOrbitPosition(diff); - } - else if (GetTemplate()->HasFlag(AREATRIGGER_FLAG_HAS_ATTACHED)) - { - if (Unit* target = GetTarget()) - GetMap()->AreaTriggerRelocation(this, target->GetPositionX(), target->GetPositionY(), target->GetPositionZ(), target->GetOrientation()); - } - else - UpdateSplinePosition(diff); - - if (GetDuration() != -1) - { - if (GetDuration() > int32(diff)) - _UpdateDuration(_duration - diff); + // "If" order matter here, Orbit > Attached > Splines + if (HasOrbit()) + { + UpdateOrbitPosition(diff); + } + else if (GetTemplate()->HasFlag(AREATRIGGER_FLAG_HAS_ATTACHED)) + { + if (Unit* target = GetTarget()) + GetMap()->AreaTriggerRelocation(this, target->GetPositionX(), target->GetPositionY(), target->GetPositionZ(), target->GetOrientation()); + } else + UpdateSplinePosition(diff); + + if (GetDuration() != -1) { - Remove(); // expired - return; + if (GetDuration() > int32(diff)) + _UpdateDuration(_duration - diff); + else + { + Remove(); // expired + return; + } } } @@ -460,7 +456,7 @@ void AreaTrigger::HandleUnitEnterExit(std::list<Unit*> const& newTargetList) { if (Player* player = unit->ToPlayer()) if (player->isDebugAreaTriggers) - ChatHandler(player->GetSession()).PSendSysMessage(LANG_DEBUG_AREATRIGGER_ENTERED, GetTemplate()->Id); + ChatHandler(player->GetSession()).PSendSysMessage(LANG_DEBUG_AREATRIGGER_ENTERED, GetTemplate()->Id.Id); DoActions(unit); @@ -473,7 +469,7 @@ void AreaTrigger::HandleUnitEnterExit(std::list<Unit*> const& newTargetList) { if (Player* player = leavingUnit->ToPlayer()) if (player->isDebugAreaTriggers) - ChatHandler(player->GetSession()).PSendSysMessage(LANG_DEBUG_AREATRIGGER_LEFT, GetTemplate()->Id); + ChatHandler(player->GetSession()).PSendSysMessage(LANG_DEBUG_AREATRIGGER_LEFT, GetTemplate()->Id.Id); UndoActions(leavingUnit); @@ -872,7 +868,7 @@ void AreaTrigger::UpdateSplinePosition(uint32 diff) if (progress < 0.f || progress > 1.f) { TC_LOG_ERROR("entities.areatrigger", "AreaTrigger (Id: %u, SpellMiscId: %u) has wrong progress (%f) caused by curve calculation (MoveCurveId: %u)", - GetTemplate()->Id, GetMiscTemplate()->MiscId, progress, GetMiscTemplate()->MorphCurveId); + GetTemplate()->Id.Id, GetMiscTemplate()->MiscId, progress, GetMiscTemplate()->MorphCurveId); } else currentTimePercent = progress; diff --git a/src/server/game/Entities/AreaTrigger/AreaTrigger.h b/src/server/game/Entities/AreaTrigger/AreaTrigger.h index 90c0a6dbd46..ec70245d0c4 100644 --- a/src/server/game/Entities/AreaTrigger/AreaTrigger.h +++ b/src/server/game/Entities/AreaTrigger/AreaTrigger.h @@ -61,16 +61,17 @@ class TC_GAME_API AreaTrigger : public WorldObject, public GridObject<AreaTrigge AreaTriggerAI* AI() { return _ai.get(); } - bool IsServerSide() const { return _areaTriggerTemplate->IsServerSide; } + bool IsServerSide() const { return _areaTriggerTemplate->Id.IsServerSide; } bool IsNeverVisibleFor(WorldObject const* /*seer*/) const override { return IsServerSide(); } private: bool Create(uint32 spellMiscId, Unit* caster, Unit* target, SpellInfo const* spell, Position const& pos, int32 duration, SpellCastVisual spellVisual, ObjectGuid const& castId, AuraEffect const* aurEff); - bool CreateServer(Map* map, AreaTriggerTemplate const* areaTriggerTemplate, AreaTriggerServerPosition const& position); + bool CreateServer(Map* map, AreaTriggerTemplate const* areaTriggerTemplate, AreaTriggerSpawn const& position); public: static AreaTrigger* CreateAreaTrigger(uint32 spellMiscId, Unit* caster, Unit* target, SpellInfo const* spell, Position const& pos, int32 duration, SpellCastVisual spellVisual, ObjectGuid const& castId = ObjectGuid::Empty, AuraEffect const* aurEff = nullptr); + bool LoadFromDB(ObjectGuid::LowType spawnId, Map* map, bool addToMap, bool allowDuplicate); void Update(uint32 diff) override; void Remove(); @@ -111,7 +112,6 @@ class TC_GAME_API AreaTrigger : public WorldObject, public GridObject<AreaTrigge UF::UpdateField<UF::AreaTriggerData, 0, TYPEID_AREATRIGGER> m_areaTriggerData; - bool LoadFromDB(uint32 spawnId, Map* map, bool addToMap, bool allowDuplicate); protected: void _UpdateDuration(int32 newDuration); @@ -159,11 +159,10 @@ class TC_GAME_API AreaTrigger : public WorldObject, public GridObject<AreaTrigge Optional<AreaTriggerOrbitInfo> _orbitInfo; AreaTriggerMiscTemplate const* _areaTriggerMiscTemplate; + AreaTriggerTemplate const* _areaTriggerTemplate; GuidUnorderedSet _insideUnits; std::unique_ptr<AreaTriggerAI> _ai; - - AreaTriggerTemplate const* _areaTriggerTemplate; }; #endif diff --git a/src/server/game/Entities/AreaTrigger/AreaTriggerTemplate.cpp b/src/server/game/Entities/AreaTrigger/AreaTriggerTemplate.cpp index 9632aac39d1..22f51434f7e 100644 --- a/src/server/game/Entities/AreaTrigger/AreaTriggerTemplate.cpp +++ b/src/server/game/Entities/AreaTrigger/AreaTriggerTemplate.cpp @@ -28,12 +28,11 @@ AreaTriggerScaleInfo::AreaTriggerScaleInfo() AreaTriggerTemplate::AreaTriggerTemplate() { - Id = 0; + Id = { 0, false }; Type = AREATRIGGER_TYPE_MAX; Flags = 0; ScriptId = 0; MaxSearchRadius = 0.0f; - IsServerSide = false; memset(DefaultDatas.Data, 0, sizeof(DefaultDatas.Data)); } diff --git a/src/server/game/Entities/AreaTrigger/AreaTriggerTemplate.h b/src/server/game/Entities/AreaTrigger/AreaTriggerTemplate.h index abd94935a13..389f0e73b89 100644 --- a/src/server/game/Entities/AreaTrigger/AreaTriggerTemplate.h +++ b/src/server/game/Entities/AreaTrigger/AreaTriggerTemplate.h @@ -72,17 +72,10 @@ enum AreaTriggerActionUserTypes AREATRIGGER_ACTION_USER_MAX = 6 }; -struct AreaTriggerServerPosition +struct AreaTriggerId { - uint64 SpawnId; - uint32 Id; - bool IsServer; - WorldLocation Location; - uint32 PhaseId; - uint32 PhaseGroup; - uint8 PhaseUseFlags; - - AreaTriggerServerPosition() : SpawnId(0), Id(0), IsServer(false), Location(), PhaseId(0), PhaseGroup(0), PhaseUseFlags(0) { } + uint32 Id = 0; + bool IsServerSide = false; }; struct AreaTriggerAction @@ -152,7 +145,7 @@ public: void InitMaxSearchRadius(); - uint32 Id; + AreaTriggerId Id; AreaTriggerTypes Type; uint32 Flags; uint32 ScriptId; @@ -160,7 +153,6 @@ public: std::vector<TaggedPosition<Position::XY>> PolygonVertices; std::vector<TaggedPosition<Position::XY>> PolygonVerticesTarget; std::vector<AreaTriggerAction> Actions; - bool IsServerSide; union { @@ -235,4 +227,14 @@ public: std::vector<Position> SplinePoints; }; +struct AreaTriggerSpawn +{ + ObjectGuid::LowType SpawnId = 0; + AreaTriggerId Id; + WorldLocation Location; + uint32 PhaseId = 0; + uint32 PhaseGroup = 0; + uint8 PhaseUseFlags = 0; +}; + #endif |
