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)); }
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); }