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:
@@ -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();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -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
|
||||||
|
|||||||
@@ -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;
|
||||||
Reference in New Issue
Block a user