probably is there one packet for UI , other for Hotkeys and quest track
Printable View
probably is there one packet for UI , other for Hotkeys and quest track
By default, server sends any unknown packets with opcode value (i didn't seen any unknown after saving/applying settings), so...
- - - Updated - - -
Oh wait, why need 3? THis everything should be saved as one hex value, include Uisettings + everything on screen. (i'm sleepy, lol)
two hex data
two client packets and two server packets
we have only one packet server =x, i believe is that
Where you got info about the second unknown packet?
(didn't seen it)
0xC233 = Client Packet for Setting1
0x7D1B = Client packet for UISetting
0xE265 = Server packet for UISetting
? = Server packet for Setting1 ( We don't have )
Yes, i see now.
The strange here is: packet E265 detects for both client side changes (maybe 1 setting?)
opcode for UISettings
http://rghost.ru/7jnQZfdLX/image.png
opcode for Hotkey bar
http://rghost.ru/8P5MTrw2F/image.png
Allright, here we go.
Have some troubles with network so...
Here is crappy part, i've coded today.
Recv.Add(unchecked((short) 0xC233), typeof (PlayerDAO.RpCharacterSettingsNew)); //1725 EU
//Byte
protected byte[] Std;
//New func
public class RpCharacterSettingsNew : ARecvPacket
{
//protected byte[] Settings;
public override void Read()
{
//Settings = ReadB((int)Reader.BaseStream.Length);
DAOManager.playerDAO.Std = ReadB((int)Reader.BaseStream.Length);
}
public override void Process()
{
//Connection.Account.UiSettings = Settings;
Connection.Account.UiSettings = DAOManager.playerDAO.Std;
//Gonna to catch hex on fly
Log.Info(DAOManager.playerDAO.BytesToHex(Connection.Account.UiSettings));
//DAOManager.playerDAO.Std = Settings; //test
}
/*private static readonly string[] Baths = {
"00", "01", "02", "03", "04", "05", "06", "07", "08", "09", "0A", "0B", "0C",
"0D", "0E", "0F", "10", "11", "12", "13", "14", "15", "16", "17", "18", "19",
"1A", "1B", "1C", "1D", "1E", "1F", "20", "21", "22", "23", "24", "25", "26",
"27", "28", "29", "2A", "2B", "2C", "2D", "2E", "2F", "30", "31", "32", "33",
"34", "35", "36", "37", "38", "39", "3A", "3B", "3C", "3D", "3E", "3F", "40",
"41", "42", "43", "44", "45", "46", "47", "48", "49", "4A", "4B", "4C", "4D",
"4E", "4F", "50", "51", "52", "53", "54", "55", "56", "57", "58", "59", "5A",
"5B", "5C", "5D", "5E", "5F", "60", "61", "62", "63", "64", "65", "66", "67",
"68", "69", "6A", "6B", "6C", "6D", "6E", "6F", "70", "71", "72", "73", "74",
"75", "76", "77", "78", "79", "7A", "7B", "7C", "7D", "7E", "7F", "80", "81",
"82", "83", "84", "85", "86", "87", "88", "89", "8A", "8B", "8C", "8D", "8E",
"8F", "90", "91", "92", "93", "94", "95", "96", "97", "98", "99", "9A", "9B",
"9C", "9D", "9E", "9F", "A0", "A1", "A2", "A3", "A4", "A5", "A6", "A7", "A8",
"A9", "AA", "AB", "AC", "AD", "AE", "AF", "B0", "B1", "B2", "B3", "B4", "B5",
"B6", "B7", "B8", "B9", "BA", "BB", "BC", "BD", "BE", "BF", "C0", "C1", "C2",
"C3", "C4", "C5", "C6", "C7", "C8", "C9", "CA", "CB", "CC", "CD", "CE", "CF",
"D0", "D1", "D2", "D3", "D4", "D5", "D6", "D7", "D8", "D9", "DA", "DB", "DC",
"DD", "DE", "DF", "E0", "E1", "E2", "E3", "E4", "E5", "E6", "E7", "E8", "E9",
"EA", "EB", "EC", "ED", "EE", "EF", "F0", "F1", "F2", "F3", "F4", "F5", "F6",
"F7", "F8", "F9", "FA", "FB", "FC", "FD", "FE", "FF"
};
public static string NewBytesToHex(byte[] data)
{
StringBuilder builder = new StringBuilder(data.Length * 2);
for (int i = 0; i < data.Length; i++)
builder.Append(Baths[data[i]]);
return builder.ToString();
}*/
}
Saving function:
public void SaveCharacterSettings(Player player)
{
string SqlQuery = "UPDATE `character` SET `uisettings`=?uiset WHERE `id`=?pid";
MySqlCommand SqlCommand = new MySqlCommand(SqlQuery, PlayerDAOConnection);
SqlCommand.Parameters.AddWithValue("?pid", player.Id);
SqlCommand.Parameters.AddWithValue("?uiset", BytesToHex(Std));
try
{
SqlCommand.ExecuteNonQuery();
Log.Info("Successfuly saved " + BytesToHex(Std));
}
catch (MySqlException ex)
{
Log.ErrorException("DAO: PLAYER SETTINGS SAVE ERROR!", ex);
return;
}
}
finally...
DAOManager.playerDAO.SaveCharacterSettings(player);
Okay, here it is.
And now need to load it as byte lmao...
that packet is UISettings your right...
but there are 2 UiSettings...
1.there iss AccoutnUiSettings Packet
2. there is an PlayerUiSettings packet.
both have C and S packets.. so there are 4 packets for UiSettings...
the account UiSettings is first read when you enter int the Lobby..
i thinks its directly S_AccountUiSettings.. sent from server to the Client..
the second comes.. when you enter the world then theres S_PlayerUiSettings from server...
the C_Uisettings are client side...
they happen when you open the Options and click on Save Settings..
so short. C_..... are send from the client when the settings go saved.
S_.... are read from the server...and send to the client...
Yup. It is.
- - - Updated - - -
Allright, the hotkey bar, it's finished.
You guys can discuss about it as you want, but i will code everything in 1 packet from server side.
Server side hotkey bar packet sending coded.
Character bar after exit/relog
http://rghost.ru/8C5Q7sCrk/image.png
Now i'm gonna to test it a bit.
Also, questing tracker is on my mind after this...
can provide only packet or where to. send tasty
going to translate now in google what you are typed xD (can't understand)
sorry >.<
what is the opcode to send again Hotkey data
Yeah, google translator is...
Sure, it's 0xE265
Don't worry, ready source code will be released this friday as always.
I'm gonna to test now AI monster event (want to code monster madness event, where all npc monsters around will come and attack player)
Sure, this is tricky.
There is need to play with bytes values on fly in memory.