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
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






