示例#1
0
        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));
        }
示例#2
0
        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));
        }