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..
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
}
}
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???Quote:
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; } } }