diff --git a/Source/Game/DataStorage/AreaTriggerDataStorage.cs b/Source/Game/DataStorage/AreaTriggerDataStorage.cs index 1de5964e8..4bc42763a 100644 --- a/Source/Game/DataStorage/AreaTriggerDataStorage.cs +++ b/Source/Game/DataStorage/AreaTriggerDataStorage.cs @@ -31,9 +31,9 @@ namespace Game.DataStorage public void LoadAreaTriggerTemplates() { uint oldMSTime = Time.GetMSTime(); - MultiMap verticesBySpellMisc = new(); - MultiMap verticesTargetBySpellMisc = new(); - MultiMap splinesBySpellMisc = new(); + MultiMap verticesByCreateProperties = new(); + MultiMap verticesTargetByCreateProperties = new(); + MultiMap splinesByCreateProperties = new(); MultiMap 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(0); + uint areaTriggerCreatePropertiesId = vertices.Read(0); - verticesBySpellMisc.Add(spellMiscId, new Vector2(vertices.Read(2), vertices.Read(3))); + verticesByCreateProperties.Add(areaTriggerCreatePropertiesId, new Vector2(vertices.Read(2), vertices.Read(3))); if (!vertices.IsNull(4) && !vertices.IsNull(5)) - verticesTargetBySpellMisc.Add(spellMiscId, new Vector2(vertices.Read(4), vertices.Read(5))); + verticesTargetByCreateProperties.Add(areaTriggerCreatePropertiesId, new Vector2(vertices.Read(4), vertices.Read(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(1)})."); + Log.outError(LogFilter.Sql, $"Table `areatrigger_create_properties_polygon_vertex` has listed invalid target vertices (AreaTriggerCreatePropertiesId: {areaTriggerCreatePropertiesId}, Index: {vertices.Read(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(0); - + uint areaTriggerCreatePropertiesId = splines.Read(0); Vector3 spline = new(splines.Read(1), splines.Read(2), splines.Read(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(0), templates.Read(1) == 1); - AreaTriggerTypes type = (AreaTriggerTypes)templates.Read(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(3); + areaTriggerTemplate.Flags = (AreaTriggerFlags)templates.Read(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(4 + i); - } - - areaTriggerTemplate.ScriptId = Global.ObjectMgr.GetScriptId(templates.Read(10)); + areaTriggerTemplate.ScriptId = Global.ObjectMgr.GetScriptId(templates.Read(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(0); + AreaTriggerCreateProperties createProperties = new(); + createProperties.Id = areatriggerCreateProperties.Read(0); - uint areatriggerId = areatriggerSpellMiscs.Read(1); - miscTemplate.Template = GetAreaTriggerTemplate(new AreaTriggerId(areatriggerId, false)); + uint areatriggerId = areatriggerCreateProperties.Read(1); + createProperties.Template = GetAreaTriggerTemplate(new AreaTriggerId(areatriggerId, false)); - if (miscTemplate.Template == null) + AreaTriggerTypes shape = (AreaTriggerTypes)areatriggerCreateProperties.Read(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(2)); - miscTemplate.ScaleCurveId = ValidateAndSetCurve(areatriggerSpellMiscs.Read(3)); - miscTemplate.MorphCurveId = ValidateAndSetCurve(areatriggerSpellMiscs.Read(4)); - miscTemplate.FacingCurveId = ValidateAndSetCurve(areatriggerSpellMiscs.Read(5)); + createProperties.MoveCurveId = ValidateAndSetCurve(areatriggerCreateProperties.Read(2)); + createProperties.ScaleCurveId = ValidateAndSetCurve(areatriggerCreateProperties.Read(3)); + createProperties.MorphCurveId = ValidateAndSetCurve(areatriggerCreateProperties.Read(4)); + createProperties.FacingCurveId = ValidateAndSetCurve(areatriggerCreateProperties.Read(5)); - miscTemplate.AnimId = areatriggerSpellMiscs.Read(6); - miscTemplate.AnimKitId = areatriggerSpellMiscs.Read(7); - miscTemplate.DecalPropertiesId = areatriggerSpellMiscs.Read(8); + createProperties.AnimId = areatriggerCreateProperties.Read(6); + createProperties.AnimKitId = areatriggerCreateProperties.Read(7); + createProperties.DecalPropertiesId = areatriggerCreateProperties.Read(8); - miscTemplate.TimeToTarget = areatriggerSpellMiscs.Read(9); - miscTemplate.TimeToTargetScale = areatriggerSpellMiscs.Read(10); + createProperties.TimeToTarget = areatriggerCreateProperties.Read(9); + createProperties.TimeToTargetScale = areatriggerCreateProperties.Read(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(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(0); + uint areaTriggerCreatePropertiesId = circularMovementInfos.Read(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(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(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(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(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(6); orbitInfo.CanLoop = circularMovementInfos.Read(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(0); AreaTriggerId areaTriggerId = new(templates.Read(1), templates.Read(2) == 1); WorldLocation location = new(templates.Read(3), templates.Read(4), templates.Read(5), templates.Read(6), templates.Read(7)); + AreaTriggerTypes shape = (AreaTriggerTypes)templates.Read(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(9); spawn.PhaseGroup = templates.Read(10); + spawn.Shape.TriggerType = shape; + unsafe + { + for (var i = 0; i < SharedConst.MaxAreatriggerEntityData; ++i) + spawn.Shape.DefaultDatas.Data[i] = templates.Read(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 GetAreaTriggersForMapAndCell(uint mapId, uint cellId) @@ -349,6 +370,6 @@ namespace Game.DataStorage Dictionary<(uint mapId, uint cellId), SortedSet> _areaTriggerSpawnsByLocation = new(); Dictionary _areaTriggerSpawnsBySpawnId = new(); Dictionary _areaTriggerTemplateStore = new(); - Dictionary _areaTriggerTemplateSpellMisc = new(); + Dictionary _areaTriggerCreateProperties = new(); } } diff --git a/Source/Game/Entities/AreaTrigger/AreaTrigger.cs b/Source/Game/Entities/AreaTrigger/AreaTrigger.cs index 84f0d7567..40fe34fb0 100644 --- a/Source/Game/Entities/AreaTrigger/AreaTrigger.cs +++ b/Source/Game/Entities/AreaTrigger/AreaTrigger.cs @@ -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 targetList = new(); - switch (GetTemplate().TriggerType) + switch (_shape.TriggerType) { case AreaTriggerTypes.Sphere: SearchUnitInSphere(targetList); @@ -372,12 +375,12 @@ namespace Game.Entities void SearchUnitInSphere(List 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 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 _orbitInfo; - AreaTriggerMiscTemplate _areaTriggerMiscTemplate; + AreaTriggerCreateProperties _areaTriggerCreateProperties; AreaTriggerTemplate _areaTriggerTemplate; List _insideUnits = new(); diff --git a/Source/Game/Entities/AreaTrigger/AreaTriggerTemplate.cs b/Source/Game/Entities/AreaTrigger/AreaTriggerTemplate.cs index 1f959da11..84bfdd057 100644 --- a/Source/Game/Entities/AreaTrigger/AreaTriggerTemplate.cs +++ b/Source/Game/Entities/AreaTrigger/AreaTriggerTemplate.cs @@ -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 PathTarget; - public Optional 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 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 PathTarget; + public Optional 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 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 PolygonVertices = new(); public List PolygonVerticesTarget = new(); public List SplinePoints = new(); + public Optional 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 diff --git a/Source/Game/Entities/Object/WorldObject.cs b/Source/Game/Entities/Object/WorldObject.cs index c7678383c..bf0529987 100644 --- a/Source/Game/Entities/Object/WorldObject.cs +++ b/Source/Game/Entities/Object/WorldObject.cs @@ -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) diff --git a/sql/updates/world/master/2021_09_16_00_world.sql b/sql/updates/world/master/2021_09_16_00_world.sql new file mode 100644 index 000000000..8712024d0 --- /dev/null +++ b/sql/updates/world/master/2021_09_16_00_world.sql @@ -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;