aboutsummaryrefslogtreecommitdiff
path: root/src/server/game/Entities
diff options
context:
space:
mode:
authorShauren <shauren.trinity@gmail.com>2021-01-30 16:26:31 +0100
committerShauren <shauren.trinity@gmail.com>2021-01-30 18:10:21 +0100
commit7851cd3a9618b245c9b425dcaf71bbadbfecd054 (patch)
tree576a6c2632537cbb44305a97d7573ad4a307afd1 /src/server/game/Entities
parent0417c5ff5fd68cd3344dede35afaab364870561b (diff)
Core/AreaTriggers: Code cleanup
Diffstat (limited to 'src/server/game/Entities')
-rw-r--r--src/server/game/Entities/AreaTrigger/AreaTrigger.cpp84
-rw-r--r--src/server/game/Entities/AreaTrigger/AreaTrigger.h9
-rw-r--r--src/server/game/Entities/AreaTrigger/AreaTriggerTemplate.cpp3
-rw-r--r--src/server/game/Entities/AreaTrigger/AreaTriggerTemplate.h26
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