Code:
using System; using System.Linq; using System.Collections.Generic; using ShekoProject.Network.GamePackets; using System.IO; using KinSocket; namespace ShekoProject.Game.ConquerStructures { public class Nobility { public static ulong MaxDonation = 0; public static ulong MaxDonation1 = 0; public static ulong MaxDonation2 = 0; public static ShekoProject.Network.GamePackets.nobility.NobilityIcon.NobilityRanks GetFemale(ShekoProject.Network.GamePackets.nobility.NobilityIcon.NobilityRanks rank) { switch (rank) { case ShekoProject.Network.GamePackets.nobility.NobilityIcon.NobilityRanks.Knight: return ShekoProject.Network.GamePackets.nobility.NobilityIcon.NobilityRanks.Lady; case ShekoProject.Network.GamePackets.nobility.NobilityIcon.NobilityRanks.Lady: case ShekoProject.Network.GamePackets.nobility.NobilityIcon.NobilityRanks.Baroness: case ShekoProject.Network.GamePackets.nobility.NobilityIcon.NobilityRanks.Countess: case ShekoProject.Network.GamePackets.nobility.NobilityIcon.NobilityRanks.Dutchess: return rank; case ShekoProject.Network.GamePackets.nobility.NobilityIcon.NobilityRanks.Baron: return ShekoProject.Network.GamePackets.nobility.NobilityIcon.NobilityRanks.Baroness; case ShekoProject.Network.GamePackets.nobility.NobilityIcon.NobilityRanks.Earl: return ShekoProject.Network.GamePackets.nobility.NobilityIcon.NobilityRanks.Countess; case ShekoProject.Network.GamePackets.nobility.NobilityIcon.NobilityRanks.Duke: return ShekoProject.Network.GamePackets.nobility.NobilityIcon.NobilityRanks.Dutchess; case ShekoProject.Network.GamePackets.nobility.NobilityIcon.NobilityRanks.Prince: return ShekoProject.Network.GamePackets.nobility.NobilityIcon.NobilityRanks.Princess; case ShekoProject.Network.GamePackets.nobility.NobilityIcon.NobilityRanks.King: return ShekoProject.Network.GamePackets.nobility.NobilityIcon.NobilityRanks.Queen; } return rank; } public static ulong GetMinimumDonation(ShekoProject.Network.GamePackets.nobility.NobilityIcon.NobilityRanks Rank) { switch (Rank) { case ShekoProject.Network.GamePackets.nobility.NobilityIcon.NobilityRanks.Knight: case ShekoProject.Network.GamePackets.nobility.NobilityIcon.NobilityRanks.Lady: return 0x1c9c380L; case ShekoProject.Network.GamePackets.nobility.NobilityIcon.NobilityRanks.Baron: case ShekoProject.Network.GamePackets.nobility.NobilityIcon.NobilityRanks.Baroness: return 0x5f5e100L; case ShekoProject.Network.GamePackets.nobility.NobilityIcon.NobilityRanks.Earl: case ShekoProject.Network.GamePackets.nobility.NobilityIcon.NobilityRanks.Countess: return 0xbebc200L; } return MinimumDonationFor(Rank); } public static SafeDictionary<uint, NobilityInformation> Board = new SafeDictionary<uint, NobilityInformation>(10000); public static List<NobilityInformation> BoardList = new List<NobilityInformation>(10000); public static ulong MinimumDonationFor(ShekoProject.Network.GamePackets.nobility.NobilityIcon.NobilityRanks Rank) { ulong num = 0L; for (int c = 0; c < BoardList.Count; c++) { sbyte place = 0; ShekoProject.Network.GamePackets.nobility.NobilityIcon.NobilityRanks commoner = ShekoProject.Network.GamePackets.nobility.NobilityIcon.NobilityRanks.Commoner; uint identifier = BoardList[c].EntityUID; ulong donation = BoardList[c].Donation; GetNobilityStats(identifier, donation, ref place, ref commoner); if ((commoner == Rank) && ((donation < num) || (num == 0L))) { num = donation; } } return (num + ((ulong)1L)); } public static void GetNobilityStats(uint Identifier, ulong Donation, ref sbyte Place, ref ShekoProject.Network.GamePackets.nobility.NobilityIcon.NobilityRanks Rank) { sbyte place = 0; ShekoProject.Network.GamePackets.nobility.NobilityIcon.NobilityRanks commoner = ShekoProject.Network.GamePackets.nobility.NobilityIcon.NobilityRanks.Commoner; for (int c = 0; c < 50; c++) { if (BoardList[c].EntityUID == Identifier) { break; } // if (place < 3000) { place = (sbyte)(place + 1); } } //Place = (place < 3000) ? place : ((sbyte)(-1)); if (Donation == 0L) { Place = -1; } commoner = GetRanking(Donation, place); Rank = commoner; } public static ShekoProject.Network.GamePackets.nobility.NobilityIcon.NobilityRanks GetRanking(ulong Donation, sbyte Place) { if ((Donation != 0L) && (Place >= 0)) { if ((Place < Database.rates.king) && (Donation > 0L)) { return ShekoProject.Network.GamePackets.nobility.NobilityIcon.NobilityRanks.King; } if ((Place < 0x12) && (Donation > 0L)) { return ShekoProject.Network.GamePackets.nobility.NobilityIcon.NobilityRanks.Prince; } if ((Place < 0x35) && (Donation > 0L)) { return ShekoProject.Network.GamePackets.nobility.NobilityIcon.NobilityRanks.Duke; } if (Donation >= 0xbebc200L) { return ShekoProject.Network.GamePackets.nobility.NobilityIcon.NobilityRanks.Earl; } if (Donation >= 0x5f5e100L) { return ShekoProject.Network.GamePackets.nobility.NobilityIcon.NobilityRanks.Baron; } if (Donation >= 0x1c9c380L) { return ShekoProject.Network.GamePackets.nobility.NobilityIcon.NobilityRanks.Knight; } } return ShekoProject.Network.GamePackets.nobility.NobilityIcon.NobilityRanks.Commoner; } public static void Handle(NobilityInfo information, Client.GameState client) { switch (information.Type) { case NobilityInfo.Donate: { if (client.Trade.InTrade) return; if (client.Entity.MapID == 3031) return; uint silvers = information.dwParam; bool newDonator = false; if (client.NobilityInformation.Donation == 0) newDonator = true; if (client.Entity.Money < information.dwParam) { uint cps = silvers / 50000; if (client.Entity.ConquerPoints >= 500000) { if (client.Entity.NobalityDonation == client.NobilityInformation.Donation) { client.Entity.ConquerPoints -= 500000; Database.EntityTable.UpdateCps(client); client.NobilityInformation.Donation += silvers; client.Entity.NobalityDonation += silvers; Database.EntityTable.UpdateDonation(client); } else { if (client.Entity.NobalityDonation > client.NobilityInformation.Donation) { client.Entity.ConquerPoints -= 500000; Database.EntityTable.UpdateCps(client); client.Entity.NobalityDonation += silvers; client.NobilityInformation.Donation = client.Entity.NobalityDonation; Database.EntityTable.UpdateDonation(client); } else { if (client.Entity.NobalityDonation < client.NobilityInformation.Donation) { client.Entity.ConquerPoints -= 500000; Database.EntityTable.UpdateCps(client); client.NobilityInformation.Donation += silvers; client.Entity.NobalityDonation = client.NobilityInformation.Donation; Database.EntityTable.UpdateDonation(client); } } } } } else { if (client.Entity.Money >= silvers) { /*if (client.Entity.NobalityDonation == client.NobilityInformation.Donation) { client.Entity.Money -= silvers; client.NobilityInformation.Donation += silvers; client.Entity.NobalityDonation += silvers; Database.EntityTable.UpdateDonation(client); } else { if (client.Entity.NobalityDonation > client.NobilityInformation.Donation) { client.Entity.Money -= silvers; client.Entity.NobalityDonation += silvers; client.NobilityInformation.Donation = client.Entity.NobalityDonation; Database.EntityTable.UpdateDonation(client); } else { if (client.Entity.NobalityDonation < client.NobilityInformation.Donation) { client.Entity.Money -= silvers; client.NobilityInformation.Donation += silvers; client.Entity.NobalityDonation = client.NobilityInformation.Donation; Database.EntityTable.UpdateDonation(client); } } }*/ } } if (!Board.ContainsKey(client.Entity.UID) && newDonator) { Board.Add(client.Entity.UID, client.NobilityInformation); try { Database.NobilityTable.InsertNobilityInformation(client.NobilityInformation); } catch { Database.NobilityTable.UpdateNobilityInformation(client.NobilityInformation); } } else { Database.NobilityTable.UpdateNobilityInformation(client.NobilityInformation); } Sort(client.Entity.UID); Network.GamePackets.NpcReply npc = new Network.GamePackets.NpcReply(6, "You've donated " + silvers + " Silver. Your total donation is " + client.NobilityInformation.Donation + " silver. You rank at " + client.NobilityInformation.Position + " place in the Donation Ranking."); npc.OptionID = 255; client.Send(npc.ToArray()); //return; break; } case NobilityInfo.List: { byte Count = 0; MemoryStream strm = new MemoryStream(); BinaryWriter wtr = new BinaryWriter(strm); wtr.Write((ushort)0); wtr.Write((ushort)2064); wtr.Write((uint)NobilityInfo.List); wtr.Write((ushort)information.wParam1); wtr.Write((ushort)5); wtr.Write((uint)0); wtr.Write((uint)0); wtr.Write((uint)0); wtr.Write((uint)0); wtr.Write((uint)0); wtr.Write((uint)0); wtr.Write((uint)0); wtr.Write((uint)0); wtr.Write((uint)0); wtr.Write((uint)0); wtr.Write((uint)0); wtr.Write((uint)0); wtr.Write((uint)0); wtr.Write((uint)0); wtr.Write((uint)0); wtr.Write((uint)0); wtr.Write((uint)0); wtr.Write((uint)0); wtr.Write((uint)0); wtr.Write((uint)0); wtr.Write((uint)0); wtr.Write((uint)0); wtr.Write((uint)0); wtr.Write((uint)0); wtr.Write((uint)0); wtr.Write((uint)0); wtr.Write((uint)0); for (int i = (int)(information.wParam1 * 10); i < information.wParam1 * 10 + 10; i++) { if (BoardList.Count > i) { Count++; wtr.Write((uint)BoardList[i].EntityUID); wtr.Write((uint)BoardList[i].Gender); wtr.Write((uint)BoardList[i].Mesh); for (int c = 0; c < 20; c++) { if (BoardList[i].Name.Length > c) wtr.Write((byte)(BoardList[i].Name[c])); else wtr.Write((byte)(0)); } wtr.Write((ulong)BoardList[i].Donation); wtr.Write((uint)BoardList[i].Rank); wtr.Write((uint)BoardList[i].Position); } } int packetlength = (int)strm.Length; strm.Position = 0; wtr.Write((ushort)packetlength); strm.Position = strm.Length; wtr.Write(System.Text.Encoding.ASCII.GetBytes("TQServer")); strm.Position = 0; byte[] buf = new byte[strm.Length]; strm.Read(buf, 0, buf.Length); Network.Writer.WriteUInt32(Count, 12, buf); client.Send(buf); information.Type = NobilityInfo.NextRank; ulong value = 0; information.dwParam2 = 0; if (client.NobilityInformation.Rank == NobilityRank.Prince) value = (ulong)(BoardList[02].Donation - client.NobilityInformation.Donation + 1); if (client.NobilityInformation.Rank == NobilityRank.Duke) value = (ulong)(BoardList[14].Donation - client.NobilityInformation.Donation + 1); if (client.NobilityInformation.Rank == NobilityRank.Earl) value = (ulong)(BoardList[49].Donation - client.NobilityInformation.Donation + 1); Network.Writer.WriteUInt64(value, 8, information.ToArray()); information.dwParam3 = 60; information.dwParam4 = uint.MaxValue; client.Send(information); break; } case NobilityInfo.NextRank: { ShekoProject.Network.GamePackets.nobility.NobilityIcon icon = new ShekoProject.Network.GamePackets.nobility.NobilityIcon(0xa8) { Type = ShekoProject.Network.GamePackets.nobility.NobilityIcon.NobilityTypes.Minimum }; for (int i = 1; i < 12; i += 2) { if (i == 11) { i++; } ShekoProject.Network.GamePackets.nobility.NobilityIcon.NobilityRanks rank = (ShekoProject.Network.GamePackets.nobility.NobilityIcon.NobilityRanks)i; icon.AddMinimum(rank, Nobility.GetMinimumDonation(rank)); } client.Send((byte[])icon); break; } } } public static void Sort(uint updateUID) { SortedDictionary<ulong, SortEntry<uint, NobilityInformation>> sortdict = new SortedDictionary<ulong, SortEntry<uint, NobilityInformation>>(); foreach (NobilityInformation info in Board.Values) { if (sortdict.ContainsKey(info.Donation)) { SortEntry<uint, NobilityInformation> entry = sortdict[info.Donation]; entry.Values.Add(info.EntityUID, info); } else { SortEntry<uint, NobilityInformation> entry = new SortEntry<uint, NobilityInformation>(); entry.Values = new Dictionary<uint, NobilityInformation>(); entry.Values.Add(info.EntityUID, info); sortdict.Add(info.Donation, entry); } } SafeDictionary<uint, NobilityInformation> sortedBoard = new SafeDictionary<uint, NobilityInformation>(1000000); sortedBoard.Clear(); int Place = 0; foreach (KeyValuePair<ulong, SortEntry<uint, NobilityInformation>> entries in sortdict.Reverse()) { foreach (KeyValuePair<uint, NobilityInformation> value in entries.Value.Values) { Client.GameState client = null; try { int previousPlace = value.Value.Position; value.Value.Position = Place; NobilityRank Rank = NobilityRank.Serf; if (Place > 100) { if (value.Value.Donation >= 200000000) { Rank = NobilityRank.Earl; } else if (value.Value.Donation >= 100000000) { Rank = NobilityRank.Baron; } else if (value.Value.Donation >= 30000000) { Rank = NobilityRank.Knight; } } else if (Place < Database.rates.king) { Rank = NobilityRank.King; if (Place < (Database.rates.king - (Database.rates.king - 1))) { MaxDonation = value.Value.Donation; } } else if (Place < Database.rates.prince) { Rank = NobilityRank.Prince; if (Place < (Database.rates.king + 2)) { MaxDonation1 = value.Value.Donation; } } else { Rank = NobilityRank.Duke; if (Place < (Database.rates.prince + 2)) { MaxDonation2 = value.Value.Donation; } } var oldRank = value.Value.Rank; value.Value.Rank = Rank; if (ServerBase.Kernel.GamePool.TryGetValue(value.Key, out client)) { bool updateTheClient = false; if (oldRank != Rank) { updateTheClient = true; if (Rank == NobilityRank.Baron) { ServerBase.Kernel.SendWorldMessage(new Message("Congratulation! " + client.Entity.Name + " Donation To Baron in Nobility Rank.", System.Drawing.Color.White, Message.TopLeft), ServerBase.Kernel.GamePool.Values); } if (Rank == NobilityRank.Earl) { ServerBase.Kernel.SendWorldMessage(new Message("Congratulation! " + client.Entity.Name + " Donation To Earl in Nobility Rank.", System.Drawing.Color.White, Message.TopLeft), ServerBase.Kernel.GamePool.Values); } if (Rank == NobilityRank.Duke) { ServerBase.Kernel.SendWorldMessage(new Message("Congratulation! " + client.Entity.Name + " Donation To Duke in Nobility Rank.", System.Drawing.Color.White, Message.Center), ServerBase.Kernel.GamePool.Values); } if (Rank == NobilityRank.Prince) { ServerBase.Kernel.SendWorldMessage(new Message("Congratulation! " + client.Entity.Name + " Donation To Prince in Nobility Rank.", System.Drawing.Color.White, Message.Center), ServerBase.Kernel.GamePool.Values); } if (Rank == NobilityRank.King) { ServerBase.Kernel.SendWorldMessage(new Message("Congratulation! " + client.Entity.Name + " has become the new King/Queen in " + Database.rates.servername + "!", System.Drawing.Color.White, Message.Center), ServerBase.Kernel.GamePool.Values); } if (Rank == NobilityRank.Knight) { ServerBase.Kernel.SendWorldMessage(new Message("Congratulation! " + client.Entity.Name + " Donation To Knight in Nobility Rank.", System.Drawing.Color.White, Message.TopLeft), ServerBase.Kernel.GamePool.Values); } } else { if (previousPlace != Place) { updateTheClient = true; } } if (updateTheClient || client.Entity.UID == updateUID) { NobilityInfo update = new NobilityInfo(true); update.Type = NobilityInfo.Icon; update.dwParam = value.Key; update.UpdateString(value.Value); client.SendScreen(update, true); client.Entity.NobilityRank = value.Value.Rank; } } sortedBoard.Add(value.Key, value.Value); Place++; } catch { } } } Board = sortedBoard; lock (BoardList) { BoardList = Board.Values.ToList(); } } } public class NobilityInformation { public string Name; public uint EntityUID; public uint Mesh; public ulong Donation; public byte Gender; public int Position; public NobilityRank Rank; } public enum NobilityRank : byte { Serf = 0, Knight = 1, Baron = 3, Earl = 5, Duke = 7, Prince = 9, King = 12 } }