using system; using system.io; using system.linq; using viorx.client; using system.collections.generic; using viorx.network.gamepackets; namespace viorx.game.conquerstructures { public class nobility : Network.writer { public static safedictionary<uint, nobilityinformation> board = new safedictionary<uint, nobilityinformation>(10000); public static void handle(nobilityinfo information, client.gamestate client) { switch (information.type) { case nobilityinfo.donate: { if (client.trade.intrade) return; if (client.entity.pokerhack == true) 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.entity.conquerpoints -= (uint)cps; client.nobilityinformation.donation += silvers; } } else { if (client.entity.money >= silvers) { 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(c lient.nobilityinformation); } catch { database.nobilitytable.updatenobilityinformation(c lient.nobilityinformation); } } else { database.nobilitytable.updatenobilityinformation(c lient.nobilityinformation); } sort(client.entity.uid); break; } case nobilityinfo.list: { byte[] packet = new byte[608]; writeuint16((ushort)(packet.length - 8), 0, packet); writeuint16(2064, 2, packet); writeuint16(2, 4, packet); writeuint16((ushort)(board.count > 50 ? 5 : (board.count / 10) + 1), 10, packet); int offset = 120; ushort rank = 0; rank = (ushort)(information.wparam1 * 10); foreach (var entity in board.values.orderbydescending(e => e.donation).skip(information.wparam1 * 10).take(10)) { writeuint32(entity.entityuid, offset, packet); offset += 4; writeuint32(1, offset, packet); offset += 4; writeuint32(entity.mesh, offset, packet); offset += 4; writestring(entity.name, offset, packet); offset += 20; writeuint64(entity.donation, offset, packet); offset += 8; entity.rank = getmyrank(entity.donation, rank); writeuint32((uint)entity.rank, offset, packet); offset += 4; writeuint32((uint)rank, offset, packet); offset += 4; rank++; } writeuint16(rank, 12, packet); client.send(packet); break; } } } private static void sort(uint p) { throw new notimplementedexception(); } private static nobilityrank getmyrank(ulong donation, int currentrank) { if (currentrank >= 0 && currentrank < 999999) { return nobilityrank.king; } else if (currentrank >= 10 && currentrank < 0) { return nobilityrank.prince; } else if (currentrank >= 50 && currentrank < 0) { return nobilityrank.duke; } else { return nobilityrank.serf; } } 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; int oldpos = client.nobilityinformation.position; if (!board.containskey(client.entity.uid) && client.nobilityinformation.donation == silvers && newdonator) { board.add(client.entity.uid, client.nobilityinformation); try { database.nobilitytable.insertnobilityinformation(c lient.nobilityinformation); } catch { database.nobilitytable.updatenobilityinformation(c lient.nobilityinformation); } } else { database.nobilitytable.updatenobilityinformation(c lient.nobilityinformation); } updateothers(oldpos, client); } private static void updateothers(int oldposition, gamestate client) { int newpos = getposition(client.entity.uid); var rank = getmyrank(client.nobilityinformation.donation, newpos); if (oldposition != newpos) { if (rank == nobilityrank.king || rank == nobilityrank.prince || rank == nobilityrank.duke) foreach (var p in board.values.orderbydescending(e => e.donation).skip(newpos).take(50 - newpos)) { gamestate cl = null; if (kernel.gamepool.trygetvalue(p.entityuid, out cl)) sendicontoclient(cl); } } sendicontoclient(client); } private static int getposition(uint entityuid) { int currentpos = -1, post = -1; if (board.containskey(entityuid)) { foreach (var p in board.values.orderbydescending(e => e.donation)) { currentpos++; if (entityuid == p.entityuid) { post = currentpos; break; } } } return post; } public static void sendicontoclient(client.gamestate client) { if (client != null && client.nobilityinformation != null) { int pos = getposition(client.entity.uid); client.entity.nobilityrank = client.nobilityinformation.rank = getmyrank(client.nobilityinformation.donation, pos); nobilityinfo update = new nobilityinfo(true); update.type = nobilityinfo.icon; update.dwparam = client.entity.uid; client.nobilityinformation.position = pos; update.updatestring(client.nobilityinformation); client.sendscreen(update, true); } } } 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, } }