using System;using System.Linq;using System.Collections.Generic;using KhaledMohamed.Network.GamePackets;using System.IO;namespace KhaledMohamed.Game.ConquerStructures{ public class Nobility : KhaledMohamed.Network.Writer { public static ulong MaxDonation = 0; public static ulong MaxDonation1 = 0; public static ulong MaxDonation2 = 0; public static SafeDictionary<uint, NobilityInformation> Board = new SafeDictionary<uint, NobilityInformation>(10000); public static List<NobilityInformation> BoardList = new List<NobilityInformation>(10000); public static void Handle(NobilityInfo information, Client.GameState client) { switch (information.Type) { case NobilityInfo.Donate: { if (client.Trade.InTrade) return; ulong silvers = information.dwParam; bool newDonator = false; client.NobilityInformation.Gender = (byte)(client.Entity.Body % 10); if (client.NobilityInformation.Donation == 0) newDonator = true; if (information.MoneyType == 1) { ulong cps = silvers / 1; if (client.Entity.ConquerPoints >= cps && client.PokerPlayer == null) { client.Entity.ConquerPoints -= (uint)cps; client.NobilityInformation.Donation += silvers; } } else { if (client.Entity.Money >= silvers && client.PokerPlayer == null) { client.Entity.Money -= (ulong)silvers; client.NobilityInformation.Donation += silvers; } } if (!Board.ContainsKey(client.Entity.UID) && client.NobilityInformation.Donation == silvers && 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); break; } case NobilityInfo.List: { byte[] packet = new byte[600 + 8]; WriteUInt16(600, 0, packet); WriteUInt16(2064, 2, packet); WriteUInt16(2, 4, packet); WriteUInt16(5, 10, packet); WriteUInt16(10, 12, packet); int offset = 120; for (int i = (int)(information.wParam1 * 10); i < information.wParam1 * 10 + 10 && i < BoardList.Count; i++) { var nob = BoardList[i]; WriteUInt32(nob.EntityUID, offset, packet); offset += 4; if (Kernel.GamePool.ContainsKey(nob.EntityUID)) { WriteUInt32(1, offset, packet); offset += 4; WriteUInt32(nob.Mesh, offset, packet); offset += 4; } else { offset += 8; } WriteString(nob.Name, offset, packet); offset += 20; WriteUInt64(nob.Donation, offset, packet); offset += 8; WriteUInt32((uint)nob.Rank, offset, packet); offset += 4; WriteUInt32((uint)i, offset, packet); offset += 4; } client.Send(packet); information.Type = NobilityInfo.NextRank; ulong value = 0; information.dwParam2 = 0; lock (BoardList) { 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); } Network.Writer.WriteUInt64(value, 8, information.ToArray()); information.dwParam3 = 60; information.dwParam4 = uint.MaxValue; client.Send(information); break; } } } public static void Donate(ulong silvers, Client.GameState client) { bool newDonator = false; client.NobilityInformation.Gender = (byte)(client.Entity.Body % 10); if (client.NobilityInformation.Donation == 0) newDonator = true; client.NobilityInformation.Donation += silvers; if (!Board.ContainsKey(client.Entity.UID) && client.NobilityInformation.Donation == silvers && 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); } public static void Sort(uint updateUID) { SafeDictionary<uint, NobilityInformation> sortedBoard = new SafeDictionary<uint, NobilityInformation>(); int Place = 0; foreach (NobilityInformation entry in Board.Values.OrderByDescending((p) => p.Donation)) { Client.GameState client = null; try { int previousPlace = entry.Position; entry.Position = Place; NobilityRank Rank = NobilityRank.Serf; if (Place >= CPanal.Duke) { if (Program.Nobility == true) { Rank = NobilityRank.King; } else { if (entry.Donation >= 200000000) { Rank = NobilityRank.Earl; } else if (entry.Donation >= 100000000) { Rank = NobilityRank.Baron; } else if (entry.Donation >= 30000000) { Rank = NobilityRank.Knight; } else if (entry.Donation == 1) { Rank = NobilityRank.King; } } } else { if (Program.Nobility == true) { Rank = NobilityRank.King; } else { if (Place < CPanal.king)//serverrank { Rank = NobilityRank.King; } else if (Place < CPanal.prince) { Rank = NobilityRank.Prince; } else if (Place < CPanal.Duke && Place < CPanal.lastDuke) { Rank = NobilityRank.Duke; } } } var oldRank = entry.Rank; entry.Rank = Rank; if (Kernel.GamePool.TryGetValue(entry.EntityUID, out client)) { bool updateTheClient = false; if (oldRank != Rank) { updateTheClient = true; if (Rank == NobilityRank.Duke) { Kernel.SendWorldMessage(new Message("Congratulation! " + client.Entity.Name + " has the Duke title.", System.Drawing.Color.White, Message.Center), Program.Values); } if (Rank == NobilityRank.Prince) { Kernel.SendWorldMessage(new Message("Congratulation! " + client.Entity.Name + " has the Prince title.", System.Drawing.Color.White, Message.Center), Program.Values); } if (Rank == NobilityRank.King) { Kernel.SendWorldMessage(new Message("Congratulation! " + client.Entity.Name + " has become the new King/Queen.", System.Drawing.Color.White, Message.Center), Program.Values); } } else { if (previousPlace != Place) { updateTheClient = true; } } if (updateTheClient || client.Entity.UID == updateUID) { NobilityInfo update = new NobilityInfo(true); update.Type = NobilityInfo.Icon; update.dwParam = entry.EntityUID; update.UpdateString(entry); client.SendScreen(update, true); client.Entity.NobilityRank = entry.Rank; } } sortedBoard.Add(entry.EntityUID, entry); Place++; } catch { } } Board = sortedBoard; lock (BoardList) BoardList = Board.Values.ToList(); } public static void Delet(Client.GameState client) { if (Game.ConquerStructures.Nobility.Board.ContainsKey(client.Entity.UID)) { Game.ConquerStructures.Nobility.Board.Remove(client.Entity.UID); Game.ConquerStructures.Nobility.Sort(0); foreach (var clients in Program.GamePool) { if (Game.ConquerStructures.Nobility.Board.ContainsKey(clients.Entity.UID)) Game.ConquerStructures.Nobility.Sort(client.Entity.UID); } Database.MySqlCommand cmd = new Database.MySqlCommand(Database.MySqlCommandType.DELETE).Delete("nobility", "EntityUID", client.Entity.UID); cmd.Execute(); } } } 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 bool king; public DateTime KingDays; } public enum NobilityRank : byte { Serf = 0, Knight = 1, Baron = 3, Earl = 5, Duke = 7, Prince = 9, King = 12 }}
//Rank\\ king = 2, //عدد الكنجات prince = 2 + CPanal.king, //عدد البرنسات عدل علي رقم 10 Duke = 2 + CPanal.prince,//عدد الدوقات lastDuke = 2 + CPanal.Duke, Earl = 0 ,//عدد الايرلات Baron = 0, Knight = 0,