From 8622b9bf8f74a0635dacba860df6b677475b324f Mon Sep 17 00:00:00 2001 From: Shauren Date: Sun, 11 Jan 2026 12:20:42 +0100 Subject: [PATCH] Core/AreaTriggers: Changed how Attached flag is determined - instead of being set in database it is now dynamically set depending on how the areatrigger was created. AreaTriggers created by auras are now all attached by default --- src/server/game/Entities/AreaTrigger/AreaTrigger.cpp | 8 +++++--- .../game/Entities/AreaTrigger/AreaTriggerTemplate.h | 2 +- src/server/game/Spells/Auras/SpellAuraEffects.cpp | 3 ++- 3 files changed, 8 insertions(+), 5 deletions(-) diff --git a/src/server/game/Entities/AreaTrigger/AreaTrigger.cpp b/src/server/game/Entities/AreaTrigger/AreaTrigger.cpp index 5b0612fedc7..8ede240dacb 100644 --- a/src/server/game/Entities/AreaTrigger/AreaTrigger.cpp +++ b/src/server/game/Entities/AreaTrigger/AreaTrigger.cpp @@ -169,7 +169,10 @@ bool AreaTrigger::Create(AreaTriggerCreatePropertiesId areaTriggerCreateProperti SetSpellVisual(spellVisual); if (!IsStaticSpawn()) + { SetUpdateFieldValue(areaTriggerData.ModifyValue(&UF::AreaTriggerData::TimeToTargetScale), GetCreateProperties()->TimeToTargetScale != 0 ? GetCreateProperties()->TimeToTargetScale : *m_areaTriggerData->Duration); + SetUpdateFieldValue(areaTriggerData.ModifyValue(&UF::AreaTriggerData::TimeToTargetPos), *m_areaTriggerData->Duration); + } SetUpdateFieldValue(areaTriggerData.ModifyValue(&UF::AreaTriggerData::BoundsRadius2D), GetCreateProperties()->Shape.GetMaxSearchRadius()); SetUpdateFieldValue(areaTriggerData.ModifyValue(&UF::AreaTriggerData::DecalPropertiesID), GetCreateProperties()->DecalPropertiesId); if (IsServerSide()) @@ -206,8 +209,6 @@ bool AreaTrigger::Create(AreaTriggerCreatePropertiesId areaTriggerCreateProperti fieldFlags |= AreaTriggerFieldFlags::AbsoluteOrientation; if (flags.HasFlag(AreaTriggerCreatePropertiesFlag::HasDynamicShape)) fieldFlags |= AreaTriggerFieldFlags::DynamicShape; - if (flags.HasFlag(AreaTriggerCreatePropertiesFlag::HasAttached)) - fieldFlags |= AreaTriggerFieldFlags::Attached; if (flags.HasFlag(AreaTriggerCreatePropertiesFlag::HasFaceMovementDir)) fieldFlags |= AreaTriggerFieldFlags::FaceMovementDir; if (flags.HasFlag(AreaTriggerCreatePropertiesFlag::HasFollowsTerrain)) @@ -234,8 +235,9 @@ bool AreaTrigger::Create(AreaTriggerCreatePropertiesId areaTriggerCreateProperti PhasingHandler::InitDbPhaseShift(GetPhaseShift(), spawnData->phaseUseFlags, spawnData->phaseId, spawnData->phaseGroup); } - if (target && HasAreaTriggerFlag(AreaTriggerFieldFlags::Attached)) + if (target && aurEff) { + SetAreaTriggerFlag(AreaTriggerFieldFlags::Attached); m_movementInfo.transport.guid = target->GetGUID(); m_updateFlag.MovementTransport = true; } diff --git a/src/server/game/Entities/AreaTrigger/AreaTriggerTemplate.h b/src/server/game/Entities/AreaTrigger/AreaTriggerTemplate.h index 50e471d23c9..62a64827122 100644 --- a/src/server/game/Entities/AreaTrigger/AreaTriggerTemplate.h +++ b/src/server/game/Entities/AreaTrigger/AreaTriggerTemplate.h @@ -62,7 +62,7 @@ enum class AreaTriggerCreatePropertiesFlag : uint32 None = 0x00000, HasAbsoluteOrientation = 0x00001, HasDynamicShape = 0x00002, - HasAttached = 0x00004, + HasAttached = 0x00004, // DEPRECATED HasFaceMovementDir = 0x00008, HasFollowsTerrain = 0x00010, // NYI AlwaysExterior = 0x00020, diff --git a/src/server/game/Spells/Auras/SpellAuraEffects.cpp b/src/server/game/Spells/Auras/SpellAuraEffects.cpp index 73fcbe1cefe..2d9c4e9626a 100644 --- a/src/server/game/Spells/Auras/SpellAuraEffects.cpp +++ b/src/server/game/Spells/Auras/SpellAuraEffects.cpp @@ -6383,7 +6383,8 @@ void AuraEffect::HandleCreateAreaTrigger(AuraApplication const* aurApp, uint8 mo if (apply) { AreaTriggerCreatePropertiesId createPropertiesId = { uint32(GetMiscValue()), false }; - AreaTrigger::CreateAreaTrigger(createPropertiesId, *target, GetBase()->GetDuration(), GetCaster(), target, GetBase()->GetSpellVisual(), GetSpellInfo(), nullptr, this); + Position pos = { target->GetPositionX(), target->GetPositionY(), target->GetPositionZ() }; // drop orientation for attached areatrigger + AreaTrigger::CreateAreaTrigger(createPropertiesId, pos, GetBase()->GetDuration(), GetCaster(), target, GetBase()->GetSpellVisual(), GetSpellInfo(), nullptr, this); } else {