All pastes #540208 Raw Edit

Nanowish/pet change model via ke

public text v1 · immutable
·published 2007-06-05 14:52 UTC
rendered paste body
Index: DOLDatabase/DOLTables/DBNpcTemplate.cs
===================================================================
--- DOLDatabase/DOLTables/DBNpcTemplate.cs	(revision 665)
+++ DOLDatabase/DOLTables/DBNpcTemplate.cs	(working copy)
@@ -44,6 +44,8 @@
 		private string m_level = "0";
 		private short m_maxSpeed = 50;
 		private string m_equipmentTemplateID = "";
+        private string m_raceAvailable = "";
+        private string m_weaponsAvailable = "";
 		private bool m_ghost;
 		private byte m_meleeDamageType = 1;
 		private byte m_parryChance;
@@ -210,6 +212,34 @@
 			}
 		}
 
+        /// <summary>
+        /// AvailableWeapons
+        /// </summary>
+        [DataElement(AllowDbNull = true)]
+        public string WeaponsAvailable
+        {
+            get { return m_weaponsAvailable; }
+            set
+            {
+                Dirty = true;
+                m_weaponsAvailable = value;
+            }
+        }
+
+        /// <summary>
+        /// RaceAvailable
+        /// </summary>
+        [DataElement(AllowDbNull = true)]
+        public string RaceAvailable
+        {
+            get {return m_raceAvailable;}
+            set
+            {
+                Dirty = true;
+                m_raceAvailable = value;
+            }
+        }
+
 		/// <summary>
 		/// Ghost
 		/// </summary>
Index: GameServer/gameobjects/GameNPC.cs
===================================================================
--- GameServer/gameobjects/GameNPC.cs	(revision 665)
+++ GameServer/gameobjects/GameNPC.cs	(working copy)
@@ -262,6 +262,26 @@
 			set { m_bodyType = value; }
 		}
 
+        private string m_raceAvailable;
+        /// <summary>
+        /// The NPC's race model
+        /// </summary>
+        public string RaceAvailable
+        {
+            get { return m_raceAvailable; }
+            set { m_raceAvailable = value; }
+        }
+
+        private string m_weaponsAvailable;
+        /// <summary>
+        /// The NPC's weapons pet
+        /// </summary>
+        public string WeaponsAvailable
+        {
+            get { return m_weaponsAvailable; }
+            set { m_weaponsAvailable = value; }
+        }
+
 		private int m_houseNumber;
 		/// <summary>
 		/// The NPC's current house
Index: GameServer/gameutils/INpcTemplate.cs
===================================================================
--- GameServer/gameutils/INpcTemplate.cs	(revision 665)
+++ GameServer/gameutils/INpcTemplate.cs	(working copy)
@@ -168,5 +168,15 @@
 		/// Gets the body type of the npc
 		/// </summary>
 		int BodyType { get;}
+
+        /// <summary>
+        /// Gets the race model pet
+        /// </summary>
+        string RaceAvailable { get;}
+
+        /// <summary>
+        /// Gets the weapon pet
+        /// </summary>
+        string WeaponsAvailable{ get;}
 	}
 }
\ No newline at end of file
Index: GameServer/gameutils/NpcTemplate.cs
===================================================================
--- GameServer/gameutils/NpcTemplate.cs	(revision 665)
+++ GameServer/gameutils/NpcTemplate.cs	(working copy)
@@ -68,6 +68,8 @@
 		protected byte m_aggroLevel;
 		protected int m_aggroRange;
 		protected int m_bodyType;
+        protected string m_raceAvailable;
+        protected string m_weaponsAvailable;
 
 		/// <summary>
 		/// Constructs a new NpcTemplate
@@ -162,6 +164,8 @@
 			m_aggroLevel = data.AggroLevel;
 			m_aggroRange = data.AggroRange;
 			m_bodyType = data.BodyType;
+            m_raceAvailable = data.RaceAvailable;
+            m_weaponsAvailable = data.WeaponsAvailable;
 		}
 
 		public NpcTemplate(GameNPC mob)
@@ -196,6 +200,8 @@
 				m_aggroRange = brain.AggroRange;
 			}
 			m_bodyType = mob.BodyType;
+            m_raceAvailable = mob.RaceAvailable;
+            m_weaponsAvailable = mob.WeaponsAvailable;
 		}
 
 		public NpcTemplate()
@@ -422,6 +428,18 @@
 			set { m_bodyType = value; }
 		}
 
