Esempio n. 1
0
        void LoadPlotFinalizeGOInfo()
        {
            //                                                                0                  1       2       3       4       5               6
            SQLResult result = DB.World.Query("SELECT garrPlotInstanceId, hordeGameObjectId, hordeX, hordeY, hordeZ, hordeO, hordeAnimKitId, " +
                                              //                      7          8          9         10         11                 12
                                              "allianceGameObjectId, allianceX, allianceY, allianceZ, allianceO, allianceAnimKitId FROM garrison_plot_finalize_info");

            if (result.IsEmpty())
            {
                Log.outInfo(LogFilter.ServerLoading, "Loaded 0 garrison follower class spec abilities. DB table `garrison_plot_finalize_info` is empty.");
                return;
            }

            uint msTime = Time.GetMSTime();

            do
            {
                uint   garrPlotInstanceId   = result.Read <uint>(0);
                uint   hordeGameObjectId    = result.Read <uint>(1);
                uint   allianceGameObjectId = result.Read <uint>(7);
                ushort hordeAnimKitId       = result.Read <ushort>(6);
                ushort allianceAnimKitId    = result.Read <ushort>(12);

                if (!CliDB.GarrPlotInstanceStorage.ContainsKey(garrPlotInstanceId))
                {
                    Log.outError(LogFilter.Sql, "Non-existing GarrPlotInstance.db2 entry {0} was referenced in `garrison_plot_finalize_info`.", garrPlotInstanceId);
                    continue;
                }

                GameObjectTemplate goTemplate = Global.ObjectMgr.GetGameObjectTemplate(hordeGameObjectId);
                if (goTemplate == null)
                {
                    Log.outError(LogFilter.Sql, "Non-existing gameobject_template entry {0} was referenced in `garrison_plot_finalize_info`.`hordeGameObjectId` for garrPlotInstanceId {1}.",
                                 hordeGameObjectId, garrPlotInstanceId);
                    continue;
                }

                if (goTemplate.type != GameObjectTypes.Goober)
                {
                    Log.outError(LogFilter.Sql, "Invalid gameobject type {0} (entry {1}) was referenced in `garrison_plot_finalize_info`.`hordeGameObjectId` for garrPlotInstanceId {2}.",
                                 goTemplate.type, hordeGameObjectId, garrPlotInstanceId);
                    continue;
                }

                goTemplate = Global.ObjectMgr.GetGameObjectTemplate(allianceGameObjectId);
                if (goTemplate == null)
                {
                    Log.outError(LogFilter.Sql, "Non-existing gameobject_template entry {0} was referenced in `garrison_plot_finalize_info`.`allianceGameObjectId` for garrPlotInstanceId {1}.",
                                 allianceGameObjectId, garrPlotInstanceId);
                    continue;
                }

                if (goTemplate.type != GameObjectTypes.Goober)
                {
                    Log.outError(LogFilter.Sql, "Invalid gameobject type {0} (entry {1}) was referenced in `garrison_plot_finalize_info`.`allianceGameObjectId` for garrPlotInstanceId {2}.",
                                 goTemplate.type, allianceGameObjectId, garrPlotInstanceId);
                    continue;
                }

                if (hordeAnimKitId != 0 && !CliDB.AnimKitStorage.ContainsKey(hordeAnimKitId))
                {
                    Log.outError(LogFilter.Sql, "Non-existing AnimKit.dbc entry {0} was referenced in `garrison_plot_finalize_info`.`hordeAnimKitId` for garrPlotInstanceId {1}.",
                                 hordeAnimKitId, garrPlotInstanceId);
                    continue;
                }

                if (allianceAnimKitId != 0 && !CliDB.AnimKitStorage.ContainsKey(allianceAnimKitId))
                {
                    Log.outError(LogFilter.Sql, "Non-existing AnimKit.dbc entry {0} was referenced in `garrison_plot_finalize_info`.`allianceAnimKitId` for garrPlotInstanceId {1}.",
                                 allianceAnimKitId, garrPlotInstanceId);
                    continue;
                }

                FinalizeGarrisonPlotGOInfo info = new FinalizeGarrisonPlotGOInfo();
                info.factionInfo[GarrisonFactionIndex.Horde].GameObjectId = hordeGameObjectId;
                info.factionInfo[GarrisonFactionIndex.Horde].Pos.Relocate(result.Read <float>(2), result.Read <float>(3), result.Read <float>(4), result.Read <float>(5));
                info.factionInfo[GarrisonFactionIndex.Horde].AnimKitId = hordeAnimKitId;

                info.factionInfo[GarrisonFactionIndex.Alliance].GameObjectId = allianceGameObjectId;
                info.factionInfo[GarrisonFactionIndex.Alliance].Pos.Relocate(result.Read <float>(8), result.Read <float>(9), result.Read <float>(10), result.Read <float>(11));
                info.factionInfo[GarrisonFactionIndex.Alliance].AnimKitId = allianceAnimKitId;

                _finalizePlotGOInfo[garrPlotInstanceId] = info;
            } while (result.NextRow());

            Log.outInfo(LogFilter.ServerLoading, "Loaded {0} garrison plot finalize entries in {1}.", _finalizePlotGOInfo.Count, Time.GetMSTimeDiffToNow(msTime));
        }
