aboutsummaryrefslogtreecommitdiff
path: root/src/server/game/Entities/AreaTrigger
diff options
context:
space:
mode:
authorMatan Shukry <matanshukry@gmail.com>2021-01-28 05:46:06 +0200
committerShauren <shauren.trinity@gmail.com>2021-01-30 18:10:21 +0100
commit0417c5ff5fd68cd3344dede35afaab364870561b (patch)
treec281641aa9bb74652e2105cbb72905b64d06f3ed /src/server/game/Entities/AreaTrigger
parent08005a7cf937d2abd3bd164c24c80bb87ec3378c (diff)
Core/AreaTriggers: Implementation for sever side area triggers
- Spawn GridLoader to spawn area triggers correctly now - Removed SAI completely - Removed remnants of smart scripts. Created different issue for it - Calling InitDbPhaseShift and not InDbPhaseShift - changed SpawnId to uint64 rather than uint32 - not using CellGuidSet typedef as to not include ObjectMgr.h in the header
Diffstat (limited to 'src/server/game/Entities/AreaTrigger')
-rw-r--r--src/server/game/Entities/AreaTrigger/AreaTrigger.cpp75
-rw-r--r--src/server/game/Entities/AreaTrigger/AreaTrigger.h10
-rw-r--r--src/server/game/Entities/AreaTrigger/AreaTriggerTemplate.cpp1
-rw-r--r--src/server/game/Entities/AreaTrigger/AreaTriggerTemplate.h21
4 files changed, 98 insertions, 9 deletions
diff --git a/src/server/game/Entities/AreaTrigger/AreaTrigger.cpp b/src/server/game/Entities/AreaTrigger/AreaTrigger.cpp
index c5d50dc9ed6..19807a7a5b2 100644
--- a/src/server/game/Entities/AreaTrigger/AreaTrigger.cpp
+++ b/src/server/game/Entities/AreaTrigger/AreaTrigger.cpp
@@ -27,6 +27,7 @@
#include "Log.h"
#include "Object.h"
#include "ObjectAccessor.h"
+#include "ObjectMgr.h"
#include "PhasingHandler.h"
#include "Player.h"
#include "ScriptMgr.h"
@@ -38,10 +39,13 @@
#include "UpdateData.h"
#include <G3D/AABox.h>
-AreaTrigger::AreaTrigger() : WorldObject(false), MapObject(), _aurEff(nullptr),
+AreaTrigger::AreaTrigger() : WorldObject(false), MapObject(),
+ _targetGuid(), _aurEff(nullptr),
_duration(0), _totalDuration(0), _timeSinceCreated(0), _previousCheckOrientation(std::numeric_limits<float>::infinity()),
- _isRemoved(false), _reachedDestination(true), _lastSplineIndex(0), _movementTime(0),
- _areaTriggerMiscTemplate(nullptr), _ai()
+ _isRemoved(false), _rollPitchYaw(), _targetRollPitchYaw(), _polygonVertices(), _spline(),
+ _reachedDestination(true), _lastSplineIndex(0), _movementTime(0),
+ _orbitInfo(), _areaTriggerMiscTemplate(nullptr), _insideUnits(), _ai(),
+ _areaTriggerTemplate(nullptr)
{
m_objectType |= TYPEMASK_AREATRIGGER;
m_objectTypeId = TYPEID_AREATRIGGER;
@@ -104,6 +108,8 @@ bool AreaTrigger::Create(uint32 spellMiscId, Unit* caster, Unit* target, SpellIn
return false;
}
+ _areaTriggerTemplate = _areaTriggerMiscTemplate->Template;
+
Object::_Create(ObjectGuid::Create<HighGuid::AreaTrigger>(GetMapId(), GetTemplate()->Id, caster->GetMap()->GenerateLowGuid<HighGuid::AreaTrigger>()));
SetEntry(GetTemplate()->Id);
@@ -212,11 +218,59 @@ AreaTrigger* AreaTrigger::CreateAreaTrigger(uint32 spellMiscId, Unit* caster, Un
return at;
}
+bool AreaTrigger::LoadFromDB(uint32 spawnId, Map* map, bool /*addToMap*/, bool /*allowDuplicate*/)
+{
+ AreaTriggerServerPosition const* position = sAreaTriggerDataStore->GetAreaTriggerServerPosition(spawnId);
+ if (!position)
+ return false;
+
+ AreaTriggerTemplate const* areaTriggerTemplate = sAreaTriggerDataStore->GetAreaTriggerServerTemplate(position->Id);
+ if (!areaTriggerTemplate)
+ return false;
+
+ return CreateServer(map, areaTriggerTemplate, *position);
+}
+
+bool AreaTrigger::CreateServer(Map* map, AreaTriggerTemplate const* areaTriggerTemplate, AreaTriggerServerPosition 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());
+ return false;
+ }
+
+ _areaTriggerTemplate = areaTriggerTemplate;
+
+ Object::_Create(ObjectGuid::Create<HighGuid::AreaTrigger>(GetMapId(),
+ areaTriggerTemplate->Id, GetMap()->GenerateLowGuid<HighGuid::AreaTrigger>()));
+
+ SetEntry(areaTriggerTemplate->Id);
+
+ SetObjectScale(1.0f);
+
+ if (position.PhaseId || position.PhaseGroup || position.PhaseUseFlags)
+ PhasingHandler::InitDbPhaseShift(GetPhaseShift(), position.PhaseUseFlags, position.PhaseId, position.PhaseGroup);
+
+ UpdateShape();
+
+ AI_Initialize();
+
+ return true;
+}
+
void AreaTrigger::Update(uint32 diff)
{
WorldObject::Update(diff);
_timeSinceCreated += diff;
+ if (IsServerSide())
+ {
+ UpdateTargetList();
+ return;
+ }
+
// "If" order matter here, Orbit > Attached > Splines
if (HasOrbit())
{
@@ -430,7 +484,7 @@ void AreaTrigger::HandleUnitEnterExit(std::list<Unit*> const& newTargetList)
AreaTriggerTemplate const* AreaTrigger::GetTemplate() const
{
- return _areaTriggerMiscTemplate->Template;
+ return _areaTriggerTemplate;
}
uint32 AreaTrigger::GetScriptId() const
@@ -581,11 +635,13 @@ bool UnitFitToActionRequirement(Unit* unit, Unit* caster, AreaTriggerAction cons
void AreaTrigger::DoActions(Unit* unit)
{
- if (Unit* caster = GetCaster())
+ Unit* caster = IsServerSide() ? unit : GetCaster();
+
+ if (caster)
{
for (AreaTriggerAction const& action : GetTemplate()->Actions)
{
- if (UnitFitToActionRequirement(unit, caster, action))
+ if (IsServerSide() || UnitFitToActionRequirement(unit, caster, action))
{
switch (action.ActionType)
{
@@ -595,6 +651,13 @@ void AreaTrigger::DoActions(Unit* unit)
case AREATRIGGER_ACTION_ADDAURA:
caster->AddAura(action.Param, unit);
break;
+ case AREATRIGGER_ACTION_TELEPORT:
+ {
+ if (WorldSafeLocsEntry const* safeLoc = sObjectMgr->GetWorldSafeLoc(action.Param))
+ if (Player* player = caster->ToPlayer())
+ player->TeleportTo(safeLoc->Loc);
+ break;
+ }
default:
break;
}
diff --git a/src/server/game/Entities/AreaTrigger/AreaTrigger.h b/src/server/game/Entities/AreaTrigger/AreaTrigger.h
index a9e1a54ed0f..90c0a6dbd46 100644
--- a/src/server/game/Entities/AreaTrigger/AreaTrigger.h
+++ b/src/server/game/Entities/AreaTrigger/AreaTrigger.h
@@ -61,8 +61,14 @@ class TC_GAME_API AreaTrigger : public WorldObject, public GridObject<AreaTrigge
AreaTriggerAI* AI() { return _ai.get(); }
+ bool IsServerSide() const { return _areaTriggerTemplate->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);
+
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);
@@ -105,6 +111,8 @@ 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);
float GetProgress() const;
@@ -154,6 +162,8 @@ class TC_GAME_API AreaTrigger : public WorldObject, public GridObject<AreaTrigge
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 4072089d275..9632aac39d1 100644
--- a/src/server/game/Entities/AreaTrigger/AreaTriggerTemplate.cpp
+++ b/src/server/game/Entities/AreaTrigger/AreaTriggerTemplate.cpp
@@ -33,6 +33,7 @@ AreaTriggerTemplate::AreaTriggerTemplate()
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 7b8ec39b3f0..abd94935a13 100644
--- a/src/server/game/Entities/AreaTrigger/AreaTriggerTemplate.h
+++ b/src/server/game/Entities/AreaTrigger/AreaTriggerTemplate.h
@@ -55,9 +55,10 @@ enum AreaTriggerTypes
enum AreaTriggerActionTypes
{
- AREATRIGGER_ACTION_CAST = 0,
- AREATRIGGER_ACTION_ADDAURA = 1,
- AREATRIGGER_ACTION_MAX = 2
+ AREATRIGGER_ACTION_CAST = 0,
+ AREATRIGGER_ACTION_ADDAURA = 1,
+ AREATRIGGER_ACTION_TELEPORT = 2,
+ AREATRIGGER_ACTION_MAX = 3
};
enum AreaTriggerActionUserTypes
@@ -71,6 +72,19 @@ enum AreaTriggerActionUserTypes
AREATRIGGER_ACTION_USER_MAX = 6
};
+struct AreaTriggerServerPosition
+{
+ 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) { }
+};
+
struct AreaTriggerAction
{
uint32 Param;
@@ -146,6 +160,7 @@ public:
std::vector<TaggedPosition<Position::XY>> PolygonVertices;
std::vector<TaggedPosition<Position::XY>> PolygonVerticesTarget;
std::vector<AreaTriggerAction> Actions;
+ bool IsServerSide;
union
{