Core/AreaTriggers: Remove loading AreaTriggerCreatePropertiesFlag::HasDynamicShape from database
Build (Windows x64) / build (push) Canceled after 0s
Build (Windows x64) / linux-build (push) Canceled after 0s

This commit is contained in:
luis
2026-08-30 18:17:55 -03:00
parent 78ea7e759c
commit b2ca290a6a
4 changed files with 79 additions and 3 deletions
@@ -208,8 +208,6 @@ bool AreaTrigger::Create(AreaTriggerCreatePropertiesId areaTriggerCreateProperti
AreaTriggerFieldFlags fieldFlags = AreaTriggerFieldFlags::None;
if (flags.HasFlag(AreaTriggerCreatePropertiesFlag::HasAbsoluteOrientation))
fieldFlags |= AreaTriggerFieldFlags::AbsoluteOrientation;
if (flags.HasFlag(AreaTriggerCreatePropertiesFlag::HasDynamicShape))
fieldFlags |= AreaTriggerFieldFlags::DynamicShape;
if (flags.HasFlag(AreaTriggerCreatePropertiesFlag::HasFaceMovementDir))
fieldFlags |= AreaTriggerFieldFlags::FaceMovementDir;
if (flags.HasFlag(AreaTriggerCreatePropertiesFlag::HasFollowsTerrain))
@@ -284,6 +282,8 @@ bool AreaTrigger::Create(AreaTriggerCreatePropertiesId areaTriggerCreateProperti
AI_Initialize();
UpdateDynamicShapeFlag();
// Relocate areatriggers with circular movement again
if (HasOrbit())
Relocate(CalculateOrbitPosition());
@@ -422,31 +422,37 @@ uint32 AreaTrigger::GetTimeSinceCreated() const
void AreaTrigger::SetOverrideScaleCurve(float overrideScale)
{
SetScaleCurve(m_values.ModifyValue(&AreaTrigger::m_areaTriggerData).ModifyValue(&UF::AreaTriggerData::OverrideScaleCurve), overrideScale);
UpdateDynamicShapeFlag();
}
void AreaTrigger::SetOverrideScaleCurve(std::array<DBCPosition2D, 2> const& points, Optional<uint32> startTimeOffset, CurveInterpolationMode interpolation)
{
SetScaleCurve(m_values.ModifyValue(&AreaTrigger::m_areaTriggerData).ModifyValue(&UF::AreaTriggerData::OverrideScaleCurve), points, startTimeOffset, interpolation);
SetAreaTriggerFlag(AreaTriggerFieldFlags::DynamicShape);
}
void AreaTrigger::ClearOverrideScaleCurve()
{
ClearScaleCurve(m_values.ModifyValue(&AreaTrigger::m_areaTriggerData).ModifyValue(&UF::AreaTriggerData::OverrideScaleCurve));
UpdateDynamicShapeFlag();
}
void AreaTrigger::SetExtraScaleCurve(float extraScale)
{
SetScaleCurve(m_values.ModifyValue(&AreaTrigger::m_areaTriggerData).ModifyValue(&UF::AreaTriggerData::ExtraScaleCurve), extraScale);
UpdateDynamicShapeFlag();
}
void AreaTrigger::SetExtraScaleCurve(std::array<DBCPosition2D, 2> const& points, Optional<uint32> startTimeOffset, CurveInterpolationMode interpolation)
{
SetScaleCurve(m_values.ModifyValue(&AreaTrigger::m_areaTriggerData).ModifyValue(&UF::AreaTriggerData::ExtraScaleCurve), points, startTimeOffset, interpolation);
SetAreaTriggerFlag(AreaTriggerFieldFlags::DynamicShape);
}
void AreaTrigger::ClearExtraScaleCurve()
{
ClearScaleCurve(m_values.ModifyValue(&AreaTrigger::m_areaTriggerData).ModifyValue(&UF::AreaTriggerData::ExtraScaleCurve));
UpdateDynamicShapeFlag();
}
void AreaTrigger::SetOverrideMoveCurve(float x, float y, float z)
@@ -455,6 +461,7 @@ void AreaTrigger::SetOverrideMoveCurve(float x, float y, float z)
SetScaleCurve(areaTriggerData.ModifyValue(&UF::AreaTriggerData::OverrideMoveCurveX), x);
SetScaleCurve(areaTriggerData.ModifyValue(&UF::AreaTriggerData::OverrideMoveCurveY), y);
SetScaleCurve(areaTriggerData.ModifyValue(&UF::AreaTriggerData::OverrideMoveCurveZ), z);
UpdateDynamicShapeFlag();
}
void AreaTrigger::SetOverrideMoveCurve(std::array<DBCPosition2D, 2> const& xCurvePoints, std::array<DBCPosition2D, 2> const& yCurvePoints,
@@ -464,6 +471,7 @@ void AreaTrigger::SetOverrideMoveCurve(std::array<DBCPosition2D, 2> const& xCurv
SetScaleCurve(areaTriggerData.ModifyValue(&UF::AreaTriggerData::OverrideMoveCurveX), xCurvePoints, startTimeOffset, interpolation);
SetScaleCurve(areaTriggerData.ModifyValue(&UF::AreaTriggerData::OverrideMoveCurveY), yCurvePoints, startTimeOffset, interpolation);
SetScaleCurve(areaTriggerData.ModifyValue(&UF::AreaTriggerData::OverrideMoveCurveZ), zCurvePoints, startTimeOffset, interpolation);
SetAreaTriggerFlag(AreaTriggerFieldFlags::DynamicShape);
}
void AreaTrigger::ClearOverrideMoveCurve()
@@ -472,6 +480,7 @@ void AreaTrigger::ClearOverrideMoveCurve()
ClearScaleCurve(areaTriggerData.ModifyValue(&UF::AreaTriggerData::OverrideMoveCurveX));
ClearScaleCurve(areaTriggerData.ModifyValue(&UF::AreaTriggerData::OverrideMoveCurveY));
ClearScaleCurve(areaTriggerData.ModifyValue(&UF::AreaTriggerData::OverrideMoveCurveZ));
UpdateDynamicShapeFlag();
}
void AreaTrigger::SetSpellVisual(SpellCastVisual const& visual)
@@ -1051,6 +1060,9 @@ void AreaTrigger::SetShape(AreaTriggerShapeInfo const& shape)
else
static_assert(Trinity::dependant_false_v<ShapeType>, "Unsupported shape type");
}, shape.Data);
if (IsInWorld())
UpdateDynamicShapeFlag();
}
float AreaTrigger::GetMaxSearchRadius() const
@@ -1260,6 +1272,7 @@ void AreaTrigger::InitSplines(std::vector<G3D::Vector3> const& splinePoints, Opt
SetUpdateFieldValue(areaTriggerData.ModifyValue(&UF::AreaTriggerData::TimeToTarget), timeToTarget);
SetUpdateFieldValue(areaTriggerData.ModifyValue(&UF::AreaTriggerData::MovementStartTime), GameTime::GetGameTimeMS());
SetAreaTriggerFlag(AreaTriggerFieldFlags::DynamicShape);
SetUpdateFieldValue(areaTriggerData.ModifyValue(&UF::AreaTriggerData::PathType), int32(AreaTriggerPathType::Spline));
auto pathData = areaTriggerData.ModifyValue(&UF::AreaTriggerData::PathData, UF::VariantCase<UF::AreaTriggerSplineCalculator>);
SetUpdateFieldValue(pathData.ModifyValue(&UF::AreaTriggerSplineCalculator::Catmullrom), spline->getPointCount() >= 4);
@@ -1303,6 +1316,7 @@ void AreaTrigger::InitOrbit(AreaTriggerOrbitInfo const& orbit, Optional<float> o
else
RemoveAreaTriggerFlag(AreaTriggerFieldFlags::CanLoop);
SetAreaTriggerFlag(AreaTriggerFieldFlags::DynamicShape);
SetUpdateFieldValue(areaTriggerData.ModifyValue(&UF::AreaTriggerData::PathType), int32(AreaTriggerPathType::Orbit));
auto pathData = areaTriggerData.ModifyValue(&UF::AreaTriggerData::PathData, UF::VariantCase<UF::AreaTriggerOrbit>);
SetUpdateFieldValue(pathData.ModifyValue(&UF::AreaTriggerOrbit::CounterClockwise), orbit.CounterClockwise);
@@ -1438,6 +1452,7 @@ void AreaTrigger::UpdateSplinePosition(Movement::Spline<float>& spline)
_ai->OnDestinationReached();
_spline = nullptr;
SetUpdateFieldValue(m_values.ModifyValue(&AreaTrigger::m_areaTriggerData).ModifyValue(&UF::AreaTriggerData::PathType), int32(AreaTriggerPathType::None));
UpdateDynamicShapeFlag();
}
}
}
@@ -1461,6 +1476,24 @@ void AreaTrigger::UpdateOverridePosition()
GetMap()->AreaTriggerRelocation(this, x, y, z, orientation);
}
void AreaTrigger::UpdateDynamicShapeFlag()
{
if (AreaTriggerPathType(*m_areaTriggerData->PathType) != AreaTriggerPathType::None
|| HasAreaTriggerFlag(AreaTriggerFieldFlags::Attached)
|| (*m_areaTriggerData->OverrideScaleCurve->OverrideActive && !(*m_areaTriggerData->OverrideScaleCurve->ParameterCurve & 1))
|| *m_areaTriggerData->ScaleCurveId
|| (*m_areaTriggerData->ExtraScaleCurve->OverrideActive && !(*m_areaTriggerData->ExtraScaleCurve->ParameterCurve & 1))
|| (HasOverridePosition()
&& (!(*m_areaTriggerData->OverrideMoveCurveX->ParameterCurve & 1)
|| !(*m_areaTriggerData->OverrideMoveCurveY->ParameterCurve & 1)
|| !(*m_areaTriggerData->OverrideMoveCurveZ->ParameterCurve & 1)))
|| (m_areaTriggerData->TargetRollPitchYaw.has_value() && *m_areaTriggerData->RollPitchYaw != *m_areaTriggerData->TargetRollPitchYaw)
|| GetCreateProperties()->Shape.IsDynamic())
SetAreaTriggerFlag(AreaTriggerFieldFlags::DynamicShape);
else
RemoveAreaTriggerFlag(AreaTriggerFieldFlags::DynamicShape);
}
void AreaTrigger::UpdateHasPlayersFlag()
{
if (std::ranges::any_of(_insideUnits, [](ObjectGuid const& guid) { return guid.IsPlayer(); }))
@@ -253,6 +253,7 @@ class TC_GAME_API AreaTrigger final : public WorldObject, public GridObject<Area
Position const* GetOrbitCenterPosition() const;
Position CalculateOrbitPosition() const;
void UpdateDynamicShapeFlag();
void UpdateHasPlayersFlag();
void DebugVisualizePosition(); // Debug purpose only
@@ -24,6 +24,11 @@ float AreaTriggerShapeInfo::Sphere::GetMaxSearchRadius() const
return std::max(Radius, RadiusTarget);
}
bool AreaTriggerShapeInfo::Sphere::IsDynamic() const
{
return Radius != RadiusTarget;
}
float AreaTriggerShapeInfo::Box::GetMaxSearchRadius() const
{
return std::sqrt(std::max(
@@ -31,6 +36,11 @@ float AreaTriggerShapeInfo::Box::GetMaxSearchRadius() const
ExtentsTarget.Pos.GetPositionX() * ExtentsTarget.Pos.GetPositionX() + ExtentsTarget.Pos.GetPositionY() * ExtentsTarget.Pos.GetPositionY()));
}
bool AreaTriggerShapeInfo::Box::IsDynamic() const
{
return Extents != ExtentsTarget;
}
float AreaTriggerShapeInfo::Polygon::GetMaxSearchRadius() const
{
Position center(0.0f, 0.0f);
@@ -45,16 +55,31 @@ float AreaTriggerShapeInfo::Polygon::GetMaxSearchRadius() const
return maxSearchRadius;
}
bool AreaTriggerShapeInfo::Polygon::IsDynamic() const
{
return Height != HeightTarget || PolygonVertices != PolygonVerticesTarget;
}
float AreaTriggerShapeInfo::Cylinder::GetMaxSearchRadius() const
{
return std::max(Radius, RadiusTarget);
}
bool AreaTriggerShapeInfo::Cylinder::IsDynamic() const
{
return Radius != RadiusTarget || Height != HeightTarget || LocationZOffset != LocationZOffsetTarget;
}
float AreaTriggerShapeInfo::Disk::GetMaxSearchRadius() const
{
return std::max(OuterRadius, OuterRadiusTarget);
}
bool AreaTriggerShapeInfo::Disk::IsDynamic() const
{
return InnerRadius != InnerRadiusTarget || OuterRadius != OuterRadiusTarget || Height != HeightTarget || LocationZOffset != LocationZOffsetTarget;
}
float AreaTriggerShapeInfo::BoundedPlane::GetMaxSearchRadius() const
{
return std::sqrt(std::max(
@@ -62,11 +87,21 @@ float AreaTriggerShapeInfo::BoundedPlane::GetMaxSearchRadius() const
ExtentsTarget.Pos.GetPositionX() * ExtentsTarget.Pos.GetPositionX() / 4 + ExtentsTarget.Pos.GetPositionY() * ExtentsTarget.Pos.GetPositionY() / 4));
}
bool AreaTriggerShapeInfo::BoundedPlane::IsDynamic() const
{
return Extents != ExtentsTarget;
}
float AreaTriggerShapeInfo::GetMaxSearchRadius() const
{
return std::visit([&](auto const& data) { return data.GetMaxSearchRadius(); }, Data);
}
bool AreaTriggerShapeInfo::IsDynamic() const
{
return std::visit([&](auto const& data) { return data.IsDynamic(); }, Data);
}
AreaTriggerTemplate::AreaTriggerTemplate() = default;
AreaTriggerTemplate::~AreaTriggerTemplate() = default;
@@ -61,7 +61,7 @@ enum class AreaTriggerCreatePropertiesFlag : uint32
{
None = 0x00000,
HasAbsoluteOrientation = 0x00001,
HasDynamicShape = 0x00002,
HasDynamicShape = 0x00002, // DEPRECATED
HasAttached = 0x00004, // DEPRECATED
HasFaceMovementDir = 0x00008,
HasFollowsTerrain = 0x00010, // NYI
@@ -106,6 +106,7 @@ struct AreaTriggerShapeInfo
float RadiusTarget;
float GetMaxSearchRadius() const;
bool IsDynamic() const;
};
struct Box
@@ -119,6 +120,7 @@ struct AreaTriggerShapeInfo
TaggedPosition<Position::XYZ> ExtentsTarget;
float GetMaxSearchRadius() const;
bool IsDynamic() const;
};
struct Polygon
@@ -134,6 +136,7 @@ struct AreaTriggerShapeInfo
float HeightTarget;
float GetMaxSearchRadius() const;
bool IsDynamic() const;
};
struct Cylinder
@@ -151,6 +154,7 @@ struct AreaTriggerShapeInfo
float LocationZOffsetTarget;
float GetMaxSearchRadius() const;
bool IsDynamic() const;
};
struct Disk
@@ -172,6 +176,7 @@ struct AreaTriggerShapeInfo
float LocationZOffsetTarget;
float GetMaxSearchRadius() const;
bool IsDynamic() const;
};
struct BoundedPlane
@@ -185,6 +190,7 @@ struct AreaTriggerShapeInfo
TaggedPosition<Position::XY> ExtentsTarget;
float GetMaxSearchRadius() const;
bool IsDynamic() const;
};
std::variant<Sphere, Box, Polygon, Cylinder, Disk, BoundedPlane> Data;
@@ -196,6 +202,7 @@ struct AreaTriggerShapeInfo
bool IsDisk() const { return std::holds_alternative<Disk>(Data); }
bool IsBoundedPlane() const { return std::holds_alternative<BoundedPlane>(Data); }
float GetMaxSearchRadius() const;
bool IsDynamic() const;
};
struct AreaTriggerOrbitInfo