nobility rank 5375

10/14/2011 08:54 raymart12#1
is their a solution to make the rank work? like in 5095..king can hit 3 times if he or she is a prince or princess..anyone pls and also with duke..
10/14/2011 10:09 BaussHacker#2
Yes. It's called coding it.
10/14/2011 12:33 raymart12#3
Quote:
Originally Posted by BaussHacker View Post
Yes. It's called coding it.
so how to code it? pls
10/14/2011 15:52 DontSpeakToMe#4
open Nobility.cs and replace all in it
Code:
using System;
using System.Linq;
using System.Collections.Generic;
using Conquer_Online_Server.Network.GamePackets;
using System.IO;

namespace Conquer_Online_Server.Game.ConquerStructures
{
    public class Nobility
    {
        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:
                    {
                        uint silvers = information.dwParam;

                        if (information.dwParam2 == 1)
                        {
                            uint cps = silvers / 50000;
                            if (client.Entity.ConquerPoints >= cps)
                            {
                                client.Entity.ConquerPoints = (int)Math.Max(0, (int)((int)client.Entity.ConquerPoints - (int)cps));
                                client.NobilityInformation.Donation += silvers;
                            }
                        }
                        else
                        {
                            if (client.Entity.Money >= silvers)
                            {
                                client.Entity.Money -= silvers;
                                client.NobilityInformation.Donation += silvers;
                            }
                        }

                        if (!Board.ContainsKey(client.Entity.UID) && client.NobilityInformation.Donation == silvers)
                        {
                            Board.Add(client.Entity.UID, client.NobilityInformation);
                            Database.NobilityTable.InsertNobilityInformation(client.NobilityInformation);
                        }
                        else
                        {
                            Database.NobilityTable.UpdateNobilityInformation(client.NobilityInformation);
                        }
                        Sort(client.Entity.UID);
                        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);
                        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;
                    }
            }
        }

        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>(10000);

            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;

                    int previousPlace = value.Value.Position;
                    value.Value.Position = Place;
                    NobilityRank Rank = NobilityRank.Serf;

                    if (Place >= 50)
                    {
                        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 < 3)
                        {
                            Rank = NobilityRank.King;
                        }
                        else if (Place < 15)
                        {
                            Rank = NobilityRank.Prince;
                        }
                        else
                        {
                            Rank = NobilityRank.Duke;
                        }
                    }
                    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;
                        }
                        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.Screen.SendScreen(update, true);
                            client.Entity.NobilityRank = value.Value.Rank;
                        }
                    }
                    sortedBoard.Add(value.Key, value.Value);
                    Place++;
                }
            }

            Board = sortedBoard;
            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 
    }
}

