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