public static string CreatureTemplateNonWDB(Dictionary <WowGuid, Unit> units) { if (units.Count == 0) { return(string.Empty); } if (!Settings.SQLOutputFlag.HasAnyFlagBit(SQLOutput.creature_template)) { return(string.Empty); } var levels = GetLevels(units); var usesCurrentExpansionLevels = new Dictionary <uint, long>(); var expansionBaseLevel = 0; if (Settings.TargetedDatabase >= TargetedDatabase.WarlordsOfDraenor && Settings.DBEnabled) { usesCurrentExpansionLevels = SQLDatabase.GetDict <uint, long>($"SELECT entry, 1 FROM {Settings.TDBDatabase}.creature_template WHERE HealthScalingExpansion = -1"); switch (Settings.TargetedDatabase) { case TargetedDatabase.WarlordsOfDraenor: expansionBaseLevel = 100; break; case TargetedDatabase.Legion: expansionBaseLevel = 110; break; case TargetedDatabase.BattleForAzeroth: expansionBaseLevel = 120; break; case TargetedDatabase.Shadowlands: expansionBaseLevel = 60; break; } } Func <uint, (int MinLevel, int MaxLevel)> getLevel = (uint id) => { CreatureTemplate template; if ((Storage.CreatureTemplates.TryGetValue(id, out template) && template.HealthScalingExpansion == ClientType.Current) || usesCurrentExpansionLevels.ContainsKey(id)) { return(levels[id].Item1 - expansionBaseLevel, levels[id].Item2 - expansionBaseLevel); } return(levels[id]); }; foreach (var unit in units) { if (Storage.CreatureTemplatesNonWDB.Any(creature => creature.Item1.Entry == unit.Key.GetEntry())) { continue; } var npc = unit.Value; var minMaxLevel = getLevel(unit.Key.GetEntry()); var template = new CreatureTemplateNonWDB { Entry = unit.Key.GetEntry(), GossipMenuId = Storage.CreatureDefaultGossips.GetValueOrDefault(unit.Key.GetEntry()), MinLevel = minMaxLevel.MinLevel, MaxLevel = minMaxLevel.MaxLevel, Faction = (uint)npc.UnitData.FactionTemplate, NpcFlag = (NPCFlags)Utilities.MAKE_PAIR64(npc.UnitData.NpcFlags[0] ?? 0, npc.UnitData.NpcFlags[1] ?? 0), SpeedRun = npc.Movement.RunSpeed, SpeedWalk = npc.Movement.WalkSpeed, BaseAttackTime = npc.UnitData.AttackRoundBaseTime[0], RangedAttackTime = npc.UnitData.RangedAttackRoundBaseTime, UnitClass = npc.UnitData.ClassId, UnitFlags = (UnitFlags)npc.UnitData.Flags, UnitFlags2 = (UnitFlags2)npc.UnitData.Flags2, UnitFlags3 = (UnitFlags3)npc.UnitData.Flags3, DynamicFlags = npc.DynamicFlags.GetValueOrDefault(UnitDynamicFlags.None), DynamicFlagsWod = npc.DynamicFlagsWod.GetValueOrDefault(UnitDynamicFlagsWOD.None), VehicleID = npc.Movement.VehicleId, HoverHeight = npc.UnitData.HoverHeight }; if (Settings.UseDBC) { var creatureDiff = DBC.DBC.CreatureDifficulty.Where(diff => diff.Value.CreatureID == unit.Key.GetEntry()); if (creatureDiff.Any()) { template.Faction = creatureDiff.Select(lv => lv.Value.FactionTemplateID).First(); } } if (template.Faction == 1 || template.Faction == 2 || template.Faction == 3 || template.Faction == 4 || template.Faction == 5 || template.Faction == 6 || template.Faction == 115 || template.Faction == 116 || template.Faction == 1610 || template.Faction == 1629 || template.Faction == 2203 || template.Faction == 2204 || template.Faction == 2395 || template.Faction == 2401 || template.Faction == 2402) // player factions { template.Faction = 35; } template.UnitFlags &= ~UnitFlags.IsInCombat; template.UnitFlags &= ~UnitFlags.PetIsAttackingTarget; template.UnitFlags &= ~UnitFlags.PlayerControlled; template.UnitFlags &= ~UnitFlags.Silenced; template.UnitFlags &= ~UnitFlags.PossessedByPlayer; if (!ClientVersion.AddedInVersion(ClientType.WarlordsOfDraenor)) { template.DynamicFlags &= ~UnitDynamicFlags.Lootable; template.DynamicFlags &= ~UnitDynamicFlags.Tapped; template.DynamicFlags &= ~UnitDynamicFlags.TappedByPlayer; template.DynamicFlags &= ~UnitDynamicFlags.TappedByAllThreatList; } else { template.DynamicFlagsWod &= ~UnitDynamicFlagsWOD.Lootable; template.DynamicFlagsWod &= ~UnitDynamicFlagsWOD.Tapped; template.DynamicFlagsWod &= ~UnitDynamicFlagsWOD.TappedByPlayer; template.DynamicFlagsWod &= ~UnitDynamicFlagsWOD.TappedByAllThreatList; } // has trainer flag but doesn't have prof nor class trainer flag if ((template.NpcFlag & NPCFlags.Trainer) != 0 && ((template.NpcFlag & NPCFlags.ProfessionTrainer) == 0 || (template.NpcFlag & NPCFlags.ClassTrainer) == 0)) { var subname = GetSubName((int)unit.Key.GetEntry(), false); // Fall back CreatureTemplate entry; if (Storage.CreatureTemplates.TryGetValue(unit.Key.GetEntry(), out entry)) { var sub = entry.SubName; if (sub.Length > 0) { template.NpcFlag |= ProcessNpcFlags(sub); } else // If the SubName doesn't exist or is cached, fall back to DB method { template.NpcFlag |= ProcessNpcFlags(subname); } } else // In case we have NonWDB data which doesn't have an entry in CreatureTemplates { template.NpcFlag |= ProcessNpcFlags(subname); } } Storage.CreatureTemplatesNonWDB.Add(template); } var templatesDb = SQLDatabase.Get(Storage.CreatureTemplatesNonWDB); return(SQLUtil.Compare(Storage.CreatureTemplatesNonWDB, templatesDb, StoreNameType.Unit)); }
public static string CreatureTemplateNonWDB(Dictionary <WowGuid, Unit> units) { if (units.Count == 0) { return(string.Empty); } if (!Settings.SQLOutputFlag.HasAnyFlagBit(SQLOutput.creature_template)) { return(string.Empty); } var levels = GetLevels(units); foreach (var unit in units) { if (Storage.CreatureTemplatesNonWDB.Any(creature => creature.Item1.Entry == unit.Key.GetEntry())) { continue; } var npc = unit.Value; int minLevel, maxLevel; if (npc.ScalingMinLevel != null && npc.ScalingMaxLevel != null) { minLevel = (int)npc.ScalingMinLevel; maxLevel = (int)npc.ScalingMaxLevel; } else { minLevel = (int)levels[unit.Key.GetEntry()].Item1; maxLevel = (int)levels[unit.Key.GetEntry()].Item2; } var template = new CreatureTemplateNonWDB { Entry = unit.Key.GetEntry(), GossipMenuId = npc.GossipId, MinLevel = minLevel, MaxLevel = maxLevel, Faction = npc.Faction.GetValueOrDefault(35), NpcFlag = npc.NpcFlags.GetValueOrDefault(NPCFlags.None), SpeedRun = npc.Movement.RunSpeed, SpeedWalk = npc.Movement.WalkSpeed, BaseAttackTime = npc.MeleeTime.GetValueOrDefault(2000), RangedAttackTime = npc.RangedTime.GetValueOrDefault(2000), UnitClass = (uint)npc.Class.GetValueOrDefault(Class.Warrior), UnitFlags = npc.UnitFlags.GetValueOrDefault(UnitFlags.None), UnitFlags2 = npc.UnitFlags2.GetValueOrDefault(UnitFlags2.None), UnitFlags3 = npc.UnitFlags3.GetValueOrDefault(UnitFlags3.None), DynamicFlags = npc.DynamicFlags.GetValueOrDefault(UnitDynamicFlags.None), VehicleID = npc.Movement.VehicleId, HoverHeight = npc.HoverHeight.GetValueOrDefault(1.0f) }; if (Settings.UseDBC) { var creatureDiff = DBC.DBC.CreatureDifficulty.Where(diff => diff.Value.CreatureID == unit.Key.GetEntry()); if (creatureDiff.Any()) { template.MinLevel = creatureDiff.Select(lv => lv.Value.MinLevel).First(); template.MaxLevel = creatureDiff.Select(lv => lv.Value.MaxLevel).First(); template.Faction = creatureDiff.Select(lv => lv.Value.FactionTemplateID).First(); } } if (template.Faction == 1 || template.Faction == 2 || template.Faction == 3 || template.Faction == 4 || template.Faction == 5 || template.Faction == 6 || template.Faction == 115 || template.Faction == 116 || template.Faction == 1610 || template.Faction == 1629 || template.Faction == 2203 || template.Faction == 2204) // player factions { template.Faction = 35; } template.UnitFlags &= ~UnitFlags.IsInCombat; template.UnitFlags &= ~UnitFlags.PetIsAttackingTarget; template.UnitFlags &= ~UnitFlags.PlayerControlled; template.UnitFlags &= ~UnitFlags.Silenced; template.UnitFlags &= ~UnitFlags.PossessedByPlayer; if (!ClientVersion.AddedInVersion(ClientType.WarlordsOfDraenor)) { template.DynamicFlags &= ~UnitDynamicFlags.Lootable; template.DynamicFlags &= ~UnitDynamicFlags.Tapped; template.DynamicFlags &= ~UnitDynamicFlags.TappedByPlayer; template.DynamicFlags &= ~UnitDynamicFlags.TappedByAllThreatList; } else { template.DynamicFlagsWod &= ~UnitDynamicFlagsWOD.Lootable; template.DynamicFlagsWod &= ~UnitDynamicFlagsWOD.Tapped; template.DynamicFlagsWod &= ~UnitDynamicFlagsWOD.TappedByPlayer; template.DynamicFlagsWod &= ~UnitDynamicFlagsWOD.TappedByAllThreatList; } // has trainer flag but doesn't have prof nor class trainer flag if ((template.NpcFlag & NPCFlags.Trainer) != 0 && ((template.NpcFlag & NPCFlags.ProfessionTrainer) == 0 || (template.NpcFlag & NPCFlags.ClassTrainer) == 0)) { var subname = GetSubName((int)unit.Key.GetEntry(), false); // Fall back var entry = Storage.CreatureTemplates.Where(creature => creature.Item1.Entry == unit.Key.GetEntry()); if (entry.Any()) { var sub = entry.Select(creature => creature.Item1.SubName).First(); if (sub.Length > 0) { template.NpcFlag |= ProcessNpcFlags(sub); Trace.WriteLine($"Entry: { unit.Key.GetEntry() } NpcFlag: { template.NpcFlag }"); } else // If the SubName doesn't exist or is cached, fall back to DB method { template.NpcFlag |= ProcessNpcFlags(subname); } } else // In case we have NonWDB data which doesn't have an entry in CreatureTemplates { template.NpcFlag |= ProcessNpcFlags(subname); } } Storage.CreatureTemplatesNonWDB.Add(template); } var templatesDb = SQLDatabase.Get(Storage.CreatureTemplatesNonWDB); return(SQLUtil.Compare(Storage.CreatureTemplatesNonWDB, templatesDb, StoreNameType.Unit)); }