diff options
| author | Matan Shukry <matanshukry@gmail.com> | 2021-01-28 05:46:06 +0200 |
|---|---|---|
| committer | Shauren <shauren.trinity@gmail.com> | 2021-01-30 18:10:21 +0100 |
| commit | 0417c5ff5fd68cd3344dede35afaab364870561b (patch) | |
| tree | c281641aa9bb74652e2105cbb72905b64d06f3ed /src/server/game/Entities/AreaTrigger | |
| parent | 08005a7cf937d2abd3bd164c24c80bb87ec3378c (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')
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 { |
