public static string CreatureEquip(Dictionary<Guid, Unit> units) { if (units.Count == 0) return string.Empty; const string tableName = "creature_equip_template"; var rows = new List<QueryBuilder.SQLInsertRow>(); foreach (var unit in units) { var row = new QueryBuilder.SQLInsertRow(); var creature = unit.Value; var equipData = creature.Equipment; // check if fields are empty if (equipData == null || equipData.All(value => value == 0)) continue; row.AddValue("entry", unit.Key.GetEntry()); row.AddValue("itemEntry1", equipData[0]); row.AddValue("itemEntry2", equipData[1]); row.AddValue("itemEntry3", equipData[2]); row.Comment = StoreGetters.GetName(StoreNameType.Unit, (int)unit.Key.GetEntry(), false); rows.Add(row); } return new QueryBuilder.SQLInsert(tableName, rows).Build(); }
public static string Addon(Dictionary<WowGuid, Unit> units) { if (units.Count == 0) return string.Empty; if (!Settings.SQLOutputFlag.HasAnyFlagBit(SQLOutput.creature_template_addon)) return string.Empty; const string tableName = "creature_template_addon"; var rows = new List<QueryBuilder.SQLInsertRow>(); foreach (var unit in units) { var npc = unit.Value; if (Settings.AreaFilters.Length > 0) if (!(npc.Area.ToString(CultureInfo.InvariantCulture).MatchesFilters(Settings.AreaFilters))) continue; if (Settings.MapFilters.Length > 0) if (!(npc.Map.ToString(CultureInfo.InvariantCulture).MatchesFilters(Settings.MapFilters))) continue; var row = new QueryBuilder.SQLInsertRow(); row.AddValue("entry", unit.Key.GetEntry()); row.AddValue("mount", npc.Mount); row.AddValue("bytes1", npc.Bytes1, true); row.AddValue("bytes2", npc.Bytes2, true); var auras = string.Empty; var commentAuras = string.Empty; if (npc.Auras != null && npc.Auras.Count() != 0) { foreach (var aura in npc.Auras) { if (aura == null) continue; // usually "template auras" do not have caster if (ClientVersion.AddedInVersion(ClientType.MistsOfPandaria) ? !aura.AuraFlags.HasAnyFlag(AuraFlagMoP.NoCaster) : !aura.AuraFlags.HasAnyFlag(AuraFlag.NotCaster)) continue; auras += aura.SpellId + " "; commentAuras += StoreGetters.GetName(StoreNameType.Spell, (int) aura.SpellId, false) + ", "; } auras = auras.TrimEnd(' '); commentAuras = commentAuras.TrimEnd(',', ' '); } row.AddValue("auras", auras); row.Comment += StoreGetters.GetName(StoreNameType.Unit, (int)unit.Key.GetEntry(), false); if (!String.IsNullOrWhiteSpace(auras)) row.Comment += " - " + commentAuras; rows.Add(row); } return new QueryBuilder.SQLInsert(tableName, rows).Build(); }
public static string BroadcastTextLocale() { if (Storage.BroadcastTextLocales.IsEmpty()) return String.Empty; if (!Settings.HotfixSQLOutputFlag.HasAnyFlagBit(HotfixSQLOutput.broadcast_text_locale)) return String.Empty; const string tableName = "broadcast_text_locale"; var rowsIns = new List<QueryBuilder.SQLInsertRow>(); var rowsUpd = new List<QueryBuilder.SQLUpdateRow>(); foreach (var broadcastTextLocale in Settings.SQLOrderByKey ? Storage.BroadcastTextLocales.OrderBy(blub => blub.Key).ToList() : Storage.BroadcastTextLocales.ToList()) { if (SQLDatabase.BroadcastTextLocaleStores != null && SQLDatabase.BroadcastTextLocaleStores.ContainsKey(Tuple.Create(broadcastTextLocale.Key.Item1, broadcastTextLocale.Key.Item2))) { var row = new QueryBuilder.SQLUpdateRow(); var broadcastTextLocaleDB = SQLDatabase.BroadcastTextLocaleStores[Tuple.Create(broadcastTextLocale.Key.Item1, broadcastTextLocale.Key.Item2)]; if (!Utilities.EqualValues(broadcastTextLocaleDB.MaleText_lang, broadcastTextLocale.Value.Item1.MaleText_lang)) row.AddValue("MaleText_lang", broadcastTextLocale.Value.Item1.MaleText_lang); if (!Utilities.EqualValues(broadcastTextLocaleDB.FemaleText_lang, broadcastTextLocale.Value.Item1.FemaleText_lang)) row.AddValue("FemaleText_lang", broadcastTextLocale.Value.Item1.FemaleText_lang); if (!Utilities.EqualValues(broadcastTextLocaleDB.VerifiedBuild, broadcastTextLocale.Value.Item1.VerifiedBuild)) row.AddValue("VerifiedBuild", broadcastTextLocale.Value.Item1.VerifiedBuild); row.AddWhere("ID", broadcastTextLocale.Key.Item1); row.AddWhere("locale", broadcastTextLocale.Key.Item2); row.Table = tableName; rowsUpd.Add(row); } else // insert new { var row = new QueryBuilder.SQLInsertRow(); row.AddValue("ID", broadcastTextLocale.Key.Item1); row.AddValue("locale", broadcastTextLocale.Key.Item2); row.AddValue("MaleText_lang", broadcastTextLocale.Value.Item1.MaleText_lang); row.AddValue("FemaleText_lang", broadcastTextLocale.Value.Item1.FemaleText_lang); row.AddValue("VerifiedBuild", broadcastTextLocale.Value.Item1.VerifiedBuild); rowsIns.Add(row); } } var result = new QueryBuilder.SQLInsert(tableName, rowsIns, deleteDuplicates: false, primaryKeyNumber: 2).Build() + new QueryBuilder.SQLUpdate(rowsUpd).Build(); return "SET NAMES 'utf8';" + Environment.NewLine + result + Environment.NewLine + "SET NAMES 'latin1';"; }
public static string QuestPOI() { if (Storage.QuestPOIs.IsEmpty()) return String.Empty; const string tableName1 = "quest_poi"; const string tableName2 = "quest_poi_points"; // `quest_poi` var rows = new List<QueryBuilder.SQLInsertRow>(); foreach (var quest in Storage.QuestPOIs) { var questPOI = quest.Value.Item1; var row = new QueryBuilder.SQLInsertRow(); row.AddValue("questId", quest.Key.Item1); row.AddValue("id", quest.Key.Item2); row.AddValue("objIndex", questPOI.ObjectiveIndex); row.AddValue("mapid", questPOI.Map); row.AddValue("WorldMapAreaId", questPOI.WorldMapAreaId); row.AddValue("FloorId", questPOI.FloorId); row.AddValue("unk3", questPOI.UnkInt1); row.AddValue("unk4", questPOI.UnkInt2); row.Comment = StoreGetters.GetName(StoreNameType.Quest, (int)quest.Key.Item1, false); rows.Add(row); } var result = new QueryBuilder.SQLInsert(tableName1, rows, 2).Build(); // `quest_poi_points` rows = new List<QueryBuilder.SQLInsertRow>(); foreach (var quest in Storage.QuestPOIs) { var questPOI = quest.Value.Item1; if (questPOI.Points != null) // Needed? foreach (var point in questPOI.Points) { var row = new QueryBuilder.SQLInsertRow(); row.AddValue("questId", quest.Key.Item1); row.AddValue("id", quest.Key.Item2); row.AddValue("idx", point.Index); // Not on sniffs row.AddValue("x", point.X); row.AddValue("y", point.Y); row.Comment = StoreGetters.GetName(StoreNameType.Quest, (int)quest.Key.Item1, false); rows.Add(row); } } result += new QueryBuilder.SQLInsert(tableName2, rows, 2).Build(); return result; }
public static string QuestPOI() { if (Storage.QuestPOIs.IsEmpty()) return String.Empty; var sql = string.Empty; if (Settings.SQLOutputFlag.HasAnyFlagBit(SQLOutput.quest_poi)) { var entries = Storage.QuestPOIs.Keys(); var poiDb = SQLDatabase.GetDict<uint, uint, QuestPOI>(entries, "questid", "id"); sql = SQLUtil.CompareDicts(Storage.QuestPOIs, poiDb, StoreNameType.Quest, "questid", "id"); } //var points = new StoreMulti<Tuple<uint, uint>, QuestPOIPoint>(); // //foreach (KeyValuePair<Tuple<uint, uint>, Tuple<QuestPOI, TimeSpan?>> pair in Storage.QuestPOIs) // foreach (var point in pair.Value.Item1.Points) // points.Add(pair.Key, point, pair.Value.Item2); // //var entries2 = points.Keys(); //var poiPointsDb = SQLDatabase.GetDictMulti<uint, uint, QuestPOIPoint>(entries2, "questid", "id"); const string tableName2 = "quest_poi_points"; if (Settings.SQLOutputFlag.HasAnyFlagBit(SQLOutput.quest_poi_points)) { var rows = new List<QueryBuilder.SQLInsertRow>(); foreach (var quest in Storage.QuestPOIs) { var questPOI = quest.Value.Item1; if (questPOI.Points != null) // Needed? foreach (var point in questPOI.Points) { var row = new QueryBuilder.SQLInsertRow(); row.AddValue("questId", quest.Key.Item1); row.AddValue("id", quest.Key.Item2); row.AddValue("idx", point.Index); // Not on sniffs row.AddValue("x", point.X); row.AddValue("y", point.Y); row.Comment = StoreGetters.GetName(StoreNameType.Quest, (int) quest.Key.Item1, false); rows.Add(row); } } sql += new QueryBuilder.SQLInsert(tableName2, rows, 2).Build(); } return sql; }
public static string DefenseMessage() { if (Storage.DefenseMessages.IsEmpty()) return String.Empty; if (!Settings.SQLOutputFlag.HasAnyFlagBit(SQLOutput.defense_message)) return string.Empty; const string tableName = "defense_message"; var rows = new List<QueryBuilder.SQLInsertRow>(); foreach (var message in Storage.DefenseMessages) { foreach (var messageValue in message.Value) { var row = new QueryBuilder.SQLInsertRow(); var query = new StringBuilder(string.Format("SELECT Id FROM {1}.broadcast_text WHERE MaleText='{0}' OR FemaleText='{0}';", MySqlHelper.DoubleQuoteString(messageValue.Item1.text), Settings.TDBDatabase)); string broadcastTextId = ""; if (Settings.DevMode) { using (var reader = SQLConnector.ExecuteQuery(query.ToString())) { if (reader != null) while (reader.Read()) { var values = new object[1]; var count = reader.GetValues(values); if (count != 1) break; // error in query if (!String.IsNullOrWhiteSpace(broadcastTextId)) broadcastTextId += " - " + Convert.ToInt32(values[0]); else broadcastTextId += Convert.ToInt32(values[0]); } } } row.AddValue("ZoneId", message.Key); row.AddValue("Id", "x", false, true); row.AddValue("Text", messageValue.Item1.text); if (Settings.DevMode) row.AddValue("BroadcastTextId", broadcastTextId); rows.Add(row); } } return new QueryBuilder.SQLInsert(tableName, rows, 1, false).Build(); }
public static string SniffData() { if (Storage.SniffData.IsEmpty) return String.Empty; const string tableName = "SniffData"; var rows = new List<QueryBuilder.SQLInsertRow>(); foreach (var data in Storage.SniffData) { var row = new QueryBuilder.SQLInsertRow(); row.AddValue("Build", ClientVersion.Build); row.AddValue("SniffName", data.FileName); row.AddValue("TimeStamp", data.TimeStamp); row.AddValue("ObjectType", data.ObjectType.ToString()); row.AddValue("Id", data.Id); row.AddValue("Data", data.Data); row.AddValue("Number", data.Number); if (data.ObjectType == StoreNameType.Opcode) row.Comment = Opcodes.GetOpcodeName(data.Id); rows.Add(row); } return new QueryBuilder.SQLInsert(tableName, rows, ignore: true, withDelete: false).Build(); }
public static string Addon(Dictionary<Guid, Unit> units) { if (units.Count == 0) return string.Empty; const string tableName = "creature_template_addon"; var rows = new List<QueryBuilder.SQLInsertRow>(); foreach (var unit in units) { var npc = unit.Value; npc.LoadValuesFromUpdateFields(); var row = new QueryBuilder.SQLInsertRow(); row.AddValue("entry", unit.Key.GetEntry()); row.AddValue("mount", npc.Mount); row.AddValue("bytes1", npc.Bytes1, true); row.AddValue("bytes2", npc.Bytes2, true); var auras = string.Empty; var commentAuras = string.Empty; if (npc.Auras != null && npc.Auras.Count() != 0) { foreach (var aura in npc.Auras) { if (aura.CasterGuid.Full == 0) // usually "template auras" do not have caster { auras += aura.SpellId + " "; commentAuras += StoreGetters.GetName(StoreNameType.Spell, (int) aura.SpellId, false) + ", "; } } auras = auras.TrimEnd(' '); commentAuras = commentAuras.TrimEnd(',', ' '); } row.AddValue("auras", auras); row.Comment += StoreGetters.GetName(StoreNameType.Unit, (int)unit.Key.GetEntry(), false); if (!String.IsNullOrWhiteSpace(auras)) row.Comment += " - " + commentAuras; rows.Add(row); } return new QueryBuilder.SQLInsert(tableName, rows).Build(); }
public static string ObjectNames() { if (Storage.ObjectNames.IsEmpty) return String.Empty; const string tableName = "ObjectNames"; var rows = new List<QueryBuilder.SQLInsertRow>(); foreach (var data in Storage.ObjectNames) { var row = new QueryBuilder.SQLInsertRow(); row.AddValue("ObjectType", data.Value.ObjectType.ToString()); row.AddValue("Id", data.Key); row.AddValue("Name", data.Value.Name); rows.Add(row); } return new QueryBuilder.SQLInsert(tableName, rows, 2, ignore: true, withDelete: false).Build(); }
public static string NpcTrainer() { if (Storage.NpcTrainers.IsEmpty) { return(String.Empty); } const string tableName = "npc_trainer"; var rows = new List <QueryBuilder.SQLInsertRow>(); foreach (var npcTrainer in Storage.NpcTrainers) { var comment = new QueryBuilder.SQLInsertRow(); comment.HeaderComment = StoreGetters.GetName(StoreNameType.Unit, (int)npcTrainer.Key, false); rows.Add(comment); foreach (var trainerSpell in npcTrainer.Value.TrainerSpells) { var row = new QueryBuilder.SQLInsertRow(); row.AddValue("entry", npcTrainer.Key); row.AddValue("spell", trainerSpell.Spell); row.AddValue("spellcost", trainerSpell.Cost); row.AddValue("reqskill", trainerSpell.RequiredSkill); row.AddValue("reqskillvalue", trainerSpell.RequiredSkillLevel); row.AddValue("reqlevel", trainerSpell.RequiredLevel); row.Comment = StoreGetters.GetName(StoreNameType.Spell, (int)trainerSpell.Spell, false); rows.Add(row); } } return(new QueryBuilder.SQLInsert(tableName, rows).Build()); }
public static string QuestPOI() { if (Storage.QuestPOIs.IsEmpty()) { return(String.Empty); } var sql = string.Empty; if (Settings.SQLOutputFlag.HasAnyFlagBit(SQLOutput.quest_poi)) { var entries = Storage.QuestPOIs.Keys(); var poiDb = SQLDatabase.GetDict <uint, uint, QuestPOI>(entries, "questid", "id"); sql = SQLUtil.CompareDicts(Storage.QuestPOIs, poiDb, StoreNameType.Quest, StoreNameType.None, "questid", "id"); } // TODO: fix this piece of code so it compares with db //var points = new StoreMulti<Tuple<uint, uint>, QuestPOIPoint>(); // //foreach (KeyValuePair<Tuple<uint, uint>, Tuple<QuestPOI, TimeSpan?>> pair in Storage.QuestPOIs) // foreach (var point in pair.Value.Item1.Points) // points.Add(pair.Key, point, pair.Value.Item2); // //var entries2 = points.Keys(); //var poiPointsDb = SQLDatabase.GetDictMulti<uint, uint, QuestPOIPoint>(entries2, "questid", "id"); const string tableName2 = "quest_poi_points"; if (Settings.SQLOutputFlag.HasAnyFlagBit(SQLOutput.quest_poi_points)) { var rows = new List <QueryBuilder.SQLInsertRow>(); foreach (var quest in Storage.QuestPOIs.OrderBy(blub => blub.Key.Item1)) { var questPOI = quest.Value.Item1; if (questPOI.Points != null) // Needed? { foreach (var point in questPOI.Points) { var row = new QueryBuilder.SQLInsertRow(); row.AddValue("questId", quest.Key.Item1); row.AddValue("id", quest.Key.Item2); row.AddValue("idx", point.Index); // Not on sniffs row.AddValue("x", point.X); row.AddValue("y", point.Y); row.AddValue("VerifiedBuild", point.VerifiedBuild); row.Comment = StoreGetters.GetName(StoreNameType.Quest, (int)quest.Key.Item1, false); rows.Add(row); } } } sql += new QueryBuilder.SQLInsert(tableName2, rows, 2).Build(); } return(sql); }
public static string Loot() { if (Storage.Loots.IsEmpty()) { return(String.Empty); } if (!Settings.SQLOutputFlag.HasAnyFlagBit(SQLOutput.LootTemplate)) { return(string.Empty); } // Not TDB structure const string tableName = "LootTemplate"; var rows = new List <QueryBuilder.SQLInsertRow>(); foreach (var loot in Storage.Loots) { var comment = new QueryBuilder.SQLInsertRow(); comment.HeaderComment = StoreGetters.GetName(Utilities.ObjectTypeToStore(Storage.Loots.Keys().First().Item2), (int)loot.Key.Item1, false) + " (" + loot.Value.Item1.Gold + " gold)"; rows.Add(comment); foreach (var lootItem in loot.Value.Item1.LootItems) { var row = new QueryBuilder.SQLInsertRow(); row.AddValue("Id", loot.Key.Item1); row.AddValue("Type", loot.Key.Item2); row.AddValue("ItemId", lootItem.ItemId); row.AddValue("Count", lootItem.Count); row.Comment = StoreGetters.GetName(StoreNameType.Item, (int)lootItem.ItemId, false); rows.Add(row); } } return(new QueryBuilder.SQLInsert(tableName, rows, 2).Build()); }
public static string SniffData() { if (Storage.SniffData.IsEmpty()) return String.Empty; const string tableName = "SniffData"; var rows = new List<QueryBuilder.SQLInsertRow>(); foreach (var data in Storage.SniffData) { var row = new QueryBuilder.SQLInsertRow(); row.AddValue("Build", ClientVersion.Build); row.AddValue("SniffName", data.Item1.FileName); row.AddValue("ObjectType", data.Item1.ObjectType.ToString()); row.AddValue("Id", data.Item1.Id); row.AddValue("Data", data.Item1.Data); rows.Add(row); } return new QueryBuilder.SQLInsert(tableName, rows, ignore: true, withDelete: false, deleteDuplicates: true).Build(); }
public static string ObjectNames() { if (Storage.ObjectNames.IsEmpty()) { return(String.Empty); } const string tableName = "ObjectNames"; var rows = new List <QueryBuilder.SQLInsertRow>(); foreach (var data in Storage.ObjectNames) { var row = new QueryBuilder.SQLInsertRow(); row.AddValue("ObjectType", data.Value.Item1.ObjectType.ToString()); row.AddValue("Id", data.Key); row.AddValue("Name", data.Value.Item1.Name); rows.Add(row); } return(new QueryBuilder.SQLInsert(tableName, rows, 2, ignore: true, withDelete: false).Build()); }
public static string Addon(Dictionary <Guid, Unit> units) { if (units.Count == 0) { return(string.Empty); } const string tableName = "creature_template_addon"; var rows = new List <QueryBuilder.SQLInsertRow>(); foreach (var unit in units) { var npc = unit.Value; var row = new QueryBuilder.SQLInsertRow(); row.AddValue("entry", unit.Key.GetEntry()); row.AddValue("mount", npc.Mount); row.AddValue("bytes1", npc.Bytes1, true); row.AddValue("b2_0_sheath", npc.Bytes2, true); row.AddValue("MovementFlags", npc.Movement.Flags, true); var auras = string.Empty; var commentAuras = string.Empty; if (npc.Auras != null && npc.Auras.Count() != 0) { foreach (var aura in npc.Auras) { if (aura == null) { continue; } if (!aura.AuraFlags.HasAnyFlag(AuraFlag.NotCaster)) { continue; // usually "template auras" do not have caster } auras += aura.SpellId + " "; commentAuras += StoreGetters.GetName(StoreNameType.Spell, (int)aura.SpellId, false) + ", "; } auras = auras.TrimEnd(' '); commentAuras = commentAuras.TrimEnd(',', ' '); } row.AddValue("auras", auras); row.Comment += StoreGetters.GetName(StoreNameType.Unit, (int)unit.Key.GetEntry(), false); if (!String.IsNullOrWhiteSpace(auras)) { row.Comment += " - " + commentAuras; } rows.Add(row); } return(new QueryBuilder.SQLInsert(tableName, rows).Build()); }
public static string VehicleAccessory() { if (Storage.VehicleTemplateAccessorys.IsEmpty()) { return(String.Empty); } if (!Settings.SQLOutputFlag.HasAnyFlagBit(SQLOutput.vehicle_template_accessory)) { return(string.Empty); } const string tableName = "vehicle_template_accessory"; var rows = new List <QueryBuilder.SQLInsertRow>(); foreach (var accessorys in Storage.VehicleTemplateAccessorys) { foreach (var accessorysValue in accessorys.Value) { var row = new QueryBuilder.SQLInsertRow(); if (accessorysValue.Item1.SeatId < 0 || accessorysValue.Item1.SeatId > 7) { continue; } row.Comment = StoreGetters.GetName(StoreNameType.Unit, (int)accessorys.Key, false) + " - "; row.Comment += StoreGetters.GetName(StoreNameType.Unit, (int)accessorysValue.Item1.AccessoryEntry, false); row.AddValue("entry", accessorys.Key); row.AddValue("accessory_entry", accessorysValue.Item1.AccessoryEntry); row.AddValue("seat_id", accessorysValue.Item1.SeatId); row.AddValue("minion", "x", false, true); row.AddValue("description", row.Comment); row.AddValue("summontype", "x", false, true); row.AddValue("summontimer", "x", false, true); rows.Add(row); } } return(new QueryBuilder.SQLInsert(tableName, rows, 1, false).Build()); }
public static string CreatureMovement(Dictionary <Guid, Unit> units) { if (units.Count == 0) { return(string.Empty); } if (!Settings.SQLOutputFlag.HasAnyFlagBit(SQLOutput.creature_movement)) { return(string.Empty); } const string tableName = "creature_movement"; var rows = new List <QueryBuilder.SQLInsertRow>(); foreach (var unit in units) { var row = new QueryBuilder.SQLInsertRow(); var npc = unit.Value; row.AddValue("Id", unit.Key.GetEntry()); row.AddValue("MovementFlags", npc.Movement.Flags, true); row.AddValue("MovementFlagsExtra", npc.Movement.FlagsExtra, true); row.AddValue("ufBytes1", npc.Bytes1, true); row.AddValue("ufBytes2", npc.Bytes2, true); row.AddValue("ufFlags", npc.UnitFlags, true); row.AddValue("ufFlags2", npc.UnitFlags2, true); row.Comment = StoreGetters.GetName(StoreNameType.Unit, (int)unit.Key.GetEntry(), false); /* * row.Comment += " - MoveFlags: " + npc.Movement.Flags + " - MoveFlags2: " + npc.Movement.FlagsExtra; * row.Comment += " - Bytes1: " + npc.Bytes1 + " - Bytes2: " + npc.Bytes2 + " - UnitFlags: " + npc.UnitFlags; * row.Comment += " - UnitFlags2: " + npc.UnitFlags2; */ rows.Add(row); } return(new QueryBuilder.SQLInsert(tableName, rows, ignore: true, withDelete: false).Build()); }
public static string NpcText() { if (Storage.NpcTexts.IsEmpty()) return String.Empty; // Not TDB structure const string tableName = "npc_text"; var rows = new List<QueryBuilder.SQLInsertRow>(); foreach (var npcTextPair in Storage.NpcTexts) { var row = new QueryBuilder.SQLInsertRow(); var npcText = npcTextPair.Value.Item1; row.AddValue("Id", npcTextPair.Key); for (var i = 0; i < npcText.Probabilities.Length; i++) row.AddValue("Probability" + (i + 1), npcText.Probabilities[i]); for (var i = 0; i < npcText.Texts1.Length; i++) row.AddValue("Text1_" + (i + 1), npcText.Texts1[i]); for (var i = 0; i < npcText.Texts2.Length; i++) row.AddValue("Text2_" + (i + 1), npcText.Texts2[i]); for (var i = 0; i < npcText.Languages.Length; i++) row.AddValue("Language" + (i + 1), npcText.Languages[i]); for (var i = 0; i < npcText.EmoteDelays[0].Length; i++) for (var j = 0; j < npcText.EmoteDelays[1].Length; j++) row.AddValue("EmoteDelay" + (i + 1) + "_" + (j + 1), npcText.EmoteDelays[i][j]); for (var i = 0; i < npcText.EmoteIds[0].Length; i++) for (var j = 0; j < npcText.EmoteIds[1].Length; j++) row.AddValue("EmoteId" + (i + 1) + "_" + (j + 1), npcText.EmoteDelays[i][j]); rows.Add(row); } return new QueryBuilder.SQLInsert(tableName, rows).Build(); }
public static string NpcVendor() { if (Storage.NpcVendors.IsEmpty()) { return(String.Empty); } if (!Settings.SQLOutputFlag.HasAnyFlagBit(SQLOutput.npc_vendor)) { return(string.Empty); } const string tableName = "npc_vendor"; var rows = new List <QueryBuilder.SQLInsertRow>(); foreach (var npcVendor in Storage.NpcVendors) { var comment = new QueryBuilder.SQLInsertRow(); comment.HeaderComment = StoreGetters.GetName(StoreNameType.Unit, (int)npcVendor.Key); rows.Add(comment); foreach (var vendorItem in npcVendor.Value.Item1.VendorItems) { var row = new QueryBuilder.SQLInsertRow(); row.AddValue("entry", npcVendor.Key); row.AddValue("item", vendorItem.ItemId); row.AddValue("slot", vendorItem.Slot); row.AddValue("maxcount", vendorItem.MaxCount); row.AddValue("ExtendedCost", vendorItem.ExtendedCostId); if (ClientVersion.AddedInVersion(ClientType.Cataclysm)) { row.AddValue("Type", vendorItem.Type); } row.Comment = StoreGetters.GetName(vendorItem.Type <= 1 ? StoreNameType.Item : StoreNameType.Currency, (int)vendorItem.ItemId, false); rows.Add(row); } } return(new QueryBuilder.SQLInsert(tableName, rows).Build()); }
public static string WeatherUpdates() { if (Storage.WeatherUpdates.IsEmpty()) { return(String.Empty); } if (!Settings.SQLOutputFlag.HasAnyFlagBit(SQLOutput.weather_updates)) { return(string.Empty); } const string tableName = "weather_updates"; var rows = new List <QueryBuilder.SQLInsertRow>(); foreach (var weatherUpdate in Storage.WeatherUpdates) { var row = new QueryBuilder.SQLInsertRow(); var weather = weatherUpdate.Item1; row.AddValue("map_id", weather.MapId); row.AddValue("zone_id", weather.ZoneId); row.AddValue("weather_state", (int)weather.State); row.AddValue("timestamp", weatherUpdate.Item2.HasValue ? weatherUpdate.Item2.Value.ToFormattedString() : "null"); row.AddValue("grade", weather.Grade); row.AddValue("unk", weather.Unk); row.Comment = StoreGetters.GetName(StoreNameType.Map, (int)weather.MapId, false) + " - " + weather.State + " - " + weather.Grade; rows.Add(row); } return(new QueryBuilder.SQLInsert(tableName, rows, ignore: true, withDelete: false).Build()); }
public static string NpcVendor() { if (Storage.NpcVendors.IsEmpty) return String.Empty; const string tableName = "npc_vendor"; var rows = new List<QueryBuilder.SQLInsertRow>(); foreach (var npcVendor in Storage.NpcVendors) { var comment = new QueryBuilder.SQLInsertRow(); comment.HeaderComment = StoreGetters.GetName(StoreNameType.Unit, (int)npcVendor.Key); rows.Add(comment); foreach (var vendorItem in npcVendor.Value.VendorItems) { var row = new QueryBuilder.SQLInsertRow(); row.AddValue("entry", npcVendor.Key); row.AddValue("item", vendorItem.ItemId); row.AddValue("slot", vendorItem.Slot); row.AddValue("maxcount", vendorItem.MaxCount); row.AddValue("ExtendedCost", vendorItem.ExtendedCostId); row.Comment = StoreGetters.GetName(StoreNameType.Item, (int)vendorItem.ItemId, false); rows.Add(row); } } return new QueryBuilder.SQLInsert(tableName, rows, 2).Build(); }
public static string Loot() { if (Storage.Loots.IsEmpty) return String.Empty; // Not TDB structure const string tableName = "LootTemplate"; var rows = new List<QueryBuilder.SQLInsertRow>(); foreach (var loot in Storage.Loots) { var comment = new QueryBuilder.SQLInsertRow(); comment.HeaderComment = StoreGetters.GetName(Utilities.ObjectTypeToStore(Storage.Loots.Keys.First().Item2), (int)loot.Key.Item1, false) + " (" + loot.Value.Gold + " gold)"; rows.Add(comment); foreach (var lootItem in loot.Value.LootItems) { var row = new QueryBuilder.SQLInsertRow(); row.AddValue("Id", loot.Key.Item1); row.AddValue("Type", loot.Key.Item2); row.AddValue("ItemId", lootItem.ItemId); row.AddValue("Count", lootItem.Count); row.Comment = StoreGetters.GetName(StoreNameType.Item, (int)lootItem.ItemId, false); rows.Add(row); } } return new QueryBuilder.SQLInsert(tableName, rows, 2).Build(); }
public static string Gossip() { if (Storage.Gossips.IsEmpty) return String.Empty; const string tableName1 = "gossip_menu"; const string tableName2 = "gossip_menu_option"; // TODO: Add creature_template gossip_menu_id update query or similar // `gossip` var rows = new List<QueryBuilder.SQLInsertRow>(); foreach (var gossip in Storage.Gossips) { var row = new QueryBuilder.SQLInsertRow(); row.AddValue("entry", gossip.Key.Item1); row.AddValue("text_id", gossip.Key.Item2); row.Comment = StoreGetters.GetName(Utilities.ObjectTypeToStore(gossip.Value.ObjectType), (int)gossip.Value.ObjectEntry, false); rows.Add(row); } var result = new QueryBuilder.SQLInsert(tableName1, rows, 2).Build(); // `gossip_menu_option` rows = new List<QueryBuilder.SQLInsertRow>(); ICollection<Tuple<uint, uint>> keys = new Collection<Tuple<uint, uint>>(); foreach (var gossip in Storage.Gossips) { if (gossip.Value.GossipOptions != null) // Needed? foreach (var gossipOption in gossip.Value.GossipOptions) { var row = new QueryBuilder.SQLInsertRow(); row.AddValue("menu_id", gossip.Key.Item1); row.AddValue("id", gossipOption.Index); row.AddValue("option_icon", gossipOption.OptionIcon); row.AddValue("option_text", gossipOption.OptionText); row.AddValue("box_coded", gossipOption.Box); row.AddValue("box_money", gossipOption.RequiredMoney); row.AddValue("box_text", gossipOption.BoxText); rows.Add(row); keys.Add(Tuple.Create(gossip.Key.Item1, gossipOption.Index)); } } result += new QueryBuilder.SQLInsert(tableName2, rows, 2).Build(); return result; }
public static string GameObject(Dictionary<Guid, GameObject> gameObjects) { if (gameObjects.Count == 0) return string.Empty; if (!Settings.SQLOutputFlag.HasAnyFlagBit(SQLOutput.gameobject)) return string.Empty; const string tableName = "gameobject"; uint count = 0; var rows = new List<QueryBuilder.SQLInsertRow>(); foreach (var gameobject in gameObjects) { var row = new QueryBuilder.SQLInsertRow(); var go = gameobject.Value; if (Settings.AreaFilters.Length > 0) if (!(go.Area.ToString(CultureInfo.InvariantCulture).MatchesFilters(Settings.AreaFilters))) continue; uint animprogress = 0; uint state = 0; UpdateField uf; if (!go.UpdateFields.TryGetValue(UpdateFields.GetUpdateField(ObjectField.OBJECT_FIELD_ENTRY), out uf)) continue; // broken entry, nothing to spawn var entry = uf.UInt32Value; if (go.UpdateFields.TryGetValue(UpdateFields.GetUpdateField(GameObjectField.GAMEOBJECT_BYTES_1), out uf)) { var bytes = uf.UInt32Value; state = (bytes & 0x000000FF); animprogress = Convert.ToUInt32((bytes & 0xFF000000) >> 24); } row.AddValue("guid", "@OGUID+" + count, noQuotes: true); row.AddValue("id", entry); row.AddValue("map", !go.IsOnTransport() ? go.Map : 0); // TODO: query transport template for map row.AddValue("spawnMask", 1); row.AddValue("phaseMask", go.PhaseMask); if (!go.IsOnTransport()) { row.AddValue("position_x", go.Movement.Position.X); row.AddValue("position_y", go.Movement.Position.Y); row.AddValue("position_z", go.Movement.Position.Z); row.AddValue("orientation", go.Movement.Orientation); } else { row.AddValue("position_x", go.Movement.TransportOffset.X); row.AddValue("position_y", go.Movement.TransportOffset.Y); row.AddValue("position_z", go.Movement.TransportOffset.Z); row.AddValue("orientation", go.Movement.TransportOffset.O); } var rotation = go.GetRotation(); if (rotation != null && rotation.Length == 4) { row.AddValue("rotation0", rotation[0]); row.AddValue("rotation1", rotation[1]); row.AddValue("rotation2", rotation[2]); row.AddValue("rotation3", rotation[3]); } else { row.AddValue("rotation0", 0); row.AddValue("rotation1", 0); row.AddValue("rotation2", 0); row.AddValue("rotation3", 0); } row.AddValue("spawntimesecs", go.GetDefaultSpawnTime()); row.AddValue("animprogress", animprogress); row.AddValue("state", state); row.Comment = StoreGetters.GetName(StoreNameType.GameObject, (int)gameobject.Key.GetEntry(), false); row.Comment += " (Area: " + StoreGetters.GetName(StoreNameType.Area, go.Area, false) + ")"; if (go.IsTemporarySpawn()) { row.CommentOut = true; row.Comment += " - !!! might be temporary spawn !!!"; } else if (go.IsTransport()) { row.CommentOut = true; row.Comment += " - !!! transport !!!"; } else if (go.IsOnTransport()) { row.CommentOut = true; row.Comment += " - !!! on transport (NYI) !!!"; } else ++count; rows.Add(row); } var result = new StringBuilder(); // delete query for GUIDs var delete = new QueryBuilder.SQLDelete(Tuple.Create("@OGUID+0", "@OGUID+" + --count), "guid", tableName); result.Append(delete.Build()); var sql = new QueryBuilder.SQLInsert(tableName, rows, withDelete: false); result.Append(sql.Build()); return result.ToString(); }
public static string Addon(Dictionary <WowGuid, Unit> units) { if (units.Count == 0) { return(string.Empty); } if (!Settings.SQLOutputFlag.HasAnyFlagBit(SQLOutput.creature_template_addon)) { return(string.Empty); } const string tableName = "creature_template_addon"; var rows = new List <QueryBuilder.SQLInsertRow>(); foreach (var unit in units) { var npc = unit.Value; if (Settings.AreaFilters.Length > 0) { if (!(npc.Area.ToString(CultureInfo.InvariantCulture).MatchesFilters(Settings.AreaFilters))) { continue; } } if (Settings.MapFilters.Length > 0) { if (!(npc.Map.ToString(CultureInfo.InvariantCulture).MatchesFilters(Settings.MapFilters))) { continue; } } var row = new QueryBuilder.SQLInsertRow(); row.AddValue("entry", unit.Key.GetEntry()); row.AddValue("mount", npc.Mount); row.AddValue("bytes1", npc.Bytes1, true); row.AddValue("bytes2", npc.Bytes2, true); var auras = string.Empty; var commentAuras = string.Empty; if (npc.Auras != null && npc.Auras.Count() != 0) { foreach (var aura in npc.Auras) { if (aura == null) { continue; } // usually "template auras" do not have caster if (ClientVersion.AddedInVersion(ClientType.MistsOfPandaria) ? !aura.AuraFlags.HasAnyFlag(AuraFlagMoP.NoCaster) : !aura.AuraFlags.HasAnyFlag(AuraFlag.NotCaster)) { continue; } auras += aura.SpellId + " "; commentAuras += StoreGetters.GetName(StoreNameType.Spell, (int)aura.SpellId, false) + ", "; } auras = auras.TrimEnd(' '); commentAuras = commentAuras.TrimEnd(',', ' '); } row.AddValue("auras", auras); row.Comment += StoreGetters.GetName(StoreNameType.Unit, (int)unit.Key.GetEntry(), false); if (!String.IsNullOrWhiteSpace(auras)) { row.Comment += " - " + commentAuras; } rows.Add(row); } return(new QueryBuilder.SQLInsert(tableName, rows).Build()); }
public static string StartInformation() { var result = String.Empty; if (!Storage.StartActions.IsEmpty) { var rows = new List<QueryBuilder.SQLInsertRow>(); foreach (var startActions in Storage.StartActions) { var comment = new QueryBuilder.SQLInsertRow(); comment.HeaderComment = startActions.Key.Item1 + " - " + startActions.Key.Item2; rows.Add(comment); foreach (var action in startActions.Value.Actions) { var row = new QueryBuilder.SQLInsertRow(); row.AddValue("race", startActions.Key.Item1); row.AddValue("class", startActions.Key.Item2); row.AddValue("button", action.Button); row.AddValue("action", action.Id); row.AddValue("type", action.Type); if (action.Type == ActionButtonType.Spell) row.Comment = StoreGetters.GetName(StoreNameType.Spell, (int)action.Id, false); if (action.Type == ActionButtonType.Item) row.Comment = StoreGetters.GetName(StoreNameType.Item, (int)action.Id, false); rows.Add(row); } } result = new QueryBuilder.SQLInsert("playercreateinfo_action", rows, 2).Build(); } if (!Storage.StartPositions.IsEmpty) { var rows = new List<QueryBuilder.SQLInsertRow>(); foreach (var startPosition in Storage.StartPositions) { var comment = new QueryBuilder.SQLInsertRow(); comment.HeaderComment = startPosition.Key.Item1 + " - " + startPosition.Key.Item2; rows.Add(comment); var row = new QueryBuilder.SQLInsertRow(); row.AddValue("race", startPosition.Key.Item1); row.AddValue("class", startPosition.Key.Item2); row.AddValue("map", startPosition.Value.Map); row.AddValue("zone", startPosition.Value.Zone); row.AddValue("position_x", startPosition.Value.Position.X); row.AddValue("position_y", startPosition.Value.Position.Y); row.AddValue("position_z", startPosition.Value.Position.Z); row.Comment = StoreGetters.GetName(StoreNameType.Map, startPosition.Value.Map, false) + " - " + StoreGetters.GetName(StoreNameType.Zone, startPosition.Value.Zone, false); rows.Add(row); } result += new QueryBuilder.SQLInsert("playercreateinfo", rows, 2).Build(); } if (!Storage.StartSpells.IsEmpty) { var rows = new List<QueryBuilder.SQLInsertRow>(); foreach (var startSpells in Storage.StartSpells) { var comment = new QueryBuilder.SQLInsertRow(); comment.HeaderComment = startSpells.Key.Item1 + " - " + startSpells.Key.Item2; rows.Add(comment); foreach (var spell in startSpells.Value.Spells) { var row = new QueryBuilder.SQLInsertRow(); row.AddValue("race", startSpells.Key.Item1); row.AddValue("class", startSpells.Key.Item2); row.AddValue("Spell", spell); row.AddValue("Note", StoreGetters.GetName(StoreNameType.Spell, (int)spell, false)); rows.Add(row); } } result = new QueryBuilder.SQLInsert("playercreateinfo_spell", rows, 2).Build(); } return result; }
public static string VehicleAccessory() { if (Storage.VehicleTemplateAccessorys.IsEmpty()) return String.Empty; if (!Settings.SQLOutputFlag.HasAnyFlagBit(SQLOutput.vehicle_template_accessory)) return string.Empty; const string tableName = "vehicle_template_accessory"; var rows = new List<QueryBuilder.SQLInsertRow>(); foreach (var accessorys in Storage.VehicleTemplateAccessorys) { foreach (var accessorysValue in accessorys.Value) { var row = new QueryBuilder.SQLInsertRow(); if (accessorysValue.Item1.SeatId < 0 || accessorysValue.Item1.SeatId > 7) continue; row.Comment = StoreGetters.GetName(StoreNameType.Unit, (int)accessorys.Key, false) + " - "; row.Comment += StoreGetters.GetName(StoreNameType.Unit, (int)accessorysValue.Item1.AccessoryEntry, false); row.AddValue("entry", accessorys.Key); row.AddValue("accessory_entry", accessorysValue.Item1.AccessoryEntry); row.AddValue("seat_id", accessorysValue.Item1.SeatId); row.AddValue("minion", "x", false, true); row.AddValue("description", row.Comment); row.AddValue("summontype", "x", false, true); row.AddValue("summontimer", "x", false, true); rows.Add(row); } } return new QueryBuilder.SQLInsert(tableName, rows, 1, false).Build(); }
public static string ModelData(Dictionary<Guid, Unit> units) { if (units.Count == 0) return string.Empty; const string tableName = "creature_model_info"; // Build a dictionary with model data; model is the key var models = new SortedDictionary<uint, Tuple<float, float, Gender>>(); foreach (var unit in units) { var npc = unit.Value; if (npc.Model == null) continue; var model = (uint)npc.Model; // Do not add duplicate models if (models.ContainsKey(model)) continue; var boundingRadius = 0.0f; if (npc.BoundingRadius != null) boundingRadius = (float)npc.BoundingRadius; var combatReach = 0.0f; if (npc.CombatReach != null) combatReach = (float)npc.CombatReach; var gender = Gender.None; if (npc.Gender != null) gender = (Gender)npc.Gender; models.Add(model, Tuple.Create(boundingRadius, combatReach, gender)); } Dictionary<uint, dynamic> modelsDb = null; if (SQLConnector.Enabled) { modelsDb = SQLDatabase.GetDict<uint>(string.Format( "SELECT `modelid`, `bounding_radius`, `combat_reach`," + "`gender` FROM `{0}`.{1} WHERE `modelid` IN ({2});", Settings.TDBDatabase, tableName, String.Join(",", models.Keys))); } var rowsUpd = new List<QueryBuilder.SQLUpdateRow>(); var rowsIns = new List<QueryBuilder.SQLInsertRow>(); foreach (var model in models) { if (modelsDb != null && modelsDb.Count != 0) { if (modelsDb.ContainsKey(model.Key)) // possible update { var row = new QueryBuilder.SQLUpdateRow(); if (!Utilities.EqualValues(modelsDb[model.Key].Item1, model.Value.Item1)) row.AddValue("bounding_radius", model.Value.Item1); if (!Utilities.EqualValues(modelsDb[model.Key].Item2, model.Value.Item2)) row.AddValue("combat_reach", model.Value.Item2); if (!Utilities.EqualValues(modelsDb[model.Key].Item3, model.Value.Item3)) row.AddValue("gender", model.Value.Item3); row.AddWhere("entry", model.Key); row.Table = tableName; if (row.ValueCount != 0) rowsUpd.Add(row); } else // insert new { var row = new QueryBuilder.SQLInsertRow(); row.AddValue("entry", model.Key); row.AddValue("bounding_radius", model.Value.Item1); row.AddValue("combat_reach", model.Value.Item2); row.AddValue("gender", model.Value.Item3); rowsIns.Add(row); } } else // no db values, simply do inserts { var row = new QueryBuilder.SQLInsertRow(); row.AddValue("entry", model.Key); row.AddValue("bounding_radius", model.Value.Item1); row.AddValue("combat_reach", model.Value.Item2); row.AddValue("gender", model.Value.Item3); rowsIns.Add(row); } } return new QueryBuilder.SQLInsert(tableName, rowsIns).Build() + new QueryBuilder.SQLUpdate(rowsUpd).Build(); }
public static string WeatherUpdates() { if (Storage.WeatherUpdates.IsEmpty()) return String.Empty; if (!Settings.SQLOutputFlag.HasAnyFlagBit(SQLOutput.weather_updates)) return string.Empty; const string tableName = "weather_updates"; var rows = new List<QueryBuilder.SQLInsertRow>(); foreach (var weatherUpdate in Storage.WeatherUpdates) { var row = new QueryBuilder.SQLInsertRow(); var weather = weatherUpdate.Item1; row.AddValue("map_id", weather.MapId); row.AddValue("zone_id", weather.ZoneId); row.AddValue("weather_state", (int)weather.State); row.AddValue("timestamp", weatherUpdate.Item2.HasValue ? weatherUpdate.Item2.Value.ToFormattedString() : "null"); row.AddValue("grade", weather.Grade); row.AddValue("unk", weather.Unk); row.Comment = StoreGetters.GetName(StoreNameType.Map, (int)weather.MapId, false) + " - " + weather.State + " - " + weather.Grade; rows.Add(row); } return new QueryBuilder.SQLInsert(tableName, rows, ignore: true, withDelete: false).Build(); }
public static string CreatureText() { if (Storage.CreatureTexts.IsEmpty()) { return(string.Empty); } if (!Settings.SQLOutputFlag.HasAnyFlagBit(SQLOutput.creature_text)) { return(string.Empty); } // For each sound and emote, if the time they were send is in the +1/-1 seconds range of // our texts, add that sound and emote to our Storage.CreatureTexts foreach (var text in Storage.CreatureTexts) { // For each text foreach (var textValue in text.Value) { // For each emote foreach (var emote in Storage.Emotes) { // Emote packets always have a sender (guid); // skip this one if it was sent by a different creature if (emote.Key.GetEntry() != text.Key) { continue; } foreach (var emoteValue in emote.Value) { var timeSpan = textValue.Item2 - emoteValue.Item2; if (timeSpan != null && timeSpan.Value.Duration() <= TimeSpan.FromSeconds(1)) { textValue.Item1.Emote = emoteValue.Item1; } } } // For each sound foreach (var sound in Storage.Sounds) { var timeSpan = textValue.Item2 - sound.Item2; if (timeSpan != null && timeSpan.Value.Duration() <= TimeSpan.FromSeconds(1)) { textValue.Item1.Sound = sound.Item1; } } } } /* can't use compare DB without knowing values of groupid or id * var entries = Storage.CreatureTexts.Keys.ToList(); * var creatureTextDb = SQLDatabase.GetDict<uint, CreatureText>(entries); */ const string tableName = "creature_text"; var rows = new List <QueryBuilder.SQLInsertRow>(); foreach (var text in Storage.CreatureTexts) { foreach (var textValue in text.Value) { var row = new QueryBuilder.SQLInsertRow(); var query = new StringBuilder(string.Format("SELECT Id FROM {1}.broadcast_text WHERE MaleText='{0}' OR FemaleText='{0}';", MySqlHelper.DoubleQuoteString(textValue.Item1.Text), Settings.TDBDatabase)); string broadcastTextId = ""; if (Settings.DevMode) { using (var reader = SQLConnector.ExecuteQuery(query.ToString())) { if (reader != null) { while (reader.Read()) { var values = new object[1]; var count = reader.GetValues(values); if (count != 1) { break; // error in query } if (!String.IsNullOrWhiteSpace(broadcastTextId)) { broadcastTextId += " - " + Convert.ToInt32(values[0]); } else { broadcastTextId += Convert.ToInt32(values[0]); } } } } } row.AddValue("entry", text.Key); row.AddValue("groupid", "x", false, true); row.AddValue("id", "x", false, true); row.AddValue("text", textValue.Item1.Text); row.AddValue("type", textValue.Item1.Type); row.AddValue("language", textValue.Item1.Language); row.AddValue("probability", 100.0); row.AddValue("emote", textValue.Item1.Emote); row.AddValue("duration", 0); row.AddValue("sound", textValue.Item1.Sound); if (Settings.DevMode) { row.AddValue("BroadcastTextID", broadcastTextId); } row.AddValue("comment", textValue.Item1.Comment); rows.Add(row); } } return(new QueryBuilder.SQLInsert(tableName, rows, 1, false).Build()); }
public static string Quest() { if (Storage.QuestTemplates.IsEmpty) { return(String.Empty); } const string tableName = "quest_template"; var rows = new List <QueryBuilder.SQLInsertRow>(); foreach (var quest in Storage.QuestTemplates) { var row = new QueryBuilder.SQLInsertRow(); row.AddValue("entry", quest.Key); row.AddValue("Method", quest.Value.Method); row.AddValue("QuestLevel", quest.Value.Level); row.AddValue("MinLevel", quest.Value.MinLevel); row.AddValue("ZoneOrSort", quest.Value.ZoneOrSort); row.AddValue("Type", quest.Value.Type); row.AddValue("SuggestedPlayers", quest.Value.SuggestedPlayers); for (var i = 0; i < quest.Value.RequiredFactionId.Length; i++) { row.AddValue("RequiredFactionId" + (i + 1), quest.Value.RequiredFactionId[i]); } for (var i = 0; i < quest.Value.RequiredFactionId.Length; i++) { row.AddValue("RequiredFactionValue" + (i + 1), quest.Value.RequiredFactionValue[i]); } row.AddValue("NextQuestIdChain", quest.Value.NextQuestIdChain); row.AddValue("RewardXPId", quest.Value.RewardXPId); row.AddValue("RewardOrRequiredMoney", quest.Value.RewardOrRequiredMoney); row.AddValue("RewardMoneyMaxLevel", quest.Value.RewardMoneyMaxLevel); row.AddValue("RewardSpell", quest.Value.RewardSpell); row.AddValue("RewardSpellCast", quest.Value.RewardSpellCast); row.AddValue("RewardHonor", quest.Value.RewardHonor); row.AddValue("RewardHonorMultiplier", quest.Value.RewardHonorMultiplier); row.AddValue("SourceItemId", quest.Value.SourceItemId); row.AddValue("Flags", quest.Value.Flags, true); row.AddValue("MinimapTargetMark", quest.Value.MinimapTargetMark); row.AddValue("RewardTitleId", quest.Value.RewardTitleId); row.AddValue("RequiredPlayerKills", quest.Value.RequiredPlayerKills); row.AddValue("RewardTalents", quest.Value.RewardTalents); row.AddValue("RewardArenaPoints", quest.Value.RewardArenaPoints); row.AddValue("RewardSkillId", quest.Value.RewardSkillId); row.AddValue("RewardSkillPoints", quest.Value.RewardSkillPoints); row.AddValue("RewardReputationMask", quest.Value.RewardReputationMask); row.AddValue("QuestGiverPortrait", quest.Value.QuestGiverPortrait); row.AddValue("QuestTurnInPortrait", quest.Value.QuestTurnInPortrait); for (var i = 0; i < quest.Value.RewardItemId.Length; i++) { row.AddValue("RewardItemId" + (i + 1), quest.Value.RewardItemId[i]); } for (var i = 0; i < quest.Value.RewardItemCount.Length; i++) { row.AddValue("RewardItemCount" + (i + 1), quest.Value.RewardItemCount[i]); } for (var i = 0; i < quest.Value.RewardChoiceItemId.Length; i++) { row.AddValue("RewardChoiceItemId" + (i + 1), quest.Value.RewardChoiceItemId[i]); } for (var i = 0; i < quest.Value.RewardChoiceItemCount.Length; i++) { row.AddValue("RewardChoiceItemCount" + (i + 1), quest.Value.RewardChoiceItemCount[i]); } for (var i = 0; i < quest.Value.RewardFactionId.Length; i++) { row.AddValue("RewardFactionId" + (i + 1), quest.Value.RewardFactionId[i]); } for (var i = 0; i < quest.Value.RewardFactionValueId.Length; i++) { row.AddValue("RewardFactionValueId" + (i + 1), quest.Value.RewardFactionValueId[i]); } for (var i = 0; i < quest.Value.RewardFactionValueIdOverride.Length; i++) { row.AddValue("RewardFactionValueIdOverride" + (i + 1), quest.Value.RewardFactionValueIdOverride[i]); } row.AddValue("PointMapId", quest.Value.PointMapId); row.AddValue("PointX", quest.Value.PointX); row.AddValue("PointY", quest.Value.PointY); row.AddValue("PointOption", quest.Value.PointOption); row.AddValue("Title", quest.Value.Title); row.AddValue("Objectives", quest.Value.Objectives); row.AddValue("Details", quest.Value.Details); row.AddValue("EndText", quest.Value.EndText); row.AddValue("CompletedText", quest.Value.CompletedText); for (var i = 0; i < quest.Value.RequiredNpcOrGo.Length; i++) { row.AddValue("RequiredNpcOrGo" + (i + 1), quest.Value.RequiredNpcOrGo[i]); } for (var i = 0; i < quest.Value.RequiredNpcOrGoCount.Length; i++) { row.AddValue("RequiredNpcOrGoCount" + (i + 1), quest.Value.RequiredNpcOrGoCount[i]); } for (var i = 0; i < quest.Value.RequiredSourceItemId.Length; i++) { row.AddValue("RequiredSourceItemId" + (i + 1), quest.Value.RequiredSourceItemId[i]); } for (var i = 0; i < quest.Value.RequiredSourceItemCount.Length; i++) { row.AddValue("RequiredSourceItemCount" + (i + 1), quest.Value.RequiredSourceItemCount[i]); } for (var i = 0; i < quest.Value.RequiredItemId.Length; i++) { row.AddValue("RequiredItemId" + (i + 1), quest.Value.RequiredItemId[i]); } for (var i = 0; i < quest.Value.RequiredItemCount.Length; i++) { row.AddValue("RequiredItemCount" + (i + 1), quest.Value.RequiredItemCount[i]); } row.AddValue("RequiredSpell", quest.Value.RequiredSpell); for (var i = 0; i < quest.Value.ObjectiveText.Length; i++) { row.AddValue("ObjectiveText" + (i + 1), quest.Value.ObjectiveText[i]); } for (var i = 0; i < quest.Value.RewardCurrencyId.Length; i++) { row.AddValue("RewardCurrencyId" + (i + 1), quest.Value.RewardCurrencyId[i]); } for (var i = 0; i < quest.Value.RewardCurrencyCount.Length; i++) { row.AddValue("RewardCurrencyCount" + (i + 1), quest.Value.RewardCurrencyCount[i]); } for (var i = 0; i < quest.Value.RequiredCurrencyId.Length; i++) { row.AddValue("RequiredCurrencyId" + (i + 1), quest.Value.RequiredCurrencyId[i]); } for (var i = 0; i < quest.Value.RequiredCurrencyCount.Length; i++) { row.AddValue("RequiredCurrencyCount" + (i + 1), quest.Value.RequiredCurrencyCount[i]); } row.AddValue("QuestGiverTextWindow", quest.Value.QuestGiverTextWindow); row.AddValue("QuestGiverTargetName", quest.Value.QuestGiverTargetName); row.AddValue("QuestTurnTextWindow", quest.Value.QuestTurnTextWindow); row.AddValue("QuestTurnTargetName", quest.Value.QuestTurnTargetName); row.AddValue("SoundAccept", quest.Value.SoundAccept); row.AddValue("SoundTurnIn", quest.Value.SoundTurnIn); rows.Add(row); } return(new QueryBuilder.SQLInsert(tableName, rows).Build()); }
public static string CreatureMovement(Dictionary<Guid, Unit> units) { if (units.Count == 0) return string.Empty; const string tableName = "creature_movement"; var rows = new List<QueryBuilder.SQLInsertRow>(); foreach (var unit in units) { var row = new QueryBuilder.SQLInsertRow(); var npc = unit.Value; npc.LoadValuesFromUpdateFields(); row.AddValue("Id", unit.Key.GetEntry()); row.AddValue("MovementFlags", npc.Movement.Flags, true); row.AddValue("MovementFlagsExtra", npc.Movement.FlagsExtra, true); row.AddValue("ufBytes1", npc.Bytes1, true); row.AddValue("ufBytes2", npc.Bytes2, true); row.AddValue("ufFlags", npc.UnitFlags, true); row.AddValue("ufFlags2", npc.UnitFlags2, true); row.Comment = StoreGetters.GetName(StoreNameType.Unit, (int)unit.Key.GetEntry(), false); /* row.Comment += " - MoveFlags: " + npc.Movement.Flags + " - MoveFlags2: " + npc.Movement.FlagsExtra; row.Comment += " - Bytes1: " + npc.Bytes1 + " - Bytes2: " + npc.Bytes2 + " - UnitFlags: " + npc.UnitFlags; row.Comment += " - UnitFlags2: " + npc.UnitFlags2; */ rows.Add(row); } return new QueryBuilder.SQLInsert(tableName, rows, ignore: true, withDelete: false).Build(); }
public static string CreatureEquip(Dictionary<WowGuid, Unit> units) { if (units.Count == 0) return string.Empty; if (!Settings.SQLOutputFlag.HasAnyFlagBit(SQLOutput.creature_equip_template)) return string.Empty; var rows = new List<QueryBuilder.SQLInsertRow>(); var equips = new StoreDictionary<uint, CreatureEquipment>(); foreach (var unit in units) { var equip = new CreatureEquipment(); var npc = unit.Value; var CreatureID = unit.Key.GetEntry(); var row = new QueryBuilder.SQLInsertRow(); if (Settings.AreaFilters.Length > 0) if (!(npc.Area.ToString(CultureInfo.InvariantCulture).MatchesFilters(Settings.AreaFilters))) continue; if (Settings.MapFilters.Length > 0) if (!(npc.Map.ToString(CultureInfo.InvariantCulture).MatchesFilters(Settings.MapFilters))) continue; if (npc.Equipment == null || npc.Equipment.Length != 3) continue; if (npc.Equipment[0] == 0 && npc.Equipment[1] == 0 && npc.Equipment[2] == 0) continue; if (equips.ContainsKey(CreatureID)) { var existingEquip = equips[CreatureID].Item1; if (existingEquip.ItemEntry1 != npc.Equipment[0] || existingEquip.ItemEntry2 != npc.Equipment[1] || existingEquip.ItemEntry3 != npc.Equipment[2]) equips.Remove(CreatureID); // no conflicts continue; } /*equip.ID = 1; equip.ItemEntry1 = npc.Equipment[0]; equip.ItemEntry2 = npc.Equipment[1]; equip.ItemEntry3 = npc.Equipment[2];*/ row.AddValue("CreatureID", CreatureID); row.AddValue("ID", 1); row.AddValue("ItemID1", npc.Equipment[0]); row.AddValue("ItemID2", npc.Equipment[1]); row.AddValue("ItemID3", npc.Equipment[2]); equips.Add(CreatureID, equip); rows.Add(row); } var entries = equips.Keys(); //var equipsDb = SQLDatabase.GetDict<uint, CreatureEquipment>(entries); //return SQLUtil.CompareDicts(equips, equipsDb, StoreNameType.Unit); return new QueryBuilder.SQLInsert("creature_equip_template", rows, withDelete: true).Build(); }
public static string GameObject(Dictionary <Guid, GameObject> gameObjects) { if (gameObjects.Count == 0) { return(string.Empty); } const string tableName = "gameobject"; uint count = 0; var rows = new List <QueryBuilder.SQLInsertRow>(); foreach (var gameobject in gameObjects) { var row = new QueryBuilder.SQLInsertRow(); var go = gameobject.Value; if (Settings.AreaFilters.Length > 0) { if (!(go.Area.ToString(CultureInfo.InvariantCulture).MatchesFilters(Settings.AreaFilters))) { continue; } } uint animprogress = 0; uint state = 0; UpdateField uf; if (go.UpdateFields.TryGetValue(UpdateFields.GetUpdateField(GameObjectField.GAMEOBJECT_BYTES_1), out uf)) { var bytes = uf.UInt32Value; state = (bytes & 0x000000FF); animprogress = Convert.ToUInt32((bytes & 0xFF000000) >> 24); } var spawnTimeSecs = go.GetDefaultSpawnTime(); if (gameobject.Key.GetEntry() != 0) { row.AddValue("id", gameobject.Key.GetEntry()); row.AddValue("map", go.Map); row.AddValue("spawnMask", 1); row.AddValue("phaseMask", go.PhaseMask); row.AddValue("position_x", go.Movement.Position.X); row.AddValue("position_y", go.Movement.Position.Y); row.AddValue("position_z", go.Movement.Position.Z); row.AddValue("orientation", go.Movement.Orientation); row.AddValue("rotation0", go.Movement.Rotation.X); row.AddValue("rotation1", go.Movement.Rotation.Y); row.AddValue("rotation2", go.Movement.Rotation.Z); row.AddValue("rotation3", go.Movement.Rotation.W); row.AddValue("spawntimesecs", spawnTimeSecs); row.AddValue("animprogress", animprogress); row.AddValue("state", state); row.Comment = StoreGetters.GetName(StoreNameType.GameObject, (int)gameobject.Key.GetEntry(), false); row.Comment += " (Area: " + StoreGetters.GetName(StoreNameType.Area, go.Area, false) + ")"; if (go.IsTemporarySpawn()) { row.CommentOut = true; row.Comment += " - !!! might be temporary spawn !!!"; } else { ++count; } rows.Add(row); } } var result = new StringBuilder(); var sql = new QueryBuilder.SQLInsert(tableName, rows, withDelete: false); result.Append(sql.Build()); return(result.ToString()); }
public static string ModelData(Dictionary <Guid, Unit> units) { if (units.Count == 0) { return(string.Empty); } const string tableName = "creature_model_info"; // Build a dictionary with model data; model is the key var models = new SortedDictionary <uint, Tuple <float, float, Gender> >(); foreach (var unit in units) { var npc = unit.Value; if (npc.Model == null) { continue; } var model = (uint)npc.Model; // Do not add duplicate models if (models.ContainsKey(model)) { continue; } var boundingRadius = 0.0f; if (npc.BoundingRadius != null) { boundingRadius = (float)npc.BoundingRadius; } var combatReach = 0.0f; if (npc.CombatReach != null) { combatReach = (float)npc.CombatReach; } var gender = Gender.None; if (npc.Gender != null) { gender = (Gender)npc.Gender; } models.Add(model, Tuple.Create(boundingRadius, combatReach, gender)); } Dictionary <uint, dynamic> modelsDb = null; if (SQLConnector.Enabled) { modelsDb = SQLDatabase.GetDict <uint>(string.Format( "SELECT `modelid`, `bounding_radius`, `combat_reach`," + "`gender` FROM `{0}`.{1} WHERE `modelid` IN ({2});", Settings.TDBDatabase, tableName, String.Join(",", models.Keys))); } var rowsUpd = new List <QueryBuilder.SQLUpdateRow>(); var rowsIns = new List <QueryBuilder.SQLInsertRow>(); foreach (var model in models) { if (modelsDb != null && modelsDb.Count != 0) { if (modelsDb.ContainsKey(model.Key)) // possible update { var row = new QueryBuilder.SQLUpdateRow(); if (!Utilities.EqualValues(modelsDb[model.Key].Item1, model.Value.Item1)) { row.AddValue("bounding_radius", model.Value.Item1); } if (!Utilities.EqualValues(modelsDb[model.Key].Item2, model.Value.Item2)) { row.AddValue("combat_reach", model.Value.Item2); } if (!Utilities.EqualValues(modelsDb[model.Key].Item3, model.Value.Item3)) { row.AddValue("gender", model.Value.Item3); } row.AddWhere("modelid", model.Key); row.Table = tableName; if (row.ValueCount != 0) { rowsUpd.Add(row); } } else // insert new { var row = new QueryBuilder.SQLInsertRow(); row.AddValue("modelid", model.Key); row.AddValue("bounding_radius", model.Value.Item1); row.AddValue("combat_reach", model.Value.Item2); row.AddValue("gender", model.Value.Item3); rowsIns.Add(row); } } else // no db values, simply do inserts { var row = new QueryBuilder.SQLInsertRow(); row.AddValue("modelid", model.Key); row.AddValue("bounding_radius", model.Value.Item1); row.AddValue("combat_reach", model.Value.Item2); row.AddValue("gender", model.Value.Item3); rowsIns.Add(row); } } return(new QueryBuilder.SQLInsert(tableName, rowsIns).Build() + new QueryBuilder.SQLUpdate(rowsUpd).Build()); }
public static string PointsOfInterest() { if (Storage.GossipPOIs.IsEmpty()) { return(string.Empty); } var result = string.Empty; if (!Storage.GossipSelects.IsEmpty() && Settings.SQLOutputFlag.HasAnyFlagBit(SQLOutput.gossip_menu_option)) { var gossipPOIsTable = new Dictionary <Tuple <uint, uint>, uint>(); foreach (var poi in Storage.GossipPOIs) { foreach (var gossipSelect in Storage.GossipSelects) { var tuple = Tuple.Create(gossipSelect.Key.Item1, gossipSelect.Key.Item2); if (gossipPOIsTable.ContainsKey(tuple)) { continue; } var timeSpan = poi.Value.Item2 - gossipSelect.Value.Item2; if (timeSpan != null && timeSpan.Value.Duration() <= TimeSpan.FromSeconds(1)) { gossipPOIsTable.Add(tuple, poi.Key); } } } var rowsUpd = new List <QueryBuilder.SQLUpdateRow>(); foreach (var u in gossipPOIsTable) { var row = new QueryBuilder.SQLUpdateRow(); row.AddValue("action_poi_id", u.Value); row.AddWhere("menu_id", u.Key.Item1); row.AddWhere("id", u.Key.Item2); row.Table = "gossip_menu_option"; rowsUpd.Add(row); } result += new QueryBuilder.SQLUpdate(rowsUpd).Build(); } if (Settings.SQLOutputFlag.HasAnyFlagBit(SQLOutput.points_of_interest)) { const string tableName = "points_of_interest"; var rowsIns = new List <QueryBuilder.SQLInsertRow>(); uint count = 0; foreach (var poi in Storage.GossipPOIs) { var row = new QueryBuilder.SQLInsertRow(); row.AddValue("entry", "@ID+" + count, noQuotes: true); row.AddValue("x", poi.Value.Item1.XPos); row.AddValue("y", poi.Value.Item1.YPos); row.AddValue("icon", poi.Value.Item1.Icon); row.AddValue("flags", poi.Value.Item1.Flags); row.AddValue("data", poi.Value.Item1.Data); row.AddValue("icon_name", poi.Value.Item1.IconName); rowsIns.Add(row); count++; } result += new QueryBuilder.SQLDelete(Tuple.Create("@ID+0", "@ID+" + (count - 1)), "entry", tableName).Build(); result += new QueryBuilder.SQLInsert(tableName, rowsIns, withDelete: false).Build(); } return(result); }
public static string LocalesQuest() { if (Storage.LocalesQuests.IsEmpty()) { return(String.Empty); } if (!Settings.SQLOutputFlag.HasAnyFlagBit(SQLOutput.locales_quest)) { return(String.Empty); } const string tableName = "quest_template_locale"; var rowsIns = new List <QueryBuilder.SQLInsertRow>(); var rowsUpd = new List <QueryBuilder.SQLUpdateRow>(); foreach (var localesQuest in Settings.SQLOrderByKey ? Storage.LocalesQuests.OrderBy(blub => blub.Key).ToList() : Storage.LocalesQuests.ToList()) { if (SQLDatabase.LocalesQuestStores != null && SQLDatabase.LocalesQuestStores.ContainsKey(Tuple.Create(localesQuest.Key.Item1, localesQuest.Key.Item2))) { var row = new QueryBuilder.SQLUpdateRow(); var localesQuestDB = SQLDatabase.LocalesQuestStores[Tuple.Create(localesQuest.Key.Item1, localesQuest.Key.Item2)]; if (!Utilities.EqualValues(localesQuestDB.LogTitle, localesQuest.Value.Item1.LogTitle)) { row.AddValue("LogTitle", localesQuest.Value.Item1.LogTitle); } if (!Utilities.EqualValues(localesQuestDB.LogDescription, localesQuest.Value.Item1.LogDescription)) { row.AddValue("LogDescription", localesQuest.Value.Item1.LogDescription); } if (!Utilities.EqualValues(localesQuestDB.QuestDescription, localesQuest.Value.Item1.QuestDescription)) { row.AddValue("QuestDescription", localesQuest.Value.Item1.QuestDescription); } if (!Utilities.EqualValues(localesQuestDB.AreaDescription, localesQuest.Value.Item1.AreaDescription)) { row.AddValue("AreaDescription", localesQuest.Value.Item1.AreaDescription); } if (!Utilities.EqualValues(localesQuestDB.QuestCompletionLog, localesQuest.Value.Item1.QuestCompletionLog)) { row.AddValue("QuestCompletionLog", localesQuest.Value.Item1.QuestCompletionLog); } if (!Utilities.EqualValues(localesQuestDB.PortraitGiverText, localesQuest.Value.Item1.PortraitGiverText)) { row.AddValue("PortraitGiverText", localesQuest.Value.Item1.PortraitGiverText); } if (!Utilities.EqualValues(localesQuestDB.PortraitGiverName, localesQuest.Value.Item1.PortraitGiverName)) { row.AddValue("PortraitGiverName", localesQuest.Value.Item1.PortraitGiverName); } if (!Utilities.EqualValues(localesQuestDB.PortraitTurnInText, localesQuest.Value.Item1.PortraitTurnInText)) { row.AddValue("PortraitTurnInText", localesQuest.Value.Item1.PortraitTurnInText); } if (!Utilities.EqualValues(localesQuestDB.PortraitTurnInName, localesQuest.Value.Item1.PortraitTurnInName)) { row.AddValue("PortraitTurnInName", localesQuest.Value.Item1.PortraitTurnInName); } if (!Utilities.EqualValues(localesQuestDB.VerifiedBuild, localesQuest.Value.Item1.VerifiedBuild)) { row.AddValue("VerifiedBuild", localesQuest.Value.Item1.VerifiedBuild); } row.AddWhere("ID", localesQuest.Key.Item1); row.AddWhere("locale", localesQuest.Key.Item2); row.Table = tableName; rowsUpd.Add(row); } else // insert new { var row = new QueryBuilder.SQLInsertRow(); row.AddValue("ID", localesQuest.Key.Item1); row.AddValue("locale", localesQuest.Key.Item2); row.AddValue("LogTitle", localesQuest.Value.Item1.LogTitle); row.AddValue("LogDescription", localesQuest.Value.Item1.LogDescription); row.AddValue("QuestDescription", localesQuest.Value.Item1.QuestDescription); row.AddValue("AreaDescription", localesQuest.Value.Item1.AreaDescription); row.AddValue("PortraitGiverText", localesQuest.Value.Item1.AreaDescription); row.AddValue("PortraitGiverName", localesQuest.Value.Item1.PortraitGiverName); row.AddValue("PortraitTurnInText", localesQuest.Value.Item1.PortraitTurnInText); row.AddValue("PortraitTurnInName", localesQuest.Value.Item1.PortraitTurnInName); row.AddValue("QuestCompletionLog", localesQuest.Value.Item1.QuestCompletionLog); row.AddValue("VerifiedBuild", localesQuest.Value.Item1.VerifiedBuild); rowsIns.Add(row); } } var result = new QueryBuilder.SQLInsert(tableName, rowsIns, deleteDuplicates: false, primaryKeyNumber: 2).Build() + new QueryBuilder.SQLUpdate(rowsUpd).Build(); return("SET NAMES 'utf8';" + Environment.NewLine + result + Environment.NewLine + "SET NAMES 'latin1';"); }
public static string StartInformation() { var result = String.Empty; if (!Storage.StartActions.IsEmpty() && Settings.SQLOutputFlag.HasAnyFlagBit(SQLOutput.playercreateinfo_action)) { var rows = new List <QueryBuilder.SQLInsertRow>(); foreach (var startActions in Storage.StartActions) { var comment = new QueryBuilder.SQLInsertRow(); comment.HeaderComment = startActions.Key.Item1 + " - " + startActions.Key.Item2; rows.Add(comment); foreach (var action in startActions.Value.Item1.Actions) { var row = new QueryBuilder.SQLInsertRow(); row.AddValue("race", startActions.Key.Item1); row.AddValue("class", startActions.Key.Item2); row.AddValue("button", action.Button); row.AddValue("action", action.Id); row.AddValue("type", action.Type); if (action.Type == ActionButtonType.Spell) { row.Comment = StoreGetters.GetName(StoreNameType.Spell, (int)action.Id, false); } if (action.Type == ActionButtonType.Item) { row.Comment = StoreGetters.GetName(StoreNameType.Item, (int)action.Id, false); } rows.Add(row); } } result = new QueryBuilder.SQLInsert("playercreateinfo_action", rows, 2).Build(); } if (!Storage.StartPositions.IsEmpty() && Settings.SQLOutputFlag.HasAnyFlagBit(SQLOutput.playercreateinfo)) { var rows = new List <QueryBuilder.SQLInsertRow>(); foreach (KeyValuePair <Tuple <Race, Class>, Tuple <StartPosition, TimeSpan?> > startPosition in Storage.StartPositions) { var comment = new QueryBuilder.SQLInsertRow(); comment.HeaderComment = startPosition.Key.Item1 + " - " + startPosition.Key.Item2; rows.Add(comment); var row = new QueryBuilder.SQLInsertRow(); row.AddValue("race", startPosition.Key.Item1); row.AddValue("class", startPosition.Key.Item2); row.AddValue("map", startPosition.Value.Item1.Map); row.AddValue("zone", startPosition.Value.Item1.Zone); row.AddValue("position_x", startPosition.Value.Item1.Position.X); row.AddValue("position_y", startPosition.Value.Item1.Position.Y); row.AddValue("position_z", startPosition.Value.Item1.Position.Z); row.Comment = StoreGetters.GetName(StoreNameType.Map, startPosition.Value.Item1.Map, false) + " - " + StoreGetters.GetName(StoreNameType.Zone, startPosition.Value.Item1.Zone, false); rows.Add(row); } result += new QueryBuilder.SQLInsert("playercreateinfo", rows, 2).Build(); } if (!Storage.StartSpells.IsEmpty() && Settings.SQLOutputFlag.HasAnyFlagBit(SQLOutput.playercreateinfo_spell)) { var rows = new List <QueryBuilder.SQLInsertRow>(); foreach (var startSpells in Storage.StartSpells) { var comment = new QueryBuilder.SQLInsertRow(); comment.HeaderComment = startSpells.Key.Item1 + " - " + startSpells.Key.Item2; rows.Add(comment); foreach (var spell in startSpells.Value.Item1.Spells) { var row = new QueryBuilder.SQLInsertRow(); row.AddValue("race", startSpells.Key.Item1); row.AddValue("class", startSpells.Key.Item2); row.AddValue("Spell", spell); row.AddValue("Note", StoreGetters.GetName(StoreNameType.Spell, (int)spell, false)); rows.Add(row); } } result = new QueryBuilder.SQLInsert("playercreateinfo_spell", rows, 2).Build(); } return(result); }
public static string CreatureText() { if (Storage.CreatureTexts.IsEmpty()) { return(string.Empty); } if (!Settings.SQLOutputFlag.HasAnyFlagBit(SQLOutput.creature_text)) { return(string.Empty); } // For each sound and emote, if the time they were send is in the +1/-1 seconds range of // our texts, add that sound and emote to our Storage.CreatureTexts foreach (var text in Storage.CreatureTexts) { // For each text foreach (var textValue in text.Value) { // For each emote foreach (var emote in Storage.Emotes) { // Emote packets always have a sender (guid); // skip this one if it was sent by a different creature if (emote.Key.GetEntry() != text.Key) { continue; } foreach (var emoteValue in emote.Value) { var timeSpan = textValue.Item2 - emoteValue.Item2; if (timeSpan != null && timeSpan.Value.Duration() <= TimeSpan.FromSeconds(1)) { textValue.Item1.Emote = emoteValue.Item1; } } } // For each sound foreach (var sound in Storage.Sounds) { var timeSpan = textValue.Item2 - sound.Item2; if (timeSpan != null && timeSpan.Value.Duration() <= TimeSpan.FromSeconds(1)) { textValue.Item1.Sound = sound.Item1; } } // Set comment string from = null, to = null; if (textValue.Item1.SenderGUID != 0) { if (textValue.Item1.SenderGUID.GetObjectType() == ObjectType.Player) { from = "Player"; } else { if (!string.IsNullOrEmpty(textValue.Item1.SenderName)) { from = textValue.Item1.SenderName; } else { from = StoreGetters.GetName(StoreNameType.Unit, (int)textValue.Item1.SenderGUID.GetEntry(), false); } } } if (textValue.Item1.ReceiverGUID != 0) { if (textValue.Item1.ReceiverGUID.GetObjectType() == ObjectType.Player) { to = "Player"; } else { if (!string.IsNullOrEmpty(textValue.Item1.ReceiverName)) { to = textValue.Item1.ReceiverName; } else { to = StoreGetters.GetName(StoreNameType.Unit, (int)textValue.Item1.ReceiverGUID.GetEntry(), false); } } } Trace.Assert(text.Key == textValue.Item1.SenderGUID.GetEntry() || text.Key == textValue.Item1.ReceiverGUID.GetEntry()); if (from != null && to != null) { textValue.Item1.Comment = from + " to " + to; } else if (from != null) { textValue.Item1.Comment = from; } else { Trace.Assert(false); } } } /* can't use compare DB without knowing values of groupid or id * var entries = Storage.CreatureTexts.Keys.ToList(); * var creatureTextDb = SQLDatabase.GetDict<uint, CreatureText>(entries); */ const string tableName = "creature_text"; var broadcastTextStoresMale = SQLDatabase.BroadcastTextStores.GroupBy(blub => blub.Item2.MaleText).ToDictionary(group => group.Key, group => group.ToList()); var broadcastTextStoresFemale = SQLDatabase.BroadcastTextStores.GroupBy(blub => blub.Item2.FemaleText).ToDictionary(group => group.Key, group => group.ToList()); var rows = new List <QueryBuilder.SQLInsertRow>(); foreach (var text in Storage.CreatureTexts) { foreach (var textValue in text.Value) { var row = new QueryBuilder.SQLInsertRow(); row.AddValue("entry", text.Key); row.AddValue("groupid", "x", false, true); row.AddValue("id", "x", false, true); row.AddValue("text", textValue.Item1.Text); row.AddValue("type", textValue.Item1.Type); row.AddValue("language", textValue.Item1.Language); row.AddValue("probability", 100.0); row.AddValue("emote", textValue.Item1.Emote); row.AddValue("duration", 0); row.AddValue("sound", textValue.Item1.Sound); if (SQLDatabase.BroadcastTextStores != null) { List <Tuple <uint, BroadcastText> > textList; if (broadcastTextStoresMale.TryGetValue(textValue.Item1.Text, out textList) || broadcastTextStoresFemale.TryGetValue(textValue.Item1.Text, out textList)) { foreach (var broadcastTextId in textList) { if (!String.IsNullOrWhiteSpace(textValue.Item1.BroadcastTextID)) { textValue.Item1.BroadcastTextID += " - " + broadcastTextId.Item1.ToString(); } else { textValue.Item1.BroadcastTextID = broadcastTextId.Item1.ToString(); } } } row.AddValue("BroadcastTextID", textValue.Item1.BroadcastTextID); } row.AddValue("comment", textValue.Item1.Comment); rows.Add(row); } } return(new QueryBuilder.SQLInsert(tableName, rows, 1, false).Build()); }
public static string Creature(Dictionary <WowGuid, Unit> units) { if (units.Count == 0) { return(string.Empty); } if (!Settings.SQLOutputFlag.HasAnyFlagBit(SQLOutput.creature)) { return(string.Empty); } const string tableName = "creature"; const string addonTableName = "creature_addon"; uint count = 0; var rows = new List <QueryBuilder.SQLInsertRow>(); var addonRows = new List <QueryBuilder.SQLInsertRow>(); foreach (var unit in units) { var row = new QueryBuilder.SQLInsertRow(); var badTransport = false; var creature = unit.Value; if (Settings.AreaFilters.Length > 0) { if (!(creature.Area.ToString(CultureInfo.InvariantCulture).MatchesFilters(Settings.AreaFilters))) { continue; } } if (Settings.MapFilters.Length > 0) { if (!(creature.Map.ToString(CultureInfo.InvariantCulture).MatchesFilters(Settings.MapFilters))) { continue; } } UpdateField uf; if (!creature.UpdateFields.TryGetValue(UpdateFields.GetUpdateField(ObjectField.OBJECT_FIELD_ENTRY), out uf)) { continue; // broken entry, nothing to spawn } var entry = uf.UInt32Value; var movementType = 0; var spawnDist = 0; if (creature.Movement.HasWpsOrRandMov) { movementType = 1; spawnDist = 5; } row.AddValue("guid", "@CGUID+" + count, noQuotes: true); row.AddValue("id", entry); if (!creature.IsOnTransport()) { row.AddValue("map", creature.Map); } else { int mapId; badTransport = !GetTransportMap(creature, out mapId); row.AddValue("map", mapId); } row.AddValue("spawnMask", creature.GetDefaultSpawnMask()); row.AddValue("phaseMask", creature.PhaseMask); if (ClientVersion.AddedInVersion(ClientVersionBuild.V4_3_4_15595) && creature.Phases != null) { row.AddValue("phaseId", string.Join(" - ", creature.Phases)); } if (!creature.IsOnTransport()) { row.AddValue("position_x", creature.Movement.Position.X); row.AddValue("position_y", creature.Movement.Position.Y); row.AddValue("position_z", creature.Movement.Position.Z); row.AddValue("orientation", creature.Movement.Orientation); } else { row.AddValue("position_x", creature.Movement.TransportOffset.X); row.AddValue("position_y", creature.Movement.TransportOffset.Y); row.AddValue("position_z", creature.Movement.TransportOffset.Z); row.AddValue("orientation", creature.Movement.TransportOffset.O); } row.AddValue("spawntimesecs", creature.GetDefaultSpawnTime()); row.AddValue("spawndist", spawnDist); row.AddValue("MovementType", movementType); row.Comment = StoreGetters.GetName(StoreNameType.Unit, (int)unit.Key.GetEntry(), false); row.Comment += " (Area: " + StoreGetters.GetName(StoreNameType.Area, creature.Area, false) + ")"; var auras = string.Empty; var commentAuras = string.Empty; if (creature.Auras != null && creature.Auras.Count() != 0) { foreach (var aura in creature.Auras) { if (aura == null) { continue; } // usually "template auras" do not have caster if (ClientVersion.AddedInVersion(ClientType.MistsOfPandaria) ? !aura.AuraFlags.HasAnyFlag(AuraFlagMoP.NoCaster) : !aura.AuraFlags.HasAnyFlag(AuraFlag.NotCaster)) { continue; } auras += aura.SpellId + " "; commentAuras += aura.SpellId.ToString() + " - " + StoreGetters.GetName(StoreNameType.Spell, (int)aura.SpellId, false) + ", "; } auras = auras.TrimEnd(' '); commentAuras = commentAuras.TrimEnd(',', ' '); row.Comment += " (Auras: " + commentAuras + ")"; } var addonRow = new QueryBuilder.SQLInsertRow(); if (Settings.SQLOutputFlag.HasAnyFlagBit(SQLOutput.creature_addon)) { addonRow.AddValue("guid", "@CGUID+" + count, noQuotes: true); addonRow.AddValue("mount", creature.Mount); addonRow.AddValue("bytes1", creature.Bytes1, true); addonRow.AddValue("bytes2", creature.Bytes2, true); addonRow.AddValue("auras", auras); addonRow.Comment += StoreGetters.GetName(StoreNameType.Unit, (int)unit.Key.GetEntry(), false); if (!String.IsNullOrWhiteSpace(auras)) { addonRow.Comment += " - " + commentAuras; } addonRows.Add(addonRow); } if (creature.IsTemporarySpawn()) { row.CommentOut = true; row.Comment += " - !!! might be temporary spawn !!!"; } else if (creature.IsOnTransport() && badTransport) { row.CommentOut = true; row.Comment += " - !!! on transport - transport template not found !!!"; } else { ++count; } if (creature.Movement.HasWpsOrRandMov) { row.Comment += " (possible waypoints or random movement)"; } rows.Add(row); } var result = new StringBuilder(); if (count > 0) { // delete query for GUIDs var delete = new QueryBuilder.SQLDelete(Tuple.Create("@CGUID+0", "@CGUID+" + --count), "guid", tableName); result.Append(delete.Build()); var sql = new QueryBuilder.SQLInsert(tableName, rows, withDelete: false); result.Append(sql.Build()); if (Settings.SQLOutputFlag.HasAnyFlagBit(SQLOutput.creature_addon)) { var addonDelete = new QueryBuilder.SQLDelete(Tuple.Create("@CGUID+0", "@CGUID+" + count), "guid", addonTableName); result.Append(addonDelete.Build()); var addonSql = new QueryBuilder.SQLInsert(addonTableName, addonRows, withDelete: false); result.Append(addonSql.Build()); } } return(result.ToString()); }
public static string Creature(Dictionary<Guid, Unit> units) { if (units.Count == 0) return string.Empty; if (!Settings.SQLOutputFlag.HasAnyFlagBit(SQLOutput.creature)) return string.Empty; const string tableName = "creature"; uint count = 0; var rows = new List<QueryBuilder.SQLInsertRow>(); foreach (var unit in units) { var row = new QueryBuilder.SQLInsertRow(); var creature = unit.Value; if (Settings.AreaFilters.Length > 0) if (!(creature.Area.ToString(CultureInfo.InvariantCulture).MatchesFilters(Settings.AreaFilters))) continue; UpdateField uf; if (!creature.UpdateFields.TryGetValue(UpdateFields.GetUpdateField(ObjectField.OBJECT_FIELD_ENTRY), out uf)) continue; // broken entry, nothing to spawn var entry = uf.UInt32Value; var spawnTimeSecs = creature.GetDefaultSpawnTime(); var movementType = 0; // TODO: Find a way to check if our unit got random movement var spawnDist = (movementType == 1) ? 5 : 0; row.AddValue("guid", "@CGUID+" + count, noQuotes: true); row.AddValue("id", entry); row.AddValue("map", !creature.IsOnTransport() ? creature.Map : 0); // TODO: query transport template for map row.AddValue("spawnMask", 1); row.AddValue("phaseMask", creature.PhaseMask); if (!creature.IsOnTransport()) { row.AddValue("position_x", creature.Movement.Position.X); row.AddValue("position_y", creature.Movement.Position.Y); row.AddValue("position_z", creature.Movement.Position.Z); row.AddValue("orientation", creature.Movement.Orientation); } else { row.AddValue("position_x", creature.Movement.TransportOffset.X); row.AddValue("position_y", creature.Movement.TransportOffset.Y); row.AddValue("position_z", creature.Movement.TransportOffset.Z); row.AddValue("orientation", creature.Movement.TransportOffset.O); } row.AddValue("spawntimesecs", spawnTimeSecs); row.AddValue("spawndist", spawnDist); row.AddValue("MovementType", movementType); row.Comment = StoreGetters.GetName(StoreNameType.Unit, (int)unit.Key.GetEntry(), false); row.Comment += " (Area: " + StoreGetters.GetName(StoreNameType.Area, creature.Area, false) + ")"; if (creature.IsTemporarySpawn()) { row.CommentOut = true; row.Comment += " - !!! might be temporary spawn !!!"; } else if (creature.IsOnTransport()) { row.CommentOut = true; row.Comment += " - !!! on transport (NYI) !!!"; } else ++count; if (creature.Movement.HasWpsOrRandMov) row.Comment += " (possible waypoints or random movement)"; rows.Add(row); } var result = new StringBuilder(); // delete query for GUIDs var delete = new QueryBuilder.SQLDelete(Tuple.Create("@CGUID+0", "@CGUID+" + --count), "guid", tableName); result.Append(delete.Build()); var sql = new QueryBuilder.SQLInsert(tableName, rows, withDelete: false); result.Append(sql.Build()); return result.ToString(); }
public static string Creature(Dictionary <Guid, Unit> units) { if (units.Count == 0) { return(string.Empty); } const string tableName = "creature"; uint count = 0; var rows = new List <QueryBuilder.SQLInsertRow>(); foreach (var unit in units) { var row = new QueryBuilder.SQLInsertRow(); var creature = unit.Value; if (Settings.AreaFilters.Length > 0) { if (!(creature.Area.ToString(CultureInfo.InvariantCulture).MatchesFilters(Settings.AreaFilters))) { continue; } } var spawnTimeSecs = creature.GetDefaultSpawnTime(); var movementType = 0; // TODO: Find a way to check if our unit got random movement var spawnDist = (movementType == 1) ? 5 : 0; row.AddValue("id", unit.Key.GetEntry()); row.AddValue("map", creature.Map); row.AddValue("spawnMask", 1); row.AddValue("phaseMask", creature.PhaseMask); row.AddValue("modelid", creature.Model); row.AddValue("position_x", creature.Movement.Position.X); row.AddValue("position_y", creature.Movement.Position.Y); row.AddValue("position_z", creature.Movement.Position.Z); row.AddValue("orientation", creature.Movement.Orientation); row.AddValue("curhealth", creature.MaxHealth); row.AddValue("spawntimesecs", spawnTimeSecs); row.AddValue("spawndist", spawnDist); row.AddValue("MovementType", movementType); row.Comment = StoreGetters.GetName(StoreNameType.Unit, (int)unit.Key.GetEntry(), false); row.Comment += " (Area: " + StoreGetters.GetName(StoreNameType.Area, creature.Area, false) + ")"; if (creature.IsTemporarySpawn()) { row.CommentOut = true; row.Comment += " - !!! might be temporary spawn !!!"; } else { ++count; } rows.Add(row); } var result = new StringBuilder(); // delete query for GUIDs //var delete = new QueryBuilder.SQLDelete(Tuple.Create("@CGUID+0", "@CGUID+" + --count), "guid", tableName); //result.Append(delete.Build()); var sql = new QueryBuilder.SQLInsert(tableName, rows, withDelete: false); result.Append(sql.Build()); return(result.ToString()); }
public static string LocalesQuestObjectives() { if (Storage.LocalesQuestObjectives.IsEmpty()) { return(String.Empty); } if (!Settings.SQLOutputFlag.HasAnyFlagBit(SQLOutput.locales_quest_objectives)) { return(String.Empty); } const string tableName = "quest_objectives_locale"; var rowsIns = new List <QueryBuilder.SQLInsertRow>(); var rowsUpd = new List <QueryBuilder.SQLUpdateRow>(); foreach (var localesQuestObjective in Settings.SQLOrderByKey ? Storage.LocalesQuestObjectives.OrderBy(blub => blub.Key).ToList() : Storage.LocalesQuestObjectives.ToList()) { if (SQLDatabase.LocalesQuestObjectiveStores != null && SQLDatabase.LocalesQuestObjectiveStores.ContainsKey(Tuple.Create(localesQuestObjective.Key.Item1, localesQuestObjective.Key.Item2))) { var row = new QueryBuilder.SQLUpdateRow(); var localesQuestObjectiveDB = SQLDatabase.LocalesQuestObjectiveStores[Tuple.Create(localesQuestObjective.Key.Item1, localesQuestObjective.Key.Item2)]; if (!Utilities.EqualValues(localesQuestObjectiveDB.QuestId, localesQuestObjective.Value.Item1.QuestId)) { row.AddValue("QuestId", localesQuestObjective.Value.Item1.QuestId); } if (!Utilities.EqualValues(localesQuestObjectiveDB.StorageIndex, localesQuestObjective.Value.Item1.StorageIndex)) { row.AddValue("StorageIndex", localesQuestObjective.Value.Item1.StorageIndex); } if (!Utilities.EqualValues(localesQuestObjectiveDB.Description, localesQuestObjective.Value.Item1.Description)) { row.AddValue("Description", localesQuestObjective.Value.Item1.Description); } if (!Utilities.EqualValues(localesQuestObjectiveDB.VerifiedBuild, localesQuestObjective.Value.Item1.VerifiedBuild)) { row.AddValue("VerifiedBuild", localesQuestObjective.Value.Item1.VerifiedBuild); } row.AddWhere("ID", localesQuestObjective.Key.Item1); row.AddWhere("locale", localesQuestObjective.Key.Item2); row.Table = tableName; rowsUpd.Add(row); } else // insert new { var row = new QueryBuilder.SQLInsertRow(); row.AddValue("ID", localesQuestObjective.Key.Item1); row.AddValue("locale", localesQuestObjective.Key.Item2); row.AddValue("QuestId", localesQuestObjective.Value.Item1.QuestId); row.AddValue("StorageIndex", localesQuestObjective.Value.Item1.StorageIndex); row.AddValue("Description", localesQuestObjective.Value.Item1.Description); row.AddValue("VerifiedBuild", localesQuestObjective.Value.Item1.VerifiedBuild); rowsIns.Add(row); } } var result = new QueryBuilder.SQLInsert(tableName, rowsIns, deleteDuplicates: false, primaryKeyNumber: 2).Build() + new QueryBuilder.SQLUpdate(rowsUpd).Build(); return("SET NAMES 'utf8';" + Environment.NewLine + result + Environment.NewLine + "SET NAMES 'latin1';"); }
public static string NpcVendor() { if (Storage.NpcVendors.IsEmpty()) return String.Empty; if (!Settings.SQLOutputFlag.HasAnyFlagBit(SQLOutput.npc_vendor)) return string.Empty; const string tableName = "npc_vendor"; var rows = new List<QueryBuilder.SQLInsertRow>(); foreach (var npcVendor in Storage.NpcVendors) { var comment = new QueryBuilder.SQLInsertRow { HeaderComment = StoreGetters.GetName(StoreNameType.Unit, (int) npcVendor.Key) }; rows.Add(comment); foreach (var vendorItem in npcVendor.Value.Item1.VendorItems) { var row = new QueryBuilder.SQLInsertRow(); row.AddValue("entry", npcVendor.Key); row.AddValue("slot", vendorItem.Slot); row.AddValue("item", vendorItem.ItemId); row.AddValue("maxcount", vendorItem.MaxCount); row.AddValue("ExtendedCost", vendorItem.ExtendedCostId); /*if (ClientVersion.AddedInVersion(ClientType.Cataclysm)) row.AddValue("Type", vendorItem.Type); if (ClientVersion.AddedInVersion(ClientType.MistsOfPandaria)) { row.AddValue("PlayerConditionID", vendorItem.PlayerConditionID); row.AddValue("IgnoreFiltering", vendorItem.IgnoreFiltering); }*/ row.AddValue("VerifiedBuild", vendorItem.VerifiedBuild); row.Comment = StoreGetters.GetName(vendorItem.Type <= 1 ? StoreNameType.Item : StoreNameType.Currency, (int)vendorItem.ItemId, false); rows.Add(row); } } return new QueryBuilder.SQLInsert(tableName, rows).Build(); }
public static string NpcTrainer() { if (Storage.NpcTrainers.IsEmpty) return String.Empty; const string tableName = "npc_trainer"; var rows = new List<QueryBuilder.SQLInsertRow>(); foreach (var npcTrainer in Storage.NpcTrainers) { var comment = new QueryBuilder.SQLInsertRow(); comment.HeaderComment = StoreGetters.GetName(StoreNameType.Unit, (int)npcTrainer.Key, false); rows.Add(comment); foreach (var trainerSpell in npcTrainer.Value.TrainerSpells) { var row = new QueryBuilder.SQLInsertRow(); row.AddValue("entry", npcTrainer.Key); row.AddValue("spell", trainerSpell.Spell); row.AddValue("spellcost", trainerSpell.Cost); row.AddValue("reqskill", trainerSpell.RequiredSkill); row.AddValue("reqskillvalue", trainerSpell.RequiredSkillLevel); row.AddValue("reqlevel", trainerSpell.RequiredLevel); row.Comment = StoreGetters.GetName(StoreNameType.Spell, (int)trainerSpell.Spell, false); rows.Add(row); } } return new QueryBuilder.SQLInsert(tableName, rows).Build(); }
public static string PointsOfInterest() { if (Storage.GossipPOIs.IsEmpty()) return string.Empty; var result = string.Empty; if (!Storage.GossipSelects.IsEmpty() && Settings.SQLOutputFlag.HasAnyFlagBit(SQLOutput.gossip_menu_option)) { var gossipPOIsTable = new Dictionary<Tuple<uint, uint>, uint>(); foreach (var poi in Storage.GossipPOIs) { foreach (var gossipSelect in Storage.GossipSelects) { var tuple = Tuple.Create(gossipSelect.Key.Item1, gossipSelect.Key.Item2); if (gossipPOIsTable.ContainsKey(tuple)) continue; var timeSpan = poi.Value.Item2 - gossipSelect.Value.Item2; if (timeSpan != null && timeSpan.Value.Duration() <= TimeSpan.FromSeconds(1)) gossipPOIsTable.Add(tuple, poi.Key); } } var rowsUpd = new List<QueryBuilder.SQLUpdateRow>(); foreach (var u in gossipPOIsTable) { var row = new QueryBuilder.SQLUpdateRow(); row.AddValue("action_poi_id", u.Value); row.AddWhere("menu_id", u.Key.Item1); row.AddWhere("id", u.Key.Item2); row.Table = "gossip_menu_option"; rowsUpd.Add(row); } result += new QueryBuilder.SQLUpdate(rowsUpd).Build(); } if (Settings.SQLOutputFlag.HasAnyFlagBit(SQLOutput.points_of_interest)) { const string tableName = "points_of_interest"; var rowsIns = new List<QueryBuilder.SQLInsertRow>(); uint count = 0; foreach (var poi in Storage.GossipPOIs) { var row = new QueryBuilder.SQLInsertRow(); row.AddValue("ID", "@ID+" + count, noQuotes: true); row.AddValue("PositionX", poi.Value.Item1.PositionX); row.AddValue("PositionY", poi.Value.Item1.PositionY); row.AddValue("Icon", poi.Value.Item1.Icon); row.AddValue("Flags", poi.Value.Item1.Flags); row.AddValue("Importance", poi.Value.Item1.Importance); row.AddValue("Name", poi.Value.Item1.Name); rowsIns.Add(row); count++; } result += new QueryBuilder.SQLDelete(Tuple.Create("@ID+0", "@ID+" + (count - 1)), "entry", tableName).Build(); result += new QueryBuilder.SQLInsert(tableName, rowsIns, withDelete: false).Build(); } return result; }
public static string BroadcastTextLocale() { if (Storage.BroadcastTextLocales.IsEmpty()) { return(String.Empty); } if (!Settings.HotfixSQLOutputFlag.HasAnyFlagBit(HotfixSQLOutput.broadcast_text_locale)) { return(String.Empty); } const string tableName = "broadcast_text_locale"; var rowsIns = new List <QueryBuilder.SQLInsertRow>(); var rowsUpd = new List <QueryBuilder.SQLUpdateRow>(); foreach (var broadcastTextLocale in Settings.SQLOrderByKey ? Storage.BroadcastTextLocales.OrderBy(blub => blub.Key).ToList() : Storage.BroadcastTextLocales.ToList()) { if (SQLDatabase.BroadcastTextLocaleStores != null && SQLDatabase.BroadcastTextLocaleStores.ContainsKey(Tuple.Create(broadcastTextLocale.Key.Item1, broadcastTextLocale.Key.Item2))) { var row = new QueryBuilder.SQLUpdateRow(); var broadcastTextLocaleDB = SQLDatabase.BroadcastTextLocaleStores[Tuple.Create(broadcastTextLocale.Key.Item1, broadcastTextLocale.Key.Item2)]; if (!Utilities.EqualValues(broadcastTextLocaleDB.MaleText_lang, broadcastTextLocale.Value.Item1.MaleText_lang)) { row.AddValue("MaleText_lang", broadcastTextLocale.Value.Item1.MaleText_lang); } if (!Utilities.EqualValues(broadcastTextLocaleDB.FemaleText_lang, broadcastTextLocale.Value.Item1.FemaleText_lang)) { row.AddValue("FemaleText_lang", broadcastTextLocale.Value.Item1.FemaleText_lang); } if (!Utilities.EqualValues(broadcastTextLocaleDB.VerifiedBuild, broadcastTextLocale.Value.Item1.VerifiedBuild)) { row.AddValue("VerifiedBuild", broadcastTextLocale.Value.Item1.VerifiedBuild); } row.AddWhere("ID", broadcastTextLocale.Key.Item1); row.AddWhere("locale", broadcastTextLocale.Key.Item2); row.Table = tableName; rowsUpd.Add(row); } else // insert new { var row = new QueryBuilder.SQLInsertRow(); row.AddValue("ID", broadcastTextLocale.Key.Item1); row.AddValue("locale", broadcastTextLocale.Key.Item2); row.AddValue("MaleText_lang", broadcastTextLocale.Value.Item1.MaleText_lang); row.AddValue("FemaleText_lang", broadcastTextLocale.Value.Item1.FemaleText_lang); row.AddValue("VerifiedBuild", broadcastTextLocale.Value.Item1.VerifiedBuild); rowsIns.Add(row); } } var result = new QueryBuilder.SQLInsert(tableName, rowsIns, deleteDuplicates: false, primaryKeyNumber: 2).Build() + new QueryBuilder.SQLUpdate(rowsUpd).Build(); return("SET NAMES 'utf8';" + Environment.NewLine + result + Environment.NewLine + "SET NAMES 'latin1';"); }
public static string DefenseMessage() { if (Storage.DefenseMessages.IsEmpty()) { return(String.Empty); } if (!Settings.SQLOutputFlag.HasAnyFlagBit(SQLOutput.defense_message)) { return(string.Empty); } const string tableName = "defense_message"; var rows = new List <QueryBuilder.SQLInsertRow>(); foreach (var message in Storage.DefenseMessages) { foreach (var messageValue in message.Value) { var row = new QueryBuilder.SQLInsertRow(); var query = new StringBuilder(string.Format("SELECT Id FROM {1}.broadcast_text WHERE MaleText='{0}' OR FemaleText='{0}';", MySqlHelper.DoubleQuoteString(messageValue.Item1.text), Settings.TDBDatabase)); string broadcastTextId = ""; if (Settings.DevMode) { using (var reader = SQLConnector.ExecuteQuery(query.ToString())) { if (reader != null) { while (reader.Read()) { var values = new object[1]; var count = reader.GetValues(values); if (count != 1) { break; // error in query } if (!String.IsNullOrWhiteSpace(broadcastTextId)) { broadcastTextId += " - " + Convert.ToInt32(values[0]); } else { broadcastTextId += Convert.ToInt32(values[0]); } } } } } row.AddValue("ZoneId", message.Key); row.AddValue("Id", "x", false, true); row.AddValue("Text", messageValue.Item1.text); if (Settings.DevMode) { row.AddValue("BroadcastTextId", broadcastTextId); } rows.Add(row); } } return(new QueryBuilder.SQLInsert(tableName, rows, 1, false).Build()); }
public static string Creature(Dictionary <Guid, Unit> units) { if (units.Count == 0) { return(string.Empty); } if (!Settings.SQLOutputFlag.HasAnyFlagBit(SQLOutput.creature)) { return(string.Empty); } const string tableName = "creature"; uint count = 0; var rows = new List <QueryBuilder.SQLInsertRow>(); foreach (var unit in units) { var row = new QueryBuilder.SQLInsertRow(); var creature = unit.Value; if (Settings.AreaFilters.Length > 0) { if (!(creature.Area.ToString(CultureInfo.InvariantCulture).MatchesFilters(Settings.AreaFilters))) { continue; } } UpdateField uf; if (!creature.UpdateFields.TryGetValue(UpdateFields.GetUpdateField(ObjectField.OBJECT_FIELD_ENTRY), out uf)) { continue; // broken entry, nothing to spawn } var entry = uf.UInt32Value; var spawnTimeSecs = creature.GetDefaultSpawnTime(); var movementType = 0; // TODO: Find a way to check if our unit got random movement var spawnDist = (movementType == 1) ? 5 : 0; row.AddValue("guid", "@CGUID+" + count, noQuotes: true); row.AddValue("id", entry); row.AddValue("map", !creature.IsOnTransport() ? creature.Map : 0); // TODO: query transport template for map row.AddValue("spawnMask", 1); row.AddValue("phaseMask", creature.PhaseMask); if (!creature.IsOnTransport()) { row.AddValue("position_x", creature.Movement.Position.X); row.AddValue("position_y", creature.Movement.Position.Y); row.AddValue("position_z", creature.Movement.Position.Z); row.AddValue("orientation", creature.Movement.Orientation); } else { row.AddValue("position_x", creature.Movement.TransportOffset.X); row.AddValue("position_y", creature.Movement.TransportOffset.Y); row.AddValue("position_z", creature.Movement.TransportOffset.Z); row.AddValue("orientation", creature.Movement.TransportOffset.O); } row.AddValue("spawntimesecs", spawnTimeSecs); row.AddValue("spawndist", spawnDist); row.AddValue("MovementType", movementType); row.Comment = StoreGetters.GetName(StoreNameType.Unit, (int)unit.Key.GetEntry(), false); row.Comment += " (Area: " + StoreGetters.GetName(StoreNameType.Area, creature.Area, false) + ")"; if (creature.IsTemporarySpawn()) { row.CommentOut = true; row.Comment += " - !!! might be temporary spawn !!!"; } else if (creature.IsOnTransport()) { row.CommentOut = true; row.Comment += " - !!! on transport (NYI) !!!"; } else { ++count; } if (creature.Movement.HasWpsOrRandMov) { row.Comment += " (possible waypoints or random movement)"; } rows.Add(row); } var result = new StringBuilder(); // delete query for GUIDs var delete = new QueryBuilder.SQLDelete(Tuple.Create("@CGUID+0", "@CGUID+" + --count), "guid", tableName); result.Append(delete.Build()); var sql = new QueryBuilder.SQLInsert(tableName, rows, withDelete: false); result.Append(sql.Build()); return(result.ToString()); }
public static string QuestPOI() { if (Storage.QuestPOIs.IsEmpty()) { return(String.Empty); } const string tableName1 = "quest_poi"; const string tableName2 = "quest_poi_points"; // `quest_poi` var rows = new List <QueryBuilder.SQLInsertRow>(); foreach (var quest in Storage.QuestPOIs) { var questPOI = quest.Value.Item1; var row = new QueryBuilder.SQLInsertRow(); row.AddValue("questId", quest.Key.Item1); row.AddValue("id", quest.Key.Item2); row.AddValue("objIndex", questPOI.ObjectiveIndex); row.AddValue("mapid", questPOI.Map); row.AddValue("WorldMapAreaId", questPOI.WorldMapAreaId); row.AddValue("FloorId", questPOI.FloorId); row.AddValue("unk3", questPOI.UnkInt1); row.AddValue("unk4", questPOI.UnkInt2); row.Comment = StoreGetters.GetName(StoreNameType.Quest, (int)quest.Key.Item1, false); rows.Add(row); } var result = new QueryBuilder.SQLInsert(tableName1, rows, 2).Build(); // `quest_poi_points` rows = new List <QueryBuilder.SQLInsertRow>(); foreach (var quest in Storage.QuestPOIs) { var questPOI = quest.Value.Item1; if (questPOI.Points != null) // Needed? { foreach (var point in questPOI.Points) { var row = new QueryBuilder.SQLInsertRow(); row.AddValue("questId", quest.Key.Item1); row.AddValue("id", quest.Key.Item2); row.AddValue("idx", point.Index); // Not on sniffs row.AddValue("x", point.X); row.AddValue("y", point.Y); row.Comment = StoreGetters.GetName(StoreNameType.Quest, (int)quest.Key.Item1, false); rows.Add(row); } } } result += new QueryBuilder.SQLInsert(tableName2, rows, 2).Build(); return(result); }
public static string CreatureText() { if (Storage.CreatureTexts.IsEmpty()) return string.Empty; if (!Settings.SQLOutputFlag.HasAnyFlagBit(SQLOutput.creature_text)) return string.Empty; // For each sound and emote, if the time they were send is in the +1/-1 seconds range of // our texts, add that sound and emote to our Storage.CreatureTexts var broadcastTextStoresMale = SQLDatabase.BroadcastTextStores.GroupBy(blub => blub.Item2.MaleText).ToDictionary(group => group.Key, group => group.ToList()); var broadcastTextStoresFemale = SQLDatabase.BroadcastTextStores.GroupBy(blub => blub.Item2.FemaleText).ToDictionary(group => group.Key, group => group.ToList()); foreach (var text in Storage.CreatureTexts) { // For each text foreach (var textValue in text.Value) { // For each emote var text1 = text; var value1 = textValue; foreach (var emoteValue in from emote in Storage.Emotes where emote.Key.GetEntry() == text1.Key from emoteValue in emote.Value let timeSpan = value1.Item2 - emoteValue.Item2 where timeSpan != null && timeSpan.Value.Duration() <= TimeSpan.FromSeconds(1) select emoteValue) textValue.Item1.Emote = emoteValue.Item1; // For each sound var value = textValue; foreach (var sound in from sound in Storage.Sounds let timeSpan = value.Item2 - sound.Item2 where timeSpan != null && timeSpan.Value.Duration() <= TimeSpan.FromSeconds(1) select sound) textValue.Item1.Sound = sound.Item1; if (SQLDatabase.BroadcastTextStores != null) { List<Tuple<uint, BroadcastText>> textList; if (broadcastTextStoresMale.TryGetValue(textValue.Item1.Text, out textList) || broadcastTextStoresFemale.TryGetValue(textValue.Item1.Text, out textList)) foreach (var broadcastTextId in textList) { if (!String.IsNullOrWhiteSpace(textValue.Item1.BroadcastTextID)) textValue.Item1.BroadcastTextID += " - " + broadcastTextId.Item1; else textValue.Item1.BroadcastTextID = broadcastTextId.Item1.ToString(); } } // Set comment string from = null, to = null; if (!textValue.Item1.SenderGUID.IsEmpty() || textValue.Item1.SenderGUID != null) { if (textValue.Item1.SenderGUID.GetObjectType() == ObjectType.Player) from = "Player"; else @from = !string.IsNullOrEmpty(textValue.Item1.SenderName) ? textValue.Item1.SenderName : StoreGetters.GetName(StoreNameType.Unit, (int)textValue.Item1.SenderGUID.GetEntry(), false); } if (!textValue.Item1.ReceiverGUID.IsEmpty() || textValue.Item1.ReceiverGUID != null) { if (textValue.Item1.ReceiverGUID.GetObjectType() == ObjectType.Player) to = "Player"; else to = !string.IsNullOrEmpty(textValue.Item1.ReceiverName) ? textValue.Item1.ReceiverName : StoreGetters.GetName(StoreNameType.Unit, (int)textValue.Item1.ReceiverGUID.GetEntry(), false); } Trace.Assert(text.Key == textValue.Item1.SenderGUID.GetEntry() || text.Key == textValue.Item1.ReceiverGUID.GetEntry()); if (from != null && to != null) textValue.Item1.Comment = from + " to " + to; else if (from != null) textValue.Item1.Comment = from; else Trace.Assert(false); } } /* can't use compare DB without knowing values of groupid or id var entries = Storage.CreatureTexts.Keys.ToList(); var creatureTextDb = SQLDatabase.GetDict<uint, CreatureText>(entries); */ const string tableName = "creature_text"; var rows = new List<QueryBuilder.SQLInsertRow>(); foreach (var text in Storage.CreatureTexts) { foreach (var textValue in text.Value) { var row = new QueryBuilder.SQLInsertRow(); row.AddValue("entry", text.Key); row.AddValue("groupid", "x", false, true); row.AddValue("id", "x", false, true); row.AddValue("text", textValue.Item1.Text); row.AddValue("type", textValue.Item1.Type); row.AddValue("language", textValue.Item1.Language); row.AddValue("probability", 100.0); row.AddValue("emote", textValue.Item1.Emote); row.AddValue("duration", 0); row.AddValue("sound", textValue.Item1.Sound); row.AddValue("BroadcastTextID", textValue.Item1.BroadcastTextID); row.AddValue("comment", textValue.Item1.Comment); rows.Add(row); } } return new QueryBuilder.SQLInsert(tableName, rows, 1, false).Build(); }
public static string StartInformation() { var result = String.Empty; if (!Storage.StartActions.IsEmpty() && Settings.SQLOutputFlag.HasAnyFlagBit(SQLOutput.playercreateinfo_action)) { var rows = new List <QueryBuilder.SQLInsertRow>(); foreach (var startActions in Storage.StartActions) { var comment = new QueryBuilder.SQLInsertRow { HeaderComment = startActions.Key.Item1 + " - " + startActions.Key.Item2 }; rows.Add(comment); foreach (var action in startActions.Value.Item1.Actions) { var row = new QueryBuilder.SQLInsertRow(); row.AddValue("race", startActions.Key.Item1); row.AddValue("class", startActions.Key.Item2); row.AddValue("button", action.Button); row.AddValue("action", action.Id); row.AddValue("type", action.Type); if (action.Type == ActionButtonType.Spell) { row.Comment = StoreGetters.GetName(StoreNameType.Spell, (int)action.Id, false); } if (action.Type == ActionButtonType.Item) { row.Comment = StoreGetters.GetName(StoreNameType.Item, (int)action.Id, false); } rows.Add(row); } } result += new QueryBuilder.SQLInsert("playercreateinfo_action", rows, 2).Build(); } if (!Storage.StartPositions.IsEmpty() && Settings.SQLOutputFlag.HasAnyFlagBit(SQLOutput.playercreateinfo)) { var entries = Storage.StartPositions.Keys(); var dataDb = SQLDatabase.GetDict <Race, Class, StartPosition>(entries, "race", "class"); result += SQLUtil.CompareDicts(Storage.StartPositions, dataDb, StoreNameType.None, StoreNameType.None, "race", "class"); } if (!Storage.StartSpells.IsEmpty() && Settings.SQLOutputFlag.HasAnyFlagBit(SQLOutput.playercreateinfo_spell)) { var rows = new List <QueryBuilder.SQLInsertRow>(); foreach (var startSpells in Storage.StartSpells) { var comment = new QueryBuilder.SQLInsertRow { HeaderComment = startSpells.Key.Item1 + " - " + startSpells.Key.Item2 }; rows.Add(comment); foreach (var spell in startSpells.Value.Item1.Spells) { var row = new QueryBuilder.SQLInsertRow(); row.AddValue("race", startSpells.Key.Item1); row.AddValue("class", startSpells.Key.Item2); row.AddValue("Spell", spell); row.AddValue("Note", StoreGetters.GetName(StoreNameType.Spell, (int)spell, false)); rows.Add(row); } } result += new QueryBuilder.SQLInsert("playercreateinfo_spell", rows, 2).Build(); } return(result); }
public static string Gossip() { // TODO: This should be rewritten if (Storage.Gossips.IsEmpty()) { return(string.Empty); } var result = ""; // `gossip` if (Settings.SQLOutputFlag.HasAnyFlagBit(SQLOutput.gossip_menu)) { if (SQLConnector.Enabled) { var query = new StringBuilder(string.Format("SELECT `entry`,`text_id` FROM {0}.`gossip_menu` WHERE ", Settings.TDBDatabase)); foreach (Tuple <uint, uint> gossip in Storage.Gossips.Keys()) { query.Append("(`entry`=").Append(gossip.Item1).Append(" AND "); query.Append("`text_id`=").Append(gossip.Item2).Append(") OR "); } query.Remove(query.Length - 4, 4).Append(";"); var rows = new List <QueryBuilder.SQLInsertRow>(); using (var reader = SQLConnector.ExecuteQuery(query.ToString())) { if (reader != null) { while (reader.Read()) { var values = new object[2]; var count = reader.GetValues(values); if (count != 2) { break; // error in query } var entry = Convert.ToUInt32(values[0]); var textId = Convert.ToUInt32(values[1]); // our table is small, 2 fields and both are PKs; no need for updates if (!Storage.Gossips.ContainsKey(Tuple.Create(entry, textId))) { var row = new QueryBuilder.SQLInsertRow(); row.AddValue("entry", entry); row.AddValue("text_id", textId); row.Comment = StoreGetters.GetName(StoreNameType.Unit, // BUG: GOs can send gossips too (int)entry, false); rows.Add(row); } } } } result += new QueryBuilder.SQLInsert("gossip_menu", rows, 2).Build(); } else { var rows = new List <QueryBuilder.SQLInsertRow>(); foreach (var gossip in Storage.Gossips) { var row = new QueryBuilder.SQLInsertRow(); row.AddValue("entry", gossip.Key.Item1); row.AddValue("text_id", gossip.Key.Item2); row.Comment = StoreGetters.GetName(Utilities.ObjectTypeToStore(gossip.Value.Item1.ObjectType), (int)gossip.Value.Item1.ObjectEntry, false); rows.Add(row); } result += new QueryBuilder.SQLInsert("gossip_menu", rows, 2).Build(); } } // `gossip_menu_option` if (Settings.SQLOutputFlag.HasAnyFlagBit(SQLOutput.gossip_menu_option)) { if (SQLConnector.Enabled) { var rowsIns = new List <QueryBuilder.SQLInsertRow>(); var rowsUpd = new List <QueryBuilder.SQLUpdateRow>(); foreach (var gossip in Storage.Gossips) { if (gossip.Value.Item1.GossipOptions == null) { continue; } foreach (var gossipOption in gossip.Value.Item1.GossipOptions) { var query = // 0 1 2 3 4 5 6 string.Format( "SELECT menu_id,id,option_icon,box_coded,box_money,box_text,option_text " + "FROM {2}.gossip_menu_option WHERE menu_id={0} AND id={1};", gossip.Key.Item1, gossipOption.Index, Settings.TDBDatabase); using (var reader = SQLConnector.ExecuteQuery(query)) { if (reader.HasRows) // possible update { while (reader.Read()) { var row = new QueryBuilder.SQLUpdateRow(); if (!Utilities.EqualValues(reader.GetValue(2), gossipOption.OptionIcon)) { row.AddValue("option_icon", gossipOption.OptionIcon); } if (!Utilities.EqualValues(reader.GetValue(3), gossipOption.Box)) { row.AddValue("box_coded", gossipOption.Box); } if (!Utilities.EqualValues(reader.GetValue(4), gossipOption.RequiredMoney)) { row.AddValue("box_money", gossipOption.RequiredMoney); } if (!Utilities.EqualValues(reader.GetValue(5), gossipOption.BoxText)) { row.AddValue("box_text", gossipOption.BoxText); } if (!Utilities.EqualValues(reader.GetValue(6), gossipOption.OptionText)) { row.AddValue("option_text", gossipOption.OptionText); } row.AddWhere("menu_id", gossip.Key.Item1); row.AddWhere("id", gossipOption.Index); row.Comment = StoreGetters.GetName( Utilities.ObjectTypeToStore(gossip.Value.Item1.ObjectType), (int)gossip.Value.Item1.ObjectEntry, false); row.Table = "gossip_menu_option"; if (row.ValueCount != 0) { rowsUpd.Add(row); } } } else // insert { var row = new QueryBuilder.SQLInsertRow(); row.AddValue("menu_id", gossip.Key.Item1); row.AddValue("id", gossipOption.Index); row.AddValue("option_icon", gossipOption.OptionIcon); row.AddValue("option_text", gossipOption.OptionText); row.AddValue("box_coded", gossipOption.Box); row.AddValue("box_money", gossipOption.RequiredMoney); row.AddValue("box_text", gossipOption.BoxText); row.Comment = StoreGetters.GetName(Utilities.ObjectTypeToStore(gossip.Value.Item1.ObjectType), (int)gossip.Value.Item1.ObjectEntry, false); rowsIns.Add(row); } } } } result += new QueryBuilder.SQLInsert("gossip_menu_option", rowsIns, 2).Build() + new QueryBuilder.SQLUpdate(rowsUpd).Build(); } else { var rows = new List <QueryBuilder.SQLInsertRow>(); foreach (var gossip in Storage.Gossips) { if (gossip.Value.Item1.GossipOptions != null) { foreach (var gossipOption in gossip.Value.Item1.GossipOptions) { var row = new QueryBuilder.SQLInsertRow(); row.AddValue("menu_id", gossip.Key.Item1); row.AddValue("id", gossipOption.Index); row.AddValue("option_icon", gossipOption.OptionIcon); row.AddValue("option_text", gossipOption.OptionText); row.AddValue("box_coded", gossipOption.Box); row.AddValue("box_money", gossipOption.RequiredMoney); row.AddValue("box_text", gossipOption.BoxText); row.Comment = StoreGetters.GetName(Utilities.ObjectTypeToStore(gossip.Value.Item1.ObjectType), (int)gossip.Value.Item1.ObjectEntry, false); rows.Add(row); } } } result += new QueryBuilder.SQLInsert("gossip_menu_option", rows, 2).Build(); } } return(result); }
public static string Gossip() { // TODO: This should be rewritten if (Storage.Gossips.IsEmpty()) return string.Empty; var result = ""; // `gossip` if (Settings.SQLOutputFlag.HasAnyFlagBit(SQLOutput.gossip_menu)) { if (SQLConnector.Enabled) { var query = new StringBuilder(string.Format("SELECT `entry`,`text_id` FROM {0}.`gossip_menu` WHERE ", Settings.TDBDatabase)); foreach (Tuple<uint, uint> gossip in Storage.Gossips.Keys()) { query.Append("(`entry`=").Append(gossip.Item1).Append(" AND "); query.Append("`text_id`=").Append(gossip.Item2).Append(") OR "); } query.Remove(query.Length - 4, 4).Append(";"); var rows = new List<QueryBuilder.SQLInsertRow>(); using (var reader = SQLConnector.ExecuteQuery(query.ToString())) { if (reader != null) while (reader.Read()) { var values = new object[2]; var count = reader.GetValues(values); if (count != 2) break; // error in query var entry = Convert.ToUInt32(values[0]); var textId = Convert.ToUInt32(values[1]); // our table is small, 2 fields and both are PKs; no need for updates if (!Storage.Gossips.ContainsKey(Tuple.Create(entry, textId))) { var row = new QueryBuilder.SQLInsertRow(); row.AddValue("entry", entry); row.AddValue("text_id", textId); row.Comment = StoreGetters.GetName(StoreNameType.Unit, // BUG: GOs can send gossips too (int) entry, false); rows.Add(row); } } } result += new QueryBuilder.SQLInsert("gossip_menu", rows, 2).Build(); } else { var rows = new List<QueryBuilder.SQLInsertRow>(); foreach (var gossip in Storage.Gossips) { var row = new QueryBuilder.SQLInsertRow(); row.AddValue("entry", gossip.Key.Item1); row.AddValue("text_id", gossip.Key.Item2); row.Comment = StoreGetters.GetName(Utilities.ObjectTypeToStore(gossip.Value.Item1.ObjectType), (int) gossip.Value.Item1.ObjectEntry, false); rows.Add(row); } result += new QueryBuilder.SQLInsert("gossip_menu", rows, 2).Build(); } } // `gossip_menu_option` if (Settings.SQLOutputFlag.HasAnyFlagBit(SQLOutput.gossip_menu_option)) { if (SQLConnector.Enabled) { var rowsIns = new List<QueryBuilder.SQLInsertRow>(); var rowsUpd = new List<QueryBuilder.SQLUpdateRow>(); foreach (var gossip in Storage.Gossips) { if (gossip.Value.Item1.GossipOptions == null) continue; foreach (var gossipOption in gossip.Value.Item1.GossipOptions) { var query = // 0 1 2 3 4 5 6 string.Format( "SELECT menu_id,id,option_icon,box_coded,box_money,box_text,option_text " + "FROM {2}.gossip_menu_option WHERE menu_id={0} AND id={1};", gossip.Key.Item1, gossipOption.Index, Settings.TDBDatabase); using (var reader = SQLConnector.ExecuteQuery(query)) { if (reader.HasRows) // possible update { while (reader.Read()) { var row = new QueryBuilder.SQLUpdateRow(); if (!Utilities.EqualValues(reader.GetValue(2), gossipOption.OptionIcon)) row.AddValue("option_icon", gossipOption.OptionIcon); if (!Utilities.EqualValues(reader.GetValue(3), gossipOption.Box)) row.AddValue("box_coded", gossipOption.Box); if (!Utilities.EqualValues(reader.GetValue(4), gossipOption.RequiredMoney)) row.AddValue("box_money", gossipOption.RequiredMoney); if (!Utilities.EqualValues(reader.GetValue(5), gossipOption.BoxText)) row.AddValue("box_text", gossipOption.BoxText); if (!Utilities.EqualValues(reader.GetValue(6), gossipOption.OptionText)) row.AddValue("option_text", gossipOption.OptionText); row.AddWhere("menu_id", gossip.Key.Item1); row.AddWhere("id", gossipOption.Index); row.Comment = StoreGetters.GetName( Utilities.ObjectTypeToStore(gossip.Value.Item1.ObjectType), (int) gossip.Value.Item1.ObjectEntry, false); row.Table = "gossip_menu_option"; if (row.ValueCount != 0) rowsUpd.Add(row); } } else // insert { var row = new QueryBuilder.SQLInsertRow(); row.AddValue("menu_id", gossip.Key.Item1); row.AddValue("id", gossipOption.Index); row.AddValue("option_icon", gossipOption.OptionIcon); row.AddValue("option_text", gossipOption.OptionText); row.AddValue("box_coded", gossipOption.Box); row.AddValue("box_money", gossipOption.RequiredMoney); row.AddValue("box_text", gossipOption.BoxText); row.Comment = StoreGetters.GetName(Utilities.ObjectTypeToStore(gossip.Value.Item1.ObjectType), (int) gossip.Value.Item1.ObjectEntry, false); rowsIns.Add(row); } } } } result += new QueryBuilder.SQLInsert("gossip_menu_option", rowsIns, 2).Build() + new QueryBuilder.SQLUpdate(rowsUpd).Build(); } else { var rows = new List<QueryBuilder.SQLInsertRow>(); foreach (var gossip in Storage.Gossips) { if (gossip.Value.Item1.GossipOptions != null) foreach (var gossipOption in gossip.Value.Item1.GossipOptions) { var row = new QueryBuilder.SQLInsertRow(); row.AddValue("menu_id", gossip.Key.Item1); row.AddValue("id", gossipOption.Index); row.AddValue("option_icon", gossipOption.OptionIcon); row.AddValue("option_text", gossipOption.OptionText); row.AddValue("box_coded", gossipOption.Box); row.AddValue("box_money", gossipOption.RequiredMoney); row.AddValue("box_text", gossipOption.BoxText); row.Comment = StoreGetters.GetName(Utilities.ObjectTypeToStore(gossip.Value.Item1.ObjectType), (int) gossip.Value.Item1.ObjectEntry, false); rows.Add(row); } } result += new QueryBuilder.SQLInsert("gossip_menu_option", rows, 2).Build(); } } return result; }
public static string CreatureText() { if (Storage.CreatureTexts.IsEmpty()) { return(string.Empty); } if (!Settings.SQLOutputFlag.HasAnyFlagBit(SQLOutput.creature_text)) { return(string.Empty); } // For each sound and emote, if the time they were send is in the +1/-1 seconds range of // our texts, add that sound and emote to our Storage.CreatureTexts foreach (var text in Storage.CreatureTexts) { // For each text foreach (var textValue in text.Value) { // For each emote foreach (var emote in Storage.Emotes) { // Emote packets always have a sender (guid); // skip this one if it was sent by a different creature if (emote.Key.GetEntry() != text.Key) { continue; } foreach (var emoteValue in emote.Value) { var timeSpan = textValue.Item2 - emoteValue.Item2; if (timeSpan != null && timeSpan.Value.Duration() <= TimeSpan.FromSeconds(1)) { textValue.Item1.Emote = emoteValue.Item1; } } } // For each sound foreach (var sound in Storage.Sounds) { var timeSpan = textValue.Item2 - sound.Item2; if (timeSpan != null && timeSpan.Value.Duration() <= TimeSpan.FromSeconds(1)) { textValue.Item1.Sound = sound.Item1; } } } } /* can't use compare DB without knowing values of groupid or id * var entries = Storage.CreatureTexts.Keys.ToList(); * var creatureTextDb = SQLDatabase.GetDict<uint, CreatureText>(entries); */ const string tableName = "creature_text"; var rows = new List <QueryBuilder.SQLInsertRow>(); foreach (var text in Storage.CreatureTexts) { foreach (var textValue in text.Value) { var row = new QueryBuilder.SQLInsertRow(); row.AddValue("entry", text.Key); row.AddValue("groupid", "x", false, true); row.AddValue("id", "x", false, true); row.AddValue("text", textValue.Item1.Text); row.AddValue("type", textValue.Item1.Type); row.AddValue("language", textValue.Item1.Language); row.AddValue("probability", 100.0); row.AddValue("emote", textValue.Item1.Emote); row.AddValue("duration", 0); row.AddValue("sound", textValue.Item1.Sound); row.AddValue("comment", textValue.Item1.Comment); rows.Add(row); } } return(new QueryBuilder.SQLInsert(tableName, rows, 1, false).Build()); }
public static string NpcSpellClick() { if (Storage.NpcSpellClicks.IsEmpty()) return string.Empty; if (!Settings.SQLOutputFlag.HasAnyFlagBit(SQLOutput.npc_spellclick_spells)) return string.Empty; const string tableName = "npc_spellclick_spells"; var rows = new List<QueryBuilder.SQLInsertRow>(); foreach (var npcSpellClick in Storage.NpcSpellClicks) { foreach (var spellClick in Storage.SpellClicks) { var row = new QueryBuilder.SQLInsertRow(); if (spellClick.Item1.CasterGUID.GetObjectType() == ObjectType.Unit && spellClick.Item1.TargetGUID.GetObjectType() == ObjectType.Unit) spellClick.Item1.CastFlags = 0x0; if (spellClick.Item1.CasterGUID.GetObjectType() == ObjectType.Player && spellClick.Item1.TargetGUID.GetObjectType() == ObjectType.Unit) spellClick.Item1.CastFlags = 0x1; if (spellClick.Item1.CasterGUID.GetObjectType() == ObjectType.Unit && spellClick.Item1.TargetGUID.GetObjectType() == ObjectType.Player) spellClick.Item1.CastFlags = 0x2; if (spellClick.Item1.CasterGUID.GetObjectType() == ObjectType.Player && spellClick.Item1.TargetGUID.GetObjectType() == ObjectType.Player) spellClick.Item1.CastFlags = 0x3; row.AddValue("npc_entry", npcSpellClick.Item1.GetEntry()); row.AddValue("spell_id", spellClick.Item1.SpellId); row.AddValue("cast_flags", spellClick.Item1.CastFlags); row.AddValue("user_type", "x", false, true); var timeSpan = spellClick.Item2 - npcSpellClick.Item2; if (timeSpan != null && timeSpan.Value.Duration() <= TimeSpan.FromSeconds(1)) rows.Add(row); } } return new QueryBuilder.SQLInsert(tableName, rows, 1, false).Build(); }
public static string GameObject(Dictionary <WowGuid, GameObject> gameObjects) { if (gameObjects.Count == 0) { return(string.Empty); } if (!Settings.SQLOutputFlag.HasAnyFlagBit(SQLOutput.gameobject)) { return(string.Empty); } const string tableName = "gameobject"; uint count = 0; var rows = new List <QueryBuilder.SQLInsertRow>(); foreach (var gameobject in gameObjects) { var row = new QueryBuilder.SQLInsertRow(); var go = gameobject.Value; if (Settings.AreaFilters.Length > 0) { if (!(go.Area.ToString(CultureInfo.InvariantCulture).MatchesFilters(Settings.AreaFilters))) { continue; } } if (Settings.MapFilters.Length > 0) { if (!(go.Map.ToString(CultureInfo.InvariantCulture).MatchesFilters(Settings.MapFilters))) { continue; } } uint animprogress = 0; uint state = 0; UpdateField uf; if (!go.UpdateFields.TryGetValue(UpdateFields.GetUpdateField(ObjectField.OBJECT_FIELD_ENTRY), out uf)) { continue; // broken entry, nothing to spawn } var entry = uf.UInt32Value; var badTransport = false; if (go.UpdateFields.TryGetValue(UpdateFields.GetUpdateField(GameObjectField.GAMEOBJECT_BYTES_1), out uf)) { var bytes = uf.UInt32Value; state = (bytes & 0x000000FF); animprogress = Convert.ToUInt32((bytes & 0xFF000000) >> 24); } row.AddValue("guid", "@OGUID+" + count, noQuotes: true); row.AddValue("id", entry); if (!go.IsOnTransport()) { row.AddValue("map", go.Map); } else { int mapId; badTransport = !GetTransportMap(go, out mapId); row.AddValue("map", mapId); } row.AddValue("spawnMask", go.GetDefaultSpawnMask()); row.AddValue("phaseMask", go.PhaseMask); if (ClientVersion.AddedInVersion(ClientVersionBuild.V4_3_4_15595) && go.Phases != null) { row.AddValue("phaseId", string.Join(" - ", go.Phases)); } if (!go.IsOnTransport()) { row.AddValue("position_x", go.Movement.Position.X); row.AddValue("position_y", go.Movement.Position.Y); row.AddValue("position_z", go.Movement.Position.Z); row.AddValue("orientation", go.Movement.Orientation); } else { row.AddValue("position_x", go.Movement.TransportOffset.X); row.AddValue("position_y", go.Movement.TransportOffset.Y); row.AddValue("position_z", go.Movement.TransportOffset.Z); row.AddValue("orientation", go.Movement.TransportOffset.O); } var rotation = go.GetRotation(); if (rotation != null && rotation.Length == 4) { row.AddValue("rotation0", rotation[0]); row.AddValue("rotation1", rotation[1]); row.AddValue("rotation2", rotation[2]); row.AddValue("rotation3", rotation[3]); } else { row.AddValue("rotation0", 0); row.AddValue("rotation1", 0); row.AddValue("rotation2", 0); row.AddValue("rotation3", 0); } row.AddValue("spawntimesecs", go.GetDefaultSpawnTime()); row.AddValue("animprogress", animprogress); row.AddValue("state", state); row.Comment = StoreGetters.GetName(StoreNameType.GameObject, (int)gameobject.Key.GetEntry(), false); row.Comment += " (Area: " + StoreGetters.GetName(StoreNameType.Area, go.Area, false) + ")"; if (go.IsTemporarySpawn()) { row.CommentOut = true; row.Comment += " - !!! might be temporary spawn !!!"; } else if (go.IsTransport()) { row.CommentOut = true; row.Comment += " - !!! transport !!!"; } else if (go.IsOnTransport() && badTransport) { row.CommentOut = true; row.Comment += " - !!! on transport - transport template not found !!!"; } else { ++count; } rows.Add(row); } var result = new StringBuilder(); if (count > 0) { // delete query for GUIDs var delete = new QueryBuilder.SQLDelete(Tuple.Create("@OGUID+0", "@OGUID+" + --count), "guid", tableName); result.Append(delete.Build()); } var sql = new QueryBuilder.SQLInsert(tableName, rows, withDelete: false); result.Append(sql.Build()); return(result.ToString()); }
public static string NpcSpellClickMop(Dictionary<WowGuid, Unit> units) { if (units.Count == 0) return string.Empty; if (!Settings.SQLOutputFlag.HasAnyFlagBit(SQLOutput.npc_spellclick_spells)) return string.Empty; const string tableName = "npc_spellclick_spells"; var rows = new List<QueryBuilder.SQLInsertRow>(); foreach (var unit in units) { var row = new QueryBuilder.SQLInsertRow(); var npc = unit.Value; if (npc.InteractSpellID == null) continue; if (Settings.AreaFilters.Length > 0) if (!(npc.Area.ToString(CultureInfo.InvariantCulture).MatchesFilters(Settings.AreaFilters))) continue; if (Settings.MapFilters.Length > 0) if (!(npc.Map.ToString(CultureInfo.InvariantCulture).MatchesFilters(Settings.MapFilters))) continue; row.AddValue("npc_entry", unit.Key.GetEntry()); row.AddValue("spell_id", npc.InteractSpellID); row.AddValue("cast_flags", "x", false, true); row.AddValue("user_type", "x", false, true); rows.Add(row); } return new QueryBuilder.SQLInsert(tableName, rows, 1, false).Build(); }
public static string CreatureDifficulty() { if (Storage.CreatureDifficultys.IsEmpty()) { return(String.Empty); } if (!Settings.SQLOutputFlag.HasAnyFlagBit(SQLOutput.creature_template)) { return(String.Empty); } var rowsIns = new List <QueryBuilder.SQLInsertRow>(); var rowsUpd = new List <QueryBuilder.SQLUpdateRow>(); foreach (var creature in Storage.CreatureDifficultys) { if (SQLDatabase.CreatureDifficultyStores != null) { if (SQLDatabase.CreatureDifficultyStores.ContainsKey(creature.Key)) { foreach (var creatureDiff in SQLDatabase.CreatureDifficultyStores) { var row = new QueryBuilder.SQLUpdateRow(); if (!Utilities.EqualValues(creature.Key, creatureDiff.Key)) { continue; } if (!Utilities.EqualValues(creatureDiff.Value.CreatureID, creature.Value.Item1.CreatureID)) { row.AddValue("CreatureID", creature.Value.Item1.CreatureID); } if (!Utilities.EqualValues(creatureDiff.Value.FactionID, creature.Value.Item1.FactionID)) { row.AddValue("FactionID", creature.Value.Item1.FactionID); } if (!Utilities.EqualValues(creatureDiff.Value.Expansion, creature.Value.Item1.Expansion)) { row.AddValue("Expansion", creature.Value.Item1.Expansion); } if (!Utilities.EqualValues(creatureDiff.Value.MinLevel, creature.Value.Item1.MinLevel)) { row.AddValue("MinLevel", creature.Value.Item1.MinLevel); } if (!Utilities.EqualValues(creatureDiff.Value.MaxLevel, creature.Value.Item1.MaxLevel)) { row.AddValue("MaxLevel", creature.Value.Item1.MaxLevel); } for (int i = 0; i < 5; i++) { if (!Utilities.EqualValues(creatureDiff.Value.Flags[i], creature.Value.Item1.Flags[i])) { row.AddValue("Flags" + (i + 1), creature.Value.Item1.Flags[i]); } } if (!Utilities.EqualValues(creatureDiff.Value.VerifiedBuild, creature.Value.Item1.VerifiedBuild)) { row.AddValue("VerifiedBuild", creature.Value.Item1.VerifiedBuild); } row.AddWhere("Id", creature.Key); row.Table = "creature_difficulty"; if (row.ValueCount != 0) { rowsUpd.Add(row); } } } else // insert { var row = new QueryBuilder.SQLInsertRow(); row.AddValue("ID", creature.Key); row.AddValue("CreatureID", creature.Value.Item1.CreatureID); row.AddValue("FactionID", creature.Value.Item1.FactionID); row.AddValue("Expansion", creature.Value.Item1.Expansion); row.AddValue("MinLevel", creature.Value.Item1.MinLevel); row.AddValue("MaxLevel", creature.Value.Item1.MaxLevel); for (int i = 0; i < 5; i++) { row.AddValue("Flags" + (i + 1), creature.Value.Item1.Flags[i]); } row.AddValue("VerifiedBuild", creature.Value.Item1.VerifiedBuild); rowsIns.Add(row); } } else // insert { var row = new QueryBuilder.SQLInsertRow(); row.AddValue("ID", creature.Key); row.AddValue("CreatureID", creature.Value.Item1.CreatureID); row.AddValue("FactionID", creature.Value.Item1.FactionID); row.AddValue("Expansion", creature.Value.Item1.Expansion); row.AddValue("MinLevel", creature.Value.Item1.MinLevel); row.AddValue("MaxLevel", creature.Value.Item1.MaxLevel); for (int i = 0; i < 5; i++) { row.AddValue("Flags" + (i + 1), creature.Value.Item1.Flags[i]); } row.AddValue("VerifiedBuild", creature.Value.Item1.VerifiedBuild); rowsIns.Add(row); } } return(new QueryBuilder.SQLInsert("creature_difficulty", rowsIns).Build() + new QueryBuilder.SQLUpdate(rowsUpd).Build()); }
public static string NpcTrainer() { if (Storage.NpcTrainers.IsEmpty()) return String.Empty; if (!Settings.SQLOutputFlag.HasAnyFlagBit(SQLOutput.npc_trainer)) return string.Empty; const string tableName = "npc_trainer"; var rows = new List<QueryBuilder.SQLInsertRow>(); foreach (var npcTrainer in Storage.NpcTrainers) { var comment = new QueryBuilder.SQLInsertRow { HeaderComment = StoreGetters.GetName(StoreNameType.Unit, (int) npcTrainer.Key, false) }; rows.Add(comment); foreach (var trainerSpell in npcTrainer.Value.Item1.TrainerSpells) { var row = new QueryBuilder.SQLInsertRow(); row.AddValue("ID", npcTrainer.Key); row.AddValue("SpellID", trainerSpell.Spell); row.AddValue("MoneyCost", trainerSpell.Cost); row.AddValue("ReqSkillLine", trainerSpell.RequiredSkill); row.AddValue("ReqSkillRank", trainerSpell.RequiredSkillLevel); row.AddValue("ReqLevel", trainerSpell.RequiredLevel); row.Comment = StoreGetters.GetName(StoreNameType.Spell, (int)trainerSpell.Spell, false); rows.Add(row); } } return new QueryBuilder.SQLInsert(tableName, rows).Build(); }