namespace Supercell.Laser.Logic.Command.Home { using System.Linq; using Supercell.Laser.Logic.Avatar; using Supercell.Laser.Logic.Avatar.Structures; using Supercell.Laser.Logic.Data; using Supercell.Laser.Logic.Data.Helper; using Supercell.Laser.Logic.Friends; using Supercell.Laser.Logic.Home; using Supercell.Laser.Logic.Listener; using Supercell.Laser.Logic.Message.Friends; using Supercell.Laser.Titan.DataStream; public class LogicPurchaseBrawlPassCommand : Command { public int Unknown; public bool Bundle; public override void Decode(ByteStream stream) { base.Decode(stream); Unknown = stream.ReadVInt(); Bundle = stream.ReadBoolean(); } public override int Execute(HomeMode homeMode) { int price = Bundle ? 249 : 169; if (!homeMode.Avatar.UseDiamonds(price)) { return -1; } homeMode.Home.HasPremiumPass = true; if (Bundle) { AdvancePassProgress(homeMode, 10); } RefreshSocialDisplay(homeMode); return 0; } private static void AdvancePassProgress(HomeMode homeMode, int steps) { int advanced = 0; while (advanced < steps) { MilestoneData milestoneData = GetNextPassMilestone(homeMode.Home.BrawlPassTokens); if (milestoneData == null) { break; } homeMode.Home.BrawlPassTokens = milestoneData.ProgressStart + milestoneData.Progress; advanced++; } } private static MilestoneData GetNextPassMilestone(int currentTokens) { return DataTables.Get(DataType.Milestone) .GetDatas() .OfType() .Where(milestone => milestone != null && milestone.Progress > 0) .OrderBy(milestone => milestone.ProgressStart) .FirstOrDefault(milestone => milestone.ProgressStart <= currentTokens && (milestone.ProgressStart + milestone.Progress) > currentTokens); } private static void RefreshSocialDisplay(HomeMode homeMode) { foreach (Friend friend in homeMode.Avatar.Friends) { ClientAvatar friendAvatar = friend.Avatar; if (friendAvatar == null) { continue; } Friend entry = friendAvatar.GetFriendById(homeMode.Avatar.AccountId); if (entry == null) { continue; } if (entry.DisplayData == null) { entry.DisplayData = new PlayerDisplayData(homeMode.Home.ThumbnailId, homeMode.Avatar.Name); } entry.DisplayData.Namecolor = homeMode.Home.Namecolor; entry.DisplayData.NameColorId = homeMode.Home.Namecolor; if (LogicServerListener.Instance.IsPlayerOnline(friend.AccountId)) { FriendListUpdateMessage update = new FriendListUpdateMessage { Entry = entry }; LogicServerListener.Instance.GetGameListener(friend.AccountId).SendTCPMessage(update); } } } public override int GetCommandType() { return 534; } } }