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