diff options
| author | Shauren <shauren.trinity@gmail.com> | 2021-09-16 22:22:14 +0200 |
|---|---|---|
| committer | Shauren <shauren.trinity@gmail.com> | 2021-09-16 22:22:14 +0200 |
| commit | ee73948a64fc3d767d37cd3cc7f44358c5274b83 (patch) | |
| tree | 9a5bb079ca7b1f1945211a6328fa52fa9f79f8aa /src/server/game/Entities/AreaTrigger | |
| parent | ca67286905aba7614a4a5f9e6f3bb6a0132a49f3 (diff) | |
Core/AreaTriggers: Rename spell_areatrigger* tables to areatrigger_create_properties* according to last MiscValue research for areatrigger effects
* Move areatrigger_template.DataX to areatrigger_create_properties.ShapeDataX
Diffstat (limited to 'src/server/game/Entities/AreaTrigger')
4 files changed, 160 insertions, 158 deletions
diff --git a/src/server/game/Entities/AreaTrigger/AreaTrigger.cpp b/src/server/game/Entities/AreaTrigger/AreaTrigger.cpp index 870bf676b7a..195837c8ebb 100644 --- a/src/server/game/Entities/AreaTrigger/AreaTrigger.cpp +++ b/src/server/game/Entities/AreaTrigger/AreaTrigger.cpp @@ -41,7 +41,7 @@ AreaTrigger::AreaTrigger() : WorldObject(false), MapObject(), _aurEff(nullptr), _maxSearchRadius(0.0f), _duration(0), _totalDuration(0), _timeSinceCreated(0), _previousCheckOrientation(std::numeric_limits<float>::infinity()), _isRemoved(false), _reachedDestination(true), _lastSplineIndex(0), _movementTime(0), - _areaTriggerMiscTemplate(nullptr), _areaTriggerTemplate(nullptr) + _areaTriggerCreateProperties(nullptr), _areaTriggerTemplate(nullptr) { m_objectType |= TYPEMASK_AREATRIGGER; m_objectTypeId = TYPEID_AREATRIGGER; @@ -84,7 +84,7 @@ void AreaTrigger::RemoveFromWorld() } } -bool AreaTrigger::Create(uint32 spellMiscId, Unit* caster, Unit* target, SpellInfo const* spell, Position const& pos, int32 duration, SpellCastVisual spellVisual, ObjectGuid const& castId, AuraEffect const* aurEff) +bool AreaTrigger::Create(uint32 areaTriggerCreatePropertiesId, Unit* caster, Unit* target, SpellInfo const* spell, Position const& pos, int32 duration, SpellCastVisual spellVisual, ObjectGuid const& castId, AuraEffect const* aurEff) { _targetGuid = target ? target->GetGUID() : ObjectGuid::Empty; _aurEff = aurEff; @@ -93,30 +93,30 @@ bool AreaTrigger::Create(uint32 spellMiscId, Unit* caster, Unit* target, SpellIn Relocate(pos); if (!IsPositionValid()) { - TC_LOG_ERROR("entities.areatrigger", "AreaTrigger (spellMiscId %u) not created. Invalid coordinates (X: %f Y: %f)", spellMiscId, GetPositionX(), GetPositionY()); + TC_LOG_ERROR("entities.areatrigger", "AreaTrigger (areaTriggerCreatePropertiesId %u) not created. Invalid coordinates (X: %f Y: %f)", areaTriggerCreatePropertiesId, GetPositionX(), GetPositionY()); return false; } - _areaTriggerMiscTemplate = sAreaTriggerDataStore->GetAreaTriggerMiscTemplate(spellMiscId); - if (!_areaTriggerMiscTemplate) + _areaTriggerCreateProperties = sAreaTriggerDataStore->GetAreaTriggerCreateProperties(areaTriggerCreatePropertiesId); + if (!_areaTriggerCreateProperties) { - TC_LOG_ERROR("entities.areatrigger", "AreaTrigger (spellMiscId %u) not created. Invalid areatrigger miscid (%u)", spellMiscId, spellMiscId); + TC_LOG_ERROR("entities.areatrigger", "AreaTrigger (areaTriggerCreatePropertiesId %u) not created. Invalid areatrigger create properties id (%u)", areaTriggerCreatePropertiesId, areaTriggerCreatePropertiesId); return false; } - _areaTriggerTemplate = _areaTriggerMiscTemplate->Template; + _areaTriggerTemplate = _areaTriggerCreateProperties->Template; - Object::_Create(ObjectGuid::Create<HighGuid::AreaTrigger>(GetMapId(), GetTemplate()->Id.Id, caster->GetMap()->GenerateLowGuid<HighGuid::AreaTrigger>())); + Object::_Create(ObjectGuid::Create<HighGuid::AreaTrigger>(GetMapId(), GetTemplate() ? GetTemplate()->Id.Id : 0, caster->GetMap()->GenerateLowGuid<HighGuid::AreaTrigger>())); + + if (GetTemplate()) + SetEntry(GetTemplate()->Id.Id); - SetEntry(GetTemplate()->Id.Id); SetDuration(duration); SetObjectScale(1.0f); - if (GetTemplate()->IsPolygon()) - _maxSearchRadius = GetMiscTemplate()->GetPolygonMaxSearchRadius(); - else - _maxSearchRadius = GetTemplate()->MaxSearchRadius; + _shape = GetCreateProperties()->Shape; + _maxSearchRadius = GetCreateProperties()->GetMaxSearchRadius(); auto areaTriggerData = m_values.ModifyValue(&AreaTrigger::m_areaTriggerData); SetUpdateFieldValue(areaTriggerData.ModifyValue(&UF::AreaTriggerData::Caster), caster->GetGUID()); @@ -126,51 +126,51 @@ bool AreaTrigger::Create(uint32 spellMiscId, Unit* caster, Unit* target, SpellIn SetUpdateFieldValue(areaTriggerData.ModifyValue(&UF::AreaTriggerData::SpellForVisuals), spell->Id); SetUpdateFieldValue(areaTriggerData.ModifyValue(&UF::AreaTriggerData::SpellVisual).ModifyValue(&UF::SpellCastVisual::SpellXSpellVisualID), spellVisual.SpellXSpellVisualID); SetUpdateFieldValue(areaTriggerData.ModifyValue(&UF::AreaTriggerData::SpellVisual).ModifyValue(&UF::SpellCastVisual::ScriptVisualID), spellVisual.ScriptVisualID); - SetUpdateFieldValue(areaTriggerData.ModifyValue(&UF::AreaTriggerData::TimeToTargetScale), GetMiscTemplate()->TimeToTargetScale != 0 ? GetMiscTemplate()->TimeToTargetScale : *m_areaTriggerData->Duration); + SetUpdateFieldValue(areaTriggerData.ModifyValue(&UF::AreaTriggerData::TimeToTargetScale), GetCreateProperties()->TimeToTargetScale != 0 ? GetCreateProperties()->TimeToTargetScale : *m_areaTriggerData->Duration); SetUpdateFieldValue(areaTriggerData.ModifyValue(&UF::AreaTriggerData::BoundsRadius2D), GetMaxSearchRadius()); - SetUpdateFieldValue(areaTriggerData.ModifyValue(&UF::AreaTriggerData::DecalPropertiesID), GetMiscTemplate()->DecalPropertiesId); + SetUpdateFieldValue(areaTriggerData.ModifyValue(&UF::AreaTriggerData::DecalPropertiesID), GetCreateProperties()->DecalPropertiesId); - if (GetMiscTemplate()->ExtraScale.Data.Structured.StartTimeOffset) - SetUpdateFieldValue(areaTriggerData.ModifyValue(&UF::AreaTriggerData::ExtraScaleCurve).ModifyValue(&UF::ScaleCurve::StartTimeOffset), GetMiscTemplate()->ExtraScale.Data.Structured.StartTimeOffset); - if (GetMiscTemplate()->ExtraScale.Data.Structured.Points[0] || GetMiscTemplate()->ExtraScale.Data.Structured.Points[1]) + if (GetCreateProperties()->ExtraScale.Data.Structured.StartTimeOffset) + SetUpdateFieldValue(areaTriggerData.ModifyValue(&UF::AreaTriggerData::ExtraScaleCurve).ModifyValue(&UF::ScaleCurve::StartTimeOffset), GetCreateProperties()->ExtraScale.Data.Structured.StartTimeOffset); + if (GetCreateProperties()->ExtraScale.Data.Structured.Points[0] || GetCreateProperties()->ExtraScale.Data.Structured.Points[1]) { - Position point(GetMiscTemplate()->ExtraScale.Data.Structured.Points[0], GetMiscTemplate()->ExtraScale.Data.Structured.Points[1]); + Position point(GetCreateProperties()->ExtraScale.Data.Structured.Points[0], GetCreateProperties()->ExtraScale.Data.Structured.Points[1]); SetUpdateFieldValue(areaTriggerData.ModifyValue(&UF::AreaTriggerData::ExtraScaleCurve).ModifyValue(&UF::ScaleCurve::Points, 0), point); } - if (GetMiscTemplate()->ExtraScale.Data.Structured.Points[2] || GetMiscTemplate()->ExtraScale.Data.Structured.Points[3]) + if (GetCreateProperties()->ExtraScale.Data.Structured.Points[2] || GetCreateProperties()->ExtraScale.Data.Structured.Points[3]) { - Position point(GetMiscTemplate()->ExtraScale.Data.Structured.Points[2], GetMiscTemplate()->ExtraScale.Data.Structured.Points[3]); + Position point(GetCreateProperties()->ExtraScale.Data.Structured.Points[2], GetCreateProperties()->ExtraScale.Data.Structured.Points[3]); SetUpdateFieldValue(areaTriggerData.ModifyValue(&UF::AreaTriggerData::ExtraScaleCurve).ModifyValue(&UF::ScaleCurve::Points, 1), point); } - if (GetMiscTemplate()->ExtraScale.Data.Raw[5]) - SetUpdateFieldValue(areaTriggerData.ModifyValue(&UF::AreaTriggerData::ExtraScaleCurve).ModifyValue(&UF::ScaleCurve::ParameterCurve), GetMiscTemplate()->ExtraScale.Data.Raw[5]); - if (GetMiscTemplate()->ExtraScale.Data.Structured.OverrideActive) - SetUpdateFieldValue(areaTriggerData.ModifyValue(&UF::AreaTriggerData::ExtraScaleCurve).ModifyValue(&UF::ScaleCurve::OverrideActive), GetMiscTemplate()->ExtraScale.Data.Structured.OverrideActive); + if (GetCreateProperties()->ExtraScale.Data.Raw[5]) + SetUpdateFieldValue(areaTriggerData.ModifyValue(&UF::AreaTriggerData::ExtraScaleCurve).ModifyValue(&UF::ScaleCurve::ParameterCurve), GetCreateProperties()->ExtraScale.Data.Raw[5]); + if (GetCreateProperties()->ExtraScale.Data.Structured.OverrideActive) + SetUpdateFieldValue(areaTriggerData.ModifyValue(&UF::AreaTriggerData::ExtraScaleCurve).ModifyValue(&UF::ScaleCurve::OverrideActive), GetCreateProperties()->ExtraScale.Data.Structured.OverrideActive); PhasingHandler::InheritPhaseShift(this, caster); - if (target && GetTemplate()->HasFlag(AREATRIGGER_FLAG_HAS_ATTACHED)) + if (target && GetTemplate() && GetTemplate()->HasFlag(AREATRIGGER_FLAG_HAS_ATTACHED)) { m_movementInfo.transport.guid = target->GetGUID(); } UpdateShape(); - uint32 timeToTarget = GetMiscTemplate()->TimeToTarget != 0 ? GetMiscTemplate()->TimeToTarget : *m_areaTriggerData->Duration; + uint32 timeToTarget = GetCreateProperties()->TimeToTarget != 0 ? GetCreateProperties()->TimeToTarget : *m_areaTriggerData->Duration; - if (GetTemplate()->HasFlag(AREATRIGGER_FLAG_HAS_CIRCULAR_MOVEMENT)) + if (GetCreateProperties()->OrbitInfo) { - AreaTriggerOrbitInfo cmi = GetMiscTemplate()->OrbitInfo; - if (target && GetTemplate()->HasFlag(AREATRIGGER_FLAG_HAS_ATTACHED)) - cmi.PathTarget = target->GetGUID(); + AreaTriggerOrbitInfo orbit = *GetCreateProperties()->OrbitInfo; + if (target && GetTemplate() && GetTemplate()->HasFlag(AREATRIGGER_FLAG_HAS_ATTACHED)) + orbit.PathTarget = target->GetGUID(); else - cmi.Center = pos; + orbit.Center = pos; - InitOrbit(cmi, timeToTarget); + InitOrbit(orbit, timeToTarget); } - else if (GetMiscTemplate()->HasSplines()) + else if (GetCreateProperties()->HasSplines()) { - InitSplineOffsets(GetMiscTemplate()->SplinePoints, timeToTarget); + InitSplineOffsets(GetCreateProperties()->SplinePoints, timeToTarget); } // movement on transport of areatriggers on unit is handled by themself @@ -207,10 +207,10 @@ bool AreaTrigger::Create(uint32 spellMiscId, Unit* caster, Unit* target, SpellIn return true; } -AreaTrigger* 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*/) +AreaTrigger* AreaTrigger::CreateAreaTrigger(uint32 areaTriggerCreatePropertiesId, Unit* caster, Unit* target, SpellInfo const* spell, Position const& pos, int32 duration, SpellCastVisual spellVisual, ObjectGuid const& castId /*= ObjectGuid::Empty*/, AuraEffect const* aurEff /*= nullptr*/) { AreaTrigger* at = new AreaTrigger(); - if (!at->Create(spellMiscId, caster, target, spell, pos, duration, spellVisual, castId, aurEff)) + if (!at->Create(areaTriggerCreatePropertiesId, caster, target, spell, pos, duration, spellVisual, castId, aurEff)) { delete at; return nullptr; @@ -251,6 +251,9 @@ bool AreaTrigger::CreateServer(Map* map, AreaTriggerTemplate const* areaTriggerT SetObjectScale(1.0f); + _shape = position.Shape; + _maxSearchRadius = _shape.GetMaxSearchRadius(); + if (position.PhaseUseFlags || position.PhaseId || position.PhaseGroup) PhasingHandler::InitDbPhaseShift(GetPhaseShift(), position.PhaseUseFlags, position.PhaseId, position.PhaseGroup); @@ -275,7 +278,7 @@ void AreaTrigger::Update(uint32 diff) { UpdateOrbitPosition(diff); } - else if (GetTemplate()->HasFlag(AREATRIGGER_FLAG_HAS_ATTACHED)) + else if (GetTemplate() && GetTemplate()->HasFlag(AREATRIGGER_FLAG_HAS_ATTACHED)) { if (Unit* target = GetTarget()) GetMap()->AreaTriggerRelocation(this, target->GetPositionX(), target->GetPositionY(), target->GetPositionZ(), target->GetOrientation()); @@ -338,7 +341,7 @@ void AreaTrigger::UpdateTargetList() { std::vector<Unit*> targetList; - switch (GetTemplate()->Type) + switch (_shape.Type) { case AREATRIGGER_TYPE_SPHERE: SearchUnitInSphere(targetList); @@ -376,14 +379,14 @@ void AreaTrigger::SearchUnits(std::vector<Unit*>& targetList, float radius, bool void AreaTrigger::SearchUnitInSphere(std::vector<Unit*>& targetList) { - float radius = GetTemplate()->SphereDatas.Radius; - if (GetTemplate()->HasFlag(AREATRIGGER_FLAG_HAS_DYNAMIC_SHAPE)) + float radius = _shape.SphereDatas.Radius; + if (GetTemplate() && GetTemplate()->HasFlag(AREATRIGGER_FLAG_HAS_DYNAMIC_SHAPE)) { - if (GetMiscTemplate()->MorphCurveId) + if (GetCreateProperties()->MorphCurveId) { - radius = G3D::lerp(GetTemplate()->SphereDatas.Radius, - GetTemplate()->SphereDatas.RadiusTarget, - sDB2Manager.GetCurveValueAt(GetMiscTemplate()->MorphCurveId, GetProgress())); + radius = G3D::lerp(_shape.SphereDatas.Radius, + _shape.SphereDatas.RadiusTarget, + sDB2Manager.GetCurveValueAt(GetCreateProperties()->MorphCurveId, GetProgress())); } } @@ -395,9 +398,9 @@ void AreaTrigger::SearchUnitInBox(std::vector<Unit*>& targetList) SearchUnits(targetList, GetMaxSearchRadius(), false); Position const& boxCenter = GetPosition(); - float extentsX = GetTemplate()->BoxDatas.Extents[0]; - float extentsY = GetTemplate()->BoxDatas.Extents[1]; - float extentsZ = GetTemplate()->BoxDatas.Extents[2]; + float extentsX = _shape.BoxDatas.Extents[0]; + float extentsY = _shape.BoxDatas.Extents[1]; + float extentsZ = _shape.BoxDatas.Extents[2]; targetList.erase(std::remove_if(targetList.begin(), targetList.end(), [boxCenter, extentsX, extentsY, extentsZ](Unit* unit) -> bool { @@ -409,7 +412,7 @@ void AreaTrigger::SearchUnitInPolygon(std::vector<Unit*>& targetList) { SearchUnits(targetList, GetMaxSearchRadius(), false); - float height = GetTemplate()->PolygonDatas.Height; + float height = _shape.PolygonDatas.Height; float minZ = GetPositionZ() - height; float maxZ = GetPositionZ() + height; @@ -425,7 +428,7 @@ void AreaTrigger::SearchUnitInCylinder(std::vector<Unit*>& targetList) { SearchUnits(targetList, GetMaxSearchRadius(), false); - float height = GetTemplate()->CylinderDatas.Height; + float height = _shape.CylinderDatas.Height; float minZ = GetPositionZ() - height; float maxZ = GetPositionZ() + height; @@ -456,7 +459,7 @@ void AreaTrigger::HandleUnitEnterExit(std::vector<Unit*> const& newTargetList) if (Player* player = unit->ToPlayer()) { if (player->isDebugAreaTriggers) - ChatHandler(player->GetSession()).PSendSysMessage(LANG_DEBUG_AREATRIGGER_ENTERED, GetTemplate()->Id.Id); + ChatHandler(player->GetSession()).PSendSysMessage(LANG_DEBUG_AREATRIGGER_ENTERED, GetEntry()); player->UpdateQuestObjectiveProgress(QUEST_OBJECTIVE_AREA_TRIGGER_ENTER, GetEntry(), 1); } @@ -473,7 +476,7 @@ void AreaTrigger::HandleUnitEnterExit(std::vector<Unit*> const& newTargetList) if (Player* player = leavingUnit->ToPlayer()) { if (player->isDebugAreaTriggers) - ChatHandler(player->GetSession()).PSendSysMessage(LANG_DEBUG_AREATRIGGER_LEFT, GetTemplate()->Id.Id); + ChatHandler(player->GetSession()).PSendSysMessage(LANG_DEBUG_AREATRIGGER_LEFT, GetEntry()); player->UpdateQuestObjectiveProgress(QUEST_OBJECTIVE_AREA_TRIGGER_EXIT, GetEntry(), 1); } @@ -492,7 +495,7 @@ AreaTriggerTemplate const* AreaTrigger::GetTemplate() const uint32 AreaTrigger::GetScriptId() const { - return GetTemplate()->ScriptId; + return GetTemplate() ? GetTemplate()->ScriptId : 0; } Unit* AreaTrigger::GetCaster() const @@ -521,7 +524,7 @@ void AreaTrigger::UpdatePolygonOrientation() if (G3D::fuzzyEq(_previousCheckOrientation, newOrientation)) return; - _polygonVertices.assign(GetMiscTemplate()->PolygonVertices.begin(), GetMiscTemplate()->PolygonVertices.end()); + _polygonVertices.assign(GetCreateProperties()->PolygonVertices.begin(), GetCreateProperties()->PolygonVertices.end()); float angleSin = std::sin(newOrientation); float angleCos = std::cos(newOrientation); @@ -608,7 +611,7 @@ bool AreaTrigger::CheckIsInPolygon2D(Position const* pos) const void AreaTrigger::UpdateShape() { - if (GetTemplate()->IsPolygon()) + if (_shape.IsPolygon()) UpdatePolygonOrientation(); } @@ -648,7 +651,7 @@ void AreaTrigger::DoActions(Unit* unit) { Unit* caster = IsServerSide() ? unit : GetCaster(); - if (caster) + if (caster && GetTemplate()) { for (AreaTriggerAction const& action : GetTemplate()->Actions) { @@ -679,9 +682,10 @@ void AreaTrigger::DoActions(Unit* unit) void AreaTrigger::UndoActions(Unit* unit) { - for (AreaTriggerAction const& action : GetTemplate()->Actions) - if (action.ActionType == AREATRIGGER_ACTION_CAST || action.ActionType == AREATRIGGER_ACTION_ADDAURA) - unit->RemoveAurasDueToSpell(action.Param, GetCasterGuid()); + if (GetTemplate()) + for (AreaTriggerAction const& action : GetTemplate()->Actions) + if (action.ActionType == AREATRIGGER_ACTION_CAST || action.ActionType == AREATRIGGER_ACTION_ADDAURA) + unit->RemoveAurasDueToSpell(action.Param, GetCasterGuid()); } void AreaTrigger::InitSplineOffsets(std::vector<Position> const& offsets, uint32 timeToTarget) @@ -753,10 +757,10 @@ bool AreaTrigger::HasSplines() const return bool(_spline); } -void AreaTrigger::InitOrbit(AreaTriggerOrbitInfo const& cmi, uint32 timeToTarget) +void AreaTrigger::InitOrbit(AreaTriggerOrbitInfo const& orbit, uint32 timeToTarget) { // Circular movement requires either a center position or an attached unit - ASSERT(cmi.Center.is_initialized() || cmi.PathTarget.is_initialized()); + ASSERT(orbit.Center.is_initialized() || orbit.PathTarget.is_initialized()); // should be sent in object create packets only DoWithSuppressingObjectUpdates([&]() @@ -765,7 +769,7 @@ void AreaTrigger::InitOrbit(AreaTriggerOrbitInfo const& cmi, uint32 timeToTarget const_cast<UF::AreaTriggerData&>(*m_areaTriggerData).ClearChanged(&UF::AreaTriggerData::TimeToTarget); }); - _orbitInfo = cmi; + _orbitInfo = orbit; _orbitInfo->TimeToTarget = timeToTarget; _orbitInfo->ElapsedTimeForMovement = 0; @@ -883,13 +887,13 @@ void AreaTrigger::UpdateSplinePosition(uint32 diff) if (currentTimePercent <= 0.f) return; - if (GetMiscTemplate()->MoveCurveId) + if (GetCreateProperties()->MoveCurveId) { - float progress = sDB2Manager.GetCurveValueAt(GetMiscTemplate()->MoveCurveId, currentTimePercent); + float progress = sDB2Manager.GetCurveValueAt(GetCreateProperties()->MoveCurveId, currentTimePercent); if (progress < 0.f || progress > 1.f) { - TC_LOG_ERROR("entities.areatrigger", "AreaTrigger (Id: %u, SpellMiscId: %u) has wrong progress (%f) caused by curve calculation (MoveCurveId: %u)", - GetTemplate()->Id.Id, GetMiscTemplate()->MiscId, progress, GetMiscTemplate()->MorphCurveId); + TC_LOG_ERROR("entities.areatrigger", "AreaTrigger (Id: %u, AreaTriggerCreatePropertiesId: %u) has wrong progress (%f) caused by curve calculation (MoveCurveId: %u)", + GetEntry(), GetCreateProperties()->Id, progress, GetCreateProperties()->MorphCurveId); } else currentTimePercent = progress; @@ -903,7 +907,7 @@ void AreaTrigger::UpdateSplinePosition(uint32 diff) _spline->evaluate_percent(lastPositionIndex, percentFromLastPoint, currentPosition); float orientation = GetOrientation(); - if (GetTemplate()->HasFlag(AREATRIGGER_FLAG_HAS_FACE_MOVEMENT_DIR)) + if (GetTemplate() && GetTemplate()->HasFlag(AREATRIGGER_FLAG_HAS_FACE_MOVEMENT_DIR)) { G3D::Vector3 const& nextPoint = _spline->getPoint(lastPositionIndex + 1); orientation = GetAngle(nextPoint.x, nextPoint.y); diff --git a/src/server/game/Entities/AreaTrigger/AreaTrigger.h b/src/server/game/Entities/AreaTrigger/AreaTrigger.h index 5e60736be94..f6bdaf8f583 100644 --- a/src/server/game/Entities/AreaTrigger/AreaTrigger.h +++ b/src/server/game/Entities/AreaTrigger/AreaTrigger.h @@ -66,11 +66,11 @@ class TC_GAME_API AreaTrigger : public WorldObject, public GridObject<AreaTrigge 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 Create(uint32 areaTriggerCreatePropertiesId, 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, AreaTriggerSpawn 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); + static AreaTrigger* CreateAreaTrigger(uint32 areaTriggerCreatePropertiesId, Unit* caster, Unit* target, SpellInfo const* spell, Position const& pos, int32 duration, SpellCastVisual spellVisual, ObjectGuid const& castId = ObjectGuid::Empty, AuraEffect const* aurEff = nullptr); bool LoadFromDB(ObjectGuid::LowType spawnId, Map* map, bool addToMap, bool allowDuplicate); void Update(uint32 diff) override; @@ -88,7 +88,7 @@ class TC_GAME_API AreaTrigger : public WorldObject, public GridObject<AreaTrigge GuidUnorderedSet const& GetInsideUnits() const { return _insideUnits; } - AreaTriggerMiscTemplate const* GetMiscTemplate() const { return _areaTriggerMiscTemplate; } + AreaTriggerCreateProperties const* GetCreateProperties() const { return _areaTriggerCreateProperties; } AreaTriggerTemplate const* GetTemplate() const; uint32 GetScriptId() const; @@ -99,6 +99,7 @@ class TC_GAME_API AreaTrigger : public WorldObject, public GridObject<AreaTrigge uint32 GetFaction() const override; + AreaTriggerShapeInfo const& GetShape() const { return _shape; } float GetMaxSearchRadius() const { return _maxSearchRadius; } Position const& GetRollPitchYaw() const { return _rollPitchYaw; } Position const& GetTargetRollPitchYaw() const { return _targetRollPitchYaw; } @@ -108,7 +109,7 @@ 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 InitOrbit(AreaTriggerOrbitInfo const& cmi, uint32 timeToTarget); + void InitOrbit(AreaTriggerOrbitInfo const& orbit, uint32 timeToTarget); bool HasOrbit() const; Optional<AreaTriggerOrbitInfo> const& GetCircularMovementInfo() const { return _orbitInfo; } @@ -145,6 +146,7 @@ class TC_GAME_API AreaTrigger : public WorldObject, public GridObject<AreaTrigge AuraEffect const* _aurEff; + AreaTriggerShapeInfo _shape; float _maxSearchRadius; int32 _duration; int32 _totalDuration; @@ -163,7 +165,7 @@ class TC_GAME_API AreaTrigger : public WorldObject, public GridObject<AreaTrigge Optional<AreaTriggerOrbitInfo> _orbitInfo; - AreaTriggerMiscTemplate const* _areaTriggerMiscTemplate; + AreaTriggerCreateProperties const* _areaTriggerCreateProperties; AreaTriggerTemplate const* _areaTriggerTemplate; GuidUnorderedSet _insideUnits; diff --git a/src/server/game/Entities/AreaTrigger/AreaTriggerTemplate.cpp b/src/server/game/Entities/AreaTrigger/AreaTriggerTemplate.cpp index 4095037dece..4458af15997 100644 --- a/src/server/game/Entities/AreaTrigger/AreaTriggerTemplate.cpp +++ b/src/server/game/Entities/AreaTrigger/AreaTriggerTemplate.cpp @@ -26,58 +26,43 @@ AreaTriggerScaleInfo::AreaTriggerScaleInfo() memset(Data.Raw, 0, sizeof(Data.Raw)); } -AreaTriggerTemplate::AreaTriggerTemplate() +AreaTriggerShapeInfo::AreaTriggerShapeInfo() { - Id = { 0, false }; Type = AREATRIGGER_TYPE_MAX; - Flags = 0; - ScriptId = 0; - MaxSearchRadius = 0.0f; - memset(DefaultDatas.Data, 0, sizeof(DefaultDatas.Data)); } -AreaTriggerTemplate::~AreaTriggerTemplate() -{ -} - -// Init the MaxSearchRadius that will be used in TrinitySearcher, avoiding calculate it at each update -void AreaTriggerTemplate::InitMaxSearchRadius() +float AreaTriggerShapeInfo::GetMaxSearchRadius() const { switch (Type) { case AREATRIGGER_TYPE_SPHERE: - { - MaxSearchRadius = std::max(SphereDatas.Radius, SphereDatas.RadiusTarget); - break; - } + return std::max(SphereDatas.Radius, SphereDatas.RadiusTarget); case AREATRIGGER_TYPE_BOX: - { - MaxSearchRadius = std::sqrt(BoxDatas.Extents[0] * BoxDatas.Extents[0] / 4 + BoxDatas.Extents[1] * BoxDatas.Extents[1] / 4); - break; - } - // Polygon is SpellMisc based, can't init MaxSearchRadius - case AREATRIGGER_TYPE_POLYGON: - { - if (PolygonDatas.Height <= 0.0f) - PolygonDatas.Height = 1.0f; - - break; - } + return std::sqrt(BoxDatas.Extents[0] * BoxDatas.Extents[0] / 4 + BoxDatas.Extents[1] * BoxDatas.Extents[1] / 4); case AREATRIGGER_TYPE_CYLINDER: - { - MaxSearchRadius = CylinderDatas.Radius; - break; - } + return CylinderDatas.Radius; default: break; } + + return 0.0f; } -AreaTriggerMiscTemplate::AreaTriggerMiscTemplate() +AreaTriggerTemplate::AreaTriggerTemplate() { - MiscId = 0; - AreaTriggerEntry = 0; + Id = { 0, false }; + Flags = 0; + ScriptId = 0; +} + +AreaTriggerTemplate::~AreaTriggerTemplate() +{ +} + +AreaTriggerCreateProperties::AreaTriggerCreateProperties() +{ + Id = 0; MoveCurveId = 0; ScaleCurveId = 0; @@ -102,27 +87,32 @@ AreaTriggerMiscTemplate::AreaTriggerMiscTemplate() Template = nullptr; } -AreaTriggerMiscTemplate::~AreaTriggerMiscTemplate() +AreaTriggerCreateProperties::~AreaTriggerCreateProperties() { } -bool AreaTriggerMiscTemplate::HasSplines() const +bool AreaTriggerCreateProperties::HasSplines() const { return SplinePoints.size() >= 2; } -float AreaTriggerMiscTemplate::GetPolygonMaxSearchRadius() const +float AreaTriggerCreateProperties::GetMaxSearchRadius() const { - Position center(0.0f, 0.0f); - float maxSearchRadius = 0.0f; - - for (TaggedPosition<Position::XY> const& vertice : PolygonVertices) + if (Shape.Type == AREATRIGGER_TYPE_POLYGON) { - float pointDist = center.GetExactDist2d(vertice); + Position center(0.0f, 0.0f); + float maxSearchRadius = 0.0f; + + for (TaggedPosition<Position::XY> const& vertice : PolygonVertices) + { + float pointDist = center.GetExactDist2d(vertice); + + if (pointDist > maxSearchRadius) + maxSearchRadius = pointDist; + } - if (pointDist > maxSearchRadius) - maxSearchRadius = pointDist; + return maxSearchRadius; } - return maxSearchRadius; + return Shape.GetMaxSearchRadius(); } diff --git a/src/server/game/Entities/AreaTrigger/AreaTriggerTemplate.h b/src/server/game/Entities/AreaTrigger/AreaTriggerTemplate.h index 9de9356f273..73abbbcc21b 100644 --- a/src/server/game/Entities/AreaTrigger/AreaTriggerTemplate.h +++ b/src/server/game/Entities/AreaTrigger/AreaTriggerTemplate.h @@ -36,10 +36,10 @@ enum AreaTriggerFlags AREATRIGGER_FLAG_HAS_FOLLOWS_TERRAIN = 0x00010, // NYI AREATRIGGER_FLAG_UNK1 = 0x00020, AREATRIGGER_FLAG_HAS_TARGET_ROLL_PITCH_YAW = 0x00040, // NYI - AREATRIGGER_FLAG_HAS_ANIM_ID = 0x00080, + AREATRIGGER_FLAG_HAS_ANIM_ID = 0x00080, // DEPRECATED AREATRIGGER_FLAG_UNK3 = 0x00100, - AREATRIGGER_FLAG_HAS_ANIM_KIT_ID = 0x00200, - AREATRIGGER_FLAG_HAS_CIRCULAR_MOVEMENT = 0x00400, + AREATRIGGER_FLAG_HAS_ANIM_KIT_ID = 0x00200, // DEPRECATED + AREATRIGGER_FLAG_HAS_CIRCULAR_MOVEMENT = 0x00400, // DEPRECATED AREATRIGGER_FLAG_UNK5 = 0x00800, }; @@ -115,42 +115,17 @@ struct AreaTriggerScaleInfo } Data; }; -struct AreaTriggerOrbitInfo -{ - Optional<ObjectGuid> PathTarget; - 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 +struct AreaTriggerShapeInfo { -public: - AreaTriggerTemplate(); - ~AreaTriggerTemplate(); - - bool HasFlag(uint32 flag) const { return (Flags & flag) != 0; } + AreaTriggerShapeInfo(); bool IsSphere() const { return Type == AREATRIGGER_TYPE_SPHERE; } bool IsBox() const { return Type == AREATRIGGER_TYPE_BOX; } bool IsPolygon() const { return Type == AREATRIGGER_TYPE_POLYGON; } bool IsCylinder() const { return Type == AREATRIGGER_TYPE_CYLINDER; } + float GetMaxSearchRadius() const; - void InitMaxSearchRadius(); - - AreaTriggerId Id; AreaTriggerTypes Type; - uint32 Flags; - uint32 ScriptId; - float MaxSearchRadius; - std::vector<AreaTriggerAction> Actions; union { @@ -193,17 +168,46 @@ public: }; }; -class AreaTriggerMiscTemplate +struct AreaTriggerOrbitInfo +{ + Optional<ObjectGuid> PathTarget; + 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: + AreaTriggerTemplate(); + ~AreaTriggerTemplate(); + + bool HasFlag(uint32 flag) const { return (Flags & flag) != 0; } + + AreaTriggerId Id; + uint32 Flags; + uint32 ScriptId; + std::vector<AreaTriggerAction> Actions; +}; + +class AreaTriggerCreateProperties { public: - AreaTriggerMiscTemplate(); - ~AreaTriggerMiscTemplate(); + AreaTriggerCreateProperties(); + ~AreaTriggerCreateProperties(); bool HasSplines() const; - float GetPolygonMaxSearchRadius() const; + float GetMaxSearchRadius() const; - uint32 MiscId; - uint32 AreaTriggerEntry; + uint32 Id; + AreaTriggerTemplate const* Template; uint32 MoveCurveId; uint32 ScaleCurveId; @@ -220,13 +224,13 @@ public: AreaTriggerScaleInfo OverrideScale; AreaTriggerScaleInfo ExtraScale; - AreaTriggerOrbitInfo OrbitInfo; - - AreaTriggerTemplate const* Template; + AreaTriggerShapeInfo Shape; std::vector<TaggedPosition<Position::XY>> PolygonVertices; std::vector<TaggedPosition<Position::XY>> PolygonVerticesTarget; + std::vector<Position> SplinePoints; + Optional<AreaTriggerOrbitInfo> OrbitInfo; }; struct AreaTriggerSpawn @@ -237,6 +241,8 @@ struct AreaTriggerSpawn uint32 PhaseId = 0; uint32 PhaseGroup = 0; uint8 PhaseUseFlags = 0; + + AreaTriggerShapeInfo Shape; }; #endif |
