internal protected NPC() { m_threatCollection = new ThreatCollection(); // auras m_auras = new NPCAuraCollection(this); m_spells = NPCSpellCollection.Obtain(this); }
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; } }); }
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; }