First off, I know we have this already, lesderid did well, but he dropped his work on his documentation, or at least stopped releasing. We had a project in SRO Underground, called "Silkroad Online Packet Wiki", which stopped too after some mayor issues with MediaWiki and went down really soon. Besides that, I decided to release my packet documentation now. I planned on releasing this part by part, to see reactions to this, and to receive some feedback or corrections that may accrue. I'd be really happy to see some of your Packet Structures being posted here as well.
I created a Wiki ([Only registered and activated users can see links. Click Here To Register...]) for this project because its easier for me to fill and clearer than a forum post. I will no longer update this thread.
All based on vSRO 1.88, collected from forums, public sources or almost always self-decoded.
I don't know if you agree with my documentation style, but I prefer it this way since it's easy to read and understand. I may not be consistent with my "dot rule", but what I'm writing here is just pseudo code.
PRIVAT_INVENTORY
I created a Wiki ([Only registered and activated users can see links. Click Here To Register...]) for this project because its easier for me to fill and clearer than a forum post. I will no longer update this thread.
All based on vSRO 1.88, collected from forums, public sources or almost always self-decoded.
I don't know if you agree with my documentation style, but I prefer it this way since it's easy to read and understand. I may not be consistent with my "dot rule", but what I'm writing here is just pseudo code.
| Name | Opcode | Response |
| SERVER_GLOBAL_HANDSHAKE | 0x5000 | 0x5000 |
| CLIENT_GLOBAL_HANDSHAKE_ACCEPT | 0x9000 | |
| X_GLOBAL_IDENTIFICATION | 0x2001 | 0x2001 |
| CLIENT_GLOBAL_KEEP_ALIVE | 0x2002 | |
| GLOBAL_SERVER_MASSIVE | 0x600D |
Code:
//Opcode: 0x5000
//Name: SERVER_GLOBAL_HANDSHAKE
//Description:
//Encryption: false
//Massive: false
public const ushort SERVER_GLOBAL_HANDSHAKE = 0x5000;
// 1 byte Flag[0x0E = Base, 0x10 = Challange]
// if(Flag == 0x0E)
// {
// 8 uint Blowfish
// 4 uint Count Seed
// 4 uint CRC Seed
// 4 uint Seed1
// 4 uint Seed2
// 4 uint Seed3
// 4 uint Seed4
// 4 uint Seed5
// }
// else if(Flag == 0x10)
// {
// 8 ulong Blowfish
// }
Code:
//Opcode: 0x5000
//Name: CLIENT_GLOBAL_HANDSHAKE_RESPONSE
//Description:
//Encryption: false
//Massive: false
public const ushort CLIENT_GLOBAL_HANDSHAKE_RESPONSE = 0x5000;
// 4 uint Value
// 8 ulong Client Key
Code:
//Opcode: 0x9000
//Name: CLIENT_GLOBAL_HANDSHAKE_ACCEPT
//Description:
//Encryption: false
//Massive: false
public const ushort CLIENT_GLOBAL_HANDSHAKE_ACCEPT = 0x9000;
Code:
//Opcode: 0x2001
//Name: X_GLOBAL_IDENTIFICATION
//Description:
//Encryption: true, client only
//Massive: false
public const ushort X_GLOBAL_IDENTIFICATION = 0x2001;
// 2 ushort ServiceName.Length
// * string ServiceName
// 1 byte Flag [0x00 = Client, 0x01 = Server]
Code:
//Opcode: 0x2002
//Name: CLIENT_GLOBAL_KEEP_ALIVE
//Description:
//Encryption: false
//Massive: false
public const ushort CLIENT_GLOBAL_KEEP_ALIVE = 0x2002;
Code:
//Opcode: 0x600D
//Name: GLOBAL_SERVER_MASSIVE
//Description:
//Encryption: false
//Massive: false
public const ushort SERVER_GLOBAL_MASSIVE = 0x600D;
// 1 byte Flag (0 = Data, 1 = Header)
// if(Flag == 0x01)
// {
// 2 ushort Count
// 2 ushort CommandID
// }
// else if(Flag == 0x00)
// {
// * byte[] Data
// }
| Name | Opcode | Response |
| CLIENT_GATEWAY_PATCH_REQUEST | 0x6100 | 0xA100 |
| CLIENT_GATEWAY_NOTICE_REQUEST | 0x6104 | 0xA104 |
| CLIENT_GATEWAY_SERVERLIST_REQUEST | 0x6101 | 0xA101 |
| CLIENT_GATEWAY_LOGIN_REQUEST | 0x6102 | 0xA102/0x2322 |
| CLIENT_GATEWAY_LOGIN_IBUV_ANSWER | 0x6323 | 0xA323 |
Code:
//Opcode: 0x6100
//Name: CLIENT_GATEWAY_PATCH_REQUEST
//Description:
//Encryption: true
//Massive: false
public const ushort CLIENT_GATEWAY_PATCH_REQUEST= 0x6100;
// 1 byte Locale
// 2 ushort ServiceName.Length
// * string ServiceName
// 4 uint Version
Code:
//Opcode: 0xA100
//Name: SERVER_GATEWAY_PATCH_RESPONSE
//Description: Response to 0x6100
//Encryption: false
//Massive: true
public const ushort SERVER_GATEWAY_PATCH_RESPONSE = 0xA100;
// 1 byte result [0x01 = Sucess, 0x02 == Error]
// if(result == 0x02)
// {
// 1 byte errorCode*
// if(errorCode == 0x02)
// {
// 2 ushort DownloadServer.IP.Length
// * string DownloadServer.IP
// 2 ushort DownloadServer.Port
// 4 uint Version
// 1 byte FileFlag [0 = Done, 1 = NextFile]
// while (FileFlag == 0x01)
// {
// 4 uint File.ID
// 2 ushort File.Name.Length
// * string File.Name
// 2 ushort File.Path.Length
// * string File.Path
// 4 uint File.Length
// 1 byte ToBePacked
//
// 1 byte FileFlag [0 = Done, 1 = NextFile]
// }
// *ErrorCodes:
// by Launcher:
// 1 - "Invalid client. Program will be terminated."
// 2 - **UPDATE**
// 3 - "Invalid client. Program will be terminated. "
// 4 - "The server is undergoing inspection or updates. Connect to %website% for more information."
// 5 - "You have to install the full version. Move to offical website to download the full version?"
// by Client:
// 1 - "Faild to connect to server.(C4)"
// 2 - "BSObj Plugin:\nCan't create file transfer manager!\nMaybe back file corrupted or someone is already accessing it now.. try few minuts later." **Client can't patch, exceute launcher
// 3 - "Faild to connect to server.(C4)"
// 4 - "Servers are offline. Please visit our homepage to check when they are back."
Code:
//Opcode: 0x6104
//Name: CLIENT_GATEWAY_NOTICE_REQUEST
//Description:
//Encryption: false
//Massive: false
public const ushort CLIENT_GATEWAY_NOTICE_REQUEST = 0x6104;
// 1 byte Locale
Code:
//Opcode: 0xA104
//Name: SERVER_GATEWAY_NOTICE_RESPONSE
//Description:
//Encryption: false
//Massive: false
public const ushort SERVER_GATEWAY_NOTICE_RESPONSE = 0xA104;
// 1 byte NoticeCount
// ForEach(Notice)
// {
// 2 ushort Subject.Length
// * string Subject
// 2 ushort Article.Length
// * string Article
// 2 ushort Year
// 2 ushort Month
// 2 ushort Day
// 2 ushort Hour
// 2 ushort Minute
// 2 ushort Second
// 4 uint Microsecond
// }
Code:
//Opcode: 0x6101
//Name: CLIENT_GATEWAY_SERVERLIST_REQUEST
//Description:
//Encryption: true
//Massive: false
public const ushort CLIENT_GATEWAY_SERVERLIST_REQUEST = 0x6101;
Code:
//Opcode: 0xA101
//Name: SERVER_GATEWAY_SERVERLIST_RESPONSE
//Description: Response to 0x6101
//Encryption: false
//Massive: false
public const ushort SERVER_GATEWAY_SERVERLIST_RESPONSE = 0xA101;
// 1 byte GlobalOperationFlag [0x00 = done, 0x01 = NextGlobalOperation]
// while(OperationFlag == 0x01)
// {
// 1 byte GlobalOperation.Type*
// 2 ushort GlobalOperation.Name.Length
// * string GlobalOperation.Name
//
// 1 byte OperationFlag [0x00 = done, 0x01 = NextOperation]
// }
//
// 1 byte ShardFlag [0x00 = done, 0x01 = NextShard]
// while(ShardFlag == 0x01)
// {
// 2 ushort Shard.ID
// 2 ushort Shard.Name.Length
// * string Shard.Name
// 2 ushort Shard.Current
// 2 ushort Shard.Capacity
// 1 byte Status [0x00 = Online, 0x01 = Checked]
// 1 byte GlobalOperationID
//
// 1 byte ShardFlag [0x00 = done, 0x01 = NextShard]
// }
// *GlobalOperationTypes:
// 01=Silkroad_Dev
// 02=Silkroad_Korea_Yahoo_Official
// 03=Silkroad_Korea_Yahoo_Test_IN
// 04=SRO_China_Official
// 05=SRO_China_TestLocal
// 06=Silkroad_Joymax
// 07=JoymaxMessenger
// 08=ServiceManager
// 09=SRO_China_TestIn
// 10=SRO_Taiwan_TestIn
// 11=SRO_Taiwan_TestLocal
// 12=SRO_Taiwan_Official
// 13=SRO_DEEPDARK
// 14=SRO_Taiwan_BillingTest
// 15=SRO_Japan_Official
// 16=SRO_Japan_TestLocal
// 17=SRO_Japan_TestIn
// 18=SRO_Global_TestBed
// 19=SRO_Global_TestBed_In
// 20=SRO_EuropeTest
// 21=SRO_Vietnam_TestIn
// 22=SRO_Vietnam_TestLocal
// 23=SRO_Net2E_Official
// 24=Yahoo_Official_Test
// 25=SRO_GNGWC_TestIn
// 26=SRO_GNGWC_Official
// 27=SRO_China_OpenTest
// 29=SRO_GNGWC_Official_Final
// 30=CPRJ_Dev
// 31=SRO_INTERNAL_EU
// 32=SRO_INTERNAL_EU_QUEST
// 33=Vietnam_Dev
// 34=SRO_China_EuroTest
// 35=SRO_Taiwan_FOS CB
// 36=SRO_GameOn_Official_Test
// 37=SRO_Thailand_TestLocal
// 38=SRO_Thailand_Official
// 39=SRO_Russia_TestLocal
// 40=SRO_Russia_Official
// 41=SRO_Japan_TestOTP
// 42=SRO_Global_TestBed_OT
// 43=SRO_Japan_CGI_TestIn
// 44=SRO_Japan_TestLocal_We
// 45=SRO_R_JP_TestLocal_We
// 46=SRO_R_JP_RealLocal_We
// 47=SRO_R_CH_TestLocal_CIMO
// 48=SRO_R_CH_RealLocal_CIMO
Code:
//Opcode: 0x6102
//Name: CLIENT_GATEWAY_LOGIN_REQUEST
//Description:
//Encryption: true
//Massive: false
public const ushort CLIENT_GATEWAY_LOGIN_REQUEST = 0x6102;
// 1 byte Locale
// 2 ushort Username.Length
// * string Username
// 2 ushort Password.Length
// * string Password
// 2 ushort ShardID
Code:
//Opcode: 0x2322
//Name: SERVER_GATEWAY_LOGIN_IBUV_CHALLENGE
//Description: Response to 0x6102 before 0xA102 if IBUV is enabled
//Encryption: false
//Massive: false
public const ushort SERVER_GATEWAY_LOGIN_IBUV_CHALLENGE = 0x2322;
// 1 byte Flag
// 2 ushort remain
// 2 ushort compressed
// 2 ushort uncompressed
// 2 ushort width
// 2 ushort height
// * byte[] compressedData
Code:
//Opcode: 0x6323
//Name: CLIENT_GATEWAY_LOGIN_IBUV_ANSWER
//Description:
//Encryption: false
//Massive: false
public const ushort CLIENT_GATEWAY_LOGIN_IBUV_ANSWER = 0x6323;
// 2 ushort Answer.Length
// * string Answer
Code:
//Opcode: 0xA323
//Name: SERVER_GATEWAY_LOGIN_IBUV_RESULT
//Description:
//Encryption: false
//Massive: false
public const ushort SERVER_GATEWAY_LOGIN_IBUV_RESULT = 0xA323;
// 1 byte result [0x01 = Sucess, 0x02 = Error]
// if(result = 0x02)
// {
// 4 uint MaxAttempts
// 4 uint Attempts
// }
// *ErrorCodes:
// 02 - "Image code entry has failed %d out of %d times."
Code:
//Opcode: 0xA102
//Name: SERVER_GATEWAY_LOGIN_RESPONSE
//Description:
//Encryption: false
//Massive: false
public const ushort SERVER_GATEWAY_LOGIN_RESPONSE = 0xA102;
// 1 byte result
// if(result == 0x01)
// {
// 4 uint Token
// 2 ushort AgentServer.IP.Length
// * string AgentServer.IP
// 2 ushort AgentServer.Port
// }
// if(result == 0x02)
// {
// 1 byte errorCode*
// if(errorCode == 0x01)
// {
// 4 uint MaxAttempts
// 4 uint Attempts
// }
// else if(errorCode == 0x02)
// {
// 1 byte Type** [1 = block login, 2 = block login for inspection, 3 = block p2p trade, 4 = block chat]
// if(Type == 0x01)
// {
// 2 ushort Reason.Length
// * string Reason
// 2 ushort Year
// 2 ushort Month
// 2 ushort Day
// 2 ushort Hour
// 2 ushort Minute
// 2 ushort Second
// 2 ushort Microsecond
// }
// }
// }
// if(result == 0x03) //Custom Message as A102 result, not supported by every client.
// {
// 1 byte unk1
// 1 byte unk2
// 2 ushort Message.Length
// * string Message
// 2 ushort unk3
// }
// *ErrorCodes:
// 01 - "Password entry has failed %d out of %d times."
// 02 - -> Blocked
// 03 - "This user is already connected. The user may still be connected because of an error that forced the game to close. Please try again in 5 minutes."
// 04 - "Faild to Connect to Server (C5)."
// 05 - "The server is full, please try again later."
// 06 - "Faild to Connect to Server (C7)."
// 07 - "Faild to Connect to Server (C8)"
// 08 - "Faild to connect to server because access to the current IP has exceeded its limit."
// 09 - "0"
// 10 - "Only adults over the age of 18 are allowed to connect to server."
// 11 - "Only users over the age of 12 are allowed to connect to the server."
// 12 - "Adults over the age of 18 are not allowed to connect to the Teen server."
// **Types:
// 01 - 0\nBlocking reason:{0}\nCompletion time:{0}
// 02 - Cannot connect to the server because the server is now in inspection.
// 03 - ID is found, but the needed details are not found.\nFill in the needed information at Silkroad homepage to connect to the game. *Msg Box -> Client Close -> Website opens
// 04 - Cannot connect because the free service is over.
| Name | Opcode | Response |
| CLIENT_AGENT_LOGIN_REQUEST | 0x6103 | 0xA103 |
| CLIENT_AGENT_CHARACTER_SELECTION_REQUEST | 0x7007 | 0xB007 |
| CLIENT_AGENT_CHARACTER_SELECTION_JOIN_REQUEST | 0x7001 | 0xB001 |
| CLIENT_AGENT_CHARACTER_SELECTION_RENAME_REQUEST | 0x7450 | 0xB450 |
Code:
//Opcode: 0x6103
//Name: CLIENT_AGENT_LOGIN_REQUEST
//Description:
//Encryption: true
//Massive: false
public const ushort CLIENT_AGENT_LOGIN_REQUEST = 0x6103;
// 4 uint Token
// 2 ushort Username.Length
// * string Username
// 2 ushort Password.Length
// * string Password
// 1 byte Locale
// 6 byte[] MAC-Address
Code:
//Opcode: 0xA103
//Name: SERVER_AGENT_LOGIN_RESPONSE
//Description:
//Encryption: true
//Massive: false
public const ushort SERVER_AGENT_LOGIN_RESPONSE = 0xA103;
// 1 byte result
// if(result == 0x02)
// {
// 1 byte errorCode*
// }
// *ErrorCodes:
// 1 - Faild to connect to server. (C9) (=> Token TimeOut)
// 2 - Faild to connect to server (C10)
// 3 - Faild to connect to server (C10)
// 4 - ServerIsFull...
// 5 - Faild to connect to server because access to the current IP has exceeded its limit.
// 6 - 0
Code:
//Opcode: 0x7007
//Name: CLIENT_AGENT_CHARACTER_SELECTION_REQUEST
//Description:
//Encryption: false
//Massive: false
public const ushort CLIENT_AGENT_CHARACTER_SELECTION_REQUEST = 0x7007;
// 1 byte type*
// if(type == 0x01)
// {
// 2 ushort Name.Length
// * string Name
// 4 uint RefObjID
// 1 byte Scale
// 4 uint RefItemID - BODY
// 4 uint RefItemID - LEG
// 4 uint RefItemID - FOOT
// 4 uint RefItemID - WEAPON
// }
// else if(type = 0x03 || type == 0x04 || type == 0x05)
// {
// 2 ushort Name.Length
// * string Name
// }
// *Types:
// 01 - Create
// 02 - List
// 03 - Delete
// 04 - Check name
// 05 - Restore
Code:
//Opcode: 0xB007
//Name: SERVER_AGENT_CHARACTER_SELECTION_RESPONSE
//Description:
//Encryption: false
//Massive: false
public const ushort SERVER_AGENT_CHARACTER_SELECTION_RESPONSE = 0xB007;
// 1 byte Type*
// if(type == 0x01 || type == 0x03 || type == 0x04 || type == 0x05)
// {
// 1 byte result
// if(result == 0x02)
// {
// 2 ushort errorCode**
// }
// }
// else if(type == 0x02)
// {
// 1 byte result
// if(result == 0x01)
// {
// 1 byte CharacterCount
// ForEach(Character)
// {
// 4 uint RefObjID
// 2 ushort Name.Length
// * string Name
// 1 byte Scale
// 1 byte CurLevel
// 8 ulong ExpOffset
// 2 ushort STR
// 2 ushort INT
// 2 ushort AP (Stat Points)
// 4 uint HP
// 4 uint MP
// 1 byte DeleteFlag
// if(DeleteFlag == 0x01)
// {
// 4 uint DeleteTime in Minutes
// }
// 1 byte GuildFlag [0x01 == Member, 0x02 == Master]
// 1 byte GuildRenameFlag
// if((GuildRenameFlag == 0x01)
// {
// 2 ushort Guild.Name.Length
// * string Guild.Name
// }
// 1 byte AcademyFlag [0x01 = Member, 0x02 = Master)
// 1 byte ItemCount
// ForEach(Item)
// {
// 4 uint RefItemID
// 1 byte Plus
// }
// 1 byte AvatarItemCount
// ForEach(AvatarItem)
// {
// 4 uint RefItemID
// 1 byte Plus
// }
// }
// }
// else if(result == 0x02)
// {
// 2 ushort errorCode**
// }
// }
// *Types:
// 01 - Create
// 02 - List
// 03 - Delete
// 04 - NameCheck
// 05 - Restore
//
// **ErrorCodes:
// 1027 - Faild to create character. Please try to connect again.(S1027)
// 1028 - Select a Weapon
// 1029 - A maximum of %d characters can be created
// 1036 - Exceeded the letter limit.\nOnly 12 English letters are available. [Min., Max.]
// 1037 - Invalid character name.
// 1040 - This ID already exists.
// 1041 - This user is already connected. the user may still be connected because of an error that foreced the game to close. Please try again in 5 minutes.
// 1042 - Faild to create character. Please try to connect again.(S1042)
// 1044 - Cannot connect to the server because the server reached its capacity.
// 1045 - Login failed(S1045)
Code:
//Opcode: 0x7450
//Name: CLIENT_AGENT_CHARACTER_SELECTION_RENAME_REQUEST
//Description: Dialog appears when Character.Name begins with @
//Encryption: false
//Massive: false
public const ushort CLIENT_AGENT_CHARACTER_SELECTION_RENAME_REQUEST = 0x7450;
// 1 byte Type [0x01 = Character, 0x02 = Guild, 0x03 = GuildNameCheck]
// if(type == 0x01 || type == 0x02)
// {
// 2 ushort curName.Length
// * string curName
// 2 ushort newName.Length
// * string newName
// }
// else if(type == 0x03)
// {
// 2 ushort Name.Length
// * string Name
// }
// *Types:
// 01 - Character rename
// 02 - Guild rename
// 03 - Guild name check
Code:
//Opcode: 0xB450
//Name: SERVER_AGENT_CHARACTER_SELECTION_RENAME_RESPONSE
//Description:
//Encryption: false
//Massive: false
public const ushort SERVER_AGENT_CHARACTER_SELECTION_RENAME_RESPONSE = 0xB450;
// 1 byte Type*
// 1 byte result
// if(result == 0x02)
// {
// 2 ushort errorCode**
// }
// *Types:
// 01 - Character rename
// 02 - Guild rename
// 03 - Guild name check
//
// **ErrorCodes:
// *for Type 0x01
// 02 00 - Unknown error.(S2)
// 03 00 - Unknown error.(S2)
// 04 00 - Unknown error.(S2)
// 05 00 - Unknown error.(S2)
// 06 00 - This ID already exists.
// 07 00 - Invalid character name.
// *for Type 0x02
// 02 00 - Unknown error.(S2)
// 03 00 - Unknown error.(S2)
// 04 00 - Unknown error.(S2)
// 05 00 - Unknown error.(S2)
// 06 00 - The selected guild name already exists.
// 07 00 - The guild cannot be created.
// *For Type 0x03
// 02 00 - Unknown error.(S2)
// 03 00 - Unknown error.(S2)
// 04 00 - Unknown error.(S2)
// 05 00 - Unknown error.(S2)
// 06 00 - The selected guild name already exists.
// 07 00 - The guild cannot be created.
Code:
//Opcode: CLIENT_AGENT_CHARACTER_SELECTION_JOIN_REQUEST
//Name: 0x7001
//Description:
//Encryption: false
//Massive: false
public const ushort CLIENT_AGENT_CHARACTER_SELECTION_JOIN_REQUEST = 0x7001;
// 2 ushort Name.Length
// * string Name
Code:
//Opcode: 0xB001
//Name: SERVER_AGENT_CHARACTER_SELECTION_JOIN_RESPONSE
//Description:
//Encryption: false
//Massive: false
public const ushort SERVER_AGENT_CHARACTER_SELECTION_JOIN_RESPONSE = 0xB001;
// 1 byte result
// if(result == 0x02)
// {
// 2 ushort errorCode*
// }
// **ErrorCodes:
// 1033 - The server is not running.. Please try to connect again later.(S1033) (=> When GameServer with character containing region is down.)
// 1019 - The server is not running.. Please try to connect again later.(S1039)
//
// 1027 - Faild to create character. Please try to connect again.(S1027)
// 1028 - Select a Weapon
// 1029 - A maximum of %d characters can be created
// 1036 - Exceeded the letter limit.\nOnly 12 English letters are available. [Min., Max.]
// 1037 - Invalid character name.
// 1040 - This ID already exists.
// 1041 - This user is already connected. the user may still be connected because of an error that foreced the game to close. Please try again in 5 minutes.
// 1042 - Faild to create character. Please try to connect again.(S1042)
// 1044 - Cannot connect to the server because the server reached its capacity.
// 1045 - Login failed(S1045)
Code:
//Opcode: 0x34A5 //Name: SERVER_AGENT_CHARACTER_DATA_BEGIN //Description: //Encryption: false //Massive: false public const ushort SERVER_AGENT_CHARACTER_DATA_BEGIN = 0x34A5;
Code:
//Opcode: 0x3013
//Name: SERVER_AGENT_CHARACTER_DATA
//Description:
//Encryption: false
//Massive: false
public const ushort SERVER_AGENT_CHARACTER_DATA = 0x3013;
// 4 uint *unk00
// 4 uint RefObjID
// 1 byte Scale
// 1 byte Level
// 1 byte MaxLevel
// 8 ulong ExpOffset
// 4 uint SExpOffset
// 8 ulong RemainGold
// 4 uint RemainSkillPoint
// 2 ushort RemainStatPoint
// 1 byte RemainHwanCount
// 4 uint GatheredExpPoint (Use?)
// 4 uint HP
// 4 uint MP
// 1 byte AutoInverstExp(1 = Beginner Icon, 2 = Helpful, 3 = Beginner&Helpful)
// 1 byte DailyPK
// 2 ushort TotalPK
// 4 uint PKPenaltyPoint
// 1 byte HwanLevel
// 1 byte *unk01 -> Check for != 0
// 1 byte Inventory.Size
// 1 byte Inventory.Items.Count
// foreach(InventoryItem)
// {
// *** VISIT PRIVAT_INVENTORY ***
// }
//
// 1 byte Character.AvatarInventory.Size
// 1 byte Character.AvatarInventory.Items.Count
// foreach(AvatarItem)
// {
// *** VISIT PRIVAT_INVENTORY ***
// }
//
// 1 byte unk03 -> Check for != 0 (MaskFlag?)
//
// 1 byte MasteryFlag [0 = done, 1 = Mastery]
// while(MasteryFlag = 1)
// {
// 4 uint Mastery.ID
// 1 byte Mastery.Level
//
// 1 byte MasterFlag (0 = done, 1 = Mastery)
// }
//
// 1 byte SkillFlag [0 = done, 1 = Skill]
// while(SkillFlag = 1)
// {
// 4 uint Skill.ID
// 1 byte Skill.Enable
//
// 1 byte SkillFlag (0 = done, 1 = Skill)
// }
//
// 2 ushort CompletedQuestCount
// foreach(CompletedQuet)
// {
// 4 uint RefQuestID
// }
// 1 byte ActiveQuestCount
// foreach(ActiveQuest)
// {
// 4 uint Quest.ID
// 1 byte Quest.AchievementCount (Repetition Amount = Bit && Completetion Amount = Bit)
// 1 byte Quest.*unk04 -> Check for != 0
// 1 byte Quest.Type (8 = , 24 = , 88 = )
// 1 byte Quest.Status (1 = Untouched, 7 = Started, 8 = Complete)
// 1 byte Quest.ObjectiveCount
// foreach(Objective)
// {
// 1 byte Objective.ID
// 1 byte Objective.Status (00 = done, 01 = incomplete)
// 2 ushort Objective.Name.Length
// * string Objective.Name
// 1 byte Objective.TaskCount
// foreach(ObjectiveTask)
// {
// 4 uint Task.Value (=> Killed monsters; Collected items)
// }
// }
// if(Quest.Type == 88)
// {
// 1 byte Quest.TaskCount
// foreach(QuestTask)
// {
// 4 uint RefObjID (=> NPCs to deliver to, when complete you get reward)
// }
// }
// }
//
// 1 byte *unk05 -> Check for != 0
// 4 ushort *unk06 -> Check for != 0
//
// 4 uint UniqueID
// 4 ushort RegionID (=> XSec; YSec)
// 4 float XOffset
// 4 float ZOffset
// 4 float YOffset
// 1 byte DestinationFlag
// 1 byte MovementType(0 = Walking, 1 = Running)
// if(DestinationFlag)
// {
// 1 byte DestXSec
// 1 byte DestYSec
// 2 ushort DestX
// 2 ushort DestZ
// 2 ushort DestY
// }
// else
// {
// 1 byte SourceFlag (1 = Sky-/ArrowKey-walking)
// 2 ushort Angle
// }
// 1 byte StateFlag(1 = Alive, 2 = Dead)
// 1 byte *unk07 -> Check for != 0
// 1 byte Action (0 = None, 2 = Walking, 3 = Running, 4 = Sitting)
// 1 byte Status(0 = None,2 = ??*@GrowthPet*, 3 = Invincible, 4 = Invisible)
// 4 float WalkSpeed
// 4 float RunSpeed
// 4 float HwanSpeed
// 1 byte ActiveBuffCount
// foreach(ActiveBuff)
// {
// RefSkillID
// TimedJobID
// if(RefSkill.Param2 is 1701213281 -> atfe -> "auto transfer effect" like Recovery Division)
// {
// 1 byte Creator
// }
// }
//
// 2 ushort Name.Length
// * string Name
// 2 ushort JobName.Length
// * string JobName
// 1 byte JobType (0 = None, 1 = Trader, 2 = Tief, 3 = Hunter)
// 1 byte JobLevel
// 4 uint JobExp
// 4 uint JobContribution
// 4 uint JobReward
// 1 byte *unk08 -> Check for != 0 (According to Spawn structure => MurderFlag?)
// 1 byte *unk09 -> Check for != 0 (According to Spawn structure => RideFlag or AttackFlag?)
// 1 byte *unk10 -> Check for != 0 (According to Spawn structure => EquipmentCountdown?)
// 1 byte PK Flag(255 = Disable, 34 = Enable)
// 8 ulong *unk11
// 4 uint JID (=> GameAccountID)
// 1 byte GMFlag
// 1 byte *unk12
// 1 byte HotkeyCount
// foreach(Hotkey)
// {
// 1 byte SlotSeq
// 1 byte SlotType(37 = COS Command, 70 = InventoryItem, 71 = EquipedItem, 73 = Skill, 74 = Action, 78 = EquipedAvatar)
// 4 uint Data
// }
// 1 byte HP Slot (FValue * 10 + Slot)
// 1 byte HP Value (Enabled = 128 + Value)
// 1 byte MP Slot(FValue * 10 + Slot)
// 1 byte MP Value(Enabled = 128 + Value)
// 1 byte Universal Slot (Enabled = 128 + Value)
// 1 byte Universal Value(Enabled = 128,0 = Disabled)
// 1 byte Potion Delay(Enabled = 128 + Value)
//
// 1 byte BlockedPlayCount
//
// foreach(BlockedPlayer)
// {
// 2 ushort TargetName.Length
// * string TargetName
// }
// 4 uint *unk13
// 1 byte *unk14
Code:
// 1 byte Item.Slot
// 4 uint Item.RentType
// switch(Item.RentType)
// {
// case 1:
// 2 ushort Item.Rent.CanDelete (adds "Will be deleted when time period is over" to item)
// 4 uint Item.Rent.PeriodBeginTime
// 4 uint Item.Rent.PeriodEndTime
// break;
//
// case 2:
// 2 ushort Item.Rent.CanDelete (adds "Will be deleted when time period is over" to item)
// 2 ushort Item.Rent.CanRecharge (adds "Able to extend" to item)
// 4 uint Item.Rent.MeterRateTime
// break;
//
// case 3:
// 2 ushort Item.Rent.CanDelete (adds "Will be deleted when time period is over" to item)
// 4 uint Item.Rent.PeriodBeginTime
// 4 uint Item.Rent.PeriodEndTime
// 2 ushort Item.Rent.CanRecharge (adds "Able to extend" to item)
// 4 uint Item.Rent.PackingTime
// break;
// }
//
// 4 uint Item.RefItemID
// switch(Item.ItemType) //from Reference
// {
// case "Equipment":
// 1 byte InventoryItem.OptLevel
// 8 ulong InventoryItem.Variance
// 4 uint InventoryItem.Data (=> Durability)
// 1 byte InventoryItem.MagParamNum (=> Blue, Red )
// ForEach(MagParam)
// {
// 4 uint MagParam.Type
// 4 uint MagParam.Value
// }
// 1 byte OptType (1 => Socket)
// 1 byte OptCount
// ForEach(Option)
// {
// 1 byte Option.Slot
// 4 uint Option.ID
// 4 uint Option.nParam1 (=> Reference to Socket)
// }
// 1 byte OptType (2 => Advanced elixir)
// 1 byte OptCount
// ForEach(Option)
// {
// 1 byte Option.Slot
// 4 uint Option.ID
// 4 uint Option.OptValue (=> "Advanced elixir in effect [+OptValue]")
// }
// //Notice for Advanced Elixir modding.
// //Mutiple adv elixirs only possible with db edit. nOptValue of last nSlot will be shown as elixir in effect but total Plus value is correct
// //You also have to fix error when "Buy back" from NPC
// //## Stored procedure Error(-1): {?=CALL _Bind_Option_Manager (3, 174627, 1, 0, 0, 0, 0, 0, 0)} ## D:\WORK2005\Source\SilkroadOnline\Server\SR_GameServer\AsyncQuery_Storage.cpp AQ_StorageUpdater::DoWork_AddBindingOption 1366
// //Storage Operation Failed!!! [OperationType: 34, ErrorCode: 174627]
// //Query: {CALL _STRG_RESTORE_SOLDITEM_ITEM_MAGIC (174628, ?, ?, 34, 6696,13, 137,8,0,137, 1,4294967506,0,0,0,0,0,0,0,0,0,0,0,199970734269)}
// //AQ Failed! Log out!! [AQType: 1]
// break;
//
// case "AttributeStone":
// case "MagicStone":
// 2 ushort StackCount
// 1 byte AttributeAssimilationProbability
// break;
//
// case "GrowthPet"
// case "AbilityPet"
// 1 byte Status (1 = Unsumonned, 2 = Summoned, 3 = Alive, 4 = Dead)
// 4 uint RefObjID
// 2 ushort Name.Lenght
// * string Name
// if(AbilityPet)
// {
// 4 uint SecondsToRentEndTime
// }
// 1 byte *unk02 -> Check for != 0
// break;
//
// case "Item Exchange Coupon"
// 2 ushort StackCount
// 1 byte MagParamNum
// ForEach(MagParam)
// {
// 8 ulong MagParam.Value
// //1. MagParam => CouponRefItemID [fixed]
// //2. MagParam => CouponItemAmount [fixed]
// //When Coupon holds Scrolls or similar, these 2 MagParams above are used.
// //When Coupon holds Equipment, 8 MagParams are used
// //They are defined in database by "[BIIV]<M:str,1,3><M:int,1,3><O:3>"
// //As MagParams we get those 2 above and
// //01 4D 01 72 74 73 00 00 MagParam3 - .M.rts.......... (=> There is our str, don't ask me why its reversed)
// //03 00 00 00 00 00 00 00 MagParam4 - MagParam.Value (=> Amount of +STR)
// //01 4D 01 74 6E 69 00 00 MagParam5 - .M.tni.......... (=> There is our int, don't ask me why its reversed)
// //03 00 00 00 00 00 00 00 MagParam6 - MagParam.Value (=> Amount of +INT)
// //01 4F 00 00 00 00 00 00 MagParam7 - .O.............. (=> There is our O for OptLevel)
// //03 00 00 00 00 00 00 00 MagParam8 - OptLevel (=> Amount of +Overall)
// }
// break;
//
// case "Magic Cube":
// 4 uint StoredItemCount
// break;
//
// case default:
// 2 ushort StackCount
// break;
Code:
//Opcode: 0x34A6 //Name: SERVER_AGENT_CHARACTER_DATA_END //Description: //Encryption: false //Massive: false public const ushort SERVER_AGENT_CHARACTER_DATA_END = 0x34A6;
Code:
//Opcode: 0x3020 //Name: SERVER_AGENT_CHARACTER_CELESTIAL_POSITION //Description: //Encryption: false //Massive: false public const ushort SERVER_AGENT_CHARACTER_CELESTIAL_POSITION = 0x3020; // 4 uint UniqueID // 2 ushort MoonPosition // 1 byte Hour // 1 byte Minute
Code:
//Opcode: 0x303D //Name: SERVER_AGENT_CHARACTER_STATS //Description: //Encryption: false //Massive: false public const ushort SERVER_AGENT_CHARACTER_STATS = 0x303D; // 4 uint PhyAtkMin // 4 uint PhyAtkMax // 4 uint MagAtkMin // 4 uint MagAtkMax // 2 ushort PhyDef // 2 ushort MagDef // 2 ushort HitRate // 2 ushort ParryRate // 4 uint MaxHP // 4 uint MaxMP // 2 ushort STR // 2 ushort INT