Exemplo n.º 1
0
        /// <summary>
        /// NPCs only have their default items which may always be used, so no invalidation
        /// takes place.
        /// </summary>
        protected override IWeapon GetOrInvalidateItem(InventorySlotType slot)
        {
            switch (slot)
            {
            case InventorySlotType.WeaponMainHand:
                return(m_entry.CreateMainHandWeapon());

            case InventorySlotType.WeaponRanged:
                return(m_entry.CreateRangedWeapon());

            case InventorySlotType.WeaponOffHand:
                return(m_entry.CreateOffhandWeapon());
            }
            return(null);
        }
Exemplo n.º 2
0
        public void SetEntry(NPCEntry entry)
        {
            Entry = entry;

            if (m_spawnPoint == null || m_spawnPoint.SpawnEntry.DisplayIdOverride == 0)
            {
                if (entry.ModelInfos.Length > 0)
                {
                    Model = entry.ModelInfos.GetRandom();
                }
            }
            NativeDisplayId = DisplayId;

            if (m_brain == null)
            {
                // new brain
                m_brain           = m_entry.BrainCreator(this);
                m_brain.IsRunning = true;
            }

            if (m_Movement == null)
            {
                m_Movement = new Movement(this);
            }

            // misc stuff
            Name            = m_entry.DefaultName;
            NPCFlags        = entry.NPCFlags;
            UnitFlags       = entry.UnitFlags;
            DynamicFlags    = entry.DynamicFlags;
            Class           = entry.ClassId;
            Race            = entry.RaceId;
            YieldsXpOrHonor = entry.GeneratesXp;
            SheathType      = SheathType.Melee;

            // decide which faction
            if (m_spawnPoint != null)
            {
                var map = m_spawnPoint.Map;
                if (map != null)
                {
                    Faction = DefaultFaction;
                }
            }
            if (Faction == null)
            {
                Faction = entry.RandomFaction;
            }

            // speeds
            m_runSpeed        = entry.RunSpeed;
            m_swimSpeed       = entry.RunSpeed;
            m_swimBackSpeed   = entry.RunSpeed;
            m_walkSpeed       = entry.WalkSpeed;
            m_walkBackSpeed   = entry.WalkSpeed;
            m_flightSpeed     = entry.FlySpeed;
            m_flightBackSpeed = entry.FlySpeed;

            Array.Copy(entry.Resistances, m_baseResistances, m_baseResistances.Length);

            MainWeapon    = m_entry.CreateMainHandWeapon();
            RangedWeapon  = m_entry.CreateRangedWeapon();
            OffHandWeapon = entry.CreateOffhandWeapon();

            // Set model after Scale
            Model = m_entry.GetRandomModel();

            GossipMenu = (m_spawnPoint != null && m_spawnPoint.SpawnEntry.DefaultGossip != null) ?
                         m_spawnPoint.SpawnEntry.DefaultGossip :
                         entry.DefaultGossip;

            // TODO: Init stats
            //for (int i = 0; i < 5; i++)
            //{
            //    m_baseStats[i] = statVal;
            //}
            PowerType = PowerType.Mana;
            SetBaseStat(StatType.Strength, 1, false);
            SetBaseStat(StatType.Agility, 1, false);
            SetBaseStat(StatType.Intellect, 1, false);
            SetBaseStat(StatType.Stamina, 1, false);
            SetBaseStat(StatType.Spirit, 1, false);

            // health + power
            var health = entry.GetRandomHealth();

            SetInt32(UnitFields.MAXHEALTH, health);
            SetInt32(UnitFields.BASE_HEALTH, health);

            if (m_entry.IsDead || m_spawnPoint == null || !m_spawnPoint.SpawnEntry.IsDead)
            {
                SetInt32(UnitFields.HEALTH, health);
            }
            else if (m_entry.Regenerates)
            {
                Regenerates = true;
                HealthRegenPerTickNoCombat = Math.Max(m_entry.MaxHealth / 10, 1);
            }

            var mana = entry.GetRandomMana();

            if (mana == 0)
            {
                SetInt32(UnitFields.MAXPOWER1, 1);
                SetInt32(UnitFields.BASE_MANA, 1);
            }
            else
            {
                SetInt32(UnitFields.MAXPOWER1, mana);
                SetInt32(UnitFields.BASE_MANA, mana);
            }
            SetInt32(UnitFields.POWER1, mana);
            internalPower = mana;

            HoverHeight = entry.HoverHeight;

            PowerCostMultiplier = 1f;

            if (PowerType == PowerType.Mana)
            {
                ManaRegenPerTickInterrupted = 20;
            }

            UpdateUnitState();

            if (m_entry.InhabitType.HasFlag(InhabitType.Air))
            {
                Flying++;
            }

            AddStandardEquipment();
            if (m_entry.AddonData != null)
            {
                // first add general addon data
                AddAddonData(m_entry.AddonData);
            }
            if (m_spawnPoint != null && m_spawnPoint.SpawnEntry.AddonData != null)
            {
                // then override with per-spawn addon data
                AddAddonData(m_spawnPoint.SpawnEntry.AddonData);
            }

            if (m_mainWeapon != GenericWeapon.Peace)
            {
                IncMeleePermissionCounter();
            }

            if (IsImmovable)
            {
                InitImmovable();
            }
            Level = entry.GetRandomLevel();

            AddMessage(UpdateSpellRanks);
        }