public void LoadAreaTriggerTemplates()
        {
            uint oldMSTime = Time.GetMSTime();
            MultiMap <uint, Vector2> verticesByCreateProperties              = new();
            MultiMap <uint, Vector2> verticesTargetByCreateProperties        = new();
            MultiMap <uint, Vector3> splinesByCreateProperties               = new();
            MultiMap <AreaTriggerId, AreaTriggerAction> actionsByAreaTrigger = new();

            //                                                       0         1             2            3           4
            SQLResult templateActions = DB.World.Query("SELECT AreaTriggerId, IsServerSide, ActionType, ActionParam, TargetType FROM `areatrigger_template_actions`");

            if (!templateActions.IsEmpty())
            {
                do
                {
                    AreaTriggerId areaTriggerId = new(templateActions.Read <uint>(0), templateActions.Read <byte>(1) == 1);

                    AreaTriggerAction action;
                    action.Param      = templateActions.Read <uint>(3);
                    action.ActionType = (AreaTriggerActionTypes)templateActions.Read <uint>(2);
                    action.TargetType = (AreaTriggerActionUserTypes)templateActions.Read <uint>(4);

                    if (action.ActionType >= AreaTriggerActionTypes.Max)
                    {
                        Log.outError(LogFilter.Sql, $"Table `areatrigger_template_actions` has invalid ActionType ({action.ActionType}, IsServerSide: {areaTriggerId.IsServerSide}) for AreaTriggerId {areaTriggerId.Id} and Param {action.Param}");
                        continue;
                    }

                    if (action.TargetType >= AreaTriggerActionUserTypes.Max)
                    {
                        Log.outError(LogFilter.Sql, $"Table `areatrigger_template_actions` has invalid TargetType ({action.TargetType}, IsServerSide: {areaTriggerId.IsServerSide}) for AreaTriggerId {areaTriggerId} and Param {action.Param}");
                        continue;
                    }


                    if (action.ActionType == AreaTriggerActionTypes.Teleport)
                    {
                        if (Global.ObjectMgr.GetWorldSafeLoc(action.Param) == null)
                        {
                            Log.outError(LogFilter.Sql, $"Table `areatrigger_template_actions` has invalid (Id: {areaTriggerId}, IsServerSide: {areaTriggerId.IsServerSide}) with TargetType=Teleport and Param ({action.Param}) not a valid world safe loc entry");
                            continue;
                        }
                    }

                    actionsByAreaTrigger.Add(areaTriggerId, action);
                }while (templateActions.NextRow());
            }
            else
            {
                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 AreaTriggerCreatePropertiesId, Idx, VerticeX, VerticeY, VerticeTargetX, VerticeTargetY FROM `areatrigger_create_properties_polygon_vertex` ORDER BY `AreaTriggerCreatePropertiesId`, `Idx`");

            if (!vertices.IsEmpty())
            {
                do
                {
                    uint areaTriggerCreatePropertiesId = vertices.Read <uint>(0);

                    verticesByCreateProperties.Add(areaTriggerCreatePropertiesId, new Vector2(vertices.Read <float>(2), vertices.Read <float>(3)));

                    if (!vertices.IsNull(4) && !vertices.IsNull(5))
                    {
                        verticesTargetByCreateProperties.Add(areaTriggerCreatePropertiesId, new Vector2(vertices.Read <float>(4), vertices.Read <float>(5)));
                    }
                    else if (vertices.IsNull(4) != vertices.IsNull(5))
                    {
                        Log.outError(LogFilter.Sql, $"Table `areatrigger_create_properties_polygon_vertex` has listed invalid target vertices (AreaTriggerCreatePropertiesId: {areaTriggerCreatePropertiesId}, Index: {vertices.Read<uint>(1)}).");
                    }
                }while (vertices.NextRow());
            }
            else
            {
                Log.outInfo(LogFilter.ServerLoading, "Loaded 0 AreaTrigger polygon polygon vertices. DB table `areatrigger_create_properties_polygon_vertex` is empty.");
            }

            //                                         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    areaTriggerCreatePropertiesId = splines.Read <uint>(0);
                    Vector3 spline = new(splines.Read <float>(1), splines.Read <float>(2), splines.Read <float>(3));

                    splinesByCreateProperties.Add(areaTriggerCreatePropertiesId, spline);
                }while (splines.NextRow());
            }
            else
            {
                Log.outInfo(LogFilter.ServerLoading, "Loaded 0 AreaTrigger splines. DB table `areatrigger_create_properties_spline_point` is empty.");
            }

            //                                            0   1             2
            SQLResult templates = DB.World.Query("SELECT Id, IsServerSide, Flags FROM `areatrigger_template`");

            if (!templates.IsEmpty())
            {
                do
                {
                    AreaTriggerTemplate areaTriggerTemplate = new();
                    areaTriggerTemplate.Id = new(templates.Read <uint>(0), templates.Read <byte>(1) == 1);

                    areaTriggerTemplate.Flags = (AreaTriggerFlags)templates.Read <uint>(2);

                    if (areaTriggerTemplate.Id.IsServerSide && areaTriggerTemplate.Flags != 0)
                    {
                        Log.outError(LogFilter.Sql, $"Table `areatrigger_template` has listed server-side areatrigger (Id: {areaTriggerTemplate.Id.Id}, IsServerSide: {areaTriggerTemplate.Id.IsServerSide}) with none-zero flags");
                        continue;
                    }

                    areaTriggerTemplate.Actions = actionsByAreaTrigger[areaTriggerTemplate.Id];

                    _areaTriggerTemplateStore[areaTriggerTemplate.Id] = areaTriggerTemplate;
                }while (templates.NextRow());
            }

            //                                                              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          18
                                                                   "Shape, ShapeData0, ShapeData1, ShapeData2, ShapeData3, ShapeData4, ShapeData5, ScriptName FROM `areatrigger_create_properties`");

            if (!areatriggerCreateProperties.IsEmpty())
            {
                do
                {
                    AreaTriggerCreateProperties createProperties = new();
                    createProperties.Id = areatriggerCreateProperties.Read <uint>(0);

                    uint areatriggerId = areatriggerCreateProperties.Read <uint>(1);
                    createProperties.Template = GetAreaTriggerTemplate(new AreaTriggerId(areatriggerId, false));

                    AreaTriggerTypes shape = (AreaTriggerTypes)areatriggerCreateProperties.Read <byte>(11);

                    if (areatriggerId != 0 && createProperties.Template == null)
                    {
                        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;
                    }

                    uint ValidateAndSetCurve(uint value)
                    {
                        if (value != 0 && !CliDB.CurveStorage.ContainsKey(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);
                    }

                    createProperties.MoveCurveId   = ValidateAndSetCurve(areatriggerCreateProperties.Read <uint>(2));
                    createProperties.ScaleCurveId  = ValidateAndSetCurve(areatriggerCreateProperties.Read <uint>(3));
                    createProperties.MorphCurveId  = ValidateAndSetCurve(areatriggerCreateProperties.Read <uint>(4));
                    createProperties.FacingCurveId = ValidateAndSetCurve(areatriggerCreateProperties.Read <uint>(5));

                    createProperties.AnimId            = areatriggerCreateProperties.Read <int>(6);
                    createProperties.AnimKitId         = areatriggerCreateProperties.Read <uint>(7);
                    createProperties.DecalPropertiesId = areatriggerCreateProperties.Read <uint>(8);

                    createProperties.TimeToTarget      = areatriggerCreateProperties.Read <uint>(9);
                    createProperties.TimeToTargetScale = areatriggerCreateProperties.Read <uint>(10);

                    createProperties.Shape.TriggerType = shape;
                    unsafe
                    {
                        for (byte i = 0; i < SharedConst.MaxAreatriggerEntityData; ++i)
                        {
                            createProperties.Shape.DefaultDatas.Data[i] = areatriggerCreateProperties.Read <float>(12 + i);
                        }
                    }

                    createProperties.ScriptId = Global.ObjectMgr.GetScriptId(areatriggerCreateProperties.Read <string>(18));

                    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 (areatriggerCreateProperties.NextRow());
            }
            else
            {
                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 AreaTriggerCreatePropertiesId, StartDelay, CircleRadius, BlendFromRadius, InitialAngle, ZOffset, CounterClockwise, CanLoop FROM `areatrigger_create_properties_orbit` ORDER BY `SpellMiscId`");

            if (!circularMovementInfos.IsEmpty())
            {
                do
                {
                    uint areaTriggerCreatePropertiesId = circularMovementInfos.Read <uint>(0);

                    var createProperties = _areaTriggerCreateProperties.LookupByKey(areaTriggerCreatePropertiesId);
                    if (createProperties == null)
                    {
                        Log.outError(LogFilter.Sql, $"Table `areatrigger_create_properties_orbit` reference invalid AreaTriggerCreatePropertiesId {areaTriggerCreatePropertiesId}");
                        continue;
                    }

                    AreaTriggerOrbitInfo orbitInfo = new();

                    orbitInfo.StartDelay = circularMovementInfos.Read <uint>(1);
                    orbitInfo.Radius     = circularMovementInfos.Read <float>(2);
                    if (!float.IsFinite(orbitInfo.Radius))
                    {
                        Log.outError(LogFilter.Sql, $"Table `areatrigger_create_properties_orbit` has listed areatrigger (AreaTriggerCreatePropertiesId: {areaTriggerCreatePropertiesId}) with invalid Radius ({orbitInfo.Radius}), set to 0!");
                        orbitInfo.Radius = 0.0f;
                    }

                    orbitInfo.BlendFromRadius = circularMovementInfos.Read <float>(3);
                    if (!float.IsFinite(orbitInfo.BlendFromRadius))
                    {
                        Log.outError(LogFilter.Sql, $"Table `areatrigger_create_properties_orbit` has listed areatrigger (AreaTriggerCreatePropertiesId: {areaTriggerCreatePropertiesId}) with invalid BlendFromRadius ({orbitInfo.BlendFromRadius}), set to 0!");
                        orbitInfo.BlendFromRadius = 0.0f;
                    }

                    orbitInfo.InitialAngle = circularMovementInfos.Read <float>(4);
                    if (!float.IsFinite(orbitInfo.InitialAngle))
                    {
                        Log.outError(LogFilter.Sql, $"Table `areatrigger_create_properties_orbit` has listed areatrigger (AreaTriggerCreatePropertiesId: {areaTriggerCreatePropertiesId}) with invalid InitialAngle ({orbitInfo.InitialAngle}), set to 0!");
                        orbitInfo.InitialAngle = 0.0f;
                    }

                    orbitInfo.ZOffset = circularMovementInfos.Read <float>(5);
                    if (!float.IsFinite(orbitInfo.ZOffset))
                    {
                        Log.outError(LogFilter.Sql, $"Table `spell_areatrigger_circular` has listed areatrigger (MiscId: {areaTriggerCreatePropertiesId}) with invalid ZOffset ({orbitInfo.ZOffset}), set to 0!");
                        orbitInfo.ZOffset = 0.0f;
                    }

                    orbitInfo.CounterClockwise = circularMovementInfos.Read <bool>(6);
                    orbitInfo.CanLoop          = circularMovementInfos.Read <bool>(7);

                    createProperties.OrbitInfo.Set(orbitInfo);
                }while (circularMovementInfos.NextRow());
            }
            else
            {
                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.");
        }
Beispiel #2
0
        public void LoadAreaTriggerTemplates()
        {
            uint oldMSTime = Time.GetMSTime();
            MultiMap <uint, Vector2>           verticesByAreaTrigger       = new MultiMap <uint, Vector2>();
            MultiMap <uint, Vector2>           verticesTargetByAreaTrigger = new MultiMap <uint, Vector2>();
            MultiMap <uint, Vector3>           splinesBySpellMisc          = new MultiMap <uint, Vector3>();
            MultiMap <uint, AreaTriggerAction> actionsByAreaTrigger        = new MultiMap <uint, AreaTriggerAction>();

            //                                                       0              1           2            3
            SQLResult templateActions = DB.World.Query("SELECT AreaTriggerId, ActionType, ActionParam, TargetType FROM `areatrigger_template_actions`");

            if (!templateActions.IsEmpty())
            {
                do
                {
                    uint areaTriggerId = templateActions.Read <uint>(0);

                    AreaTriggerAction action;
                    action.Param      = templateActions.Read <uint>(2);
                    action.ActionType = (AreaTriggerActionTypes)templateActions.Read <uint>(1);
                    action.TargetType = (AreaTriggerActionUserTypes)templateActions.Read <uint>(3);

                    if (action.ActionType >= AreaTriggerActionTypes.Max)
                    {
                        Log.outError(LogFilter.Sql, "Table `areatrigger_template_actions` has invalid ActionType ({0}) for AreaTriggerId {1} and Param {2}", action.ActionType, areaTriggerId, action.Param);
                        continue;
                    }

                    if (action.TargetType >= AreaTriggerActionUserTypes.Max)
                    {
                        Log.outError(LogFilter.Sql, "Table `areatrigger_template_actions` has invalid TargetType ({0}) for AreaTriggerId {1} and Param {2}", action.TargetType, areaTriggerId, action.Param);
                        continue;
                    }

                    actionsByAreaTrigger.Add(areaTriggerId, action);
                }while (templateActions.NextRow());
            }
            else
            {
                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 AreaTriggerId, Idx, VerticeX, VerticeY, VerticeTargetX, VerticeTargetY FROM `areatrigger_template_polygon_vertices` ORDER BY `AreaTriggerId`, `Idx`");

            if (!vertices.IsEmpty())
            {
                do
                {
                    uint areaTriggerId = vertices.Read <uint>(0);

                    verticesByAreaTrigger.Add(areaTriggerId, new Vector2(vertices.Read <float>(2), vertices.Read <float>(3)));

                    if (!vertices.IsNull(4) && !vertices.IsNull(5))
                    {
                        verticesTargetByAreaTrigger.Add(areaTriggerId, new Vector2(vertices.Read <float>(4), vertices.Read <float>(5)));
                    }
                    else if (vertices.IsNull(4) != vertices.IsNull(5))
                    {
                        Log.outError(LogFilter.Sql, "Table `areatrigger_template_polygon_vertices` has listed invalid target vertices (AreaTrigger: {0}, Index: {1}).", areaTriggerId, vertices.Read <uint>(1));
                    }
                }while (vertices.NextRow());
            }
            else
            {
                Log.outInfo(LogFilter.ServerLoading, "Loaded 0 AreaTrigger templates polygon vertices. DB table `areatrigger_template_polygon_vertices` is empty.");
            }

            //                                         0            1  2  3
            SQLResult splines = DB.World.Query("SELECT SpellMiscId, X, Y, Z FROM `spell_areatrigger_splines` ORDER BY `SpellMiscId`, `Idx`");

            if (!splines.IsEmpty())
            {
                do
                {
                    uint spellMiscId = splines.Read <uint>(0);

                    Vector3 spline = new Vector3(splines.Read <float>(1), splines.Read <float>(2), splines.Read <float>(3));

                    splinesBySpellMisc.Add(spellMiscId, spline);
                }while (splines.NextRow());
            }
            else
            {
                Log.outInfo(LogFilter.ServerLoading, "Loaded 0 AreaTrigger templates splines. DB table `spell_areatrigger_splines` is empty.");
            }

            //                                            0   1     2      3      4      5      6      7      8      9
            SQLResult templates = DB.World.Query("SELECT Id, Type, Flags, Data0, Data1, Data2, Data3, Data4, Data5, ScriptName FROM `areatrigger_template`");

            if (!templates.IsEmpty())
            {
                do
                {
                    AreaTriggerTemplate areaTriggerTemplate = new AreaTriggerTemplate();
                    areaTriggerTemplate.Id = templates.Read <uint>(0);
                    AreaTriggerTypes type = (AreaTriggerTypes)templates.Read <byte>(1);

                    if (type >= AreaTriggerTypes.Max)
                    {
                        Log.outError(LogFilter.Sql, "Table `areatrigger_template` has listed areatrigger (Id: {0}) with invalid type {1}.", areaTriggerTemplate.Id, type);
                        continue;
                    }

                    areaTriggerTemplate.TriggerType = type;
                    areaTriggerTemplate.Flags       = (AreaTriggerFlags)templates.Read <uint>(2);

                    unsafe
                    {
                        fixed(float *b = areaTriggerTemplate.DefaultDatas.Data)
                        {
                            for (byte i = 0; i < SharedConst.MaxAreatriggerEntityData; ++i)
                            {
                                b[i] = templates.Read <float>(3 + i);
                            }
                        }
                    }

                    areaTriggerTemplate.ScriptId              = Global.ObjectMgr.GetScriptId(templates.Read <string>(9));
                    areaTriggerTemplate.PolygonVertices       = verticesByAreaTrigger[areaTriggerTemplate.Id];
                    areaTriggerTemplate.PolygonVerticesTarget = verticesTargetByAreaTrigger[areaTriggerTemplate.Id];
                    areaTriggerTemplate.Actions = actionsByAreaTrigger[areaTriggerTemplate.Id];

                    areaTriggerTemplate.InitMaxSearchRadius();
                    _areaTriggerTemplateStore[areaTriggerTemplate.Id] = areaTriggerTemplate;
                }while (templates.NextRow());
            }

            //                                                                  0            1              2            3             4             5              6                  7             8
            SQLResult areatriggerSpellMiscs = DB.World.Query("SELECT SpellMiscId, AreaTriggerId, MoveCurveId, ScaleCurveId, MorphCurveId, FacingCurveId, DecalPropertiesId, TimeToTarget, TimeToTargetScale FROM `spell_areatrigger`");

            if (!areatriggerSpellMiscs.IsEmpty())
            {
                do
                {
                    AreaTriggerMiscTemplate miscTemplate = new AreaTriggerMiscTemplate();
                    miscTemplate.MiscId = areatriggerSpellMiscs.Read <uint>(0);

                    uint areatriggerId = areatriggerSpellMiscs.Read <uint>(1);
                    miscTemplate.Template = GetAreaTriggerTemplate(areatriggerId);

                    if (miscTemplate.Template == null)
                    {
                        Log.outError(LogFilter.Sql, "Table `spell_areatrigger` reference invalid AreaTriggerId {0} for miscId {1}", areatriggerId, miscTemplate.MiscId);
                        continue;
                    }

                    uint ValidateAndSetCurve(uint 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);
                            return(0);
                        }

                        return(value);
                    }

                    miscTemplate.MoveCurveId   = ValidateAndSetCurve(areatriggerSpellMiscs.Read <uint>(2));
                    miscTemplate.ScaleCurveId  = ValidateAndSetCurve(areatriggerSpellMiscs.Read <uint>(3));
                    miscTemplate.MorphCurveId  = ValidateAndSetCurve(areatriggerSpellMiscs.Read <uint>(4));
                    miscTemplate.FacingCurveId = ValidateAndSetCurve(areatriggerSpellMiscs.Read <uint>(5));

                    miscTemplate.DecalPropertiesId = areatriggerSpellMiscs.Read <uint>(6);

                    miscTemplate.TimeToTarget      = areatriggerSpellMiscs.Read <uint>(7);
                    miscTemplate.TimeToTargetScale = areatriggerSpellMiscs.Read <uint>(8);

                    miscTemplate.SplinePoints = splinesBySpellMisc[miscTemplate.MiscId];

                    _areaTriggerTemplateSpellMisc[miscTemplate.MiscId] = miscTemplate;
                }while (areatriggerSpellMiscs.NextRow());
            }
            else
            {
                Log.outInfo(LogFilter.ServerLoading, "Loaded 0 Spell AreaTrigger templates. DB table `spell_areatrigger` is empty.");
            }

            Log.outInfo(LogFilter.ServerLoading, "Loaded {0} spell areatrigger templates in {1} ms.", _areaTriggerTemplateStore.Count, Time.GetMSTimeDiffToNow(oldMSTime));
        }
        public void LoadAreaTriggerSpawns()
        {
            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, " +
                                                 //11     12          13          14          15          16          17          18
                                                 "Shape, ShapeData0, ShapeData1, ShapeData2, ShapeData3, ShapeData4, ShapeData5, ScriptName FROM `areatrigger`");

            if (!templates.IsEmpty())
            {
                do
                {
                    ulong            spawnId       = templates.Read <ulong>(0);
                    AreaTriggerId    areaTriggerId = new(templates.Read <uint>(1), templates.Read <byte>(2) == 1);
                    WorldLocation    location      = new(templates.Read <uint>(3), templates.Read <float>(4), templates.Read <float>(5), templates.Read <float>(6), templates.Read <float>(7));
                    AreaTriggerTypes shape         = (AreaTriggerTypes)templates.Read <byte>(11);

                    if (GetAreaTriggerTemplate(areaTriggerId) == null)
                    {
                        Log.outError(LogFilter.Sql, $"Table `areatrigger` has listed areatrigger that doesn't exist: Id: {areaTriggerId.Id}, IsServerSide: {areaTriggerId.IsServerSide} for SpawnId {spawnId}");
                        continue;
                    }

                    if (!GridDefines.IsValidMapCoord(location))
                    {
                        Log.outError(LogFilter.Sql, $"Table `areatrigger` has listed an invalid position: SpawnId: {spawnId}, MapId: {location.GetMapId()}, Position: {location}");
                        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;
                    spawn.Location = new WorldLocation(location);

                    spawn.PhaseUseFlags = templates.Read <byte>(8);
                    spawn.PhaseId       = templates.Read <uint>(9);
                    spawn.PhaseGroup    = templates.Read <uint>(10);

                    spawn.Shape.TriggerType = shape;
                    unsafe
                    {
                        for (var i = 0; i < SharedConst.MaxAreatriggerEntityData; ++i)
                        {
                            spawn.Shape.DefaultDatas.Data[i] = templates.Read <float>(12 + i);
                        }
                    }

                    spawn.ScriptId = Global.ObjectMgr.GetScriptId(templates.Read <string>(18));

                    // 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())))
                    {
                        _areaTriggerSpawnsByLocation[(spawn.Location.GetMapId(), cellCoord.GetId())] = new SortedSet <ulong>();
Beispiel #4
0
 public AreaTriggerShapeInfo()
 {
     TriggerType = AreaTriggerTypes.Max;
 }