now NobilityInfo.cs
Code:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace Conquer_Online_Server.Network.GamePackets
{
    public class NobilityInfo : Writer, Interfaces.IPacket
    {
        public const uint
            Donate = 1,
            List = 2,
            Icon = 3,
            NextRank = 4;

        byte[] Buffer;

        public NobilityInfo(bool Create)
        {
            if (Create)
            {
                Buffer = new byte[33 + 8];
                WriteUInt16(33, 0, Buffer);
                WriteUInt16(2064, 2, Buffer);
            }
            Strings = new List<string>();
        }

        public uint Type
        {
            get { return BitConverter.ToUInt32(Buffer, 4); }
            set { WriteUInt32(value, 4, Buffer); }
        }


        public ulong dwParam
        {
            get { return BitConverter.ToUInt64(Buffer, 8); }
            set { WriteUInt64(value, 8, Buffer); }
        }

        public ushort wParam1
        {
            get { return BitConverter.ToUInt16(Buffer, 8); }
            set { WriteUInt16(value, 8, Buffer); }
        }

        public ushort wParam2
        {
            get { return BitConverter.ToUInt16(Buffer, 10); }
            set { WriteUInt16(value, 10, Buffer); }
        }

        public uint dwParam2
        {
            get { return BitConverter.ToUInt32(Buffer, 16); }
            set { WriteUInt32(value, 16, Buffer); }
        }

        public uint dwParam3
        {
            get { return BitConverter.ToUInt32(Buffer, 20); }
            set { WriteUInt32(value, 20, Buffer); }
        }

        public uint dwParam4
        {
            get { return BitConverter.ToUInt32(Buffer, 24); }
            set { WriteUInt32(value, 24, Buffer); }
        }
        //Thanks to ImmuneOne, who fixed the strings offsets, I managed to get nobility done.
        public byte StringCount
        {
            get { return Buffer[32]; }
            set { Buffer[32] = value; }
        }

        public List<string> DecodedStrings
        {
            get
            {
                List<string> list = new List<string>(StringCount);
                int offset = 33;
                for (int count = 0; count < StringCount; count++)
                {
                    byte stringLength = Buffer[offset]; offset++;
                    string String = Encoding.ASCII.GetString(Buffer, offset, stringLength);
                    offset += stringLength;
                    list.Add(String);
                }
                return list;
            }
        }

        public List<string> Strings;

        public void UpdateString(Game.ConquerStructures.NobilityInformation info)
        {
            string buildString = info.EntityUID + " " + info.Donation + " " + (byte)info.Rank + " " + info.Position;
            buildString = (char)buildString.Length + buildString;
            Strings.Add(buildString);
        }

        public void ListString(Game.ConquerStructures.NobilityInformation info)
        {
            string buildString = info.EntityUID + " " + info.Gender + " 0 " + info.Name + " " + info.Donation + " " + (byte)info.Rank + " " + info.Position;
            buildString = (char)buildString.Length + buildString;
            Strings.Add(buildString);
        }

        public void Send(Client.GameState client)
        {
            client.Send(ToArray());
        }

        public byte[] ToArray()
        {
            if (Strings.Count == 0)
                return Buffer;
            string theString = "";
            for (int count = 0; count < Strings.Count; count++)
            {
                theString += Strings[count];
            }
            byte[] newBuffer = new byte[33 + 8 + theString.Length];
            Buffer.CopyTo(newBuffer, 0);
            WriteUInt16((ushort)(newBuffer.Length - 8), 0, newBuffer);
            newBuffer[32] = (byte)Strings.Count;
            WriteString(theString, 33, newBuffer);
            return newBuffer;
        }

        public void Deserialize(byte[] buffer)
        {
            Buffer = buffer;
        }
    }
}
10/15/2011 13:05 raymart12#5
Quote:
Originally Posted by DontSpeakToMe View Post
open Nobility.cs and replace all in it
Code:
using System;
using System.Linq;
using System.Collections.Generic;
using Conquer_Online_Server.Network.GamePackets;
using System.IO;

namespace Conquer_Online_Server.Game.ConquerStructures
{
    public class Nobility
    {
        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:
                    {
                        uint silvers = information.dwParam;

                        if (information.dwParam2 == 1)
                        {
                            uint cps = silvers / 50000;
                            if (client.Entity.ConquerPoints >= cps)
                            {
                                client.Entity.ConquerPoints = (int)Math.Max(0, (int)((int)client.Entity.ConquerPoints - (int)cps));
                                client.NobilityInformation.Donation += silvers;
                            }
                        }
                        else
                        {
                            if (client.Entity.Money >= silvers)
                            {
                                client.Entity.Money -= silvers;
                                client.NobilityInformation.Donation += silvers;
                            }
                        }

                        if (!Board.ContainsKey(client.Entity.UID) && client.NobilityInformation.Donation == silvers)
                        {
                            Board.Add(client.Entity.UID, client.NobilityInformation);
                            Database.NobilityTable.InsertNobilityInformation(client.NobilityInformation);
                        }
                        else
                        {
                            Database.NobilityTable.UpdateNobilityInformation(client.NobilityInformation);
                        }
                        Sort(client.Entity.UID);
                        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);
                        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;
                    }
            }
        }

        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>(10000);

            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;

                    int previousPlace = value.Value.Position;
                    value.Value.Position = Place;
                    NobilityRank Rank = NobilityRank.Serf;

                    if (Place >= 50)
                    {
                        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 < 3)
                        {
                            Rank = NobilityRank.King;
                        }
                        else if (Place < 15)
                        {
                            Rank = NobilityRank.Prince;
                        }
                        else
                        {
                            Rank = NobilityRank.Duke;
                        }
                    }
                    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;
                        }
                        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.Screen.SendScreen(update, true);
                            client.Entity.NobilityRank = value.Value.Rank;
                        }
                    }
                    sortedBoard.Add(value.Key, value.Value);
                    Place++;
                }
            }

            Board = sortedBoard;
            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 
    }
}

