diff options
-rw-r--r-- | sql/updates/world/master/2018_08_05_00_world.sql | 13 | ||||
-rw-r--r-- | src/server/game/Entities/AreaTrigger/AreaTrigger.cpp | 122 | ||||
-rw-r--r-- | src/server/game/Entities/AreaTrigger/AreaTrigger.h | 21 | ||||
-rw-r--r-- | src/server/game/Entities/AreaTrigger/AreaTriggerTemplate.h | 18 | ||||
-rw-r--r-- | src/server/game/Entities/Object/Object.cpp | 29 | ||||
-rw-r--r-- | src/server/game/Globals/AreaTriggerDataStore.cpp | 46 | ||||
-rw-r--r-- | src/server/game/Maps/Map.cpp | 1 | ||||
-rw-r--r-- | src/server/game/Server/Packets/AreaTriggerPackets.cpp | 38 | ||||
-rw-r--r-- | src/server/game/Server/Packets/AreaTriggerPackets.h | 21 | ||||
-rw-r--r-- | src/server/scripts/Spells/spell_warlock.cpp | 1 |
10 files changed, 237 insertions, 73 deletions
diff --git a/sql/updates/world/master/2018_08_05_00_world.sql b/sql/updates/world/master/2018_08_05_00_world.sql new file mode 100644 index 00000000000..eabd469a873 --- /dev/null +++ b/sql/updates/world/master/2018_08_05_00_world.sql @@ -0,0 +1,13 @@ +DROP TABLE IF EXISTS `spell_areatrigger_circular`; +CREATE TABLE `spell_areatrigger_circular`( + `SpellMiscId` INT(10) UNSIGNED NOT NULL, + `StartDelay` INT(10) UNSIGNED NOT NULL DEFAULT 0, + `CircleRadius` FLOAT NOT NULL DEFAULT 0, + `BlendFromRadius` FLOAT NOT NULL DEFAULT 0, + `InitialAngle` FLOAT NOT NULL DEFAULT 0, + `ZOffset` FLOAT NOT NULL DEFAULT 0, + `CounterClockwise` TINYINT(3) UNSIGNED NOT NULL DEFAULT 0, + `CanLoop` TINYINT(3) UNSIGNED NOT NULL DEFAULT 0, + `VerifiedBuild` INT(10) UNSIGNED NOT NULL DEFAULT 0, + PRIMARY KEY (`SpellMiscId`) +); diff --git a/src/server/game/Entities/AreaTrigger/AreaTrigger.cpp b/src/server/game/Entities/AreaTrigger/AreaTrigger.cpp index 6c36fec788f..b03bdab76ce 100644 --- a/src/server/game/Entities/AreaTrigger/AreaTrigger.cpp +++ b/src/server/game/Entities/AreaTrigger/AreaTrigger.cpp @@ -19,7 +19,6 @@ #include "AreaTriggerAI.h" #include "AreaTriggerDataStore.h" #include "AreaTriggerPackets.h" -#include "AreaTriggerTemplate.h" #include "CellImpl.h" #include "Chat.h" #include "DB2Stores.h" @@ -137,9 +136,20 @@ bool AreaTrigger::Create(uint32 spellMiscId, Unit* caster, Unit* target, SpellIn UpdateShape(); - if (GetMiscTemplate()->HasSplines()) + uint32 timeToTarget = GetMiscTemplate()->TimeToTarget != 0 ? GetMiscTemplate()->TimeToTarget : GetUInt32Value(AREATRIGGER_DURATION); + + if (GetTemplate()->HasFlag(AREATRIGGER_FLAG_HAS_CIRCULAR_MOVEMENT)) + { + AreaTriggerCircularMovementInfo cmi = GetMiscTemplate()->CircularMovementInfo; + if (target && GetTemplate()->HasFlag(AREATRIGGER_FLAG_HAS_ATTACHED)) + cmi.TargetGUID = target->GetGUID(); + else + cmi.Center = pos; + + InitCircularMovement(cmi, timeToTarget); + } + else if (GetMiscTemplate()->HasSplines()) { - uint32 timeToTarget = GetMiscTemplate()->TimeToTarget != 0 ? GetMiscTemplate()->TimeToTarget : GetUInt32Value(AREATRIGGER_DURATION); InitSplineOffsets(GetMiscTemplate()->SplinePoints, timeToTarget); } @@ -158,6 +168,10 @@ bool AreaTrigger::Create(uint32 spellMiscId, Unit* caster, Unit* target, SpellIn AI_Initialize(); + // Relocate areatriggers with circular movement again + if (HasCircularMovement()) + Relocate(CalculateCircularMovementPosition()); + if (!GetMap()->AddToMap(this)) { // Returning false will cause the object to be deleted - remove from transport @@ -190,7 +204,12 @@ void AreaTrigger::Update(uint32 diff) WorldObject::Update(diff); _timeSinceCreated += diff; - if (GetTemplate()->HasFlag(AREATRIGGER_FLAG_HAS_ATTACHED)) + // "If" order matter here, Circular Movement > Attached > Splines + if (HasCircularMovement()) + { + UpdateCircularMovementPosition(diff); + } + else if (GetTemplate()->HasFlag(AREATRIGGER_FLAG_HAS_ATTACHED)) { if (Unit* target = GetTarget()) GetMap()->AreaTriggerRelocation(this, target->GetPositionX(), target->GetPositionY(), target->GetPositionZ(), target->GetOrientation()); @@ -642,6 +661,101 @@ bool AreaTrigger::HasSplines() const return bool(_spline); } +void AreaTrigger::InitCircularMovement(AreaTriggerCircularMovementInfo const& cmi, uint32 timeToTarget) +{ + // Circular movement requires either a center position or an attached unit + ASSERT(cmi.Center.is_initialized() || cmi.TargetGUID.is_initialized()); + + // should be sent in object create packets only + m_uint32Values[AREATRIGGER_TIME_TO_TARGET] = timeToTarget; + + _circularMovementInfo = cmi; + + _circularMovementInfo->TimeToTarget = timeToTarget; + _circularMovementInfo->ElapsedTimeForMovement = 0; + + if (IsInWorld()) + { + WorldPackets::AreaTrigger::AreaTriggerReShape reshape; + reshape.TriggerGUID = GetGUID(); + reshape.AreaTriggerCircularMovement = _circularMovementInfo; + + SendMessageToSet(reshape.Write(), true); + } +} + +bool AreaTrigger::HasCircularMovement() const +{ + return _circularMovementInfo.is_initialized(); +} + +Position const* AreaTrigger::GetCircularMovementCenterPosition() const +{ + if (_circularMovementInfo.is_initialized()) + return nullptr; + + if (_circularMovementInfo->TargetGUID.is_initialized()) + if (WorldObject* center = ObjectAccessor::GetWorldObject(*this, *_circularMovementInfo->TargetGUID)) + return center; + + if (_circularMovementInfo->Center.is_initialized()) + return &_circularMovementInfo->Center->Pos; + + return nullptr; +} + +Position AreaTrigger::CalculateCircularMovementPosition() const +{ + Position const* centerPos = GetCircularMovementCenterPosition(); + if (!centerPos) + return GetPosition(); + + AreaTriggerCircularMovementInfo const& cmi = *_circularMovementInfo; + + // AreaTrigger make exactly "Duration / TimeToTarget" loops during his life time + float pathProgress = float(cmi.ElapsedTimeForMovement) / float(cmi.TimeToTarget); + + // We already made one circle and can't loop + if (!cmi.CanLoop) + pathProgress = std::min(1.f, pathProgress); + + float radius = cmi.Radius; + if (G3D::fuzzyNe(cmi.BlendFromRadius, radius)) + { + float blendCurve = (cmi.BlendFromRadius - radius) / radius; + // 4.f Defines four quarters + blendCurve = RoundToInterval(blendCurve, 1.f, 4.f) / 4.f; + float blendProgress = std::min(1.f, pathProgress / blendCurve); + radius = G3D::lerp(cmi.BlendFromRadius, cmi.Radius, blendProgress); + } + + // Adapt Path progress depending of circle direction + if (!cmi.CounterClockwise) + pathProgress *= -1; + + float angle = cmi.InitialAngle + 2.f * float(M_PI) * pathProgress; + float x = centerPos->GetPositionX() + (radius * std::cos(angle)); + float y = centerPos->GetPositionY() + (radius * std::sin(angle)); + float z = centerPos->GetPositionZ() + cmi.ZOffset; + + return { x, y, z, angle }; +} + +void AreaTrigger::UpdateCircularMovementPosition(uint32 /*diff*/) +{ + if (_circularMovementInfo->StartDelay > GetElapsedTimeForMovement()) + return; + + _circularMovementInfo->ElapsedTimeForMovement = GetElapsedTimeForMovement() - _circularMovementInfo->StartDelay; + + Position pos = CalculateCircularMovementPosition(); + + GetMap()->AreaTriggerRelocation(this, pos.GetPositionX(), pos.GetPositionY(), pos.GetPositionZ(), pos.GetOrientation()); +#ifdef TRINITY_DEBUG + DebugVisualizePosition(); +#endif +} + void AreaTrigger::UpdateSplinePosition(uint32 diff) { if (_reachedDestination) diff --git a/src/server/game/Entities/AreaTrigger/AreaTrigger.h b/src/server/game/Entities/AreaTrigger/AreaTrigger.h index c4008c8e728..98a305b5a92 100644 --- a/src/server/game/Entities/AreaTrigger/AreaTrigger.h +++ b/src/server/game/Entities/AreaTrigger/AreaTrigger.h @@ -20,15 +20,12 @@ #include "Object.h" #include "MapObject.h" +#include "AreaTriggerTemplate.h" -class AreaTriggerTemplate; -class AreaTriggerMiscTemplate; +class AuraEffect; +class AreaTriggerAI; class SpellInfo; class Unit; -class AreaTriggerAI; -class AuraEffect; - -struct AreaTriggerPolygonVertice; namespace G3D { @@ -60,7 +57,7 @@ class TC_GAME_API AreaTrigger : public WorldObject, public GridObject<AreaTrigge public: static AreaTrigger* CreateAreaTrigger(uint32 spellMiscId, Unit* caster, Unit* target, SpellInfo const* spell, Position const& pos, int32 duration, uint32 spellXSpellVisualId, ObjectGuid const& castId = ObjectGuid::Empty, AuraEffect const* aurEff = nullptr); - void Update(uint32 p_time) override; + void Update(uint32 diff) override; void Remove(); bool IsRemoved() const { return _isRemoved; } uint32 GetSpellId() const { return GetUInt32Value(AREATRIGGER_SPELLID); } @@ -91,6 +88,10 @@ class TC_GAME_API AreaTrigger : public WorldObject, public GridObject<AreaTrigge ::Movement::Spline<int32> const& GetSpline() const { return *_spline; } uint32 GetElapsedTimeForMovement() const { return GetTimeSinceCreated(); } /// @todo: research the right value, in sniffs both timers are nearly identical + void InitCircularMovement(AreaTriggerCircularMovementInfo const& cmi, uint32 timeToTarget); + bool HasCircularMovement() const; + Optional<AreaTriggerCircularMovementInfo> const& GetCircularMovementInfo() const { return _circularMovementInfo; } + void UpdateShape(); protected: @@ -109,8 +110,12 @@ class TC_GAME_API AreaTrigger : public WorldObject, public GridObject<AreaTrigge void UndoActions(Unit* unit); void UpdatePolygonOrientation(); + void UpdateCircularMovementPosition(uint32 diff); void UpdateSplinePosition(uint32 diff); + Position const* GetCircularMovementCenterPosition() const; + Position CalculateCircularMovementPosition() const; + void DebugVisualizePosition(); // Debug purpose only ObjectGuid _targetGuid; @@ -132,6 +137,8 @@ class TC_GAME_API AreaTrigger : public WorldObject, public GridObject<AreaTrigge int32 _lastSplineIndex; uint32 _movementTime; + Optional<AreaTriggerCircularMovementInfo> _circularMovementInfo; + AreaTriggerMiscTemplate const* _areaTriggerMiscTemplate; GuidUnorderedSet _insideUnits; diff --git a/src/server/game/Entities/AreaTrigger/AreaTriggerTemplate.h b/src/server/game/Entities/AreaTrigger/AreaTriggerTemplate.h index 5a5c625d051..d61f13533ff 100644 --- a/src/server/game/Entities/AreaTrigger/AreaTriggerTemplate.h +++ b/src/server/game/Entities/AreaTrigger/AreaTriggerTemplate.h @@ -37,7 +37,7 @@ enum AreaTriggerFlags AREATRIGGER_FLAG_UNK2 = 0x00080, AREATRIGGER_FLAG_UNK3 = 0x00100, AREATRIGGER_FLAG_UNK4 = 0x00200, - AREATRIGGER_FLAG_UNK5 = 0x00400 + AREATRIGGER_FLAG_HAS_CIRCULAR_MOVEMENT = 0x00400 }; enum AreaTriggerTypes @@ -92,6 +92,21 @@ struct AreaTriggerScaleInfo } ExtraScale[MAX_AREATRIGGER_SCALE]; }; +struct AreaTriggerCircularMovementInfo +{ + Optional<ObjectGuid> TargetGUID; + Optional<TaggedPosition<Position::XYZ>> Center; + bool CounterClockwise = false; + bool CanLoop = false; + uint32 TimeToTarget = 0; + int32 ElapsedTimeForMovement = 0; + uint32 StartDelay = 0; + float Radius = 0.0f; + float BlendFromRadius = 0.0f; + float InitialAngle = 0.0f; + float ZOffset = 0.0f; +}; + class AreaTriggerTemplate { public: @@ -179,6 +194,7 @@ public: uint32 TimeToTargetScale; AreaTriggerScaleInfo ScaleInfo; + AreaTriggerCircularMovementInfo CircularMovementInfo; AreaTriggerTemplate const* Template; std::vector<Position> SplinePoints; diff --git a/src/server/game/Entities/Object/Object.cpp b/src/server/game/Entities/Object/Object.cpp index 36bed0bfd4b..cd1d352eda8 100644 --- a/src/server/game/Entities/Object/Object.cpp +++ b/src/server/game/Entities/Object/Object.cpp @@ -17,6 +17,7 @@ */ #include "Object.h" +#include "AreaTriggerPackets.h" #include "AreaTriggerTemplate.h" #include "BattlefieldMgr.h" #include "CellImpl.h" @@ -547,7 +548,7 @@ void Object::BuildMovementUpdate(ByteBuffer* data, uint32 flags) const bool hasAreaTriggerPolygon = areaTriggerTemplate->IsPolygon(); bool hasAreaTriggerCylinder = areaTriggerTemplate->IsCylinder(); bool hasAreaTriggerSpline = areaTrigger->HasSplines(); - bool hasAreaTriggerUnkType = false; // areaTriggerTemplate->HasFlag(AREATRIGGER_FLAG_UNK5); + bool hasCircularMovement = areaTrigger->HasCircularMovement(); data->WriteBit(hasAbsoluteOrientation); data->WriteBit(hasDynamicShape); @@ -568,7 +569,7 @@ void Object::BuildMovementUpdate(ByteBuffer* data, uint32 flags) const data->WriteBit(hasAreaTriggerPolygon); data->WriteBit(hasAreaTriggerCylinder); data->WriteBit(hasAreaTriggerSpline); - data->WriteBit(hasAreaTriggerUnkType); + data->WriteBit(hasCircularMovement); if (hasUnk3) data->WriteBit(0); @@ -644,28 +645,8 @@ void Object::BuildMovementUpdate(ByteBuffer* data, uint32 flags) const *data << float(areaTriggerTemplate->CylinderDatas.LocationZOffsetTarget); } - if (hasAreaTriggerUnkType) - { - /*packet.ResetBitReader(); - var unk1 = packet.ReadBit("AreaTriggerUnk1"); - var hasCenter = packet.ReadBit("HasCenter", index); - packet.ReadBit("Unk bit 703 1", index); - packet.ReadBit("Unk bit 703 2", index); - - packet.ReadUInt32(); - packet.ReadInt32(); - packet.ReadUInt32(); - packet.ReadSingle("Radius", index); - packet.ReadSingle("BlendFromRadius", index); - packet.ReadSingle("InitialAngel", index); - packet.ReadSingle("ZOffset", index); - - if (unk1) - packet.ReadPackedGuid128("AreaTriggerUnkGUID", index); - - if (hasCenter) - packet.ReadVector3("Center", index);*/ - } + if (hasCircularMovement) + *data << *areaTrigger->GetCircularMovementInfo(); } if (HasGameObject) diff --git a/src/server/game/Globals/AreaTriggerDataStore.cpp b/src/server/game/Globals/AreaTriggerDataStore.cpp index 176b162ff9c..903525c90f5 100644 --- a/src/server/game/Globals/AreaTriggerDataStore.cpp +++ b/src/server/game/Globals/AreaTriggerDataStore.cpp @@ -22,6 +22,7 @@ #include "Log.h" #include "ObjectMgr.h" #include "Timer.h" +#include <cmath> namespace { @@ -197,6 +198,51 @@ void AreaTriggerDataStore::LoadAreaTriggerTemplates() TC_LOG_INFO("server.loading", ">> Loaded 0 Spell AreaTrigger templates. DB table `spell_areatrigger` is empty."); } + // 0 1 2 3 4 5 6 7 + if (QueryResult circularMovementInfos = WorldDatabase.Query("SELECT SpellMiscId, StartDelay, CircleRadius, BlendFromRadius, InitialAngle, ZOffset, CounterClockwise, CanLoop FROM `spell_areatrigger_circular` ORDER BY `SpellMiscId`")) + { + do + { + Field* circularMovementInfoFields = circularMovementInfos->Fetch(); + uint32 spellMiscId = circularMovementInfoFields[0].GetUInt32(); + + auto atSpellMiscItr = _areaTriggerTemplateSpellMisc.find(spellMiscId); + if (atSpellMiscItr == _areaTriggerTemplateSpellMisc.end()) + { + TC_LOG_ERROR("sql.sql", "Table `spell_areatrigger_circular` reference invalid SpellMiscId %u", spellMiscId); + continue; + } + + AreaTriggerCircularMovementInfo& circularMovementInfo = atSpellMiscItr->second.CircularMovementInfo; + + circularMovementInfo.StartDelay = circularMovementInfoFields[1].GetUInt32(); + +#define VALIDATE_AND_SET_FLOAT(Float, Value) \ + circularMovementInfo.Float = Value; \ + if (!std::isfinite(circularMovementInfo.Float)) \ + { \ + TC_LOG_ERROR("sql.sql", "Table `spell_areatrigger_circular` has listed areatrigger (MiscId: %u) with invalid " #Float " (%f), set to 0!", \ + spellMiscId, circularMovementInfo.Float); \ + circularMovementInfo.Float = 0.0f; \ + } + + VALIDATE_AND_SET_FLOAT(Radius, circularMovementInfoFields[2].GetFloat()); + VALIDATE_AND_SET_FLOAT(BlendFromRadius, circularMovementInfoFields[3].GetFloat()); + VALIDATE_AND_SET_FLOAT(InitialAngle, circularMovementInfoFields[4].GetFloat()); + VALIDATE_AND_SET_FLOAT(ZOffset, circularMovementInfoFields[5].GetFloat()); + +#undef VALIDATE_AND_SET_FLOAT + + circularMovementInfo.CounterClockwise = circularMovementInfoFields[6].GetBool(); + circularMovementInfo.CanLoop = circularMovementInfoFields[7].GetBool(); + } + while (circularMovementInfos->NextRow()); + } + else + { + TC_LOG_INFO("server.loading", ">> Loaded 0 AreaTrigger templates circular movement infos. DB table `spell_areatrigger_circular` is empty."); + } + TC_LOG_INFO("server.loading", ">> Loaded " SZFMTD " spell areatrigger templates in %u ms.", _areaTriggerTemplateStore.size(), GetMSTimeDiffToNow(oldMSTime)); } diff --git a/src/server/game/Maps/Map.cpp b/src/server/game/Maps/Map.cpp index 2b8b453a44d..be1a3760e4c 100644 --- a/src/server/game/Maps/Map.cpp +++ b/src/server/game/Maps/Map.cpp @@ -1442,6 +1442,7 @@ void Map::MoveAllAreaTriggersInMoveList() { // update pos at->Relocate(at->_newPosition); + at->UpdateShape(); at->UpdateObjectVisibility(false); } else diff --git a/src/server/game/Server/Packets/AreaTriggerPackets.cpp b/src/server/game/Server/Packets/AreaTriggerPackets.cpp index d546c6bb6b3..f99d9831f91 100644 --- a/src/server/game/Server/Packets/AreaTriggerPackets.cpp +++ b/src/server/game/Server/Packets/AreaTriggerPackets.cpp @@ -31,26 +31,26 @@ ByteBuffer& operator<<(ByteBuffer& data, WorldPackets::AreaTrigger::AreaTriggerS return data; } -ByteBuffer& operator<<(ByteBuffer& data, WorldPackets::AreaTrigger::AreaTriggerUnkTypeInfo const& areaTriggerUnkType) +ByteBuffer& operator<<(ByteBuffer& data, AreaTriggerCircularMovementInfo const& areaTriggerCircularMovement) { - data.WriteBit(areaTriggerUnkType.AreaTriggerUnkGUID.is_initialized()); - data.WriteBit(areaTriggerUnkType.Center.is_initialized()); - data.WriteBit(areaTriggerUnkType.UnkBit1); - data.WriteBit(areaTriggerUnkType.UnkBit2); + data.WriteBit(areaTriggerCircularMovement.TargetGUID.is_initialized()); + data.WriteBit(areaTriggerCircularMovement.Center.is_initialized()); + data.WriteBit(areaTriggerCircularMovement.CounterClockwise); + data.WriteBit(areaTriggerCircularMovement.CanLoop); - data << uint32(areaTriggerUnkType.UnkUInt1); - data << int32(areaTriggerUnkType.UnkInt1); - data << uint32(areaTriggerUnkType.UnkUInt2); - data << float(areaTriggerUnkType.Radius); - data << float(areaTriggerUnkType.BlendFromRadius); - data << float(areaTriggerUnkType.InitialAngel); - data << float(areaTriggerUnkType.ZOffset); + data << uint32(areaTriggerCircularMovement.TimeToTarget); + data << int32(areaTriggerCircularMovement.ElapsedTimeForMovement); + data << uint32(areaTriggerCircularMovement.StartDelay); + data << float(areaTriggerCircularMovement.Radius); + data << float(areaTriggerCircularMovement.BlendFromRadius); + data << float(areaTriggerCircularMovement.InitialAngle); + data << float(areaTriggerCircularMovement.ZOffset); - if (areaTriggerUnkType.AreaTriggerUnkGUID) - data << *areaTriggerUnkType.AreaTriggerUnkGUID; + if (areaTriggerCircularMovement.TargetGUID) + data << *areaTriggerCircularMovement.TargetGUID; - if (areaTriggerUnkType.Center) - data << *areaTriggerUnkType.Center; + if (areaTriggerCircularMovement.Center) + data << *areaTriggerCircularMovement.Center; return data; } @@ -84,14 +84,14 @@ WorldPacket const* WorldPackets::AreaTrigger::AreaTriggerReShape::Write() _worldPacket << TriggerGUID; _worldPacket.WriteBit(AreaTriggerSpline.is_initialized()); - _worldPacket.WriteBit(AreaTriggerUnkType.is_initialized()); + _worldPacket.WriteBit(AreaTriggerCircularMovement.is_initialized()); _worldPacket.FlushBits(); if (AreaTriggerSpline) _worldPacket << *AreaTriggerSpline; - if (AreaTriggerUnkType) - _worldPacket << *AreaTriggerUnkType; + if (AreaTriggerCircularMovement) + _worldPacket << *AreaTriggerCircularMovement; return &_worldPacket; } diff --git a/src/server/game/Server/Packets/AreaTriggerPackets.h b/src/server/game/Server/Packets/AreaTriggerPackets.h index 4181bad933c..e3872493481 100644 --- a/src/server/game/Server/Packets/AreaTriggerPackets.h +++ b/src/server/game/Server/Packets/AreaTriggerPackets.h @@ -19,9 +19,9 @@ #define AreaTriggerPackets_h__ #include "Packet.h" +#include "AreaTriggerTemplate.h" #include "ObjectGuid.h" #include "Optional.h" -#include "Position.h" namespace WorldPackets { @@ -34,21 +34,6 @@ namespace WorldPackets std::vector<TaggedPosition<Position::XYZ>> Points; }; - struct AreaTriggerUnkTypeInfo - { - Optional<ObjectGuid> AreaTriggerUnkGUID; - Optional<TaggedPosition<Position::XYZ>> Center; - bool UnkBit1 = false; - bool UnkBit2 = false; - uint32 UnkUInt1 = 0; - int32 UnkInt1 = 0; - uint32 UnkUInt2 = 0; - float Radius = 0.0; - float BlendFromRadius = 0.0f; - float InitialAngel = 0.0f; - float ZOffset = 0.0f; - }; - class AreaTrigger final : public ClientPacket { public: @@ -99,10 +84,12 @@ namespace WorldPackets WorldPacket const* Write() override; Optional<AreaTriggerSplineInfo> AreaTriggerSpline; - Optional<AreaTriggerUnkTypeInfo> AreaTriggerUnkType; + Optional<AreaTriggerCircularMovementInfo> AreaTriggerCircularMovement; ObjectGuid TriggerGUID; }; } } +ByteBuffer& operator<<(ByteBuffer& data, AreaTriggerCircularMovementInfo const& areaTriggerCircularMovement); + #endif // AreaTriggerPackets_h__ diff --git a/src/server/scripts/Spells/spell_warlock.cpp b/src/server/scripts/Spells/spell_warlock.cpp index 7113fe1ea2b..55d5de35367 100644 --- a/src/server/scripts/Spells/spell_warlock.cpp +++ b/src/server/scripts/Spells/spell_warlock.cpp @@ -23,7 +23,6 @@ #include "ScriptMgr.h" #include "AreaTrigger.h" -#include "AreaTriggerTemplate.h" #include "Creature.h" #include "GameObject.h" #include "ObjectAccessor.h" |