mirror of
https://github.com/TrinityCore/TrinityCore.git
synced 2026-01-20 09:17:36 +01:00
Core/AreaTrigger Switch polygon vertices from Template to SpellMisc (#26827)
This commit is contained in:
18
sql/updates/world/master/2021_09_12_01_world.sql
Normal file
18
sql/updates/world/master/2021_09_12_01_world.sql
Normal file
@@ -0,0 +1,18 @@
|
||||
DROP TABLE IF EXISTS `spell_areatrigger_vertices`;
|
||||
CREATE TABLE `spell_areatrigger_vertices` (
|
||||
`SpellMiscId` int(10) unsigned NOT NULL,
|
||||
`Idx` int(10) unsigned NOT NULL,
|
||||
`VerticeX` float NOT NULL DEFAULT '0',
|
||||
`VerticeY` float NOT NULL DEFAULT '0',
|
||||
`VerticeTargetX` float DEFAULT NULL,
|
||||
`VerticeTargetY` float DEFAULT NULL,
|
||||
`VerifiedBuild` int(10) unsigned NOT NULL DEFAULT '0',
|
||||
PRIMARY KEY (`SpellMiscId`,`Idx`)
|
||||
) ENGINE=MyISAM DEFAULT CHARSET=utf8;
|
||||
|
||||
INSERT INTO `spell_areatrigger_vertices`
|
||||
SELECT `sa`.`SpellMiscId`,`atpv`.`Idx`,`atpv`.`VerticeX`,`atpv`.`VerticeY`,`atpv`.`VerticeTargetX`,`atpv`.`VerticeTargetY`,`atpv`.`VerifiedBuild`
|
||||
FROM `spell_areatrigger` `sa`
|
||||
INNER JOIN `areatrigger_template_polygon_vertices` `atpv` ON `sa`.`AreaTriggerId`=`atpv`.`AreaTriggerId`;
|
||||
|
||||
DROP TABLE `areatrigger_template_polygon_vertices`;
|
||||
@@ -38,7 +38,7 @@
|
||||
#include "Unit.h"
|
||||
#include "UpdateData.h"
|
||||
|
||||
AreaTrigger::AreaTrigger() : WorldObject(false), MapObject(), _aurEff(nullptr),
|
||||
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)
|
||||
@@ -113,6 +113,11 @@ bool AreaTrigger::Create(uint32 spellMiscId, Unit* caster, Unit* target, SpellIn
|
||||
|
||||
SetObjectScale(1.0f);
|
||||
|
||||
if (GetTemplate()->IsPolygon())
|
||||
_maxSearchRadius = GetMiscTemplate()->GetPolygonMaxSearchRadius();
|
||||
else
|
||||
_maxSearchRadius = GetTemplate()->MaxSearchRadius;
|
||||
|
||||
auto areaTriggerData = m_values.ModifyValue(&AreaTrigger::m_areaTriggerData);
|
||||
SetUpdateFieldValue(areaTriggerData.ModifyValue(&UF::AreaTriggerData::Caster), caster->GetGUID());
|
||||
SetUpdateFieldValue(areaTriggerData.ModifyValue(&UF::AreaTriggerData::CreatingEffectGUID), castId);
|
||||
@@ -122,7 +127,7 @@ bool AreaTrigger::Create(uint32 spellMiscId, Unit* caster, Unit* target, SpellIn
|
||||
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::BoundsRadius2D), GetTemplate()->MaxSearchRadius);
|
||||
SetUpdateFieldValue(areaTriggerData.ModifyValue(&UF::AreaTriggerData::BoundsRadius2D), GetMaxSearchRadius());
|
||||
SetUpdateFieldValue(areaTriggerData.ModifyValue(&UF::AreaTriggerData::DecalPropertiesID), GetMiscTemplate()->DecalPropertiesId);
|
||||
|
||||
if (GetMiscTemplate()->ExtraScale.Data.Structured.StartTimeOffset)
|
||||
@@ -360,12 +365,12 @@ void AreaTrigger::SearchUnits(std::vector<Unit*>& targetList, float radius, bool
|
||||
if (IsServerSide())
|
||||
{
|
||||
Trinity::PlayerListSearcher<Trinity::AnyUnitInObjectRangeCheck> searcher(this, targetList, check);
|
||||
Cell::VisitWorldObjects(this, searcher, GetTemplate()->MaxSearchRadius);
|
||||
Cell::VisitWorldObjects(this, searcher, GetMaxSearchRadius());
|
||||
}
|
||||
else
|
||||
{
|
||||
Trinity::UnitListSearcher<Trinity::AnyUnitInObjectRangeCheck> searcher(this, targetList, check);
|
||||
Cell::VisitAllObjects(this, searcher, GetTemplate()->MaxSearchRadius);
|
||||
Cell::VisitAllObjects(this, searcher, GetMaxSearchRadius());
|
||||
}
|
||||
}
|
||||
|
||||
@@ -387,7 +392,7 @@ void AreaTrigger::SearchUnitInSphere(std::vector<Unit*>& targetList)
|
||||
|
||||
void AreaTrigger::SearchUnitInBox(std::vector<Unit*>& targetList)
|
||||
{
|
||||
SearchUnits(targetList, GetTemplate()->MaxSearchRadius, false);
|
||||
SearchUnits(targetList, GetMaxSearchRadius(), false);
|
||||
|
||||
Position const& boxCenter = GetPosition();
|
||||
float extentsX = GetTemplate()->BoxDatas.Extents[0];
|
||||
@@ -402,7 +407,7 @@ void AreaTrigger::SearchUnitInBox(std::vector<Unit*>& targetList)
|
||||
|
||||
void AreaTrigger::SearchUnitInPolygon(std::vector<Unit*>& targetList)
|
||||
{
|
||||
SearchUnits(targetList, GetTemplate()->MaxSearchRadius, false);
|
||||
SearchUnits(targetList, GetMaxSearchRadius(), false);
|
||||
|
||||
float height = GetTemplate()->PolygonDatas.Height;
|
||||
float minZ = GetPositionZ() - height;
|
||||
@@ -418,7 +423,7 @@ void AreaTrigger::SearchUnitInPolygon(std::vector<Unit*>& targetList)
|
||||
|
||||
void AreaTrigger::SearchUnitInCylinder(std::vector<Unit*>& targetList)
|
||||
{
|
||||
SearchUnits(targetList, GetTemplate()->MaxSearchRadius, false);
|
||||
SearchUnits(targetList, GetMaxSearchRadius(), false);
|
||||
|
||||
float height = GetTemplate()->CylinderDatas.Height;
|
||||
float minZ = GetPositionZ() - height;
|
||||
@@ -516,7 +521,7 @@ void AreaTrigger::UpdatePolygonOrientation()
|
||||
if (G3D::fuzzyEq(_previousCheckOrientation, newOrientation))
|
||||
return;
|
||||
|
||||
_polygonVertices.assign(GetTemplate()->PolygonVertices.begin(), GetTemplate()->PolygonVertices.end());
|
||||
_polygonVertices.assign(GetMiscTemplate()->PolygonVertices.begin(), GetMiscTemplate()->PolygonVertices.end());
|
||||
|
||||
float angleSin = std::sin(newOrientation);
|
||||
float angleCos = std::cos(newOrientation);
|
||||
|
||||
@@ -99,6 +99,7 @@ class TC_GAME_API AreaTrigger : public WorldObject, public GridObject<AreaTrigge
|
||||
|
||||
uint32 GetFaction() const override;
|
||||
|
||||
float GetMaxSearchRadius() const { return _maxSearchRadius; }
|
||||
Position const& GetRollPitchYaw() const { return _rollPitchYaw; }
|
||||
Position const& GetTargetRollPitchYaw() const { return _targetRollPitchYaw; }
|
||||
void InitSplineOffsets(std::vector<Position> const& offsets, uint32 timeToTarget);
|
||||
@@ -144,6 +145,7 @@ class TC_GAME_API AreaTrigger : public WorldObject, public GridObject<AreaTrigge
|
||||
|
||||
AuraEffect const* _aurEff;
|
||||
|
||||
float _maxSearchRadius;
|
||||
int32 _duration;
|
||||
int32 _totalDuration;
|
||||
uint32 _timeSinceCreated;
|
||||
|
||||
@@ -56,20 +56,12 @@ void AreaTriggerTemplate::InitMaxSearchRadius()
|
||||
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;
|
||||
|
||||
Position center(0.0f, 0.0f);
|
||||
for (TaggedPosition<Position::XY> const& vertice : PolygonVertices)
|
||||
{
|
||||
float pointDist = center.GetExactDist2d(vertice);
|
||||
|
||||
if (pointDist > MaxSearchRadius)
|
||||
MaxSearchRadius = pointDist;
|
||||
}
|
||||
|
||||
break;
|
||||
}
|
||||
case AREATRIGGER_TYPE_CYLINDER:
|
||||
@@ -118,3 +110,19 @@ bool AreaTriggerMiscTemplate::HasSplines() const
|
||||
{
|
||||
return SplinePoints.size() >= 2;
|
||||
}
|
||||
|
||||
float AreaTriggerMiscTemplate::GetPolygonMaxSearchRadius() const
|
||||
{
|
||||
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;
|
||||
}
|
||||
|
||||
return maxSearchRadius;
|
||||
}
|
||||
|
||||
@@ -150,8 +150,6 @@ public:
|
||||
uint32 Flags;
|
||||
uint32 ScriptId;
|
||||
float MaxSearchRadius;
|
||||
std::vector<TaggedPosition<Position::XY>> PolygonVertices;
|
||||
std::vector<TaggedPosition<Position::XY>> PolygonVerticesTarget;
|
||||
std::vector<AreaTriggerAction> Actions;
|
||||
|
||||
union
|
||||
@@ -201,7 +199,8 @@ public:
|
||||
AreaTriggerMiscTemplate();
|
||||
~AreaTriggerMiscTemplate();
|
||||
|
||||
bool HasSplines() const;
|
||||
bool HasSplines() const;
|
||||
float GetPolygonMaxSearchRadius() const;
|
||||
|
||||
uint32 MiscId;
|
||||
uint32 AreaTriggerEntry;
|
||||
@@ -224,6 +223,9 @@ public:
|
||||
AreaTriggerOrbitInfo OrbitInfo;
|
||||
|
||||
AreaTriggerTemplate const* Template;
|
||||
|
||||
std::vector<TaggedPosition<Position::XY>> PolygonVertices;
|
||||
std::vector<TaggedPosition<Position::XY>> PolygonVerticesTarget;
|
||||
std::vector<Position> SplinePoints;
|
||||
};
|
||||
|
||||
|
||||
@@ -564,15 +564,15 @@ void Object::BuildMovementUpdate(ByteBuffer* data, CreateObjectBits flags) const
|
||||
|
||||
if (hasAreaTriggerPolygon)
|
||||
{
|
||||
*data << int32(areaTriggerTemplate->PolygonVertices.size());
|
||||
*data << int32(areaTriggerTemplate->PolygonVerticesTarget.size());
|
||||
*data << int32(areaTriggerMiscTemplate->PolygonVertices.size());
|
||||
*data << int32(areaTriggerMiscTemplate->PolygonVerticesTarget.size());
|
||||
*data << float(areaTriggerTemplate->PolygonDatas.Height);
|
||||
*data << float(areaTriggerTemplate->PolygonDatas.HeightTarget);
|
||||
|
||||
for (TaggedPosition<Position::XY> const& vertice : areaTriggerTemplate->PolygonVertices)
|
||||
for (TaggedPosition<Position::XY> const& vertice : areaTriggerMiscTemplate->PolygonVertices)
|
||||
*data << vertice;
|
||||
|
||||
for (TaggedPosition<Position::XY> const& vertice : areaTriggerTemplate->PolygonVerticesTarget)
|
||||
for (TaggedPosition<Position::XY> const& vertice : areaTriggerMiscTemplate->PolygonVerticesTarget)
|
||||
*data << vertice;
|
||||
}
|
||||
|
||||
|
||||
@@ -58,8 +58,8 @@ namespace
|
||||
void AreaTriggerDataStore::LoadAreaTriggerTemplates()
|
||||
{
|
||||
uint32 oldMSTime = getMSTime();
|
||||
std::unordered_map<uint32, std::vector<TaggedPosition<Position::XY>>> verticesByAreaTrigger;
|
||||
std::unordered_map<uint32, std::vector<TaggedPosition<Position::XY>>> verticesTargetByAreaTrigger;
|
||||
std::unordered_map<uint32, std::vector<TaggedPosition<Position::XY>>> verticesBySpellMisc;
|
||||
std::unordered_map<uint32, std::vector<TaggedPosition<Position::XY>>> verticesTargetBySpellMisc;
|
||||
std::unordered_map<uint32, std::vector<Position>> splinesBySpellMisc;
|
||||
std::unordered_map<AreaTriggerId, std::vector<AreaTriggerAction>> actionsByAreaTrigger;
|
||||
|
||||
@@ -112,20 +112,20 @@ void AreaTriggerDataStore::LoadAreaTriggerTemplates()
|
||||
TC_LOG_INFO("server.loading", ">> Loaded 0 AreaTrigger templates actions. DB table `areatrigger_template_actions` is empty.");
|
||||
}
|
||||
|
||||
// 0 1 2 3 4 5
|
||||
if (QueryResult vertices = WorldDatabase.Query("SELECT AreaTriggerId, Idx, VerticeX, VerticeY, VerticeTargetX, VerticeTargetY FROM `areatrigger_template_polygon_vertices` ORDER BY `AreaTriggerId`, `Idx`"))
|
||||
// 0 1 2 3 4 5
|
||||
if (QueryResult vertices = WorldDatabase.Query("SELECT SpellMiscId, Idx, VerticeX, VerticeY, VerticeTargetX, VerticeTargetY FROM `spell_areatrigger_vertices` ORDER BY `SpellMiscId`, `Idx`"))
|
||||
{
|
||||
do
|
||||
{
|
||||
Field* verticeFields = vertices->Fetch();
|
||||
uint32 areaTriggerId = verticeFields[0].GetUInt32();
|
||||
uint32 spellMiscId = verticeFields[0].GetUInt32();
|
||||
|
||||
verticesByAreaTrigger[areaTriggerId].emplace_back(verticeFields[2].GetFloat(), verticeFields[3].GetFloat());
|
||||
verticesBySpellMisc[spellMiscId].emplace_back(verticeFields[2].GetFloat(), verticeFields[3].GetFloat());
|
||||
|
||||
if (!verticeFields[4].IsNull() && !verticeFields[5].IsNull())
|
||||
verticesTargetByAreaTrigger[areaTriggerId].emplace_back(verticeFields[4].GetFloat(), verticeFields[5].GetFloat());
|
||||
verticesTargetBySpellMisc[spellMiscId].emplace_back(verticeFields[4].GetFloat(), verticeFields[5].GetFloat());
|
||||
else if (verticeFields[4].IsNull() != verticeFields[5].IsNull())
|
||||
TC_LOG_ERROR("sql.sql", "Table `areatrigger_template_polygon_vertices` has listed invalid target vertices (AreaTrigger: %u, Index: %u).", areaTriggerId, verticeFields[1].GetUInt32());
|
||||
TC_LOG_ERROR("sql.sql", "Table `spell_areatrigger_vertices` has listed invalid target vertices (SpellMiscId: %u, Index: %u).", spellMiscId, verticeFields[1].GetUInt32());
|
||||
}
|
||||
while (vertices->NextRow());
|
||||
}
|
||||
@@ -183,11 +183,6 @@ void AreaTriggerDataStore::LoadAreaTriggerTemplates()
|
||||
areaTriggerTemplate.DefaultDatas.Data[i] = fields[4 + i].GetFloat();
|
||||
|
||||
areaTriggerTemplate.ScriptId = sObjectMgr->GetScriptId(fields[10].GetString());
|
||||
if (!areaTriggerTemplate.Id.IsServerSide)
|
||||
{
|
||||
areaTriggerTemplate.PolygonVertices = std::move(verticesByAreaTrigger[areaTriggerTemplate.Id.Id]);
|
||||
areaTriggerTemplate.PolygonVerticesTarget = std::move(verticesTargetByAreaTrigger[areaTriggerTemplate.Id.Id]);
|
||||
}
|
||||
areaTriggerTemplate.Actions = std::move(actionsByAreaTrigger[areaTriggerTemplate.Id]);
|
||||
|
||||
areaTriggerTemplate.InitMaxSearchRadius();
|
||||
@@ -239,6 +234,8 @@ void AreaTriggerDataStore::LoadAreaTriggerTemplates()
|
||||
miscTemplate.TimeToTarget = areatriggerSpellMiscFields[9].GetUInt32();
|
||||
miscTemplate.TimeToTargetScale = areatriggerSpellMiscFields[10].GetUInt32();
|
||||
|
||||
miscTemplate.PolygonVertices = std::move(verticesBySpellMisc[miscTemplate.MiscId]);
|
||||
miscTemplate.PolygonVerticesTarget = std::move(verticesTargetBySpellMisc[miscTemplate.MiscId]);
|
||||
miscTemplate.SplinePoints = std::move(splinesBySpellMisc[miscTemplate.MiscId]);
|
||||
|
||||
_areaTriggerTemplateSpellMisc[miscTemplate.MiscId] = miscTemplate;
|
||||
|
||||
Reference in New Issue
Block a user