using ProtoBuf; using System; using System.Runtime.InteropServices; using System.Collections.Generic; using System.IO; using System.Linq; using System.Collections.Concurrent; using System.Text; using LordsRoad; using LordsRoad.Database; using System.Threading.Tasks; namespace LordsRoad.Network.GamePackets { public class MsgBossHarmRanking { public MsgBossHarmRanking() { } public MsgBossHarmRankingProto Info; [ProtoContract] public class MsgBossHarmRankingProto { [ProtoMember(1, IsRequired = true)] public uint Type; [ProtoMember(2, IsRequired = true)] public uint BossUID; [ProtoMember(3, IsRequired = true)] public Hunter[] Hunters; } [ProtoContract] public class Hunter { [ProtoMember(1, IsRequired = true)] public uint Rank; [ProtoMember(2, IsRequired = true)] public uint ServerID; [ProtoMember(3, IsRequired = true)] public uint UID; [ProtoMember(4, IsRequired = true)] public string Name; [ProtoMember(5, IsRequired = true)] public uint Damage; } public bool Read(byte[] packet) { using (var memoryStream = new MemoryStream(packet)) { Info = Serializer.DeserializeWithLengthPrefix(memoryStream, PrefixStyle.Fixed32); } return true; } public void Handle(Client.GameClient client) { switch (Info.Type) { case 0: { var proto = new MsgBossHarmRankingProto(); proto.BossUID = Info.BossUID; proto.Type = 1; var scores = client.Map.Entities.Where(i => i.Key == proto.BossUID).FirstOrDefault().Value.MonsterInfo.Score.OrderByDescending(i => i.Value).ToArray(); if (scores.Length != 0) { proto.Hunters = new Hunter[scores.Length]; for (int i = 0; i < proto.Hunters.Length; i++) { proto.Hunters[i] = new Hunter(); proto.Hunters[i].UID = scores[i].Key.UID; proto.Hunters[i].Name = scores[i].Key.Name; proto.Hunters[i].Damage = scores[i].Value; proto.Hunters[i].ServerID = scores[i].Key.ServerID; proto.Hunters[i].Rank = (uint)(i + 1); } } client.Send(Kernel.FinalizeProtoBuf(proto, 1044)); break; } } } } }