Skip to content
Permalink
Browse files
Added support for client 2015-10-01 / 2015-10-29
* This does not add support for Doram server side.
Thanks to @rytech!
  • Loading branch information
aleos89 committed Jan 28, 2016
1 parent 497cca1 commit e3c274ac5e9f0a7d3e2229931db07d4ab04e3b07
Showing with 92 additions and 20 deletions.
  1. +34 −1 db/packet_db.txt
  2. +36 −10 src/char/char.c
  3. +3 −1 src/char/char.h
  4. +12 −6 src/char/char_clif.c
  5. +2 −1 src/common/utils.c
  6. +4 −0 src/map/clif.c
  7. +1 −1 src/map/clif.h
@@ -2561,5 +2561,38 @@ packet_keys: 0x17F83A19,0x116944F4,0x1CC541E9 // [Napster]
0x097F,-1 // ZC_SELECTCART
0x0980,7,selectcart,2:6 // CZ_SELECTCART

//2015-10-01bRagexeRE
packet_ver: 54
packet_keys: 0x45B945B9,0x45B945B9,0x45B945B9 // [Dastgir]
0x0369,7,actionrequest,2:6
0x083c,10,useskilltoid,2:4:6
0x0437,5,walktoxy,2
0x035f,6,ticksend,2
0x0202,5,changedir,2:4
0x07e4,6,takeitem,2
0x0362,6,dropitem,2:4
0x07ec,8,movetokafra,2:4
0x0364,8,movefromkafra,2:4
0x0438,10,useskilltopos,2:4:6:8
0x0366,90,useskilltoposmoreinfo,2:4:6:8:10
0x096a,6,getcharnamerequest,2
0x0368,6,solvecharname,2
0x0838,12,searchstoreinfolistitemclick,2:6:10
0x0835,2,searchstoreinfonextpage,0
0x0819,-1,searchstoreinfo,2:4:5:9:13:14:15
0x0811,-1,reqtradebuyingstore,2:4:8:12
0x0360,6,reqclickbuyingstore,2
0x0817,2,reqclosebuyingstore,0
0x0815,-1,reqopenbuyingstore,2:4:8:9:89
0x0365,18,partybookingregisterreq,2:4:6
//0x0363,8 // CZ_JOIN_BATTLE_FIELD
0x0281,-1,itemlistwindowselected,2:4:8:12
0x022d,19,wanttoconnection,2:6:10:14:18
0x0802,26,partyinvite2,2
//0x0436,4 // CZ_GANGSI_RANK
0x023b,26,friendslistadd,2
0x0361,5,hommenu,2:4
0x0860,36,storagepassword,2:4:20

