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