Beispiel #1
0
		protected internal virtual void SetupNPC(NPCEntry entry, SpawnPoint spawnPoint)
		{
			// auras
			m_auras = new NPCAuraCollection(this);

			SpawnEntry spawnEntry;
			if (spawnPoint != null)
			{
				// Spawn-specific information
				spawnEntry = spawnPoint.SpawnEntry;
				m_spawnPoint = spawnPoint;
				Phase = spawnEntry.PhaseMask;
				m_orientation = spawnEntry.Orientation;

				if (spawnEntry.DisplayIdOverride != 0)
				{
					DisplayId = spawnEntry.DisplayIdOverride;
				}
				else if (entry.ModelInfos != null && entry.ModelInfos.Length > 0)
				{
					Model = entry.ModelInfos.GetRandom();
				}
			}
			else
			{
				Phase = 1;
				spawnEntry = entry.FirstSpawnEntry;
			}

			Entry = entry;
			NativeDisplayId = DisplayId;

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

			// 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 = entry.DefaultGossip; // set gossip menu

			// 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();
			SetUInt32(UnitFields.MAXHEALTH, health);
			SetUInt32(UnitFields.BASE_HEALTH, health);

			if (spawnEntry == null || !spawnEntry.IsDead)
			{
				SetUInt32(UnitFields.HEALTH, health);
			}

			var mana = entry.GetRandomMana();
			SetInt32(UnitFields.MAXPOWER1, mana);
			SetInt32(UnitFields.BASE_MANA, mana);
			SetInt32(UnitFields.POWER1, mana);

			HoverHeight = entry.HoverHeight;

			m_Movement = new Movement(this);

			PowerCostMultiplier = 1f;

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

			HealthRegenPerTickNoCombat = BaseHealth / 5;

			UpdateUnitState();

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

			if (IsImmovable)
			{
				InitImmovable();
			}

			m_spells = NPCSpellCollection.Obtain(this);

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

			CanMelee = m_mainWeapon != GenericWeapon.Peace;

			m_brain = m_entry.BrainCreator(this);
			m_brain.IsRunning = true;

			AddMessage(() =>
						{
							// Set Level/Scale after NPC is in world:
							if (!HasPlayerMaster)
							{
								Level = entry.GetRandomLevel();
							}
							else
							{
								Level = m_master.Level;
							}
						});
		}
Beispiel #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 = entry.DefaultGossip; // set gossip menu

            // 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);
        }
Beispiel #3
0
		protected internal virtual void SetupNPC(NPCEntry entry, SpawnPoint spawnPoint)
		{
			// auras
			m_auras = new NPCAuraCollection(this);

			var mainWeapon = entry.CreateMainHandWeapon();

			SpawnEntry spawnEntry;
			if (spawnPoint != null)
			{
				// Spawn-specific information
				spawnEntry = spawnPoint.SpawnEntry;
				m_spawnPoint = spawnPoint;
				Phase = spawnEntry.PhaseMask;
				m_orientation = spawnEntry.Orientation;
				if (spawnEntry.MountId != 0)
				{
					Mount(spawnEntry.MountId);
				}

				if (spawnEntry.DisplayIdOverride != 0)
				{
					DisplayId = spawnEntry.DisplayIdOverride;
				}

				SetUInt32(UnitFields.BYTES_0, spawnEntry.Bytes);
				SetUInt32(UnitFields.BYTES_2, spawnEntry.Bytes2);
			}
			else
			{
				Phase = 1;
				spawnEntry = entry.FirstSpawnEntry;
			}

			EmoteState = (spawnEntry != null && spawnEntry.EmoteState != 0) ? spawnEntry.EmoteState : entry.EmoteState;
			Entry = entry;
			NativeDisplayId = DisplayId;

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

			// 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 = mainWeapon;

			// Set Level/Scale *after* MainWeapon is set:
			var level = entry.GetRandomLevel();
			Level = level;

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

			m_gossipMenu = entry.DefaultGossip; // set gossip menu

			// 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();
			SetUInt32(UnitFields.MAXHEALTH, health);
			SetUInt32(UnitFields.BASE_HEALTH, health);

			if (spawnEntry == null || !spawnEntry.IsDead)
			{
				SetUInt32(UnitFields.HEALTH, health);
			}

			var mana = entry.GetRandomMana();
			SetInt32(UnitFields.MAXPOWER1, mana);
			SetInt32(UnitFields.BASE_MANA, mana);
			SetInt32(UnitFields.POWER1, mana);

			OffHandWeapon = entry.CreateOffhandWeapon();
			RangedWeapon = entry.CreateRangedWeapon();

			HoverHeight = entry.HoverHeight;

			m_Movement = new Movement(this);

			PowerCostMultiplier = 1f;

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

			HealthRegenPerTickNoCombat = BaseHealth / 5;

			UpdateUnitState();

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

			if (m_entry.Spells != null)
			{
				EnsureSpells();
			}

			if (m_entry.Type == NPCType.Totem || m_entry.Type == NPCType.None)
			{
				m_Movement.MayMove = false;
			}

			AddEquipment();

			CanMelee = mainWeapon != GenericWeapon.Peace;

			// TODO: Don't create talents if this is not a pet
			m_petTalents = new TalentCollection(this);

			m_brain = m_entry.BrainCreator(this);
			m_brain.IsRunning = true;
		}