public virtual void Stop(bool success)
 {
     if (!Started)
     {
         return;
     }
     Started = false;
     Asda2EventMgr.SendMessageToWorld("Deffence town event stoped in {0} [{2}-{3}]. Status : {1}", Town, success ? "Win" : "Loose", MinLevel, MaxLevel);
     _spawnTasks.IsRunning = false;
     _spawnTasks.Clear();
     _map.DefenceTownEvent = null;
     if (success)//getting prizies to players
     {
         var livesPrc         = (float)_lives / CharacterFormulas.DefenceTownLives;
         var expPortionsTotal = ExpPortionsTotal * livesPrc;
         var eventItemsTotal  = EventItemsTotal * livesPrc;
         NotifyBestDamagers();
         var objectsToDelete = new List <object>();
         var objectsToAdd    = new Dictionary <object, long>();
         foreach (var damage in Damages)
         {
             var grp = damage.Key as Group;
             if (grp != null)
             {
                 var receivers = grp.Where(m => m.Character != null && m.Character.Level >= MinLevel && m.Character.Level <= MaxLevel).ToList();
                 foreach (var member in receivers)
                 {
                     if (Damages.ContainsKey(member.Character))
                     {
                         objectsToDelete.Add(member.Character);
                     }
                     objectsToAdd.Add(member.Character, damage.Value / receivers.Count);
                 }
                 objectsToDelete.Add(damage.Key);
             }
         }
         World.BroadcastMsg("Rewarder", string.Format("Damagers count is {0}.", Damages.Count), Color.OrangeRed);
         foreach (var o in objectsToDelete)
         {
             Damages.Remove(o);
         }
         foreach (var l in objectsToAdd)
         {
             Damages.Add(l.Key, l.Value);
         }
         var totalDamage = Damages.Sum(d => d.Value);
         World.BroadcastMsg("Rewarder", string.Format("Total damage is {0}.", totalDamage), Color.OrangeRed);
         foreach (var damage in Damages.OrderByDescending(kvp => kvp.Value))
         {
             var chr = damage.Key as Character;
             try
             {
                 if (chr != null && chr.Asda2Inventory != null)
                 {
                     var prcFromMainPrize = (float)damage.Value / totalDamage;
                     var exp             = (int)(prcFromMainPrize * expPortionsTotal * XpGenerator.GetBaseExpForLevel(chr.Level));
                     var eventItemsCount = (int)(prcFromMainPrize * eventItemsTotal);
                     chr.GainXp(exp, "defence_town_event");
                     if (eventItemsCount > 0)
                     {
                         RealmServer.IOQueue.AddMessage(() => chr.Asda2Inventory.AddDonateItem(Asda2ItemMgr.GetTemplate(CharacterFormulas.EventItemId), eventItemsCount, "defence_town_event"));
                     }
                     World.BroadcastMsg("Rw", string.Format("{2} gain {0} coins and {1} exp for {3} dmg.", eventItemsCount, exp, chr.Name, damage.Value), Color.OrangeRed);
                 }
             }
             catch (Exception ex)
             {
                 World.BroadcastMsg("Event manager", "exception when rewarding." + ex.Message, Color.Red);
             }
         }
     }
     Damages.Clear();
 }
        public virtual void Stop(bool success)
        {
            if (!Started)
            {
                return;
            }
            Started = false;
            Asda2EventMgr.SendMessageToWorld("Deffence town event stoped in {0} [{2}-{3}]. Status : {1}",
                                             (object)Town, success ? (object)"Win" : (object)"Loose", (object)MinLevel,
                                             (object)MaxLevel);
            _spawnTasks.IsRunning = false;
            _spawnTasks.Clear();
            _map.DefenceTownEvent = null;
            if (success)
            {
                float num1 = _lives / (float)CharacterFormulas.DefenceTownLives;
                float num2 = ExpPortionsTotal * num1;
                float num3 = EventItemsTotal * num1;
                NotifyBestDamagers();
                List <object>             objectList = new List <object>();
                Dictionary <object, long> dictionary = new Dictionary <object, long>();
                foreach (KeyValuePair <object, long> damage in Damages)
                {
                    Group key = damage.Key as Group;
                    if (key != null)
                    {
                        List <GroupMember> list = key.Where(m =>
                        {
                            if (m.Character != null && m.Character.Level >= MinLevel)
                            {
                                return(m.Character.Level <= MaxLevel);
                            }
                            return(false);
                        }).ToList();
                        foreach (GroupMember groupMember in list)
                        {
                            if (Damages.ContainsKey(groupMember.Character))
                            {
                                objectList.Add(groupMember.Character);
                            }
                            dictionary.Add(groupMember.Character, damage.Value / list.Count);
                        }

                        objectList.Add(damage.Key);
                    }
                }

                World.BroadcastMsg("Rewarder",
                                   string.Format("Damagers count is {0}.", Damages.Count), Color.OrangeRed);
                foreach (object key in objectList)
                {
                    Damages.Remove(key);
                }
                foreach (KeyValuePair <object, long> keyValuePair in dictionary)
                {
                    Damages.Add(keyValuePair.Key, keyValuePair.Value);
                }
                long num4 = Damages.Sum(
                    d => d.Value);
                World.BroadcastMsg("Rewarder",
                                   string.Format("Total damage is {0}.", num4), Color.OrangeRed);
                foreach (KeyValuePair <object, long> keyValuePair in Damages.OrderByDescending(
                             kvp => kvp.Value))
                {
                    Character chr = keyValuePair.Key as Character;
                    try
                    {
                        if (chr != null)
                        {
                            if (chr.Asda2Inventory != null)
                            {
                                float num5       = keyValuePair.Value / (float)num4;
                                int   experience = (int)(num5 * (double)num2 *
                                                         XpGenerator.GetBaseExpForLevel(chr.Level));
                                int num6 = (int)(num5 * (double)num3);
                                chr.GainXp(experience, "defence_town_event", false);
                                if (num6 > 0)
                                {
                                    ServerApp <RealmServer> .IOQueue.AddMessage(() =>
                                                                                chr.Asda2Inventory.AddDonateItem(
                                                                                    Asda2ItemMgr.GetTemplate(CharacterFormulas.DonationItemId), 100,
                                                                                    "defence_town_event", false));
                                }
                                World.BroadcastMsg("Rw",
                                                   string.Format("{2} gain {0} coins and {1} exp for {3} dmg.", (object)100,
                                                                 (object)experience, (object)chr.Name, (object)keyValuePair.Value),
                                                   Color.OrangeRed);
                            }
                        }
                    }
                    catch (Exception ex)
                    {
                        World.BroadcastMsg("Event manager",
                                           "exception when rewarding." + ex.Message, Color.Red);
                    }
                }
            }

            Damages.Clear();
        }