//Add new packets here
//packet_ver: 54
//packet_ver: 55
@@ -1408,7 +1408,11 @@ int char_check_char_name(char * name, char * esc_name)
// Function to create a new character
//-----------------------------------
#if PACKETVER >= 20120307
#if PACKETVER >= 20151001
int char_make_new_char_sql(struct char_session_data* sd, char* name_, int slot, int hair_color, int hair_style, short start_job, short unknown, int sex) { // TODO: Unknown byte
#else
int char_make_new_char_sql(struct char_session_data* sd, char* name_, int slot, int hair_color, int hair_style) {
#endif
int str = 1, agi = 1, vit = 1, int_ = 1, dex = 1, luk = 1;
#else
int char_make_new_char_sql(struct char_session_data* sd, char* name_, int str, int agi, int vit, int int_, int dex, int luk, int slot, int hair_color, int hair_style) {
@@ -1428,6 +1432,19 @@ int char_make_new_char_sql(struct char_session_data* sd, char* name_, int str, i

//check other inputs
#if PACKETVER >= 20120307
#if PACKETVER >= 20151001
switch(sex) {
case SEX_FEMALE:
sex = 'F';
break;
case SEX_MALE:
sex = 'M';
break;
default:
sex = 'U';
break;
}
#endif
if(slot < 0 || slot >= sd->char_slots)
#else
if((slot < 0 || slot >= sd->char_slots) // slots
@@ -1461,31 +1478,40 @@ int char_make_new_char_sql(struct char_session_data* sd, char* name_, int str, i
schema_config.charlog_db, "make new char", sd->account_id, slot, esc_name, str, agi, vit, int_, dex, luk, hair_style, hair_color) )
Sql_ShowDebug(sql_handle);
}
#if PACKETVER >= 20120307

#if PACKETVER >= 20151001
if (start_job != JOB_NOVICE)
return -2; // Invalid job
#endif

//Insert the new char entry to the database
if( SQL_ERROR == Sql_Query(sql_handle, "INSERT INTO `%s` (`account_id`, `char_num`, `name`, `zeny`, `status_point`,`str`, `agi`, `vit`, `int`, `dex`, `luk`, `max_hp`, `hp`,"
#if PACKETVER >= 20151001
if( SQL_ERROR == Sql_Query(sql_handle, "INSERT INTO `%s` (`account_id`, `char_num`, `name`, `class`, `zeny`, `status_point`, `str`, `agi`, `vit`, `int`, `dex`, `luk`, `max_hp`, `hp`,"
"`max_sp`, `sp`, `hair`, `hair_color`, `last_map`, `last_x`, `last_y`, `save_map`, `save_x`, `save_y`, `sex`) VALUES ("
"'%d', '%d', '%s', '%d', '%d', '%d', '%d', '%d', '%d', '%d', '%d', '%d', '%d', '%d', '%d', '%d', '%d', '%d', '%s', '%d', '%d', '%s', '%d', '%d', '%c')",
schema_config.char_db, sd->account_id , slot, esc_name, start_job, charserv_config.start_zeny, 48, str, agi, vit, int_, dex, luk,
(40 * (100 + vit)/100) , (40 * (100 + vit)/100 ), (11 * (100 + int_)/100), (11 * (100 + int_)/100), hair_style, hair_color,
mapindex_id2name(charserv_config.start_point[start_point_idx].map), charserv_config.start_point[start_point_idx].x, charserv_config.start_point[start_point_idx].y, mapindex_id2name(charserv_config.start_point[start_point_idx].map), charserv_config.start_point[start_point_idx].x, charserv_config.start_point[start_point_idx].y, sex) )
#elif PACKETVER >= 20120307
if( SQL_ERROR == Sql_Query(sql_handle, "INSERT INTO `%s` (`account_id`, `char_num`, `name`, `zeny`, `status_point`, `str`, `agi`, `vit`, `int`, `dex`, `luk`, `max_hp`, `hp`,"
"`max_sp`, `sp`, `hair`, `hair_color`, `last_map`, `last_x`, `last_y`, `save_map`, `save_x`, `save_y`) VALUES ("
"'%d', '%d', '%s', '%d', '%d','%d', '%d', '%d', '%d', '%d', '%d', '%d', '%d','%d', '%d','%d', '%d', '%s', '%d', '%d', '%s', '%d', '%d')",
"'%d', '%d', '%s', '%d', '%d', '%d', '%d', '%d', '%d', '%d', '%d', '%d', '%d', '%d', '%d', '%d', '%d', '%s', '%d', '%d', '%s', '%d', '%d')",
schema_config.char_db, sd->account_id , slot, esc_name, charserv_config.start_zeny, 48, str, agi, vit, int_, dex, luk,
(40 * (100 + vit)/100) , (40 * (100 + vit)/100 ), (11 * (100 + int_)/100), (11 * (100 + int_)/100), hair_style, hair_color,
mapindex_id2name(charserv_config.start_point[start_point_idx].map), charserv_config.start_point[start_point_idx].x, charserv_config.start_point[start_point_idx].y, mapindex_id2name(charserv_config.start_point[start_point_idx].map), charserv_config.start_point[start_point_idx].x, charserv_config.start_point[start_point_idx].y) )
{
Sql_ShowDebug(sql_handle);
return -2; //No, stop the procedure!
}
#else
//Insert the new char entry to the database
if( SQL_ERROR == Sql_Query(sql_handle, "INSERT INTO `%s` (`account_id`, `char_num`, `name`, `zeny`, `str`, `agi`, `vit`, `int`, `dex`, `luk`, `max_hp`, `hp`,"
"`max_sp`, `sp`, `hair`, `hair_color`, `last_map`, `last_x`, `last_y`, `save_map`, `save_x`, `save_y`) VALUES ("
"'%d', '%d', '%s', '%d', '%d', '%d', '%d', '%d', '%d', '%d', '%d', '%d','%d', '%d','%d', '%d', '%s', '%d', '%d', '%s', '%d', '%d')",
"'%d', '%d', '%s', '%d', '%d', '%d', '%d', '%d', '%d', '%d', '%d', '%d', '%d', '%d', '%d', '%d', '%s', '%d', '%d', '%s', '%d', '%d')",
schema_config.char_db, sd->account_id , slot, esc_name, charserv_config.start_zeny, str, agi, vit, int_, dex, luk,
(40 * (100 + vit)/100) , (40 * (100 + vit)/100 ), (11 * (100 + int_)/100), (11 * (100 + int_)/100), hair_style, hair_color,
mapindex_id2name(charserv_config.start_point[start_point_idx].map), charserv_config.start_point[start_point_idx].x, charserv_config.start_point[start_point_idx].y, mapindex_id2name(charserv_config.start_point[start_point_idx].map), charserv_config.start_point[start_point_idx].x, charserv_config.start_point[start_point_idx].y) )
#endif
{
Sql_ShowDebug(sql_handle);
return -2; //No, stop the procedure!
}
#endif

//Retrieve the newly auto-generated char id
char_id = (int)Sql_LastInsertId(sql_handle);
//Give the char the default items
@@ -280,7 +280,9 @@ void char_auth_ok(int fd, struct char_session_data *sd);
void char_set_charselect(uint32 account_id);
void char_read_fame_list(void);

#if PACKETVER >= 20120307
#if PACKETVER >= 20151001
int char_make_new_char_sql(struct char_session_data* sd, char* name_, int slot, int hair_color, int hair_style, short start_job, short unknown, int sex);
#elif PACKETVER >= 20120307
int char_make_new_char_sql(struct char_session_data* sd, char* name_, int slot, int hair_color, int hair_style);
#else
int char_make_new_char_sql(struct char_session_data* sd, char* name_, int str, int agi, int vit, int int_, int dex, int luk, int slot, int hair_color, int hair_style);
@@ -887,22 +887,27 @@ int chclif_parse_charselect(int fd, struct char_session_data* sd,uint32 ipl){

// S 0970 <name>.24B <slot>.B <hair color>.W <hair style>.W
// S 0067 <name>.24B <str>.B <agi>.B <vit>.B <int>.B <dex>.B <luk>.B <slot>.B <hair color>.W <hair style>.W
// S 0a39 <name>.24B <slot>.B <hair color>.W <hair style>.W <starting job ID>.W <Unknown>.(W or 2 B's)??? <sex>.B
int chclif_parse_createnewchar(int fd, struct char_session_data* sd,int cmd){
int i = 0;

if (cmd == 0x970) FIFOSD_CHECK(31) //>=20120307
if (cmd == 0xa39) FIFOSD_CHECK(36) //>=20151001
else if (cmd == 0x970) FIFOSD_CHECK(31) //>=20120307
else if (cmd == 0x67) FIFOSD_CHECK(37)
else return 0;

if( (charserv_config.char_new)==0 ) //turn character creation on/off [Kevin]
i = -2;
else {
#if PACKETVER < 20120307
i = char_make_new_char_sql(sd, (char*)RFIFOP(fd,2),RFIFOB(fd,26),RFIFOB(fd,27),RFIFOB(fd,28),RFIFOB(fd,29),RFIFOB(fd,30),RFIFOB(fd,31),RFIFOB(fd,32),RFIFOW(fd,33),RFIFOW(fd,35));
RFIFOSKIP(fd,37);
#else
#if PACKETVER >= 20151001
i = char_make_new_char_sql(sd, (char*)RFIFOP(fd,2),RFIFOB(fd,26),RFIFOW(fd,27),RFIFOW(fd,29),RFIFOW(fd,31),RFIFOW(fd,32),RFIFOB(fd,35));
RFIFOSKIP(fd,36);
#elif PACKETVER >= 20120307
i = char_make_new_char_sql(sd, (char*)RFIFOP(fd,2),RFIFOB(fd,26),RFIFOW(fd,27),RFIFOW(fd,29));
RFIFOSKIP(fd,31);
#else
i = char_make_new_char_sql(sd, (char*)RFIFOP(fd,2),RFIFOB(fd,26),RFIFOB(fd,27),RFIFOB(fd,28),RFIFOB(fd,29),RFIFOB(fd,30),RFIFOB(fd,31),RFIFOB(fd,32),RFIFOW(fd,33),RFIFOW(fd,35));
RFIFOSKIP(fd,37);
#endif
}

@@ -1212,7 +1217,8 @@ int chclif_parse(int fd) {
// char select
case 0x66: next=chclif_parse_charselect(fd,sd,ipl); break;
// createnewchar
case 0x970: next=chclif_parse_createnewchar(fd,sd,cmd); break;
case 0xa39:
case 0x970:
case 0x67: next=chclif_parse_createnewchar(fd,sd,cmd); break;
// delete char
case 0x68: next=chclif_parse_delchar(fd,sd,cmd); break; //
@@ -384,7 +384,8 @@ uint32 date2version(int date) {
else if(date < 20141022) return 50;
else if(date < 20150513) return 51;
else if(date < 20150916) return 52;
else if(date >= 20150916) return 53;
else if(date < 20151001) return 53;
else if(date >= 20151001) return 54;

else return 30; //default
}
@@ -12273,6 +12273,10 @@ void clif_parse_NpcStringInput(int fd, struct map_session_data* sd){
if( message_len <= 0 )
return; // invalid input

#if PACKETVER >= 20151001
message_len++;
#endif

safestrncpy(sd->npc_str, message, min(message_len,CHATBOX_SIZE));
npc_scriptcont(sd, npcid, false);
}
@@ -35,7 +35,7 @@ struct party_booking_ad_info;
enum { // packet DB
MIN_PACKET_DB = 0x064,
MAX_PACKET_DB = 0xAFF,
MAX_PACKET_VER = 53,
MAX_PACKET_VER = 54,
MAX_PACKET_POS = 20,
};

2 comments on commit e3c274a

@admkakaroto
Copy link
Contributor

@admkakaroto admkakaroto commented on e3c274a Jan 29, 2016

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

nice!

@M4karov
Copy link

@M4karov M4karov commented on e3c274a Mar 15, 2016

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Bom trabalho!

Please sign in to comment.