You last visited: Today at 01:07
Advertisement
[Release] Silkroad Packet Documentation
Discussion on [Release] Silkroad Packet Documentation within the SRO Coding Corner forum part of the Silkroad Online category.
12/27/2013, 21:56
#1
elite*gold: 0
Join Date: Jan 2009
Posts: 314
Received Thanks: 687
[Release] Silkroad Packet Documentation
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 ( ) 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
PRIVAT_INVENTORY
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
12/27/2013, 23:45
#2
elite*gold: 0
Join Date: Jan 2012
Posts: 66
Received Thanks: 13
Anyways, It's very useful. It helps developing own stuff because you can bypass sniffing. Keep expanding that!
If I find some structures I'll share that.
01/06/2014, 11:09
#3
elite*gold: 0
Join Date: Nov 2009
Posts: 1,518
Received Thanks: 891
thank you ultra usefull
12/06/2018, 04:01
#4
elite*gold: 0
Join Date: Apr 2010
Posts: 44
Received Thanks: 4
how use this with python3 ???
12/06/2018, 06:41
#5
elite*gold: 350
Join Date: Aug 2015
Posts: 2,043
Received Thanks: 1,203
Quote:
Originally Posted by
crzy666
how use this with python3 ???
you can convert the srapi to python3
though i did it with python2.7 but should be fairly similar
12/06/2018, 07:06
#6
elite*gold: 0
Join Date: Apr 2010
Posts: 44
Received Thanks: 4
i using phbot and i write plugin
inject sit,walk,select target work but cast skill not work simple opcode 7074 skill E675 -> vampire touch not work why ?
12/06/2018, 08:07
#7
elite*gold: 350
Join Date: Aug 2015
Posts: 2,043
Received Thanks: 1,203
Quote:
Originally Posted by
crzy666
i using phbot and i write plugin
inject sit,walk,select target work but cast skill not work simple opcode 7074 skill E675 -> vampire touch not work why ?
oh.. i thought you're trying to code a proxy
no idea tbh
12/06/2018, 08:57
#8
elite*gold: 0
Join Date: Apr 2010
Posts: 44
Received Thanks: 4
Quote:
Originally Posted by
B1Q
oh.. i thought you're trying to code a proxy
no idea tbh
now i have idea -.- phbot blocked 7074 opcode Q.Q and i have one question in c# how i can start multi client ???
Similar Threads
[Release] Work In Progress LoginServer Packet Documentation
05/07/2016 - SRO Coding Corner - 61 Replies
I'm (edit: was) working on packet documentation for SRO, using my own file format.
LoginServer: LoginServer PDoc - By lesderid
Character Selection: CharacterSelection PDoc - By lesderid
Note: All (non-LoginServer) packets only work in kSRO.
Other versions will have other opcodes (and other packets).
Credits: Me, pushedx (for the awesome help), Windrius (for always being nice) and some (public) emulators.
Edit: The server moved to my new site: http://lesderid.net/...
Silkroad packet documentation
11/12/2013 - SRO Coding Corner - 1 Replies
worst
All times are GMT +2. The time now is 01:08 .