Core/AreaTriggers: Rename spell_areatrigger* tables to areatrigger_create_properties* according to last MiscValue research for areatrigger effects

Port From (https://github.com/TrinityCore/TrinityCore/commit/ee73948a64fc3d767d37cd3cc7f44358c5274b83)
This commit is contained in:
hondacrx
2021-09-17 10:57:02 -04:00
parent ba1819eecf
commit 4aabb695d5
5 changed files with 355 additions and 275 deletions
@@ -31,9 +31,9 @@ namespace Game.DataStorage
public void LoadAreaTriggerTemplates() public void LoadAreaTriggerTemplates()
{ {
uint oldMSTime = Time.GetMSTime(); uint oldMSTime = Time.GetMSTime();
MultiMap<uint, Vector2> verticesBySpellMisc = new(); MultiMap<uint, Vector2> verticesByCreateProperties = new();
MultiMap<uint, Vector2> verticesTargetBySpellMisc = new(); MultiMap<uint, Vector2> verticesTargetByCreateProperties = new();
MultiMap<uint, Vector3> splinesBySpellMisc = new(); MultiMap<uint, Vector3> splinesByCreateProperties = new();
MultiMap<AreaTriggerId, AreaTriggerAction> actionsByAreaTrigger = new(); MultiMap<AreaTriggerId, AreaTriggerAction> actionsByAreaTrigger = new();
// 0 1 2 3 4 // 0 1 2 3 4
@@ -80,65 +80,56 @@ namespace Game.DataStorage
Log.outInfo(LogFilter.ServerLoading, "Loaded 0 AreaTrigger templates actions. DB table `areatrigger_template_actions` is empty."); Log.outInfo(LogFilter.ServerLoading, "Loaded 0 AreaTrigger templates actions. DB table `areatrigger_template_actions` is empty.");
} }
// 0 1 2 3 4 5 // 0 1 2 3 4 5
SQLResult vertices = DB.World.Query("SELECT SpellMiscId, Idx, VerticeX, VerticeY, VerticeTargetX, VerticeTargetY FROM `spell_areatrigger_vertices` ORDER BY `SpellMiscId`, `Idx`"); SQLResult vertices = DB.World.Query("SELECT AreaTriggerCreatePropertiesId, Idx, VerticeX, VerticeY, VerticeTargetX, VerticeTargetY FROM `areatrigger_create_properties_polygon_vertex` ORDER BY `AreaTriggerCreatePropertiesId`, `Idx`");
if (!vertices.IsEmpty()) if (!vertices.IsEmpty())
{ {
do do
{ {
uint spellMiscId = vertices.Read<uint>(0); uint areaTriggerCreatePropertiesId = vertices.Read<uint>(0);
verticesBySpellMisc.Add(spellMiscId, new Vector2(vertices.Read<float>(2), vertices.Read<float>(3))); verticesByCreateProperties.Add(areaTriggerCreatePropertiesId, new Vector2(vertices.Read<float>(2), vertices.Read<float>(3)));
if (!vertices.IsNull(4) && !vertices.IsNull(5)) if (!vertices.IsNull(4) && !vertices.IsNull(5))
verticesTargetBySpellMisc.Add(spellMiscId, new Vector2(vertices.Read<float>(4), vertices.Read<float>(5))); verticesTargetByCreateProperties.Add(areaTriggerCreatePropertiesId, new Vector2(vertices.Read<float>(4), vertices.Read<float>(5)));
else if (vertices.IsNull(4) != vertices.IsNull(5)) else if (vertices.IsNull(4) != vertices.IsNull(5))
Log.outError(LogFilter.Sql, $"Table `spell_areatrigger_vertices` has listed invalid target vertices (SpellMiscId: {spellMiscId}, Index: {vertices.Read<uint>(1)})."); Log.outError(LogFilter.Sql, $"Table `areatrigger_create_properties_polygon_vertex` has listed invalid target vertices (AreaTriggerCreatePropertiesId: {areaTriggerCreatePropertiesId}, Index: {vertices.Read<uint>(1)}).");
} }
while (vertices.NextRow()); while (vertices.NextRow());
} }
else else
{ {
Log.outInfo(LogFilter.ServerLoading, "Loaded 0 AreaTrigger templates polygon vertices. DB table `areatrigger_template_polygon_vertices` is empty."); Log.outInfo(LogFilter.ServerLoading, "Loaded 0 AreaTrigger polygon polygon vertices. DB table `areatrigger_create_properties_polygon_vertex` is empty.");
} }
// 0 1 2 3 // 0 1 2 3
SQLResult splines = DB.World.Query("SELECT SpellMiscId, X, Y, Z FROM `spell_areatrigger_splines` ORDER BY `SpellMiscId`, `Idx`"); SQLResult splines = DB.World.Query("SELECT AreaTriggerCreatePropertiesId, X, Y, Z FROM `areatrigger_create_properties_spline_point` ORDER BY `AreaTriggerCreatePropertiesId`, `Idx`");
if (!splines.IsEmpty()) if (!splines.IsEmpty())
{ {
do do
{ {
uint spellMiscId = splines.Read<uint>(0); uint areaTriggerCreatePropertiesId = splines.Read<uint>(0);
Vector3 spline = new(splines.Read<float>(1), splines.Read<float>(2), splines.Read<float>(3)); Vector3 spline = new(splines.Read<float>(1), splines.Read<float>(2), splines.Read<float>(3));
splinesBySpellMisc.Add(spellMiscId, spline); splinesByCreateProperties.Add(areaTriggerCreatePropertiesId, spline);
} }
while (splines.NextRow()); while (splines.NextRow());
} }
else else
{ {
Log.outInfo(LogFilter.ServerLoading, "Loaded 0 AreaTrigger templates splines. DB table `spell_areatrigger_splines` is empty."); Log.outInfo(LogFilter.ServerLoading, "Loaded 0 AreaTrigger splines. DB table `areatrigger_create_properties_spline_point` is empty.");
} }
// 0 1 2 3 4 5 6 7 8 9 10 // 0 1 2 3
SQLResult templates = DB.World.Query("SELECT Id, IsServerSide, Type, Flags, Data0, Data1, Data2, Data3, Data4, Data5, ScriptName FROM `areatrigger_template`"); SQLResult templates = DB.World.Query("SELECT Id, IsServerSide, Flags, ScriptName FROM `areatrigger_template`");
if (!templates.IsEmpty()) if (!templates.IsEmpty())
{ {
do do
{ {
AreaTriggerTemplate areaTriggerTemplate = new(); AreaTriggerTemplate areaTriggerTemplate = new();
areaTriggerTemplate.Id = new(templates.Read<uint>(0), templates.Read<byte>(1) == 1); areaTriggerTemplate.Id = new(templates.Read<uint>(0), templates.Read<byte>(1) == 1);
AreaTriggerTypes type = (AreaTriggerTypes)templates.Read<byte>(2);
if (type >= AreaTriggerTypes.Max) areaTriggerTemplate.Flags = (AreaTriggerFlags)templates.Read<uint>(2);
{
Log.outError(LogFilter.Sql, $"Table `areatrigger_template` has listed areatrigger (Id: {areaTriggerTemplate.Id.Id}, IsServerSide: {areaTriggerTemplate.Id.IsServerSide}) with invalid type {type}.");
continue;
}
areaTriggerTemplate.TriggerType = type;
areaTriggerTemplate.Flags = (AreaTriggerFlags)templates.Read<uint>(3);
if (areaTriggerTemplate.Id.IsServerSide && areaTriggerTemplate.Flags != 0) if (areaTriggerTemplate.Id.IsServerSide && areaTriggerTemplate.Flags != 0)
{ {
@@ -146,36 +137,39 @@ namespace Game.DataStorage
continue; continue;
} }
unsafe areaTriggerTemplate.ScriptId = Global.ObjectMgr.GetScriptId(templates.Read<string>(3));
{
for (byte i = 0; i < SharedConst.MaxAreatriggerEntityData; ++i)
areaTriggerTemplate.DefaultDatas.Data[i] = templates.Read<float>(4 + i);
}
areaTriggerTemplate.ScriptId = Global.ObjectMgr.GetScriptId(templates.Read<string>(10));
areaTriggerTemplate.Actions = actionsByAreaTrigger[areaTriggerTemplate.Id]; areaTriggerTemplate.Actions = actionsByAreaTrigger[areaTriggerTemplate.Id];
areaTriggerTemplate.InitMaxSearchRadius();
_areaTriggerTemplateStore[areaTriggerTemplate.Id] = areaTriggerTemplate; _areaTriggerTemplateStore[areaTriggerTemplate.Id] = areaTriggerTemplate;
} }
while (templates.NextRow()); while (templates.NextRow());
} }
// 0 1 2 3 4 5 6 7 8 9 10 // 0 1 2 3 4 5 6 7 8 9 10
SQLResult areatriggerSpellMiscs = DB.World.Query("SELECT SpellMiscId, AreaTriggerId, MoveCurveId, ScaleCurveId, MorphCurveId, FacingCurveId, AnimId, AnimKitId, DecalPropertiesId, TimeToTarget, TimeToTargetScale FROM `spell_areatrigger`"); SQLResult areatriggerCreateProperties = DB.World.Query("SELECT Id, AreaTriggerId, MoveCurveId, ScaleCurveId, MorphCurveId, FacingCurveId, AnimId, AnimKitId, DecalPropertiesId, TimeToTarget, TimeToTargetScale, " +
if (!areatriggerSpellMiscs.IsEmpty()) //11 12 13 14 15 16 17
"Shape, ShapeData0, ShapeData1, ShapeData2, ShapeData3, ShapeData4, ShapeData5 FROM `areatrigger_create_properties`");
if (!areatriggerCreateProperties.IsEmpty())
{ {
do do
{ {
AreaTriggerMiscTemplate miscTemplate = new(); AreaTriggerCreateProperties createProperties = new();
miscTemplate.MiscId = areatriggerSpellMiscs.Read<uint>(0); createProperties.Id = areatriggerCreateProperties.Read<uint>(0);
uint areatriggerId = areatriggerSpellMiscs.Read<uint>(1); uint areatriggerId = areatriggerCreateProperties.Read<uint>(1);
miscTemplate.Template = GetAreaTriggerTemplate(new AreaTriggerId(areatriggerId, false)); createProperties.Template = GetAreaTriggerTemplate(new AreaTriggerId(areatriggerId, false));
if (miscTemplate.Template == null) AreaTriggerTypes shape = (AreaTriggerTypes)areatriggerCreateProperties.Read<byte>(11);
if (areatriggerId != 0 && createProperties.Template == null)
{ {
Log.outError(LogFilter.Sql, "Table `spell_areatrigger` reference invalid AreaTriggerId {0} for miscId {1}", areatriggerId, miscTemplate.MiscId); Log.outError(LogFilter.Sql, $"Table `areatrigger_create_properties` reference invalid AreaTriggerId {areatriggerId} for AreaTriggerCreatePropertiesId {createProperties.Id}");
continue;
}
if (shape >= AreaTriggerTypes.Max)
{
Log.outError(LogFilter.Sql, $"Table `areatrigger_create_properties` has listed areatrigger create properties {createProperties.Id} with invalid shape {shape}.");
continue; continue;
} }
@@ -183,50 +177,61 @@ namespace Game.DataStorage
{ {
if (value != 0 && !CliDB.CurveStorage.ContainsKey(value)) if (value != 0 && !CliDB.CurveStorage.ContainsKey(value))
{ {
Log.outError(LogFilter.Sql, "Table `spell_areatrigger` has listed areatrigger (MiscId: {0}, Id: {1}) with invalid Curve ({2}), set to 0!", miscTemplate.MiscId, areatriggerId, value); Log.outError(LogFilter.Sql, $"Table `areatrigger_create_properties` has listed areatrigger (AreaTriggerCreatePropertiesId: {createProperties.Id}, Id: {areatriggerId}) with invalid Curve ({value}), set to 0!");
return 0; return 0;
} }
return value; return value;
} }
miscTemplate.MoveCurveId = ValidateAndSetCurve(areatriggerSpellMiscs.Read<uint>(2)); createProperties.MoveCurveId = ValidateAndSetCurve(areatriggerCreateProperties.Read<uint>(2));
miscTemplate.ScaleCurveId = ValidateAndSetCurve(areatriggerSpellMiscs.Read<uint>(3)); createProperties.ScaleCurveId = ValidateAndSetCurve(areatriggerCreateProperties.Read<uint>(3));
miscTemplate.MorphCurveId = ValidateAndSetCurve(areatriggerSpellMiscs.Read<uint>(4)); createProperties.MorphCurveId = ValidateAndSetCurve(areatriggerCreateProperties.Read<uint>(4));
miscTemplate.FacingCurveId = ValidateAndSetCurve(areatriggerSpellMiscs.Read<uint>(5)); createProperties.FacingCurveId = ValidateAndSetCurve(areatriggerCreateProperties.Read<uint>(5));
miscTemplate.AnimId = areatriggerSpellMiscs.Read<uint>(6); createProperties.AnimId = areatriggerCreateProperties.Read<uint>(6);
miscTemplate.AnimKitId = areatriggerSpellMiscs.Read<uint>(7); createProperties.AnimKitId = areatriggerCreateProperties.Read<uint>(7);
miscTemplate.DecalPropertiesId = areatriggerSpellMiscs.Read<uint>(8); createProperties.DecalPropertiesId = areatriggerCreateProperties.Read<uint>(8);
miscTemplate.TimeToTarget = areatriggerSpellMiscs.Read<uint>(9); createProperties.TimeToTarget = areatriggerCreateProperties.Read<uint>(9);
miscTemplate.TimeToTargetScale = areatriggerSpellMiscs.Read<uint>(10); createProperties.TimeToTargetScale = areatriggerCreateProperties.Read<uint>(10);
miscTemplate.PolygonVertices = verticesBySpellMisc[miscTemplate.MiscId]; createProperties.Shape.TriggerType = shape;
miscTemplate.PolygonVerticesTarget = verticesTargetBySpellMisc[miscTemplate.MiscId]; unsafe
miscTemplate.SplinePoints = splinesBySpellMisc[miscTemplate.MiscId]; {
for (byte i = 0; i < SharedConst.MaxAreatriggerEntityData; ++i)
createProperties.Shape.DefaultDatas.Data[i] = areatriggerCreateProperties.Read<float>(12 + i);
}
_areaTriggerTemplateSpellMisc[miscTemplate.MiscId] = miscTemplate; if (shape == AreaTriggerTypes.Polygon)
if (createProperties.Shape.PolygonDatas.Height <= 0.0f)
createProperties.Shape.PolygonDatas.Height = 1.0f;
createProperties.PolygonVertices = verticesByCreateProperties[createProperties.Id];
createProperties.PolygonVerticesTarget = verticesTargetByCreateProperties[createProperties.Id];
createProperties.SplinePoints = splinesByCreateProperties[createProperties.Id];
_areaTriggerCreateProperties[createProperties.Id] = createProperties;
} }
while (areatriggerSpellMiscs.NextRow()); while (areatriggerCreateProperties.NextRow());
} }
else else
{ {
Log.outInfo(LogFilter.ServerLoading, "Loaded 0 Spell AreaTrigger templates. DB table `spell_areatrigger` is empty."); Log.outInfo(LogFilter.ServerLoading, "Loaded 0 AreaTrigger create properties. DB table `areatrigger_create_properties` is empty.");
} }
// 0 1 2 3 4 5 6 7 // 0 1 2 3 4 5 6 7
SQLResult circularMovementInfos = DB.World.Query("SELECT SpellMiscId, StartDelay, CircleRadius, BlendFromRadius, InitialAngle, ZOffset, CounterClockwise, CanLoop FROM `spell_areatrigger_circular` ORDER BY `SpellMiscId`"); SQLResult circularMovementInfos = DB.World.Query("SELECT AreaTriggerCreatePropertiesId, StartDelay, CircleRadius, BlendFromRadius, InitialAngle, ZOffset, CounterClockwise, CanLoop FROM `areatrigger_create_properties_orbit` ORDER BY `SpellMiscId`");
if (!circularMovementInfos.IsEmpty()) if (!circularMovementInfos.IsEmpty())
{ {
do do
{ {
uint spellMiscId = circularMovementInfos.Read<uint>(0); uint areaTriggerCreatePropertiesId = circularMovementInfos.Read<uint>(0);
var atSpellMisc = _areaTriggerTemplateSpellMisc.LookupByKey(spellMiscId); var createProperties = _areaTriggerCreateProperties.LookupByKey(areaTriggerCreatePropertiesId);
if (atSpellMisc == null) if (createProperties == null)
{ {
Log.outError(LogFilter.Sql, $"Table `spell_areatrigger_circular` reference invalid SpellMiscId {spellMiscId}"); Log.outError(LogFilter.Sql, $"Table `areatrigger_create_properties_orbit` reference invalid AreaTriggerCreatePropertiesId {areaTriggerCreatePropertiesId}");
continue; continue;
} }
@@ -236,41 +241,41 @@ namespace Game.DataStorage
orbitInfo.Radius = circularMovementInfos.Read<float>(2); orbitInfo.Radius = circularMovementInfos.Read<float>(2);
if (!float.IsInfinity(orbitInfo.Radius)) if (!float.IsInfinity(orbitInfo.Radius))
{ {
Log.outError(LogFilter.Sql, $"Table `spell_areatrigger_circular` has listed areatrigger (MiscId: {spellMiscId}) with invalid Radius ({orbitInfo.Radius}), set to 0!"); Log.outError(LogFilter.Sql, $"Table `areatrigger_create_properties_orbit` has listed areatrigger (AreaTriggerCreatePropertiesId: {areaTriggerCreatePropertiesId}) with invalid Radius ({orbitInfo.Radius}), set to 0!");
orbitInfo.Radius = 0.0f; orbitInfo.Radius = 0.0f;
} }
orbitInfo.BlendFromRadius = circularMovementInfos.Read<float>(3); orbitInfo.BlendFromRadius = circularMovementInfos.Read<float>(3);
if (!float.IsInfinity(orbitInfo.BlendFromRadius)) if (!float.IsInfinity(orbitInfo.BlendFromRadius))
{ {
Log.outError(LogFilter.Sql, $"Table `spell_areatrigger_circular` has listed areatrigger (MiscId: {spellMiscId}) with invalid BlendFromRadius ({orbitInfo.BlendFromRadius}), set to 0!"); Log.outError(LogFilter.Sql, $"Table `areatrigger_create_properties_orbit` has listed areatrigger (AreaTriggerCreatePropertiesId: {areaTriggerCreatePropertiesId}) with invalid BlendFromRadius ({orbitInfo.BlendFromRadius}), set to 0!");
orbitInfo.BlendFromRadius = 0.0f; orbitInfo.BlendFromRadius = 0.0f;
} }
orbitInfo.InitialAngle = circularMovementInfos.Read<float>(4); orbitInfo.InitialAngle = circularMovementInfos.Read<float>(4);
if (!float.IsInfinity(orbitInfo.InitialAngle)) if (!float.IsInfinity(orbitInfo.InitialAngle))
{ {
Log.outError(LogFilter.Sql, $"Table `spell_areatrigger_circular` has listed areatrigger (MiscId: {spellMiscId}) with invalid InitialAngle ({orbitInfo.InitialAngle}), set to 0!"); Log.outError(LogFilter.Sql, $"Table `areatrigger_create_properties_orbit` has listed areatrigger (AreaTriggerCreatePropertiesId: {areaTriggerCreatePropertiesId}) with invalid InitialAngle ({orbitInfo.InitialAngle}), set to 0!");
orbitInfo.InitialAngle = 0.0f; orbitInfo.InitialAngle = 0.0f;
} }
orbitInfo.ZOffset = circularMovementInfos.Read<float>(5); orbitInfo.ZOffset = circularMovementInfos.Read<float>(5);
if (!float.IsInfinity(orbitInfo.ZOffset)) if (!float.IsInfinity(orbitInfo.ZOffset))
{ {
Log.outError(LogFilter.Sql, $"Table `spell_areatrigger_circular` has listed areatrigger (MiscId: {spellMiscId}) with invalid ZOffset ({orbitInfo.ZOffset}), set to 0!"); Log.outError(LogFilter.Sql, $"Table `spell_areatrigger_circular` has listed areatrigger (MiscId: {areaTriggerCreatePropertiesId}) with invalid ZOffset ({orbitInfo.ZOffset}), set to 0!");
orbitInfo.ZOffset = 0.0f; orbitInfo.ZOffset = 0.0f;
} }
orbitInfo.CounterClockwise = circularMovementInfos.Read<bool>(6); orbitInfo.CounterClockwise = circularMovementInfos.Read<bool>(6);
orbitInfo.CanLoop = circularMovementInfos.Read<bool>(7); orbitInfo.CanLoop = circularMovementInfos.Read<bool>(7);
atSpellMisc.OrbitInfo = orbitInfo; createProperties.OrbitInfo.Set(orbitInfo);
} }
while (circularMovementInfos.NextRow()); while (circularMovementInfos.NextRow());
} }
else else
{ {
Log.outInfo(LogFilter.ServerLoading, "Loaded 0 AreaTrigger templates circular movement infos. DB table `spell_areatrigger_circular` is empty."); Log.outInfo(LogFilter.ServerLoading, "Loaded 0 AreaTrigger templates circular movement infos. DB table `areatrigger_create_properties_orbit` is empty.");
} }
Log.outInfo(LogFilter.ServerLoading, $"Loaded {_areaTriggerTemplateStore.Count} spell areatrigger templates in {Time.GetMSTimeDiffToNow(oldMSTime)} ms."); Log.outInfo(LogFilter.ServerLoading, $"Loaded {_areaTriggerTemplateStore.Count} spell areatrigger templates in {Time.GetMSTimeDiffToNow(oldMSTime)} ms.");
@@ -281,7 +286,9 @@ namespace Game.DataStorage
uint oldMSTime = Time.GetMSTime(); uint oldMSTime = Time.GetMSTime();
// Load area trigger positions (to put them on the server) // Load area trigger positions (to put them on the server)
// 0 1 2 3 4 5 6 7 8 9 10 // 0 1 2 3 4 5 6 7 8 9 10
SQLResult templates = DB.World.Query("SELECT SpawnId, AreaTriggerId, IsServerSide, MapId, PosX, PosY, PosZ, Orientation, PhaseUseFlags, PhaseId, PhaseGroup FROM `areatrigger`"); SQLResult templates = DB.World.Query("SELECT SpawnId, AreaTriggerId, IsServerSide, MapId, PosX, PosY, PosZ, Orientation, PhaseUseFlags, PhaseId, PhaseGroup " +
//11 12 13 14 15 16 17
"Shape, ShapeData0, ShapeData1, ShapeData2, ShapeData3, ShapeData4, ShapeData5 FROM `areatrigger`");
if (!templates.IsEmpty()) if (!templates.IsEmpty())
{ {
do do
@@ -289,6 +296,7 @@ namespace Game.DataStorage
ulong spawnId = templates.Read<ulong>(0); ulong spawnId = templates.Read<ulong>(0);
AreaTriggerId areaTriggerId = new(templates.Read<uint>(1), templates.Read<byte>(2) == 1); AreaTriggerId areaTriggerId = new(templates.Read<uint>(1), templates.Read<byte>(2) == 1);
WorldLocation location = new(templates.Read<uint>(3), templates.Read<float>(4), templates.Read<float>(5), templates.Read<float>(6), templates.Read<float>(7)); WorldLocation location = new(templates.Read<uint>(3), templates.Read<float>(4), templates.Read<float>(5), templates.Read<float>(6), templates.Read<float>(7));
AreaTriggerTypes shape = (AreaTriggerTypes)templates.Read<byte>(11);
if (GetAreaTriggerTemplate(areaTriggerId) == null) if (GetAreaTriggerTemplate(areaTriggerId) == null)
{ {
@@ -302,6 +310,12 @@ namespace Game.DataStorage
continue; continue;
} }
if (shape >= AreaTriggerTypes.Max)
{
Log.outError(LogFilter.Sql, $"Table `areatrigger` has listed areatrigger SpawnId: {spawnId} with invalid shape {shape}.");
continue;
}
AreaTriggerSpawn spawn = new(); AreaTriggerSpawn spawn = new();
spawn.SpawnId = spawnId; spawn.SpawnId = spawnId;
spawn.Id = areaTriggerId; spawn.Id = areaTriggerId;
@@ -311,6 +325,13 @@ namespace Game.DataStorage
spawn.PhaseId = templates.Read<uint>(9); spawn.PhaseId = templates.Read<uint>(9);
spawn.PhaseGroup = templates.Read<uint>(10); spawn.PhaseGroup = templates.Read<uint>(10);
spawn.Shape.TriggerType = shape;
unsafe
{
for (var i = 0; i < SharedConst.MaxAreatriggerEntityData; ++i)
spawn.Shape.DefaultDatas.Data[i] = templates.Read<float>(12 + i);
}
// Add the trigger to a map::cell map, which is later used by GridLoader to query // Add the trigger to a map::cell map, which is later used by GridLoader to query
CellCoord cellCoord = GridDefines.ComputeCellCoord(spawn.Location.GetPositionX(), spawn.Location.GetPositionY()); CellCoord cellCoord = GridDefines.ComputeCellCoord(spawn.Location.GetPositionX(), spawn.Location.GetPositionY());
if (!_areaTriggerSpawnsByLocation.ContainsKey((spawn.Location.GetMapId(), cellCoord.GetId()))) if (!_areaTriggerSpawnsByLocation.ContainsKey((spawn.Location.GetMapId(), cellCoord.GetId())))
@@ -331,9 +352,9 @@ namespace Game.DataStorage
return _areaTriggerTemplateStore.LookupByKey(areaTriggerId); return _areaTriggerTemplateStore.LookupByKey(areaTriggerId);
} }
public AreaTriggerMiscTemplate GetAreaTriggerMiscTemplate(uint spellMiscValue) public AreaTriggerCreateProperties GetAreaTriggerCreateProperties(uint spellMiscValue)
{ {
return _areaTriggerTemplateSpellMisc.LookupByKey(spellMiscValue); return _areaTriggerCreateProperties.LookupByKey(spellMiscValue);
} }
public SortedSet<ulong> GetAreaTriggersForMapAndCell(uint mapId, uint cellId) public SortedSet<ulong> GetAreaTriggersForMapAndCell(uint mapId, uint cellId)
@@ -349,6 +370,6 @@ namespace Game.DataStorage
Dictionary<(uint mapId, uint cellId), SortedSet<ulong>> _areaTriggerSpawnsByLocation = new(); Dictionary<(uint mapId, uint cellId), SortedSet<ulong>> _areaTriggerSpawnsByLocation = new();
Dictionary<ulong, AreaTriggerSpawn> _areaTriggerSpawnsBySpawnId = new(); Dictionary<ulong, AreaTriggerSpawn> _areaTriggerSpawnsBySpawnId = new();
Dictionary<AreaTriggerId, AreaTriggerTemplate> _areaTriggerTemplateStore = new(); Dictionary<AreaTriggerId, AreaTriggerTemplate> _areaTriggerTemplateStore = new();
Dictionary<uint, AreaTriggerMiscTemplate> _areaTriggerTemplateSpellMisc = new(); Dictionary<uint, AreaTriggerCreateProperties> _areaTriggerCreateProperties = new();
} }
} }
+73 -66
View File
@@ -78,7 +78,7 @@ namespace Game.Entities
} }
} }
bool Create(uint spellMiscId, Unit caster, Unit target, SpellInfo spell, Position pos, int duration, SpellCastVisualField spellVisual, ObjectGuid castId, AuraEffect aurEff) bool Create(uint areaTriggerCreatePropertiesId, Unit caster, Unit target, SpellInfo spell, Position pos, int duration, SpellCastVisualField spellVisual, ObjectGuid castId, AuraEffect aurEff)
{ {
_targetGuid = target ? target.GetGUID() : ObjectGuid.Empty; _targetGuid = target ? target.GetGUID() : ObjectGuid.Empty;
_aurEff = aurEff; _aurEff = aurEff;
@@ -87,30 +87,30 @@ namespace Game.Entities
Relocate(pos); Relocate(pos);
if (!IsPositionValid()) if (!IsPositionValid())
{ {
Log.outError(LogFilter.AreaTrigger, $"AreaTrigger (spell {spell.Id}) not created. Invalid coordinates (X: {GetPositionX()} Y: {GetPositionY()})"); Log.outError(LogFilter.AreaTrigger, $"AreaTrigger (areaTriggerCreatePropertiesId: {areaTriggerCreatePropertiesId}) not created. Invalid coordinates (X: {GetPositionX()} Y: {GetPositionY()})");
return false; return false;
} }
_areaTriggerMiscTemplate = Global.AreaTriggerDataStorage.GetAreaTriggerMiscTemplate(spellMiscId); _areaTriggerCreateProperties = Global.AreaTriggerDataStorage.GetAreaTriggerCreateProperties(areaTriggerCreatePropertiesId);
if (_areaTriggerMiscTemplate == null) if (_areaTriggerCreateProperties == null)
{ {
Log.outError(LogFilter.AreaTrigger, "AreaTrigger (spellMiscId {0}) not created. Invalid areatrigger miscid ({1})", spellMiscId, spellMiscId); Log.outError(LogFilter.AreaTrigger, $"AreaTrigger (areaTriggerCreatePropertiesId {areaTriggerCreatePropertiesId}) not created. Invalid areatrigger create properties id ({areaTriggerCreatePropertiesId})");
return false; return false;
} }
_areaTriggerTemplate = _areaTriggerMiscTemplate.Template; _areaTriggerTemplate = _areaTriggerCreateProperties.Template;
_Create(ObjectGuid.Create(HighGuid.AreaTrigger, GetMapId(), GetTemplate().Id.Id, caster.GetMap().GenerateLowGuid(HighGuid.AreaTrigger))); _Create(ObjectGuid.Create(HighGuid.AreaTrigger, GetMapId(), GetTemplate() != null ? GetTemplate().Id.Id : 0, caster.GetMap().GenerateLowGuid(HighGuid.AreaTrigger)));
if (GetTemplate() != null)
SetEntry(GetTemplate().Id.Id);
SetEntry(GetTemplate().Id.Id);
SetDuration(duration); SetDuration(duration);
SetObjectScale(1.0f); SetObjectScale(1.0f);
if (GetTemplate().IsPolygon()) _shape = GetCreateProperties().Shape;
_maxSearchRadius = GetMiscTemplate().GetPolygonMaxSearchRadius(); _maxSearchRadius = GetCreateProperties().GetMaxSearchRadius();
else
_maxSearchRadius = GetTemplate().MaxSearchRadius;
SetUpdateFieldValue(m_values.ModifyValue(m_areaTriggerData).ModifyValue(m_areaTriggerData.Caster), caster.GetGUID()); SetUpdateFieldValue(m_values.ModifyValue(m_areaTriggerData).ModifyValue(m_areaTriggerData.Caster), caster.GetGUID());
SetUpdateFieldValue(m_values.ModifyValue(m_areaTriggerData).ModifyValue(m_areaTriggerData.CreatingEffectGUID), castId); SetUpdateFieldValue(m_values.ModifyValue(m_areaTriggerData).ModifyValue(m_areaTriggerData.CreatingEffectGUID), castId);
@@ -122,57 +122,57 @@ namespace Game.Entities
SetUpdateFieldValue(ref spellCastVisual.SpellXSpellVisualID, spellVisual.SpellXSpellVisualID); SetUpdateFieldValue(ref spellCastVisual.SpellXSpellVisualID, spellVisual.SpellXSpellVisualID);
SetUpdateFieldValue(ref spellCastVisual.ScriptVisualID, spellVisual.ScriptVisualID); SetUpdateFieldValue(ref spellCastVisual.ScriptVisualID, spellVisual.ScriptVisualID);
SetUpdateFieldValue(m_values.ModifyValue(m_areaTriggerData).ModifyValue(m_areaTriggerData.TimeToTargetScale), GetMiscTemplate().TimeToTargetScale != 0 ? GetMiscTemplate().TimeToTargetScale : m_areaTriggerData.Duration); SetUpdateFieldValue(m_values.ModifyValue(m_areaTriggerData).ModifyValue(m_areaTriggerData.TimeToTargetScale), GetCreateProperties().TimeToTargetScale != 0 ? GetCreateProperties().TimeToTargetScale : m_areaTriggerData.Duration);
SetUpdateFieldValue(m_values.ModifyValue(m_areaTriggerData).ModifyValue(m_areaTriggerData.BoundsRadius2D), GetMaxSearchRadius()); SetUpdateFieldValue(m_values.ModifyValue(m_areaTriggerData).ModifyValue(m_areaTriggerData.BoundsRadius2D), GetMaxSearchRadius());
SetUpdateFieldValue(m_values.ModifyValue(m_areaTriggerData).ModifyValue(m_areaTriggerData.DecalPropertiesID), GetMiscTemplate().DecalPropertiesId); SetUpdateFieldValue(m_values.ModifyValue(m_areaTriggerData).ModifyValue(m_areaTriggerData.DecalPropertiesID), GetCreateProperties().DecalPropertiesId);
ScaleCurve extraScaleCurve = m_values.ModifyValue(m_areaTriggerData).ModifyValue(m_areaTriggerData.ExtraScaleCurve); ScaleCurve extraScaleCurve = m_values.ModifyValue(m_areaTriggerData).ModifyValue(m_areaTriggerData.ExtraScaleCurve);
if (GetMiscTemplate().ExtraScale.Structured.StartTimeOffset != 0) if (GetCreateProperties().ExtraScale.Structured.StartTimeOffset != 0)
SetUpdateFieldValue(extraScaleCurve.ModifyValue(extraScaleCurve.StartTimeOffset), GetMiscTemplate().ExtraScale.Structured.StartTimeOffset); SetUpdateFieldValue(extraScaleCurve.ModifyValue(extraScaleCurve.StartTimeOffset), GetCreateProperties().ExtraScale.Structured.StartTimeOffset);
if (GetMiscTemplate().ExtraScale.Structured.X != 0 || GetMiscTemplate().ExtraScale.Structured.Y != 0) if (GetCreateProperties().ExtraScale.Structured.X != 0 || GetCreateProperties().ExtraScale.Structured.Y != 0)
{ {
Vector2 point = new(GetMiscTemplate().ExtraScale.Structured.X, GetMiscTemplate().ExtraScale.Structured.Y); Vector2 point = new(GetCreateProperties().ExtraScale.Structured.X, GetCreateProperties().ExtraScale.Structured.Y);
SetUpdateFieldValue(ref extraScaleCurve.ModifyValue(extraScaleCurve.Points, 0), point); SetUpdateFieldValue(ref extraScaleCurve.ModifyValue(extraScaleCurve.Points, 0), point);
} }
if (GetMiscTemplate().ExtraScale.Structured.Z != 0 || GetMiscTemplate().ExtraScale.Structured.W != 0) if (GetCreateProperties().ExtraScale.Structured.Z != 0 || GetCreateProperties().ExtraScale.Structured.W != 0)
{ {
Vector2 point = new(GetMiscTemplate().ExtraScale.Structured.Z, GetMiscTemplate().ExtraScale.Structured.W); Vector2 point = new(GetCreateProperties().ExtraScale.Structured.Z, GetCreateProperties().ExtraScale.Structured.W);
SetUpdateFieldValue(ref extraScaleCurve.ModifyValue(extraScaleCurve.Points, 1), point); SetUpdateFieldValue(ref extraScaleCurve.ModifyValue(extraScaleCurve.Points, 1), point);
} }
unsafe unsafe
{ {
if (GetMiscTemplate().ExtraScale.Raw.Data[5] != 0) if (GetCreateProperties().ExtraScale.Raw.Data[5] != 0)
SetUpdateFieldValue(extraScaleCurve.ModifyValue(extraScaleCurve.ParameterCurve), GetMiscTemplate().ExtraScale.Raw.Data[5]); SetUpdateFieldValue(extraScaleCurve.ModifyValue(extraScaleCurve.ParameterCurve), GetCreateProperties().ExtraScale.Raw.Data[5]);
if (GetMiscTemplate().ExtraScale.Structured.OverrideActive != 0) if (GetCreateProperties().ExtraScale.Structured.OverrideActive != 0)
SetUpdateFieldValue(extraScaleCurve.ModifyValue(extraScaleCurve.OverrideActive), GetMiscTemplate().ExtraScale.Structured.OverrideActive != 0); SetUpdateFieldValue(extraScaleCurve.ModifyValue(extraScaleCurve.OverrideActive), GetCreateProperties().ExtraScale.Structured.OverrideActive != 0);
} }
PhasingHandler.InheritPhaseShift(this, caster); PhasingHandler.InheritPhaseShift(this, caster);
if (target && GetTemplate().HasFlag(AreaTriggerFlags.HasAttached)) if (target && GetTemplate() != null && GetTemplate().HasFlag(AreaTriggerFlags.HasAttached))
{ {
m_movementInfo.transport.guid = target.GetGUID(); m_movementInfo.transport.guid = target.GetGUID();
} }
UpdateShape(); UpdateShape();
uint timeToTarget = GetMiscTemplate().TimeToTarget != 0 ? GetMiscTemplate().TimeToTarget : m_areaTriggerData.Duration; uint timeToTarget = GetCreateProperties().TimeToTarget != 0 ? GetCreateProperties().TimeToTarget : m_areaTriggerData.Duration;
if (GetTemplate().HasFlag(AreaTriggerFlags.HasCircularMovement)) if (GetCreateProperties().OrbitInfo.HasValue)
{ {
AreaTriggerOrbitInfo cmi = GetMiscTemplate().OrbitInfo; AreaTriggerOrbitInfo orbit = GetCreateProperties().OrbitInfo.Value;
if (target && GetTemplate().HasFlag(AreaTriggerFlags.HasAttached)) if (target && GetTemplate() != null && GetTemplate().HasFlag(AreaTriggerFlags.HasAttached))
cmi.PathTarget.Set(target.GetGUID()); orbit.PathTarget.Set(target.GetGUID());
else else
cmi.Center.Set(new Vector3(pos.posX, pos.posY, pos.posZ)); orbit.Center.Set(new Vector3(pos.posX, pos.posY, pos.posZ));
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 // movement on transport of areatriggers on unit is handled by themself
@@ -208,10 +208,10 @@ namespace Game.Entities
return true; return true;
} }
public static AreaTrigger CreateAreaTrigger(uint spellMiscId, Unit caster, Unit target, SpellInfo spell, Position pos, int duration, SpellCastVisualField spellVisual, ObjectGuid castId = default, AuraEffect aurEff = null) public static AreaTrigger CreateAreaTrigger(uint areaTriggerCreatePropertiesId, Unit caster, Unit target, SpellInfo spell, Position pos, int duration, SpellCastVisualField spellVisual, ObjectGuid castId = default, AuraEffect aurEff = null)
{ {
AreaTrigger at = new(); AreaTrigger at = new();
if (!at.Create(spellMiscId, caster, target, spell, pos, duration, spellVisual, castId, aurEff)) if (!at.Create(areaTriggerCreatePropertiesId, caster, target, spell, pos, duration, spellVisual, castId, aurEff))
return null; return null;
return at; return at;
@@ -248,6 +248,9 @@ namespace Game.Entities
SetObjectScale(1.0f); SetObjectScale(1.0f);
_shape = position.Shape;
_maxSearchRadius = _shape.GetMaxSearchRadius();
if (position.PhaseUseFlags != 0 || position.PhaseId != 0 || position.PhaseGroup != 0) if (position.PhaseUseFlags != 0 || position.PhaseId != 0 || position.PhaseGroup != 0)
PhasingHandler.InitDbPhaseShift(GetPhaseShift(), (PhaseUseFlagsValues)position.PhaseUseFlags, position.PhaseId, position.PhaseGroup); PhasingHandler.InitDbPhaseShift(GetPhaseShift(), (PhaseUseFlagsValues)position.PhaseUseFlags, position.PhaseId, position.PhaseGroup);
@@ -272,7 +275,7 @@ namespace Game.Entities
{ {
UpdateOrbitPosition(diff); UpdateOrbitPosition(diff);
} }
else if (GetTemplate().HasFlag(AreaTriggerFlags.HasAttached)) else if (GetTemplate() != null && GetTemplate().HasFlag(AreaTriggerFlags.HasAttached))
{ {
Unit target = GetTarget(); Unit target = GetTarget();
if (target) if (target)
@@ -334,7 +337,7 @@ namespace Game.Entities
{ {
List<Unit> targetList = new(); List<Unit> targetList = new();
switch (GetTemplate().TriggerType) switch (_shape.TriggerType)
{ {
case AreaTriggerTypes.Sphere: case AreaTriggerTypes.Sphere:
SearchUnitInSphere(targetList); SearchUnitInSphere(targetList);
@@ -372,12 +375,12 @@ namespace Game.Entities
void SearchUnitInSphere(List<Unit> targetList) void SearchUnitInSphere(List<Unit> targetList)
{ {
float radius = GetTemplate().SphereDatas.Radius; float radius = _shape.SphereDatas.Radius;
if (GetTemplate().HasFlag(AreaTriggerFlags.HasDynamicShape)) if (GetTemplate() != null && GetTemplate().HasFlag(AreaTriggerFlags.HasDynamicShape))
{ {
if (GetMiscTemplate().MorphCurveId != 0) if (GetCreateProperties().MorphCurveId != 0)
{ {
radius = MathFunctions.lerp(GetTemplate().SphereDatas.Radius, GetTemplate().SphereDatas.RadiusTarget, Global.DB2Mgr.GetCurveValueAt(GetMiscTemplate().MorphCurveId, GetProgress())); radius = MathFunctions.lerp(_shape.SphereDatas.Radius, _shape.SphereDatas.RadiusTarget, Global.DB2Mgr.GetCurveValueAt(GetCreateProperties().MorphCurveId, GetProgress()));
} }
} }
@@ -393,9 +396,9 @@ namespace Game.Entities
unsafe unsafe
{ {
extentsX = GetTemplate().BoxDatas.Extents[0]; extentsX = _shape.BoxDatas.Extents[0];
extentsY = GetTemplate().BoxDatas.Extents[1]; extentsY = _shape.BoxDatas.Extents[1];
extentsZ = GetTemplate().BoxDatas.Extents[2]; extentsZ = _shape.BoxDatas.Extents[2];
} }
targetList.RemoveAll(unit => !unit.IsWithinBox(boxCenter, extentsX, extentsY, extentsZ)); targetList.RemoveAll(unit => !unit.IsWithinBox(boxCenter, extentsX, extentsY, extentsZ));
@@ -405,7 +408,7 @@ namespace Game.Entities
{ {
SearchUnits(targetList, GetMaxSearchRadius(), false); SearchUnits(targetList, GetMaxSearchRadius(), false);
float height = GetTemplate().PolygonDatas.Height; float height = _shape.PolygonDatas.Height;
float minZ = GetPositionZ() - height; float minZ = GetPositionZ() - height;
float maxZ = GetPositionZ() + height; float maxZ = GetPositionZ() + height;
@@ -416,7 +419,7 @@ namespace Game.Entities
{ {
SearchUnits(targetList, GetMaxSearchRadius(), false); SearchUnits(targetList, GetMaxSearchRadius(), false);
float height = GetTemplate().CylinderDatas.Height; float height = _shape.CylinderDatas.Height;
float minZ = GetPositionZ() - height; float minZ = GetPositionZ() - height;
float maxZ = GetPositionZ() + height; float maxZ = GetPositionZ() + height;
@@ -445,7 +448,7 @@ namespace Game.Entities
if (player) if (player)
{ {
if (player.IsDebugAreaTriggers) if (player.IsDebugAreaTriggers)
player.SendSysMessage(CypherStrings.DebugAreatriggerEntered, GetTemplate().Id); player.SendSysMessage(CypherStrings.DebugAreatriggerEntered, GetEntry());
player.UpdateQuestObjectiveProgress(QuestObjectiveType.AreaTriggerEnter, (int)GetEntry(), 1); player.UpdateQuestObjectiveProgress(QuestObjectiveType.AreaTriggerEnter, (int)GetEntry(), 1);
} }
@@ -464,7 +467,7 @@ namespace Game.Entities
if (player) if (player)
{ {
if (player.IsDebugAreaTriggers) if (player.IsDebugAreaTriggers)
player.SendSysMessage(CypherStrings.DebugAreatriggerLeft, GetTemplate().Id); player.SendSysMessage(CypherStrings.DebugAreatriggerLeft, GetEntry());
player.UpdateQuestObjectiveProgress(QuestObjectiveType.AreaTriggerExit, (int)GetEntry(), 1); player.UpdateQuestObjectiveProgress(QuestObjectiveType.AreaTriggerExit, (int)GetEntry(), 1);
} }
@@ -483,7 +486,7 @@ namespace Game.Entities
public uint GetScriptId() public uint GetScriptId()
{ {
return GetTemplate().ScriptId; return GetTemplate() != null ? GetTemplate().ScriptId : 0;
} }
public Unit GetCaster() public Unit GetCaster()
@@ -513,7 +516,7 @@ namespace Game.Entities
if (MathFunctions.fuzzyEq(_previousCheckOrientation, newOrientation)) if (MathFunctions.fuzzyEq(_previousCheckOrientation, newOrientation))
return; return;
_polygonVertices = GetMiscTemplate().PolygonVertices; _polygonVertices = GetCreateProperties().PolygonVertices;
float angleSin = (float)Math.Sin(newOrientation); float angleSin = (float)Math.Sin(newOrientation);
float angleCos = (float)Math.Cos(newOrientation); float angleCos = (float)Math.Cos(newOrientation);
@@ -601,7 +604,7 @@ namespace Game.Entities
public void UpdateShape() public void UpdateShape()
{ {
if (GetTemplate().IsPolygon()) if (_shape.IsPolygon())
UpdatePolygonOrientation(); UpdatePolygonOrientation();
} }
@@ -630,7 +633,7 @@ namespace Game.Entities
void DoActions(Unit unit) void DoActions(Unit unit)
{ {
Unit caster = IsServerSide() ? unit : GetCaster(); Unit caster = IsServerSide() ? unit : GetCaster();
if (caster) if (caster != null && GetTemplate() != null)
{ {
foreach (AreaTriggerAction action in GetTemplate().Actions) foreach (AreaTriggerAction action in GetTemplate().Actions)
{ {
@@ -663,10 +666,13 @@ namespace Game.Entities
void UndoActions(Unit unit) void UndoActions(Unit unit)
{ {
foreach (AreaTriggerAction action in GetTemplate().Actions) if (GetTemplate() != null)
{ {
if (action.ActionType == AreaTriggerActionTypes.Cast || action.ActionType == AreaTriggerActionTypes.AddAura) foreach (AreaTriggerAction action in GetTemplate().Actions)
unit.RemoveAurasDueToSpell(action.Param, GetCasterGuid()); {
if (action.ActionType == AreaTriggerActionTypes.Cast || action.ActionType == AreaTriggerActionTypes.AddAura)
unit.RemoveAurasDueToSpell(action.Param, GetCasterGuid());
}
} }
} }
@@ -730,10 +736,10 @@ namespace Game.Entities
_reachedDestination = false; _reachedDestination = false;
} }
void InitOrbit(AreaTriggerOrbitInfo cmi, uint timeToTarget) void InitOrbit(AreaTriggerOrbitInfo orbit, uint timeToTarget)
{ {
// Circular movement requires either a center position or an attached unit // Circular movement requires either a center position or an attached unit
Cypher.Assert(cmi.Center.HasValue || cmi.PathTarget.HasValue); Cypher.Assert(orbit.Center.HasValue || orbit.PathTarget.HasValue);
// should be sent in object create packets only // should be sent in object create packets only
DoWithSuppressingObjectUpdates(() => DoWithSuppressingObjectUpdates(() =>
@@ -742,7 +748,7 @@ namespace Game.Entities
m_areaTriggerData.ClearChanged(m_areaTriggerData.TimeToTarget); m_areaTriggerData.ClearChanged(m_areaTriggerData.TimeToTarget);
}); });
_orbitInfo.Set(cmi); _orbitInfo.Set(orbit);
_orbitInfo.Value.TimeToTarget = timeToTarget; _orbitInfo.Value.TimeToTarget = timeToTarget;
_orbitInfo.Value.ElapsedTimeForMovement = 0; _orbitInfo.Value.ElapsedTimeForMovement = 0;
@@ -861,13 +867,12 @@ namespace Game.Entities
if (currentTimePercent <= 0.0f) if (currentTimePercent <= 0.0f)
return; return;
if (GetMiscTemplate().MoveCurveId != 0) if (GetCreateProperties().MoveCurveId != 0)
{ {
float progress = Global.DB2Mgr.GetCurveValueAt(GetMiscTemplate().MoveCurveId, currentTimePercent); float progress = Global.DB2Mgr.GetCurveValueAt(GetCreateProperties().MoveCurveId, currentTimePercent);
if (progress < 0.0f || progress > 1.0f) if (progress < 0.0f || progress > 1.0f)
{ {
Log.outError(LogFilter.AreaTrigger, "AreaTrigger (Id: {0}, SpellMiscId: {1}) has wrong progress ({2}) caused by curve calculation (MoveCurveId: {3})", Log.outError(LogFilter.AreaTrigger, $"AreaTrigger (Id: {GetEntry()}, AreaTriggerCreatePropertiesId: {GetCreateProperties().Id}) has wrong progress ({progress}) caused by curve calculation (MoveCurveId: {GetCreateProperties().MorphCurveId})");
GetTemplate().Id, GetMiscTemplate().MiscId, progress, GetMiscTemplate().MorphCurveId);
} }
else else
currentTimePercent = progress; currentTimePercent = progress;
@@ -881,7 +886,7 @@ namespace Game.Entities
_spline.Evaluate_Percent(lastPositionIndex, percentFromLastPoint, out currentPosition); _spline.Evaluate_Percent(lastPositionIndex, percentFromLastPoint, out currentPosition);
float orientation = GetOrientation(); float orientation = GetOrientation();
if (GetTemplate().HasFlag(AreaTriggerFlags.HasFaceMovementDir)) if (GetTemplate() != null && GetTemplate().HasFlag(AreaTriggerFlags.HasFaceMovementDir))
{ {
Vector3 nextPoint = _spline.GetPoint(lastPositionIndex + 1); Vector3 nextPoint = _spline.GetPoint(lastPositionIndex + 1);
orientation = GetAngle(nextPoint.X, nextPoint.Y); orientation = GetAngle(nextPoint.X, nextPoint.Y);
@@ -1014,11 +1019,12 @@ namespace Game.Entities
public List<ObjectGuid> GetInsideUnits() { return _insideUnits; } public List<ObjectGuid> GetInsideUnits() { return _insideUnits; }
public AreaTriggerMiscTemplate GetMiscTemplate() { return _areaTriggerMiscTemplate; } public AreaTriggerCreateProperties GetCreateProperties() { return _areaTriggerCreateProperties; }
public override ObjectGuid GetOwnerGUID() { return GetCasterGuid(); } public override ObjectGuid GetOwnerGUID() { return GetCasterGuid(); }
public ObjectGuid GetCasterGuid() { return m_areaTriggerData.Caster; } public ObjectGuid GetCasterGuid() { return m_areaTriggerData.Caster; }
public AreaTriggerShapeInfo GetShape() { return _shape; }
float GetMaxSearchRadius() { return _maxSearchRadius; } float GetMaxSearchRadius() { return _maxSearchRadius; }
public Vector3 GetRollPitchYaw() { return _rollPitchYaw; } public Vector3 GetRollPitchYaw() { return _rollPitchYaw; }
public Vector3 GetTargetRollPitchYaw() { return _targetRollPitchYaw; } public Vector3 GetTargetRollPitchYaw() { return _targetRollPitchYaw; }
@@ -1035,6 +1041,7 @@ namespace Game.Entities
AuraEffect _aurEff; AuraEffect _aurEff;
AreaTriggerShapeInfo _shape;
float _maxSearchRadius; float _maxSearchRadius;
int _duration; int _duration;
int _totalDuration; int _totalDuration;
@@ -1053,7 +1060,7 @@ namespace Game.Entities
Optional<AreaTriggerOrbitInfo> _orbitInfo; Optional<AreaTriggerOrbitInfo> _orbitInfo;
AreaTriggerMiscTemplate _areaTriggerMiscTemplate; AreaTriggerCreateProperties _areaTriggerCreateProperties;
AreaTriggerTemplate _areaTriggerTemplate; AreaTriggerTemplate _areaTriggerTemplate;
List<ObjectGuid> _insideUnits = new(); List<ObjectGuid> _insideUnits = new();
@@ -138,43 +138,6 @@ namespace Game.Entities
} }
} }
public struct AreaTriggerOrbitInfo
{
public void Write(WorldPacket data)
{
data.WriteBit(PathTarget.HasValue);
data.WriteBit(Center.HasValue);
data.WriteBit(CounterClockwise);
data.WriteBit(CanLoop);
data.WriteUInt32(TimeToTarget);
data.WriteInt32(ElapsedTimeForMovement);
data.WriteUInt32(StartDelay);
data.WriteFloat(Radius);
data.WriteFloat(BlendFromRadius);
data.WriteFloat(InitialAngle);
data.WriteFloat(ZOffset);
if (PathTarget.HasValue)
data.WritePackedGuid(PathTarget.Value);
if (Center.HasValue)
data.WriteVector3(Center.Value);
}
public Optional<ObjectGuid> PathTarget;
public Optional<Vector3> Center;
public bool CounterClockwise;
public bool CanLoop;
public uint TimeToTarget;
public int ElapsedTimeForMovement;
public uint StartDelay;
public float Radius;
public float BlendFromRadius;
public float InitialAngle;
public float ZOffset;
}
public struct AreaTriggerMovementScriptInfo public struct AreaTriggerMovementScriptInfo
{ {
public uint SpellScriptID; public uint SpellScriptID;
@@ -218,59 +181,87 @@ namespace Game.Entities
} }
} }
public class AreaTriggerTemplate : AreaTriggerData public class AreaTriggerShapeInfo : AreaTriggerData
{ {
public unsafe void InitMaxSearchRadius() public AreaTriggerTypes TriggerType;
public AreaTriggerShapeInfo()
{
TriggerType = AreaTriggerTypes.Max;
}
public unsafe float GetMaxSearchRadius()
{ {
switch (TriggerType) switch (TriggerType)
{ {
case AreaTriggerTypes.Sphere: case AreaTriggerTypes.Sphere:
{ return Math.Max(SphereDatas.Radius, SphereDatas.RadiusTarget);
MaxSearchRadius = Math.Max(SphereDatas.Radius, SphereDatas.RadiusTarget);
break;
}
case AreaTriggerTypes.Box: case AreaTriggerTypes.Box:
{ return MathF.Sqrt(BoxDatas.Extents[0] * BoxDatas.Extents[0] / 4 + BoxDatas.Extents[1] * BoxDatas.Extents[1] / 4);
MaxSearchRadius = (float)Math.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 AreaTriggerTypes.Polygon:
{
if (PolygonDatas.Height <= 0.0f)
PolygonDatas.Height = 1.0f;
break;
}
case AreaTriggerTypes.Cylinder: case AreaTriggerTypes.Cylinder:
{ return CylinderDatas.Radius;
MaxSearchRadius = CylinderDatas.Radius;
break;
}
default:
break;
} }
}
public bool HasFlag(AreaTriggerFlags flag) { return Flags.HasAnyFlag(flag); } return 0.0f;
}
public bool IsSphere() { return TriggerType == AreaTriggerTypes.Sphere; } public bool IsSphere() { return TriggerType == AreaTriggerTypes.Sphere; }
public bool IsBox() { return TriggerType == AreaTriggerTypes.Box; } public bool IsBox() { return TriggerType == AreaTriggerTypes.Box; }
public bool IsPolygon() { return TriggerType == AreaTriggerTypes.Polygon; } public bool IsPolygon() { return TriggerType == AreaTriggerTypes.Polygon; }
public bool IsCylinder() { return TriggerType == AreaTriggerTypes.Cylinder; } public bool IsCylinder() { return TriggerType == AreaTriggerTypes.Cylinder; }
public AreaTriggerId Id;
public AreaTriggerTypes TriggerType;
public AreaTriggerFlags Flags;
public uint ScriptId;
public float MaxSearchRadius;
public List<AreaTriggerAction> Actions = new();
} }
public unsafe class AreaTriggerMiscTemplate public struct AreaTriggerOrbitInfo
{ {
public AreaTriggerMiscTemplate() public void Write(WorldPacket data)
{
data.WriteBit(PathTarget.HasValue);
data.WriteBit(Center.HasValue);
data.WriteBit(CounterClockwise);
data.WriteBit(CanLoop);
data.WriteUInt32(TimeToTarget);
data.WriteInt32(ElapsedTimeForMovement);
data.WriteUInt32(StartDelay);
data.WriteFloat(Radius);
data.WriteFloat(BlendFromRadius);
data.WriteFloat(InitialAngle);
data.WriteFloat(ZOffset);
if (PathTarget.HasValue)
data.WritePackedGuid(PathTarget.Value);
if (Center.HasValue)
data.WriteVector3(Center.Value);
}
public Optional<ObjectGuid> PathTarget;
public Optional<Vector3> Center;
public bool CounterClockwise;
public bool CanLoop;
public uint TimeToTarget;
public int ElapsedTimeForMovement;
public uint StartDelay;
public float Radius;
public float BlendFromRadius;
public float InitialAngle;
public float ZOffset;
}
public class AreaTriggerTemplate
{
public AreaTriggerId Id;
public AreaTriggerFlags Flags;
public uint ScriptId;
public List<AreaTriggerAction> Actions = new();
public bool HasFlag(AreaTriggerFlags flag) { return Flags.HasAnyFlag(flag); }
}
public unsafe class AreaTriggerCreateProperties
{
public AreaTriggerCreateProperties()
{ {
// legacy code from before it was known what each curve field does // legacy code from before it was known what each curve field does
ExtraScale.Raw.Data[5] = 1065353217; ExtraScale.Raw.Data[5] = 1065353217;
@@ -280,24 +271,29 @@ namespace Game.Entities
public bool HasSplines() { return SplinePoints.Count >= 2; } public bool HasSplines() { return SplinePoints.Count >= 2; }
public float GetPolygonMaxSearchRadius() public float GetMaxSearchRadius()
{ {
Position center = new(0.0f, 0.0f); if (Shape.TriggerType == AreaTriggerTypes.Polygon)
float maxSearchRadius = 0.0f;
foreach (var vertice in PolygonVertices)
{ {
float pointDist = center.GetExactDist2d(vertice.X, vertice.Y); Position center = new(0.0f, 0.0f);
float maxSearchRadius = 0.0f;
if (pointDist > maxSearchRadius) foreach (var vertice in PolygonVertices)
maxSearchRadius = pointDist; {
float pointDist = center.GetExactDist2d(vertice.X, vertice.Y);
if (pointDist > maxSearchRadius)
maxSearchRadius = pointDist;
}
return maxSearchRadius;
} }
return maxSearchRadius; return Shape.GetMaxSearchRadius();
} }
public uint MiscId; public uint Id;
public uint AreaTriggerEntry; public AreaTriggerTemplate Template;
public uint MoveCurveId; public uint MoveCurveId;
public uint ScaleCurveId; public uint ScaleCurveId;
@@ -314,13 +310,12 @@ namespace Game.Entities
public AreaTriggerScaleInfo OverrideScale = new(); public AreaTriggerScaleInfo OverrideScale = new();
public AreaTriggerScaleInfo ExtraScale = new(); public AreaTriggerScaleInfo ExtraScale = new();
public AreaTriggerOrbitInfo OrbitInfo;
public AreaTriggerTemplate Template;
public AreaTriggerShapeInfo Shape;
public List<Vector2> PolygonVertices = new(); public List<Vector2> PolygonVertices = new();
public List<Vector2> PolygonVerticesTarget = new(); public List<Vector2> PolygonVerticesTarget = new();
public List<Vector3> SplinePoints = new(); public List<Vector3> SplinePoints = new();
public Optional<AreaTriggerOrbitInfo> OrbitInfo;
} }
public class AreaTriggerSpawn public class AreaTriggerSpawn
@@ -331,6 +326,8 @@ namespace Game.Entities
public uint PhaseId; public uint PhaseId;
public uint PhaseGroup; public uint PhaseGroup;
public byte PhaseUseFlags; public byte PhaseUseFlags;
public AreaTriggerShapeInfo Shape;
} }
public struct AreaTriggerAction public struct AreaTriggerAction
+46 -45
View File
@@ -439,32 +439,33 @@ namespace Game.Entities
if (flags.AreaTrigger) if (flags.AreaTrigger)
{ {
AreaTrigger areaTrigger = ToAreaTrigger(); AreaTrigger areaTrigger = ToAreaTrigger();
AreaTriggerMiscTemplate areaTriggerMiscTemplate = areaTrigger.GetMiscTemplate(); AreaTriggerCreateProperties createProperties = areaTrigger.GetCreateProperties();
AreaTriggerTemplate areaTriggerTemplate = areaTrigger.GetTemplate(); AreaTriggerTemplate areaTriggerTemplate = areaTrigger.GetTemplate();
AreaTriggerShapeInfo shape = areaTrigger.GetShape();
data.WriteUInt32(areaTrigger.GetTimeSinceCreated()); data.WriteUInt32(areaTrigger.GetTimeSinceCreated());
data.WriteVector3(areaTrigger.GetRollPitchYaw()); data.WriteVector3(areaTrigger.GetRollPitchYaw());
bool hasAbsoluteOrientation = areaTriggerTemplate.HasFlag(AreaTriggerFlags.HasAbsoluteOrientation); bool hasAbsoluteOrientation = areaTriggerTemplate != null && areaTriggerTemplate.HasFlag(AreaTriggerFlags.HasAbsoluteOrientation);
bool hasDynamicShape = areaTriggerTemplate.HasFlag(AreaTriggerFlags.HasDynamicShape); bool hasDynamicShape = areaTriggerTemplate != null && areaTriggerTemplate.HasFlag(AreaTriggerFlags.HasDynamicShape);
bool hasAttached = areaTriggerTemplate.HasFlag(AreaTriggerFlags.HasAttached); bool hasAttached = areaTriggerTemplate != null && areaTriggerTemplate.HasFlag(AreaTriggerFlags.HasAttached);
bool hasFaceMovementDir = areaTriggerTemplate.HasFlag(AreaTriggerFlags.HasFaceMovementDir); bool hasFaceMovementDir = areaTriggerTemplate != null && areaTriggerTemplate.HasFlag(AreaTriggerFlags.HasFaceMovementDir);
bool hasFollowsTerrain = areaTriggerTemplate.HasFlag(AreaTriggerFlags.HasFollowsTerrain); bool hasFollowsTerrain = areaTriggerTemplate != null && areaTriggerTemplate.HasFlag(AreaTriggerFlags.HasFollowsTerrain);
bool hasUnk1 = areaTriggerTemplate.HasFlag(AreaTriggerFlags.Unk1); bool hasUnk1 = areaTriggerTemplate != null && areaTriggerTemplate.HasFlag(AreaTriggerFlags.Unk1);
bool hasTargetRollPitchYaw = areaTriggerTemplate.HasFlag(AreaTriggerFlags.HasTargetRollPitchYaw); bool hasTargetRollPitchYaw = areaTriggerTemplate != null && areaTriggerTemplate.HasFlag(AreaTriggerFlags.HasTargetRollPitchYaw);
bool hasScaleCurveID = areaTriggerMiscTemplate.ScaleCurveId != 0; bool hasScaleCurveID = createProperties != null && createProperties.ScaleCurveId != 0;
bool hasMorphCurveID = areaTriggerMiscTemplate.MorphCurveId != 0; bool hasMorphCurveID = createProperties != null && createProperties.MorphCurveId != 0;
bool hasFacingCurveID = areaTriggerMiscTemplate.FacingCurveId != 0; bool hasFacingCurveID = createProperties != null && createProperties.FacingCurveId != 0;
bool hasMoveCurveID = areaTriggerMiscTemplate.MoveCurveId != 0; bool hasMoveCurveID = createProperties != null && createProperties.MoveCurveId != 0;
bool hasAnimation = areaTriggerTemplate.HasFlag(AreaTriggerFlags.HasAnimID); bool hasAnimation = createProperties != null && createProperties.AnimId != 0;
bool hasUnk3 = areaTriggerTemplate.HasFlag(AreaTriggerFlags.Unk3); bool hasUnk3 = areaTriggerTemplate != null && areaTriggerTemplate.HasFlag(AreaTriggerFlags.Unk3);
bool hasAnimKitID = areaTriggerTemplate.HasFlag(AreaTriggerFlags.HasAnimKitID); bool hasAnimKitID = createProperties != null && createProperties.AnimKitId != 0;
bool hasAnimProgress = false; bool hasAnimProgress = false;
bool hasAreaTriggerSphere = areaTriggerTemplate.IsSphere(); bool hasAreaTriggerSphere = shape.IsSphere();
bool hasAreaTriggerBox = areaTriggerTemplate.IsBox(); bool hasAreaTriggerBox = shape.IsBox();
bool hasAreaTriggerPolygon = areaTriggerTemplate.IsPolygon(); bool hasAreaTriggerPolygon = createProperties != null && shape.IsPolygon();
bool hasAreaTriggerCylinder = areaTriggerTemplate.IsCylinder(); bool hasAreaTriggerCylinder = shape.IsCylinder();
bool hasAreaTriggerSpline = areaTrigger.HasSplines(); bool hasAreaTriggerSpline = areaTrigger.HasSplines();
bool hasOrbit = areaTrigger.HasOrbit(); bool hasOrbit = areaTrigger.HasOrbit();
bool hasMovementScript = false; bool hasMovementScript = false;
@@ -509,68 +510,68 @@ namespace Game.Entities
data.WriteVector3(areaTrigger.GetTargetRollPitchYaw()); data.WriteVector3(areaTrigger.GetTargetRollPitchYaw());
if (hasScaleCurveID) if (hasScaleCurveID)
data.WriteUInt32(areaTriggerMiscTemplate.ScaleCurveId); data.WriteUInt32(createProperties.ScaleCurveId);
if (hasMorphCurveID) if (hasMorphCurveID)
data.WriteUInt32(areaTriggerMiscTemplate.MorphCurveId); data.WriteUInt32(createProperties.MorphCurveId);
if (hasFacingCurveID) if (hasFacingCurveID)
data.WriteUInt32(areaTriggerMiscTemplate.FacingCurveId); data.WriteUInt32(createProperties.FacingCurveId);
if (hasMoveCurveID) if (hasMoveCurveID)
data.WriteUInt32(areaTriggerMiscTemplate.MoveCurveId); data.WriteUInt32(createProperties.MoveCurveId);
if (hasAnimation) if (hasAnimation)
data.WriteUInt32(areaTriggerMiscTemplate.AnimId); data.WriteUInt32(createProperties.AnimId);
if (hasAnimKitID) if (hasAnimKitID)
data.WriteUInt32(areaTriggerMiscTemplate.AnimKitId); data.WriteUInt32(createProperties.AnimKitId);
if (hasAnimProgress) if (hasAnimProgress)
data.WriteUInt32(0); data.WriteUInt32(0);
if (hasAreaTriggerSphere) if (hasAreaTriggerSphere)
{ {
data.WriteFloat(areaTriggerTemplate.SphereDatas.Radius); data.WriteFloat(shape.SphereDatas.Radius);
data.WriteFloat(areaTriggerTemplate.SphereDatas.RadiusTarget); data.WriteFloat(shape.SphereDatas.RadiusTarget);
} }
if (hasAreaTriggerBox) if (hasAreaTriggerBox)
{ {
unsafe unsafe
{ {
data.WriteFloat(areaTriggerTemplate.BoxDatas.Extents[0]); data.WriteFloat(shape.BoxDatas.Extents[0]);
data.WriteFloat(areaTriggerTemplate.BoxDatas.Extents[1]); data.WriteFloat(shape.BoxDatas.Extents[1]);
data.WriteFloat(areaTriggerTemplate.BoxDatas.Extents[2]); data.WriteFloat(shape.BoxDatas.Extents[2]);
data.WriteFloat(areaTriggerTemplate.BoxDatas.ExtentsTarget[0]); data.WriteFloat(shape.BoxDatas.ExtentsTarget[0]);
data.WriteFloat(areaTriggerTemplate.BoxDatas.ExtentsTarget[1]); data.WriteFloat(shape.BoxDatas.ExtentsTarget[1]);
data.WriteFloat(areaTriggerTemplate.BoxDatas.ExtentsTarget[2]); data.WriteFloat(shape.BoxDatas.ExtentsTarget[2]);
} }
} }
if (hasAreaTriggerPolygon) if (hasAreaTriggerPolygon)
{ {
data.WriteInt32(areaTriggerTemplate.PolygonVertices.Count); data.WriteInt32(createProperties.PolygonVertices.Count);
data.WriteInt32(areaTriggerTemplate.PolygonVerticesTarget.Count); data.WriteInt32(createProperties.PolygonVerticesTarget.Count);
data.WriteFloat(areaTriggerTemplate.PolygonDatas.Height); data.WriteFloat(shape.PolygonDatas.Height);
data.WriteFloat(areaTriggerTemplate.PolygonDatas.HeightTarget); data.WriteFloat(shape.PolygonDatas.HeightTarget);
foreach (var vertice in areaTriggerTemplate.PolygonVertices) foreach (var vertice in createProperties.PolygonVertices)
data.WriteVector2(vertice); data.WriteVector2(vertice);
foreach (var vertice in areaTriggerTemplate.PolygonVerticesTarget) foreach (var vertice in createProperties.PolygonVerticesTarget)
data.WriteVector2(vertice); data.WriteVector2(vertice);
} }
if (hasAreaTriggerCylinder) if (hasAreaTriggerCylinder)
{ {
data.WriteFloat(areaTriggerTemplate.CylinderDatas.Radius); data.WriteFloat(shape.CylinderDatas.Radius);
data.WriteFloat(areaTriggerTemplate.CylinderDatas.RadiusTarget); data.WriteFloat(shape.CylinderDatas.RadiusTarget);
data.WriteFloat(areaTriggerTemplate.CylinderDatas.Height); data.WriteFloat(shape.CylinderDatas.Height);
data.WriteFloat(areaTriggerTemplate.CylinderDatas.HeightTarget); data.WriteFloat(shape.CylinderDatas.HeightTarget);
data.WriteFloat(areaTriggerTemplate.CylinderDatas.LocationZOffset); data.WriteFloat(shape.CylinderDatas.LocationZOffset);
data.WriteFloat(areaTriggerTemplate.CylinderDatas.LocationZOffsetTarget); data.WriteFloat(shape.CylinderDatas.LocationZOffsetTarget);
} }
//if (hasMovementScript) //if (hasMovementScript)
@@ -0,0 +1,54 @@
RENAME TABLE `spell_areatrigger` TO `areatrigger_create_properties`;
RENAME TABLE `spell_areatrigger_circular` TO `areatrigger_create_properties_orbit`;
RENAME TABLE `spell_areatrigger_splines` TO `areatrigger_create_properties_spline_point`;
RENAME TABLE `spell_areatrigger_vertices` TO `areatrigger_create_properties_polygon_vertex`;
ALTER TABLE `areatrigger_create_properties`
CHANGE `SpellMiscId` `Id` int(10) unsigned NOT NULL,
ADD `Shape` tinyint(0) UNSIGNED NOT NULL DEFAULT '0' AFTER `TimeToTargetScale`,
ADD `ShapeData0` float NOT NULL DEFAULT '0' AFTER `Shape`,
ADD `ShapeData1` float NOT NULL DEFAULT '0' AFTER `ShapeData0`,
ADD `ShapeData2` float NOT NULL DEFAULT '0' AFTER `ShapeData1`,
ADD `ShapeData3` float NOT NULL DEFAULT '0' AFTER `ShapeData2`,
ADD `ShapeData4` float NOT NULL DEFAULT '0' AFTER `ShapeData3`,
ADD `ShapeData5` float NOT NULL DEFAULT '0' AFTER `ShapeData4`;
ALTER TABLE `areatrigger_create_properties_orbit`
CHANGE `SpellMiscId` `AreaTriggerCreatePropertiesId` int(10) unsigned NOT NULL;
ALTER TABLE `areatrigger_create_properties_spline_point`
CHANGE `SpellMiscId` `AreaTriggerCreatePropertiesId` int(10) unsigned NOT NULL;
ALTER TABLE `areatrigger_create_properties_polygon_vertex`
CHANGE `SpellMiscId` `AreaTriggerCreatePropertiesId` int(10) unsigned NOT NULL;
ALTER TABLE `areatrigger`
ADD `Shape` tinyint(0) UNSIGNED NOT NULL DEFAULT '0' AFTER `PhaseGroup`,
ADD `ShapeData0` float NOT NULL DEFAULT '0' AFTER `Shape`,
ADD `ShapeData1` float NOT NULL DEFAULT '0' AFTER `ShapeData0`,
ADD `ShapeData2` float NOT NULL DEFAULT '0' AFTER `ShapeData1`,
ADD `ShapeData3` float NOT NULL DEFAULT '0' AFTER `ShapeData2`,
ADD `ShapeData4` float NOT NULL DEFAULT '0' AFTER `ShapeData3`,
ADD `ShapeData5` float NOT NULL DEFAULT '0' AFTER `ShapeData4`;
UPDATE `areatrigger_create_properties` `acp`
LEFT JOIN `areatrigger_template` `at` ON `acp`.`AreaTriggerId`=`at`.`Id` AND `at`.`IsServerSide`=FALSE
SET `acp`.`Shape`=`at`.`Type`,
`acp`.`ShapeData0`=`at`.`Data0`,
`acp`.`ShapeData1`=`at`.`Data1`,
`acp`.`ShapeData2`=`at`.`Data2`,
`acp`.`ShapeData3`=`at`.`Data3`,
`acp`.`ShapeData4`=`at`.`Data4`,
`acp`.`ShapeData5`=`at`.`Data5`;
UPDATE `areatrigger` `a`
LEFT JOIN `areatrigger_template` `at` ON `a`.`AreaTriggerId`=`at`.`Id` AND `at`.`IsServerSide`=TRUE
SET `a`.`Shape`=`at`.`Type`,
`a`.`ShapeData0`=`at`.`Data0`,
`a`.`ShapeData1`=`at`.`Data1`,
`a`.`ShapeData2`=`at`.`Data2`,
`a`.`ShapeData3`=`at`.`Data3`,
`a`.`ShapeData4`=`at`.`Data4`,
`a`.`ShapeData5`=`at`.`Data5`;
DELETE FROM `areatrigger_template` WHERE `Id`=0 AND `IsServerSide`=FALSE;