/// <summary> /// Constructs a NPC /// </summary> public GameNPC() : base() { Level = 1; // health changes when GameNPC.Level changes m_Realm = 0; m_name = "new mob"; m_model = 408; //Fill the living variables // CurrentSpeed = 0; // cause position addition recalculation MaxSpeedBase = 200; GuildName = ""; m_brainSync = m_brains.SyncRoot; m_followTarget = new WeakRef(null); m_size = 50; //Default size TargetPosition = new Point3D(); m_followMinDist = 100; m_followMaxDist = 3000; m_flags = 0; m_maxdistance = 0; m_roamingRange = 0; // default to non roaming - tolakram m_ownerID = ""; if ( m_spawnPoint == null ) m_spawnPoint = new Point3D(); //m_factionName = ""; LinkedFactions = new ArrayList(1); if (m_ownBrain == null) { m_ownBrain = new StandardMobBrain(); m_ownBrain.Body = this; } }
/// <summary> /// Adds a temporary brain to Npc, last added brain is active /// </summary> /// <param name="newBrain"></param> public virtual void AddBrain(ABrain newBrain) { if (newBrain == null) throw new ArgumentNullException("newBrain"); if (newBrain.IsActive) throw new ArgumentException("The new brain is already active.", "newBrain"); lock (BrainSync) { Brain.Stop(); ArrayList brains = new ArrayList(m_brains); brains.Add(newBrain); m_brains = brains; // make new array list to avoid locks in the Brain property newBrain.Body = this; newBrain.Start(); } }
/// <summary> /// Removes a temporary brain from Npc /// </summary> /// <param name="removeBrain">The brain to remove</param> /// <returns>True if brain was found</returns> public virtual bool RemoveBrain(ABrain removeBrain) { if (removeBrain == null) return false; lock (BrainSync) { ArrayList brains = new ArrayList(m_brains); int index = brains.IndexOf(removeBrain); if (index < 0) return false; bool active = brains[index] == Brain; if (active) removeBrain.Stop(); brains.RemoveAt(index); m_brains = brains; if (active) Brain.Start(); return true; } }
/// <summary> /// Sets the NPC own brain /// </summary> /// <param name="brain">The new brain</param> /// <returns>The old own brain</returns> public virtual ABrain SetOwnBrain(ABrain brain) { if (brain == null) return null; if (brain.IsActive) throw new ArgumentException("The new brain is already active.", "brain"); lock (BrainSync) { ABrain oldBrain = m_ownBrain; bool activate = oldBrain.IsActive; if (activate) oldBrain.Stop(); m_ownBrain = brain; m_ownBrain.Body = this; if (activate) m_ownBrain.Start(); return oldBrain; } }