Esempio n. 2
0
            public GameObject CreateGameObject(Map map, uint faction)
            {
                uint entry = EmptyGameObjectId;

                if (BuildingInfo.PacketInfo.HasValue)
                {
                    GarrPlotInstanceRecord plotInstance = CliDB.GarrPlotInstanceStorage.LookupByKey(PacketInfo.GarrPlotInstanceID);
                    GarrPlotRecord         plot         = CliDB.GarrPlotStorage.LookupByKey(plotInstance.GarrPlotID);
                    GarrBuildingRecord     building     = CliDB.GarrBuildingStorage.LookupByKey(BuildingInfo.PacketInfo.Value.GarrBuildingID);

                    entry = faction == GarrisonFactionIndex.Horde ? plot.HordeConstructObjID : plot.AllianceConstructObjID;
                    if (BuildingInfo.PacketInfo.Value.Active || entry == 0)
                    {
                        entry = faction == GarrisonFactionIndex.Horde ? building.HordeGameObjectID : building.AllianceGameObjectID;
                    }
                }

                if (Global.ObjectMgr.GetGameObjectTemplate(entry) == null)
                {
                    Log.outError(LogFilter.Garrison, "Garrison attempted to spawn gameobject whose template doesn't exist ({0})", entry);
                    return(null);
                }

                GameObject go = GameObject.CreateGameObject(entry, map, PacketInfo.PlotPos, Rotation, 255, GameObjectState.Ready);

                if (!go)
                {
                    return(null);
                }

                if (BuildingInfo.CanActivate() && BuildingInfo.PacketInfo.HasValue && !BuildingInfo.PacketInfo.Value.Active)
                {
                    FinalizeGarrisonPlotGOInfo finalizeInfo = Global.GarrisonMgr.GetPlotFinalizeGOInfo(PacketInfo.GarrPlotInstanceID);
                    if (finalizeInfo != null)
                    {
                        Position   pos2      = finalizeInfo.factionInfo[faction].Pos;
                        GameObject finalizer = GameObject.CreateGameObject(finalizeInfo.factionInfo[faction].GameObjectId, map, pos2, Quaternion.fromEulerAnglesZYX(pos2.GetOrientation(), 0.0f, 0.0f), 255, GameObjectState.Ready);
                        if (finalizer)
                        {
                            // set some spell id to make the object delete itself after use
                            finalizer.SetSpellId(finalizer.GetGoInfo().Goober.spell);
                            finalizer.SetRespawnTime(0);

                            ushort animKit = finalizeInfo.factionInfo[faction].AnimKitId;
                            if (animKit != 0)
                            {
                                finalizer.SetAnimKitId(animKit, false);
                            }

                            map.AddToMap(finalizer);
                        }
                    }
                }

                if (go.GetGoType() == GameObjectTypes.GarrisonBuilding && go.GetGoInfo().garrisonBuilding.SpawnMap != 0)
                {
                    foreach (var cellGuids in Global.ObjectMgr.GetMapObjectGuids((uint)go.GetGoInfo().garrisonBuilding.SpawnMap, (byte)map.GetDifficultyID()))
                    {
                        foreach (var spawnId in cellGuids.Value.creatures)
                        {
                            Creature spawn = BuildingSpawnHelper <Creature>(go, spawnId, map);
                            if (spawn)
                            {
                                BuildingInfo.Spawns.Add(spawn.GetGUID());
                            }
                        }

                        foreach (var spawnId in cellGuids.Value.gameobjects)
                        {
                            GameObject spawn = BuildingSpawnHelper <GameObject>(go, spawnId, map);
                            if (spawn)
                            {
                                BuildingInfo.Spawns.Add(spawn.GetGUID());
                            }
                        }
                    }
                }

                BuildingInfo.Guid = go.GetGUID();
                return(go);
            }