now NobilityInfo.cs
Code:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace Conquer_Online_Server.Network.GamePackets
{
    public class NobilityInfo : Writer, Interfaces.IPacket
    {
        public const uint
            Donate = 1,
            List = 2,
            Icon = 3,
            NextRank = 4;

        byte[] Buffer;

        public NobilityInfo(bool Create)
        {
            if (Create)
            {
                Buffer = new byte[33 + 8];
                WriteUInt16(33, 0, Buffer);
                WriteUInt16(2064, 2, Buffer);
            }
            Strings = new List<string>();
        }

        public uint Type
        {
            get { return BitConverter.ToUInt32(Buffer, 4); }
            set { WriteUInt32(value, 4, Buffer); }
        }


        public ulong dwParam
        {
            get { return BitConverter.ToUInt64(Buffer, 8); }
            set { WriteUInt64(value, 8, Buffer); }
        }

        public ushort wParam1
        {
            get { return BitConverter.ToUInt16(Buffer, 8); }
            set { WriteUInt16(value, 8, Buffer); }
        }

        public ushort wParam2
        {
            get { return BitConverter.ToUInt16(Buffer, 10); }
            set { WriteUInt16(value, 10, Buffer); }
        }

        public uint dwParam2
        {
            get { return BitConverter.ToUInt32(Buffer, 16); }
            set { WriteUInt32(value, 16, Buffer); }
        }

        public uint dwParam3
        {
            get { return BitConverter.ToUInt32(Buffer, 20); }
            set { WriteUInt32(value, 20, Buffer); }
        }

        public uint dwParam4
        {
            get { return BitConverter.ToUInt32(Buffer, 24); }
            set { WriteUInt32(value, 24, Buffer); }
        }
        //Thanks to ImmuneOne, who fixed the strings offsets, I managed to get nobility done.
        public byte StringCount
        {
            get { return Buffer[32]; }
            set { Buffer[32] = value; }
        }

        public List<string> DecodedStrings
        {
            get
            {
                List<string> list = new List<string>(StringCount);
                int offset = 33;
                for (int count = 0; count < StringCount; count++)
                {
                    byte stringLength = Buffer[offset]; offset++;
                    string String = Encoding.ASCII.GetString(Buffer, offset, stringLength);
                    offset += stringLength;
                    list.Add(String);
                }
                return list;
            }
        }

        public List<string> Strings;

        public void UpdateString(Game.ConquerStructures.NobilityInformation info)
        {
            string buildString = info.EntityUID + " " + info.Donation + " " + (byte)info.Rank + " " + info.Position;
            buildString = (char)buildString.Length + buildString;
            Strings.Add(buildString);
        }

        public void ListString(Game.ConquerStructures.NobilityInformation info)
        {
            string buildString = info.EntityUID + " " + info.Gender + " 0 " + info.Name + " " + info.Donation + " " + (byte)info.Rank + " " + info.Position;
            buildString = (char)buildString.Length + buildString;
            Strings.Add(buildString);
        }

        public void Send(Client.GameState client)
        {
            client.Send(ToArray());
        }

        public byte[] ToArray()
        {
            if (Strings.Count == 0)
                return Buffer;
            string theString = "";
            for (int count = 0; count < Strings.Count; count++)
            {
                theString += Strings[count];
            }
            byte[] newBuffer = new byte[33 + 8 + theString.Length];
            Buffer.CopyTo(newBuffer, 0);
            WriteUInt16((ushort)(newBuffer.Length - 8), 0, newBuffer);
            newBuffer[32] = (byte)Strings.Count;
            WriteString(theString, 33, newBuffer);
            return newBuffer;
        }

        public void Deserialize(byte[] buffer)
        {
            Buffer = buffer;
        }
    }
}
i see...why is it when i try to debug it got 3 errors and also with nobility info.cs???