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()
{
uint oldMSTime = Time.GetMSTime();
MultiMap<uint, Vector2> verticesBySpellMisc = new();
MultiMap<uint, Vector2> verticesTargetBySpellMisc = new();
MultiMap<uint, Vector3> splinesBySpellMisc = new();
MultiMap<uint, Vector2> verticesByCreateProperties = new();
MultiMap<uint, Vector2> verticesTargetByCreateProperties = new();
MultiMap<uint, Vector3> splinesByCreateProperties = new();
MultiMap<AreaTriggerId, AreaTriggerAction> actionsByAreaTrigger = new();
// 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.");
}
// 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`");
// 0 1 2 3 4 5
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())
{
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))
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))
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());
}
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
SQLResult splines = DB.World.Query("SELECT SpellMiscId, X, Y, Z FROM `spell_areatrigger_splines` ORDER BY `SpellMiscId`, `Idx`");
// 0 1 2 3
SQLResult splines = DB.World.Query("SELECT AreaTriggerCreatePropertiesId, X, Y, Z FROM `areatrigger_create_properties_spline_point` ORDER BY `AreaTriggerCreatePropertiesId`, `Idx`");
if (!splines.IsEmpty())
{
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));
splinesBySpellMisc.Add(spellMiscId, spline);
splinesByCreateProperties.Add(areaTriggerCreatePropertiesId, spline);
}
while (splines.NextRow());
}
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
SQLResult templates = DB.World.Query("SELECT Id, IsServerSide, Type, Flags, Data0, Data1, Data2, Data3, Data4, Data5, ScriptName FROM `areatrigger_template`");
// 0 1 2 3
SQLResult templates = DB.World.Query("SELECT Id, IsServerSide, Flags, ScriptName FROM `areatrigger_template`");
if (!templates.IsEmpty())
{
do
{
AreaTriggerTemplate areaTriggerTemplate = new();
areaTriggerTemplate.Id = new(templates.Read<uint>(0), templates.Read<byte>(1) == 1);
AreaTriggerTypes type = (AreaTriggerTypes)templates.Read<byte>(2);
if (type >= AreaTriggerTypes.Max)
{
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);
areaTriggerTemplate.Flags = (AreaTriggerFlags)templates.Read<uint>(2);
if (areaTriggerTemplate.Id.IsServerSide && areaTriggerTemplate.Flags != 0)
{
@@ -146,36 +137,39 @@ namespace Game.DataStorage
continue;
}
unsafe
{
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.ScriptId = Global.ObjectMgr.GetScriptId(templates.Read<string>(3));
areaTriggerTemplate.Actions = actionsByAreaTrigger[areaTriggerTemplate.Id];
areaTriggerTemplate.InitMaxSearchRadius();
_areaTriggerTemplateStore[areaTriggerTemplate.Id] = areaTriggerTemplate;
}
while (templates.NextRow());
}
// 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`");
if (!areatriggerSpellMiscs.IsEmpty())
// 0 1 2 3 4 5 6 7 8 9 10
SQLResult areatriggerCreateProperties = DB.World.Query("SELECT Id, AreaTriggerId, MoveCurveId, ScaleCurveId, MorphCurveId, FacingCurveId, AnimId, AnimKitId, DecalPropertiesId, TimeToTarget, TimeToTargetScale, " +
//11 12 13 14 15 16 17
"Shape, ShapeData0, ShapeData1, ShapeData2, ShapeData3, ShapeData4, ShapeData5 FROM `areatrigger_create_properties`");
if (!areatriggerCreateProperties.IsEmpty())
{
do
{
AreaTriggerMiscTemplate miscTemplate = new();
miscTemplate.MiscId = areatriggerSpellMiscs.Read<uint>(0);
AreaTriggerCreateProperties createProperties = new();
createProperties.Id = areatriggerCreateProperties.Read<uint>(0);
uint areatriggerId = areatriggerSpellMiscs.Read<uint>(1);
miscTemplate.Template = GetAreaTriggerTemplate(new AreaTriggerId(areatriggerId, false));
uint areatriggerId = areatriggerCreateProperties.Read<uint>(1);
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;
}
@@ -183,50 +177,61 @@ namespace Game.DataStorage
{
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 value;
}
miscTemplate.MoveCurveId = ValidateAndSetCurve(areatriggerSpellMiscs.Read<uint>(2));
miscTemplate.ScaleCurveId = ValidateAndSetCurve(areatriggerSpellMiscs.Read<uint>(3));
miscTemplate.MorphCurveId = ValidateAndSetCurve(areatriggerSpellMiscs.Read<uint>(4));
miscTemplate.FacingCurveId = ValidateAndSetCurve(areatriggerSpellMiscs.Read<uint>(5));
createProperties.MoveCurveId = ValidateAndSetCurve(areatriggerCreateProperties.Read<uint>(2));
createProperties.ScaleCurveId = ValidateAndSetCurve(areatriggerCreateProperties.Read<uint>(3));
createProperties.MorphCurveId = ValidateAndSetCurve(areatriggerCreateProperties.Read<uint>(4));
createProperties.FacingCurveId = ValidateAndSetCurve(areatriggerCreateProperties.Read<uint>(5));
miscTemplate.AnimId = areatriggerSpellMiscs.Read<uint>(6);
miscTemplate.AnimKitId = areatriggerSpellMiscs.Read<uint>(7);
miscTemplate.DecalPropertiesId = areatriggerSpellMiscs.Read<uint>(8);
createProperties.AnimId = areatriggerCreateProperties.Read<uint>(6);
createProperties.AnimKitId = areatriggerCreateProperties.Read<uint>(7);
createProperties.DecalPropertiesId = areatriggerCreateProperties.Read<uint>(8);
miscTemplate.TimeToTarget = areatriggerSpellMiscs.Read<uint>(9);
miscTemplate.TimeToTargetScale = areatriggerSpellMiscs.Read<uint>(10);
createProperties.TimeToTarget = areatriggerCreateProperties.Read<uint>(9);
createProperties.TimeToTargetScale = areatriggerCreateProperties.Read<uint>(10);
miscTemplate.PolygonVertices = verticesBySpellMisc[miscTemplate.MiscId];
miscTemplate.PolygonVerticesTarget = verticesTargetBySpellMisc[miscTemplate.MiscId];
miscTemplate.SplinePoints = splinesBySpellMisc[miscTemplate.MiscId];
createProperties.Shape.TriggerType = shape;
unsafe
{
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
{
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
SQLResult circularMovementInfos = DB.World.Query("SELECT SpellMiscId, StartDelay, CircleRadius, BlendFromRadius, InitialAngle, ZOffset, CounterClockwise, CanLoop FROM `spell_areatrigger_circular` ORDER BY `SpellMiscId`");
// 0 1 2 3 4 5 6 7
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())
{
do
{
uint spellMiscId = circularMovementInfos.Read<uint>(0);
uint areaTriggerCreatePropertiesId = circularMovementInfos.Read<uint>(0);
var atSpellMisc = _areaTriggerTemplateSpellMisc.LookupByKey(spellMiscId);
if (atSpellMisc == null)
var createProperties = _areaTriggerCreateProperties.LookupByKey(areaTriggerCreatePropertiesId);
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;
}
@@ -236,41 +241,41 @@ namespace Game.DataStorage
orbitInfo.Radius = circularMovementInfos.Read<float>(2);
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.BlendFromRadius = circularMovementInfos.Read<float>(3);
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.InitialAngle = circularMovementInfos.Read<float>(4);
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.ZOffset = circularMovementInfos.Read<float>(5);
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.CounterClockwise = circularMovementInfos.Read<bool>(6);
orbitInfo.CanLoop = circularMovementInfos.Read<bool>(7);
atSpellMisc.OrbitInfo = orbitInfo;
createProperties.OrbitInfo.Set(orbitInfo);
}
while (circularMovementInfos.NextRow());
}
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.");
@@ -281,7 +286,9 @@ namespace Game.DataStorage
uint oldMSTime = Time.GetMSTime();
// Load area trigger positions (to put them on the server)
// 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())
{
do
@@ -289,6 +296,7 @@ namespace Game.DataStorage
ulong spawnId = templates.Read<ulong>(0);
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));
AreaTriggerTypes shape = (AreaTriggerTypes)templates.Read<byte>(11);
if (GetAreaTriggerTemplate(areaTriggerId) == null)
{
@@ -302,6 +310,12 @@ namespace Game.DataStorage
continue;
}
if (shape >= AreaTriggerTypes.Max)
{
Log.outError(LogFilter.Sql, $"Table `areatrigger` has listed areatrigger SpawnId: {spawnId} with invalid shape {shape}.");
continue;
}
AreaTriggerSpawn spawn = new();
spawn.SpawnId = spawnId;
spawn.Id = areaTriggerId;
@@ -311,6 +325,13 @@ namespace Game.DataStorage
spawn.PhaseId = templates.Read<uint>(9);
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
CellCoord cellCoord = GridDefines.ComputeCellCoord(spawn.Location.GetPositionX(), spawn.Location.GetPositionY());
if (!_areaTriggerSpawnsByLocation.ContainsKey((spawn.Location.GetMapId(), cellCoord.GetId())))
@@ -331,9 +352,9 @@ namespace Game.DataStorage
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)
@@ -349,6 +370,6 @@ namespace Game.DataStorage
Dictionary<(uint mapId, uint cellId), SortedSet<ulong>> _areaTriggerSpawnsByLocation = new();
Dictionary<ulong, AreaTriggerSpawn> _areaTriggerSpawnsBySpawnId = 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;
_aurEff = aurEff;
@@ -87,30 +87,30 @@ namespace Game.Entities
Relocate(pos);
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;
}
_areaTriggerMiscTemplate = Global.AreaTriggerDataStorage.GetAreaTriggerMiscTemplate(spellMiscId);
if (_areaTriggerMiscTemplate == null)
_areaTriggerCreateProperties = Global.AreaTriggerDataStorage.GetAreaTriggerCreateProperties(areaTriggerCreatePropertiesId);
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;
}
_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);
SetObjectScale(1.0f);
if (GetTemplate().IsPolygon())
_maxSearchRadius = GetMiscTemplate().GetPolygonMaxSearchRadius();
else
_maxSearchRadius = GetTemplate().MaxSearchRadius;
_shape = GetCreateProperties().Shape;
_maxSearchRadius = GetCreateProperties().GetMaxSearchRadius();
SetUpdateFieldValue(m_values.ModifyValue(m_areaTriggerData).ModifyValue(m_areaTriggerData.Caster), caster.GetGUID());
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.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.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);
if (GetMiscTemplate().ExtraScale.Structured.StartTimeOffset != 0)
SetUpdateFieldValue(extraScaleCurve.ModifyValue(extraScaleCurve.StartTimeOffset), GetMiscTemplate().ExtraScale.Structured.StartTimeOffset);
if (GetMiscTemplate().ExtraScale.Structured.X != 0 || GetMiscTemplate().ExtraScale.Structured.Y != 0)
if (GetCreateProperties().ExtraScale.Structured.StartTimeOffset != 0)
SetUpdateFieldValue(extraScaleCurve.ModifyValue(extraScaleCurve.StartTimeOffset), GetCreateProperties().ExtraScale.Structured.StartTimeOffset);
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);
}
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);
}
unsafe
{
if (GetMiscTemplate().ExtraScale.Raw.Data[5] != 0)
SetUpdateFieldValue(extraScaleCurve.ModifyValue(extraScaleCurve.ParameterCurve), GetMiscTemplate().ExtraScale.Raw.Data[5]);
if (GetMiscTemplate().ExtraScale.Structured.OverrideActive != 0)
SetUpdateFieldValue(extraScaleCurve.ModifyValue(extraScaleCurve.OverrideActive), GetMiscTemplate().ExtraScale.Structured.OverrideActive != 0);
if (GetCreateProperties().ExtraScale.Raw.Data[5] != 0)
SetUpdateFieldValue(extraScaleCurve.ModifyValue(extraScaleCurve.ParameterCurve), GetCreateProperties().ExtraScale.Raw.Data[5]);
if (GetCreateProperties().ExtraScale.Structured.OverrideActive != 0)
SetUpdateFieldValue(extraScaleCurve.ModifyValue(extraScaleCurve.OverrideActive), GetCreateProperties().ExtraScale.Structured.OverrideActive != 0);
}
PhasingHandler.InheritPhaseShift(this, caster);
if (target && GetTemplate().HasFlag(AreaTriggerFlags.HasAttached))
if (target && GetTemplate() != null && GetTemplate().HasFlag(AreaTriggerFlags.HasAttached))
{
m_movementInfo.transport.guid = target.GetGUID();
}
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;
if (target && GetTemplate().HasFlag(AreaTriggerFlags.HasAttached))
cmi.PathTarget.Set(target.GetGUID());
AreaTriggerOrbitInfo orbit = GetCreateProperties().OrbitInfo.Value;
if (target && GetTemplate() != null && GetTemplate().HasFlag(AreaTriggerFlags.HasAttached))
orbit.PathTarget.Set(target.GetGUID());
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
@@ -208,10 +208,10 @@ namespace Game.Entities
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();
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 at;
@@ -248,6 +248,9 @@ namespace Game.Entities
SetObjectScale(1.0f);
_shape = position.Shape;
_maxSearchRadius = _shape.GetMaxSearchRadius();
if (position.PhaseUseFlags != 0 || position.PhaseId != 0 || position.PhaseGroup != 0)
PhasingHandler.InitDbPhaseShift(GetPhaseShift(), (PhaseUseFlagsValues)position.PhaseUseFlags, position.PhaseId, position.PhaseGroup);
@@ -272,7 +275,7 @@ namespace Game.Entities
{
UpdateOrbitPosition(diff);
}
else if (GetTemplate().HasFlag(AreaTriggerFlags.HasAttached))
else if (GetTemplate() != null && GetTemplate().HasFlag(AreaTriggerFlags.HasAttached))
{
Unit target = GetTarget();
if (target)
@@ -334,7 +337,7 @@ namespace Game.Entities
{
List<Unit> targetList = new();
switch (GetTemplate().TriggerType)
switch (_shape.TriggerType)
{
case AreaTriggerTypes.Sphere:
SearchUnitInSphere(targetList);
@@ -372,12 +375,12 @@ namespace Game.Entities
void SearchUnitInSphere(List<Unit> targetList)
{
float radius = GetTemplate().SphereDatas.Radius;
if (GetTemplate().HasFlag(AreaTriggerFlags.HasDynamicShape))
float radius = _shape.SphereDatas.Radius;
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
{
extentsX = GetTemplate().BoxDatas.Extents[0];
extentsY = GetTemplate().BoxDatas.Extents[1];
extentsZ = GetTemplate().BoxDatas.Extents[2];
extentsX = _shape.BoxDatas.Extents[0];
extentsY = _shape.BoxDatas.Extents[1];
extentsZ = _shape.BoxDatas.Extents[2];
}
targetList.RemoveAll(unit => !unit.IsWithinBox(boxCenter, extentsX, extentsY, extentsZ));
@@ -405,7 +408,7 @@ namespace Game.Entities
{
SearchUnits(targetList, GetMaxSearchRadius(), false);
float height = GetTemplate().PolygonDatas.Height;
float height = _shape.PolygonDatas.Height;
float minZ = GetPositionZ() - height;
float maxZ = GetPositionZ() + height;
@@ -416,7 +419,7 @@ namespace Game.Entities
{
SearchUnits(targetList, GetMaxSearchRadius(), false);
float height = GetTemplate().CylinderDatas.Height;
float height = _shape.CylinderDatas.Height;
float minZ = GetPositionZ() - height;
float maxZ = GetPositionZ() + height;
@@ -445,7 +448,7 @@ namespace Game.Entities
if (player)
{
if (player.IsDebugAreaTriggers)
player.SendSysMessage(CypherStrings.DebugAreatriggerEntered, GetTemplate().Id);
player.SendSysMessage(CypherStrings.DebugAreatriggerEntered, GetEntry());
player.UpdateQuestObjectiveProgress(QuestObjectiveType.AreaTriggerEnter, (int)GetEntry(), 1);
}
@@ -464,7 +467,7 @@ namespace Game.Entities
if (player)
{
if (player.IsDebugAreaTriggers)
player.SendSysMessage(CypherStrings.DebugAreatriggerLeft, GetTemplate().Id);
player.SendSysMessage(CypherStrings.DebugAreatriggerLeft, GetEntry());
player.UpdateQuestObjectiveProgress(QuestObjectiveType.AreaTriggerExit, (int)GetEntry(), 1);
}
@@ -483,7 +486,7 @@ namespace Game.Entities
public uint GetScriptId()
{
return GetTemplate().ScriptId;
return GetTemplate() != null ? GetTemplate().ScriptId : 0;
}
public Unit GetCaster()
@@ -513,7 +516,7 @@ namespace Game.Entities
if (MathFunctions.fuzzyEq(_previousCheckOrientation, newOrientation))
return;
_polygonVertices = GetMiscTemplate().PolygonVertices;
_polygonVertices = GetCreateProperties().PolygonVertices;
float angleSin = (float)Math.Sin(newOrientation);
float angleCos = (float)Math.Cos(newOrientation);
@@ -601,7 +604,7 @@ namespace Game.Entities
public void UpdateShape()
{
if (GetTemplate().IsPolygon())
if (_shape.IsPolygon())
UpdatePolygonOrientation();
}
@@ -630,7 +633,7 @@ namespace Game.Entities
void DoActions(Unit unit)
{
Unit caster = IsServerSide() ? unit : GetCaster();
if (caster)
if (caster != null && GetTemplate() != null)
{
foreach (AreaTriggerAction action in GetTemplate().Actions)
{
@@ -663,10 +666,13 @@ namespace Game.Entities
void UndoActions(Unit unit)
{
foreach (AreaTriggerAction action in GetTemplate().Actions)
if (GetTemplate() != null)
{
if (action.ActionType == AreaTriggerActionTypes.Cast || action.ActionType == AreaTriggerActionTypes.AddAura)
unit.RemoveAurasDueToSpell(action.Param, GetCasterGuid());
foreach (AreaTriggerAction action in GetTemplate().Actions)
{
if (action.ActionType == AreaTriggerActionTypes.Cast || action.ActionType == AreaTriggerActionTypes.AddAura)
unit.RemoveAurasDueToSpell(action.Param, GetCasterGuid());
}
}
}
@@ -730,10 +736,10 @@ namespace Game.Entities
_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
Cypher.Assert(cmi.Center.HasValue || cmi.PathTarget.HasValue);
Cypher.Assert(orbit.Center.HasValue || orbit.PathTarget.HasValue);
// should be sent in object create packets only
DoWithSuppressingObjectUpdates(() =>
@@ -742,7 +748,7 @@ namespace Game.Entities
m_areaTriggerData.ClearChanged(m_areaTriggerData.TimeToTarget);
});
_orbitInfo.Set(cmi);
_orbitInfo.Set(orbit);
_orbitInfo.Value.TimeToTarget = timeToTarget;
_orbitInfo.Value.ElapsedTimeForMovement = 0;
@@ -861,13 +867,12 @@ namespace Game.Entities
if (currentTimePercent <= 0.0f)
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)
{
Log.outError(LogFilter.AreaTrigger, "AreaTrigger (Id: {0}, SpellMiscId: {1}) has wrong progress ({2}) caused by curve calculation (MoveCurveId: {3})",
GetTemplate().Id, GetMiscTemplate().MiscId, progress, GetMiscTemplate().MorphCurveId);
Log.outError(LogFilter.AreaTrigger, $"AreaTrigger (Id: {GetEntry()}, AreaTriggerCreatePropertiesId: {GetCreateProperties().Id}) has wrong progress ({progress}) caused by curve calculation (MoveCurveId: {GetCreateProperties().MorphCurveId})");
}
else
currentTimePercent = progress;
@@ -881,7 +886,7 @@ namespace Game.Entities
_spline.Evaluate_Percent(lastPositionIndex, percentFromLastPoint, out currentPosition);
float orientation = GetOrientation();
if (GetTemplate().HasFlag(AreaTriggerFlags.HasFaceMovementDir))
if (GetTemplate() != null && GetTemplate().HasFlag(AreaTriggerFlags.HasFaceMovementDir))
{
Vector3 nextPoint = _spline.GetPoint(lastPositionIndex + 1);
orientation = GetAngle(nextPoint.X, nextPoint.Y);
@@ -1014,11 +1019,12 @@ namespace Game.Entities
public List<ObjectGuid> GetInsideUnits() { return _insideUnits; }
public AreaTriggerMiscTemplate GetMiscTemplate() { return _areaTriggerMiscTemplate; }
public AreaTriggerCreateProperties GetCreateProperties() { return _areaTriggerCreateProperties; }
public override ObjectGuid GetOwnerGUID() { return GetCasterGuid(); }
public ObjectGuid GetCasterGuid() { return m_areaTriggerData.Caster; }
public AreaTriggerShapeInfo GetShape() { return _shape; }
float GetMaxSearchRadius() { return _maxSearchRadius; }
public Vector3 GetRollPitchYaw() { return _rollPitchYaw; }
public Vector3 GetTargetRollPitchYaw() { return _targetRollPitchYaw; }
@@ -1035,6 +1041,7 @@ namespace Game.Entities
AuraEffect _aurEff;
AreaTriggerShapeInfo _shape;
float _maxSearchRadius;
int _duration;
int _totalDuration;
@@ -1053,7 +1060,7 @@ namespace Game.Entities
Optional<AreaTriggerOrbitInfo> _orbitInfo;
AreaTriggerMiscTemplate _areaTriggerMiscTemplate;
AreaTriggerCreateProperties _areaTriggerCreateProperties;
AreaTriggerTemplate _areaTriggerTemplate;
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 uint SpellScriptID;
@@ -218,59 +181,87 @@ namespace Game.Entities
}
}
public class AreaTriggerTemplate : AreaTriggerData
{
public unsafe void InitMaxSearchRadius()
public class AreaTriggerShapeInfo : AreaTriggerData
{
public AreaTriggerTypes TriggerType;
public AreaTriggerShapeInfo()
{
TriggerType = AreaTriggerTypes.Max;
}
public unsafe float GetMaxSearchRadius()
{
switch (TriggerType)
{
case AreaTriggerTypes.Sphere:
{
MaxSearchRadius = Math.Max(SphereDatas.Radius, SphereDatas.RadiusTarget);
break;
}
return Math.Max(SphereDatas.Radius, SphereDatas.RadiusTarget);
case AreaTriggerTypes.Box:
{
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;
}
return MathF.Sqrt(BoxDatas.Extents[0] * BoxDatas.Extents[0] / 4 + BoxDatas.Extents[1] * BoxDatas.Extents[1] / 4);
case AreaTriggerTypes.Cylinder:
{
MaxSearchRadius = CylinderDatas.Radius;
break;
}
default:
break;
return CylinderDatas.Radius;
}
}
public bool HasFlag(AreaTriggerFlags flag) { return Flags.HasAnyFlag(flag); }
return 0.0f;
}
public bool IsSphere() { return TriggerType == AreaTriggerTypes.Sphere; }
public bool IsBox() { return TriggerType == AreaTriggerTypes.Box; }
public bool IsPolygon() { return TriggerType == AreaTriggerTypes.Polygon; }
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
ExtraScale.Raw.Data[5] = 1065353217;
@@ -280,24 +271,29 @@ namespace Game.Entities
public bool HasSplines() { return SplinePoints.Count >= 2; }
public float GetPolygonMaxSearchRadius()
public float GetMaxSearchRadius()
{
Position center = new(0.0f, 0.0f);
float maxSearchRadius = 0.0f;
foreach (var vertice in PolygonVertices)
if (Shape.TriggerType == AreaTriggerTypes.Polygon)
{
float pointDist = center.GetExactDist2d(vertice.X, vertice.Y);
Position center = new(0.0f, 0.0f);
float maxSearchRadius = 0.0f;
if (pointDist > maxSearchRadius)
maxSearchRadius = pointDist;
foreach (var vertice in PolygonVertices)
{
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 AreaTriggerEntry;
public uint Id;
public AreaTriggerTemplate Template;
public uint MoveCurveId;
public uint ScaleCurveId;
@@ -314,13 +310,12 @@ namespace Game.Entities
public AreaTriggerScaleInfo OverrideScale = new();
public AreaTriggerScaleInfo ExtraScale = new();
public AreaTriggerOrbitInfo OrbitInfo;
public AreaTriggerTemplate Template;
public AreaTriggerShapeInfo Shape;
public List<Vector2> PolygonVertices = new();
public List<Vector2> PolygonVerticesTarget = new();
public List<Vector3> SplinePoints = new();
public Optional<AreaTriggerOrbitInfo> OrbitInfo;
}
public class AreaTriggerSpawn
@@ -331,6 +326,8 @@ namespace Game.Entities
public uint PhaseId;
public uint PhaseGroup;
public byte PhaseUseFlags;
public AreaTriggerShapeInfo Shape;
}
public struct AreaTriggerAction
+46 -45
View File
@@ -439,32 +439,33 @@ namespace Game.Entities
if (flags.AreaTrigger)
{
AreaTrigger areaTrigger = ToAreaTrigger();
AreaTriggerMiscTemplate areaTriggerMiscTemplate = areaTrigger.GetMiscTemplate();
AreaTriggerCreateProperties createProperties = areaTrigger.GetCreateProperties();
AreaTriggerTemplate areaTriggerTemplate = areaTrigger.GetTemplate();
AreaTriggerShapeInfo shape = areaTrigger.GetShape();
data.WriteUInt32(areaTrigger.GetTimeSinceCreated());
data.WriteVector3(areaTrigger.GetRollPitchYaw());
bool hasAbsoluteOrientation = areaTriggerTemplate.HasFlag(AreaTriggerFlags.HasAbsoluteOrientation);
bool hasDynamicShape = areaTriggerTemplate.HasFlag(AreaTriggerFlags.HasDynamicShape);
bool hasAttached = areaTriggerTemplate.HasFlag(AreaTriggerFlags.HasAttached);
bool hasFaceMovementDir = areaTriggerTemplate.HasFlag(AreaTriggerFlags.HasFaceMovementDir);
bool hasFollowsTerrain = areaTriggerTemplate.HasFlag(AreaTriggerFlags.HasFollowsTerrain);
bool hasUnk1 = areaTriggerTemplate.HasFlag(AreaTriggerFlags.Unk1);
bool hasTargetRollPitchYaw = areaTriggerTemplate.HasFlag(AreaTriggerFlags.HasTargetRollPitchYaw);
bool hasScaleCurveID = areaTriggerMiscTemplate.ScaleCurveId != 0;
bool hasMorphCurveID = areaTriggerMiscTemplate.MorphCurveId != 0;
bool hasFacingCurveID = areaTriggerMiscTemplate.FacingCurveId != 0;
bool hasMoveCurveID = areaTriggerMiscTemplate.MoveCurveId != 0;
bool hasAnimation = areaTriggerTemplate.HasFlag(AreaTriggerFlags.HasAnimID);
bool hasUnk3 = areaTriggerTemplate.HasFlag(AreaTriggerFlags.Unk3);
bool hasAnimKitID = areaTriggerTemplate.HasFlag(AreaTriggerFlags.HasAnimKitID);
bool hasAbsoluteOrientation = areaTriggerTemplate != null && areaTriggerTemplate.HasFlag(AreaTriggerFlags.HasAbsoluteOrientation);
bool hasDynamicShape = areaTriggerTemplate != null && areaTriggerTemplate.HasFlag(AreaTriggerFlags.HasDynamicShape);
bool hasAttached = areaTriggerTemplate != null && areaTriggerTemplate.HasFlag(AreaTriggerFlags.HasAttached);
bool hasFaceMovementDir = areaTriggerTemplate != null && areaTriggerTemplate.HasFlag(AreaTriggerFlags.HasFaceMovementDir);
bool hasFollowsTerrain = areaTriggerTemplate != null && areaTriggerTemplate.HasFlag(AreaTriggerFlags.HasFollowsTerrain);
bool hasUnk1 = areaTriggerTemplate != null && areaTriggerTemplate.HasFlag(AreaTriggerFlags.Unk1);
bool hasTargetRollPitchYaw = areaTriggerTemplate != null && areaTriggerTemplate.HasFlag(AreaTriggerFlags.HasTargetRollPitchYaw);
bool hasScaleCurveID = createProperties != null && createProperties.ScaleCurveId != 0;
bool hasMorphCurveID = createProperties != null && createProperties.MorphCurveId != 0;
bool hasFacingCurveID = createProperties != null && createProperties.FacingCurveId != 0;
bool hasMoveCurveID = createProperties != null && createProperties.MoveCurveId != 0;
bool hasAnimation = createProperties != null && createProperties.AnimId != 0;
bool hasUnk3 = areaTriggerTemplate != null && areaTriggerTemplate.HasFlag(AreaTriggerFlags.Unk3);
bool hasAnimKitID = createProperties != null && createProperties.AnimKitId != 0;
bool hasAnimProgress = false;
bool hasAreaTriggerSphere = areaTriggerTemplate.IsSphere();
bool hasAreaTriggerBox = areaTriggerTemplate.IsBox();
bool hasAreaTriggerPolygon = areaTriggerTemplate.IsPolygon();
bool hasAreaTriggerCylinder = areaTriggerTemplate.IsCylinder();
bool hasAreaTriggerSphere = shape.IsSphere();
bool hasAreaTriggerBox = shape.IsBox();
bool hasAreaTriggerPolygon = createProperties != null && shape.IsPolygon();
bool hasAreaTriggerCylinder = shape.IsCylinder();
bool hasAreaTriggerSpline = areaTrigger.HasSplines();
bool hasOrbit = areaTrigger.HasOrbit();
bool hasMovementScript = false;
@@ -509,68 +510,68 @@ namespace Game.Entities
data.WriteVector3(areaTrigger.GetTargetRollPitchYaw());
if (hasScaleCurveID)
data.WriteUInt32(areaTriggerMiscTemplate.ScaleCurveId);
data.WriteUInt32(createProperties.ScaleCurveId);
if (hasMorphCurveID)
data.WriteUInt32(areaTriggerMiscTemplate.MorphCurveId);
data.WriteUInt32(createProperties.MorphCurveId);
if (hasFacingCurveID)
data.WriteUInt32(areaTriggerMiscTemplate.FacingCurveId);
data.WriteUInt32(createProperties.FacingCurveId);
if (hasMoveCurveID)
data.WriteUInt32(areaTriggerMiscTemplate.MoveCurveId);
data.WriteUInt32(createProperties.MoveCurveId);
if (hasAnimation)
data.WriteUInt32(areaTriggerMiscTemplate.AnimId);
data.WriteUInt32(createProperties.AnimId);
if (hasAnimKitID)
data.WriteUInt32(areaTriggerMiscTemplate.AnimKitId);
data.WriteUInt32(createProperties.AnimKitId);
if (hasAnimProgress)
data.WriteUInt32(0);
if (hasAreaTriggerSphere)
{
data.WriteFloat(areaTriggerTemplate.SphereDatas.Radius);
data.WriteFloat(areaTriggerTemplate.SphereDatas.RadiusTarget);
data.WriteFloat(shape.SphereDatas.Radius);
data.WriteFloat(shape.SphereDatas.RadiusTarget);
}
if (hasAreaTriggerBox)
{
unsafe
{
data.WriteFloat(areaTriggerTemplate.BoxDatas.Extents[0]);
data.WriteFloat(areaTriggerTemplate.BoxDatas.Extents[1]);
data.WriteFloat(areaTriggerTemplate.BoxDatas.Extents[2]);
data.WriteFloat(shape.BoxDatas.Extents[0]);
data.WriteFloat(shape.BoxDatas.Extents[1]);
data.WriteFloat(shape.BoxDatas.Extents[2]);
data.WriteFloat(areaTriggerTemplate.BoxDatas.ExtentsTarget[0]);
data.WriteFloat(areaTriggerTemplate.BoxDatas.ExtentsTarget[1]);
data.WriteFloat(areaTriggerTemplate.BoxDatas.ExtentsTarget[2]);
data.WriteFloat(shape.BoxDatas.ExtentsTarget[0]);
data.WriteFloat(shape.BoxDatas.ExtentsTarget[1]);
data.WriteFloat(shape.BoxDatas.ExtentsTarget[2]);
}
}
if (hasAreaTriggerPolygon)
{
data.WriteInt32(areaTriggerTemplate.PolygonVertices.Count);
data.WriteInt32(areaTriggerTemplate.PolygonVerticesTarget.Count);
data.WriteFloat(areaTriggerTemplate.PolygonDatas.Height);
data.WriteFloat(areaTriggerTemplate.PolygonDatas.HeightTarget);
data.WriteInt32(createProperties.PolygonVertices.Count);
data.WriteInt32(createProperties.PolygonVerticesTarget.Count);
data.WriteFloat(shape.PolygonDatas.Height);
data.WriteFloat(shape.PolygonDatas.HeightTarget);
foreach (var vertice in areaTriggerTemplate.PolygonVertices)
foreach (var vertice in createProperties.PolygonVertices)
data.WriteVector2(vertice);
foreach (var vertice in areaTriggerTemplate.PolygonVerticesTarget)
foreach (var vertice in createProperties.PolygonVerticesTarget)
data.WriteVector2(vertice);
}
if (hasAreaTriggerCylinder)
{
data.WriteFloat(areaTriggerTemplate.CylinderDatas.Radius);
data.WriteFloat(areaTriggerTemplate.CylinderDatas.RadiusTarget);
data.WriteFloat(areaTriggerTemplate.CylinderDatas.Height);
data.WriteFloat(areaTriggerTemplate.CylinderDatas.HeightTarget);
data.WriteFloat(areaTriggerTemplate.CylinderDatas.LocationZOffset);
data.WriteFloat(areaTriggerTemplate.CylinderDatas.LocationZOffsetTarget);
data.WriteFloat(shape.CylinderDatas.Radius);
data.WriteFloat(shape.CylinderDatas.RadiusTarget);
data.WriteFloat(shape.CylinderDatas.Height);
data.WriteFloat(shape.CylinderDatas.HeightTarget);
data.WriteFloat(shape.CylinderDatas.LocationZOffset);
data.WriteFloat(shape.CylinderDatas.LocationZOffsetTarget);
}
//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;