+        public string RaceAvailable
+        {
+            get { return m_raceAvailable; }
+            set { m_raceAvailable = value; }
+        }
+
+        public string WeaponsAvailable
+        {
+            get { return m_weaponsAvailable; }
+            set { m_weaponsAvailable = value; }
+        }
+
 		public virtual void SaveIntoDatabase()
 		{
 			DBNpcTemplate tmp = tmp = (DBNpcTemplate)GameServer.Database.FindObjectByKey(typeof(DBNpcTemplate), TemplateId);
Index: GameServer/spells/SummonSpellHandler.cs
===================================================================
--- GameServer/spells/SummonSpellHandler.cs	(revision 665)
+++ GameServer/spells/SummonSpellHandler.cs	(working copy)
@@ -24,9 +24,12 @@
 using DOL.Events;
 using DOL.GS;
 using DOL.GS.Effects;
+using DOL.Database;
+using DOL.Language;
 using DOL.GS.PacketHandler;
 using DOL.GS.SkillHandler;
 using log4net;
+using System.Text.RegularExpressions;
 
 namespace DOL.GS.Spells
 {
@@ -74,6 +77,34 @@
 			return base.CheckBeginCast(selectedTarget);
 		}
 
+        /// <summary>
+        /// Return the pet text based on gender.
+        /// </summary>
+        /// <param>key text</param>
+      public string GetGender(string type){
+         string gender = string.Empty;
+            GamePlayer player = Caster as GamePlayer;
+            GameClient client = player.Client;
+
+         if (type == "master"){
+            if (((GamePlayer)Caster).PlayerCharacter.Gender == (int)0){
+               gender = LanguageMgr.GetTranslation(client, "SummonSpellHandler.CustomPet.Spiritmaster.MasterMale");
+            }
+            if (((GamePlayer)Caster).PlayerCharacter.Gender == (int)1){
+               gender = LanguageMgr.GetTranslation(client, "SummonSpellHandler.CustomPet.Spiritmaster.MasterFemale");
+            }
+         }
+         if (type == "summoner"){
+            if (((GamePlayer)Caster).PlayerCharacter.Gender == (int)0){
+               gender = LanguageMgr.GetTranslation(client, "SummonSpellHandler.CustomPet.Spiritmaster.SummonerMale");
+            }
+            if (((GamePlayer)Caster).PlayerCharacter.Gender == (int)1){
+               gender = LanguageMgr.GetTranslation(client, "SummonSpellHandler.CustomPet.Spiritmaster.SummonerFemale");
+            }
+         }
+         return gender;
+      }
+      
 		/// <summary>
 		/// Apply effect on target or do spell action if non duration spell
 		/// </summary>
@@ -125,8 +156,9 @@
 			else
 			{
 				target.GetSpotFromHeading(64, out x, out y);
-
+            
 				ControlledNpc controlledBrain = new ControlledNpc(player);
+                GameClient client = player.Client;
 
 				GameNPC summoned = new GameNPC(template);
 				summoned.SetOwnBrain(controlledBrain);
@@ -145,10 +177,351 @@
 				GameEventMgr.AddHandler(player, GamePlayerEvent.CommandNpcRelease, new DOLEventHandler(OnNpcReleaseCommand));
 				player.SetControlledNpc(controlledBrain);
 				effect.Start(summoned);
-			}
-		}
+
+                #region [Custom pet model's and weapon's Handlers] Nanowish
+                if (player.CharacterClass.ID == (int)eCharacterClass.Spiritmaster)
+                {
+                    summoned.Say(LanguageMgr.GetTranslation(client, "SummonSpellHandler.CustomPet.Spiritmaster.InvocSay", GetGender("master"), GetGender("summoner")));
+                }
+                if (player.CharacterClass.ID == (int)eCharacterClass.Bonedancer)
+                {
+                    summoned.Say(LanguageMgr.GetTranslation(client, "SummonSpellHandler.CustomPet.Bonedancer.InvocSay", GetGender("master"), GetGender("summoner"),LanguageMgr.GetTranslation(client, "SummonSpellHandler.CustomPet.Bonedancer.InvocKey")));
+                }
+                if (player.CharacterClass.ID == (int)eCharacterClass.Enchanter)
+                {
+                    summoned.Say(LanguageMgr.GetTranslation(client, "SummonSpellHandler.CustomPet.Enchanter.InvocSay", GetGender("master"), GetGender("summoner"), LanguageMgr.GetTranslation(client, "SummonSpellHandler.CustomPet.Enchanter.InvocKey")));
+                }
+                if (player.CharacterClass.ID == (int)eCharacterClass.Druid)
+                {
+                    summoned.Say(LanguageMgr.GetTranslation(client, "SummonSpellHandler.CustomPet.Druid.InvocSay", player.Name, LanguageMgr.GetTranslation(client, "SummonSpellHandler.CustomPet.Druid.InvocKey")));
+                }
+            GameEventMgr.AddHandler(summoned, GameLivingEvent.WhisperReceive, new DOLEventHandler(WhisperReceiveCallback));
+            GameEventMgr.AddHandler(summoned, GameLivingEvent.SayReceive, new DOLEventHandler(SayReceiveCallback));
+                #endregion
+            }
+        }
+        #region [Custom pet model's and weapon's management] Nanowish
+
+        /// <summary>
+        /// Add and Switch weapon method
+        /// </summary>
+        /// <param>add custom weapon</param>
+        /// <param>add weapon in slot get with GetSlot(ItemTemplate, int, string) method</param>
+        public void SetWeapon(ItemTemplate weapon, eInventorySlot slot)
+        {
+            GamePlayer player = Caster as GamePlayer;
+            IControlledBrain pet = player.ControlledNpc;
+            pet.Body.Inventory.RemoveItem(pet.Body.Inventory.GetItem(eInventorySlot.RightHandWeapon));
+            pet.Body.Inventory.RemoveItem(pet.Body.Inventory.GetItem(eInventorySlot.LeftHandWeapon));
+            pet.Body.Inventory.RemoveItem(pet.Body.Inventory.GetItem(eInventorySlot.TwoHandWeapon));
+            pet.Body.Inventory.AddTemplate(weapon, 1, slot, slot);
+            if (slot == eInventorySlot.RightHandWeapon || slot == eInventorySlot.LeftHandWeapon)
+            {
+                pet.Body.SwitchWeapon(GameLiving.eActiveWeaponSlot.Standard);
+            }
+            if (slot == eInventorySlot.TwoHandWeapon)
+            {
+                pet.Body.SwitchWeapon(GameLiving.eActiveWeaponSlot.TwoHanded);
+            }
+        }
+
+        /// <summary>
+        /// get slot of pet weapon.
+        /// </summary>
+        /// <param>pet weapon</param>
+        /// <param>return int of weapon.Hand method</param>
+        /// <param>pet weapon model say with key word</param>
+        public eInventorySlot GetSlot(ItemTemplate weapon, int slot, string modelId)
+        {
+            eInventorySlot defaultSlot = eInventorySlot.RightHandWeapon;
+            weapon = (ItemTemplate)GameServer.Database.FindObjectByKey(typeof(ItemTemplate), modelId);
+
+            if (slot == 0) defaultSlot = eInventorySlot.RightHandWeapon;
+            if (slot == 1) defaultSlot = eInventorySlot.TwoHandWeapon;
+            if (slot == 2) defaultSlot = eInventorySlot.LeftHandWeapon;
+            return defaultSlot;
+        }
+
+        /// <summary>
+        /// return the model's Id of the field RaceAvailable.
+        /// </summary>
+        /// <param>get model's Id with model's name</param>
+        public ushort PetRaceModelId(string saytext)
+        {
+            GamePlayer player = Caster as GamePlayer;
+            INpcTemplate template = NpcTemplateMgr.GetTemplate(Spell.LifeDrainReturn);
+            IList m_listmodel = new ArrayList();
+            ushort modelId = 0;
+            foreach (string str in template.RaceAvailable.Split(';'))
+            {
+                string[] modelList = str.Split(':');
+                modelId = Convert.ToUInt16(modelList[1]);
+
+                if (modelList.Length == 0) continue;
+                m_listmodel.Add(modelList);
+
+                //Get if race string exist and return model id, ex: troll:666, 666 is returned.
+                if (modelList[0].Contains(saytext))
+                {
+                    return modelId;
+                }
+            }
+            return modelId;
+        }
+
+        /// <summary>
+        /// return the model's Id of the field RaceAvailable.
+        /// </summary>
+        /// <param>get model's Id with model's name</param>
+        public string PetWeaponsModelId(string saytext)
+        {
+            GamePlayer player = Caster as GamePlayer;
+            INpcTemplate template = NpcTemplateMgr.GetTemplate(Spell.LifeDrainReturn);
+            IList m_listmodel = new ArrayList();
+            string modelId = string.Empty;
+            foreach (string str in template.WeaponsAvailable.Split(';'))
+            {
+                string[] modelList = str.Split(':');
+                modelId = modelList[1];
+
+                if (modelList.Length == 0) continue;
+                m_listmodel.Add(modelList);
+
+                //Get if race string exist and return model id, ex: troll:666, 666 is returned.
+                if (modelList[0].Contains(saytext))
+                {
+                    return modelId;
+                }
+            }
+            return modelId;
+        }
+
+        /// <summary>
+        /// race option: return the model's Name of the field RaceAvailable.
+        /// weapon option: return the model's Name of the field WeaponsAvailable.
+        /// </summary>
+        /// <param>search in field</param>
+        public string PetModelName(string option)
+        {
+            INpcTemplate template = NpcTemplateMgr.GetTemplate(Spell.LifeDrainReturn);
+            GamePlayer player = Caster as GamePlayer;
+            IControlledBrain pet = player.ControlledNpc;
+            IList m_listmodel = new ArrayList();
+            string modelName = string.Empty;
+
+            if (option.Equals("race"))
+            {
+                foreach (string str in template.RaceAvailable.Split(';'))
+                {
+                    string[] modelList = str.Split(':');
+                    if (modelList.Length == 0) continue;
+                    m_listmodel.Add(modelList);
+                    modelName += String.Format("[{0}], ", modelList[0]);
+                }
+            }
+            if (option.Equals("weapon"))
+            {
+                foreach (string str in template.WeaponsAvailable.Split(';'))
+                {
+                    string[] modelList = str.Split(':');
+                    if (modelList.Length == 0) continue;
+                    m_listmodel.Add(modelList);
+                    modelName += String.Format("[{0}], ", modelList[0]);
+                }
+            }
+
+            return modelName;
+        }
+
+        /// <summary>
+        /// Get if the key word say to pet, with Regex IgnoreCase, match with text option.
+        /// </summary>
+        /// <param>key word</param>
+        /// <param>text match with key word</param>
+        public bool GetSayKeys(SayReceiveEventArgs sArgs ,string text)
+        {
+            if (Regex.Match(sArgs.Text, text, RegexOptions.IgnoreCase).Success)
+                return true;
+            return false;
+        }
+
+        /// <summary>
+        /// Get if the key word whispered to pet, with Regex IgnoreCase, match with text option.
+        /// </summary>
+        /// <param>key word</param>
+        /// <param>text match with key word</param>
+        public bool GetWhispKeys(WhisperReceiveEventArgs wArgs, string text)
+        {
+            if (Regex.Match(wArgs.Text, text, RegexOptions.IgnoreCase).Success)
+                return true;
+            return false;
+        }
+
+        public void SayReceiveCallback(DOLEvent ev, object sender, EventArgs args)
+        {
+            GamePlayer player = ((SourceEventArgs)args).Source as GamePlayer;
+            IControlledBrain pet = player.ControlledNpc;
+            GameClient client = player.Client;
+
+            if (player == null)
+                return;
+
+            if (pet == null)
+                return;
+
+            if (ev == GameLivingEvent.SayReceive)
+            {
+                SayReceiveEventArgs sArgs = (SayReceiveEventArgs)args;
+                if (player.CharacterClass.ID == (int)eCharacterClass.Spiritmaster)
+                {
+                    if (GetSayKeys(sArgs, "niflheim"))
+                    {
+                        if (PetModelName("race").Length > 4)
+                        {
+                            pet.Body.SayTo(player, LanguageMgr.GetTranslation(client, "SummonSpellHandler.CustomPet.Spiritmaster.MainText", PetModelName("race"), LanguageMgr.GetTranslation(client, "SummonSpellHandler.CustomPet.Spiritmaster.WeaponKey")));
+                        }
+                    }
+                }
+                if (player.CharacterClass.ID == (int)eCharacterClass.Enchanter)
+                {
+                    if (GetSayKeys(sArgs, LanguageMgr.GetTranslation(client, "SummonSpellHandler.CustomPet.Enchanter.InvocKey")))
+                    {
+                        if (PetModelName("race").Length > 4)
+                        {
+                            pet.Body.SayTo(player, LanguageMgr.GetTranslation(client, "SummonSpellHandler.CustomPet.Enchanter.MainText", PetModelName("race")));
+                        }
+                    }
+                }
+                if (player.CharacterClass.ID == (int)eCharacterClass.Druid)
+                {
+                    if (GetSayKeys(sArgs, LanguageMgr.GetTranslation(client, "SummonSpellHandler.CustomPet.Druid.InvocKey")))
+                    {
+                        if (PetModelName("race").Length > 4)
+                        {
+                            pet.Body.SayTo(player, LanguageMgr.GetTranslation(client, "SummonSpellHandler.CustomPet.Druid.MainText", PetModelName("race")));
+                        }
+                    }
+                }
+                if (player.CharacterClass.ID == (int)eCharacterClass.Bonedancer)
+                {
+                    if (GetSayKeys(sArgs, LanguageMgr.GetTranslation(client, "SummonSpellHandler.CustomPet.Bonedancer.InvocKey")))
+                    {
+                        if (PetModelName("weapon").Length > 4)
+                        {
+                            pet.Body.SayTo(player, LanguageMgr.GetTranslation(client, "SummonSpellHandler.CustomPet.Bonedancer.MainText", LanguageMgr.GetTranslation(client, "SummonSpellHandler.CustomPet.Bonedancer.WeaponKey")));
+                        }
+                    }
+                }
+                else {return;}
+            }
+        }
+
+        public void WhisperReceiveCallback(DOLEvent ev, object sender, EventArgs args)
+        {
+
+            INpcTemplate template = NpcTemplateMgr.GetTemplate(Spell.LifeDrainReturn);
+            GamePlayer player = ((SourceEventArgs)args).Source as GamePlayer;
+            GameClient client = player.Client;
+
+            if (player == null)
+                return;
+
+            IControlledBrain pet = player.ControlledNpc;
+            if (pet == null)
+                return;
+
+            if (ev == GameLivingEvent.WhisperReceive)
+            {
+                // Get class, get text whisp text and say pet text.
+                WhisperReceiveEventArgs wArgs = (WhisperReceiveEventArgs)args;
+                if (player.CharacterClass.ID == (int)eCharacterClass.Spiritmaster
+                    || player.CharacterClass.ID == (int)eCharacterClass.Enchanter
+                    || player.CharacterClass.ID == (int)eCharacterClass.Druid)
+                {
+                    if (PetModelName("race").Length > 4)
+                    {
+                        if (GetWhispKeys(wArgs, "niflheim") && player.CharacterClass.ID == (int)eCharacterClass.Spiritmaster)
+                        {
+                            pet.Body.SayTo(player, LanguageMgr.GetTranslation(client, "SummonSpellHandler.CustomPet.Spiritmaster.MainText", PetModelName("race"), LanguageMgr.GetTranslation(client, "SummonSpellHandler.CustomPet.Spiritmaster.WeaponKey")));
+                        }
+                        if (GetWhispKeys(wArgs, LanguageMgr.GetTranslation(client, "SummonSpellHandler.CustomPet.Enchanter.InvocKey")) && player.CharacterClass.ID == (int)eCharacterClass.Enchanter)
+                        {
+                            pet.Body.SayTo(player, LanguageMgr.GetTranslation(client, "SummonSpellHandler.CustomPet.Enchanter.MainText", PetModelName("race")));
+                        }
+                        if (GetWhispKeys(wArgs, LanguageMgr.GetTranslation(client, "SummonSpellHandler.CustomPet.Druid.InvocKey")) && player.CharacterClass.ID == (int)eCharacterClass.Druid)
+                        {
+                            pet.Body.SayTo(player, LanguageMgr.GetTranslation(client, "SummonSpellHandler.CustomPet.Druid.MainText", PetModelName("race")));
+                        }
+                    }
+                    // if the text is not voile, underhill, niflheim or nature the pet model is changed
+                    if (PetModelName("race").Contains(wArgs.Text)
+                        && !GetWhispKeys(wArgs, "niflheim")
+                        && !GetWhispKeys(wArgs, LanguageMgr.GetTranslation(client, "SummonSpellHandler.CustomPet.Enchanter.InvocKey"))
+                        && !GetWhispKeys(wArgs, LanguageMgr.GetTranslation(client, "SummonSpellHandler.CustomPet.Enchanter.InvocKey"))
+                        && !GetWhispKeys(wArgs, LanguageMgr.GetTranslation(client, "SummonSpellHandler.CustomPet.Druid.InvocKey"))
+                        //don't change weapon when change model.
+                        && (!GetWhispKeys(wArgs, LanguageMgr.GetTranslation(client, "SummonSpellHandler.CustomPet.Spiritmaster.WeaponKey"))
+                        || !GetWhispKeys(wArgs, LanguageMgr.GetTranslation(client, "SummonSpellHandler.CustomPet.Bonedancer.WeaponKey"))))
+                    {
+                        try
+                        {
+                            pet.Body.Model = PetRaceModelId(wArgs.Text);
+                        }
+                        catch (Exception)
+                        {
+                            player.Out.SendMessage("!!! Model Race Error!!! Please contact the server admin.", eChatType.CT_Important, eChatLoc.CL_SystemWindow);
+                            if (log.IsErrorEnabled)
+                                log.Error("!!!Model Race Error!!! " + player.Name + "try to use invalid pet race, please check your DB");
+                        }
+                    }
+                }
+
+                //get class, get keys and say pet weapon text
+                if (player.CharacterClass.ID == (int)eCharacterClass.Spiritmaster
+                    || player.CharacterClass.ID == (int)eCharacterClass.Bonedancer)
+                {
+                    if (PetModelName("weapon").Length > 4)
+                    {
+                        if (GetWhispKeys(wArgs, LanguageMgr.GetTranslation(client, "SummonSpellHandler.CustomPet.Spiritmaster.WeaponKey"))
+                            || GetWhispKeys(wArgs, LanguageMgr.GetTranslation(client, "SummonSpellHandler.CustomPet.Bonedancer.WeaponKey")))
+                        {
+                            if (player.CharacterClass.ID == (int)eCharacterClass.Spiritmaster)
+                            {
+                                pet.Body.SayTo(player, LanguageMgr.GetTranslation(client, "SummonSpellHandler.CustomPet.Spiritmaster.WeaponText", PetModelName("weapon")));
+                            }
+
+                            if (player.CharacterClass.ID == (int)eCharacterClass.Bonedancer)
+                            {
+                                pet.Body.SayTo(player, LanguageMgr.GetTranslation(client, "SummonSpellHandler.CustomPet.Bonedancer.WeaponText", PetModelName("weapon")));
+                            }
+                        }
+                    }
+                    try
+                    {
+                        // if the text is not weapons, weapon, arme or arme the pet weapon is changed
+                        if ((!GetWhispKeys(wArgs, LanguageMgr.GetTranslation(client, "SummonSpellHandler.CustomPet.Spiritmaster.WeaponKey"))
+                            || !GetWhispKeys(wArgs, LanguageMgr.GetTranslation(client, "SummonSpellHandler.CustomPet.Bonedancer.WeaponKey")))
+                            && PetModelName("weapon").Contains(wArgs.Text))
+                        {
+                            ItemTemplate weapon = (ItemTemplate)GameServer.Database.FindObjectByKey(typeof(ItemTemplate), PetWeaponsModelId(wArgs.Text));
+                            SetWeapon(weapon, GetSlot(weapon, weapon.Hand, PetWeaponsModelId(wArgs.Text)));
+                        }
+                        else { return; }
+                    }
+                    catch (Exception)
+                    {
+                        player.Out.SendMessage("!!!Weapon Error!!! Please contact the server admin.", eChatType.CT_Important, eChatLoc.CL_SystemWindow);
+                        if (log.IsErrorEnabled)
+                            log.Error("!!!Weapon Error!!! " + player.Name + " try to use invalid pet weapon, please check your DB");
+                    }
+                }
+               
+            }
+           
+        }
+        #endregion
 
-		/// <summary>
+        /// <summary>
 		/// When an applied effect expires.
 		/// Duration spells only.
 		/// </summary>
@@ -183,6 +556,8 @@
 
 			player.SetControlledNpc(null);
 			GameEventMgr.RemoveHandler(player, GamePlayerEvent.CommandNpcRelease, new DOLEventHandler(OnNpcReleaseCommand));
+         GameEventMgr.RemoveHandler(npc.Body, GameLivingEvent.WhisperReceive, new DOLEventHandler(WhisperReceiveCallback));
+         GameEventMgr.RemoveHandler(npc.Body, GameLivingEvent.SayReceive, new DOLEventHandler(SayReceiveCallback));
 
 			GameSpellEffect effect = FindEffectOnTarget(npc.Body, this);
 			if (effect != null)
@@ -187,6 +562,7 @@
 			GameSpellEffect effect = FindEffectOnTarget(npc.Body, this);
 			if (effect != null)
 				effect.Cancel(false);
+         
 		}
 
 		/// <summary>