| 72 |
#include "compat/mkdir.h" |
#include "compat/mkdir.h" |
| 73 |
#include "d2charfile.h" |
#include "d2charfile.h" |
| 74 |
#include "connection.h" |
#include "connection.h" |
| 75 |
|
#include "d2charstatus.h" |
| 76 |
#include "game.h" |
#include "game.h" |
| 77 |
#include "bnetd.h" |
#include "bnetd.h" |
| 78 |
#include "d2cs_protocol.h" |
#include "d2cs_protocol.h" |
| 284 |
unsigned int seqno, reply; |
unsigned int seqno, reply; |
| 285 |
unsigned int pos; |
unsigned int pos; |
| 286 |
t_elem * elem; |
t_elem * elem; |
| 287 |
char checksum_con; |
t_charstatus * cs; |
|
|
|
| 288 |
|
|
| 289 |
|
|
| 290 |
pos=sizeof(t_client_d2cs_creategamereq); |
pos=sizeof(t_client_d2cs_creategamereq); |
| 303 |
return -1; |
return -1; |
| 304 |
} |
} |
| 305 |
|
|
|
/* get checknum from client, by sowater */ |
|
|
checksum_con=d2cs_conn_get_checknum(c); |
|
|
|
|
|
|
|
| 306 |
tempflag=bn_int_get(packet->u.client_d2cs_creategamereq.gameflag); |
tempflag=bn_int_get(packet->u.client_d2cs_creategamereq.gameflag); |
| 307 |
leveldiff=bn_byte_get(packet->u.client_d2cs_creategamereq.leveldiff); |
leveldiff=bn_byte_get(packet->u.client_d2cs_creategamereq.leveldiff); |
| 308 |
maxchar=bn_byte_get(packet->u.client_d2cs_creategamereq.maxchar); |
maxchar=bn_byte_get(packet->u.client_d2cs_creategamereq.maxchar); |
| 325 |
reply=D2CS_CLIENT_CREATEGAMEREPLY_NAME_EXIST; |
reply=D2CS_CLIENT_CREATEGAMEREPLY_NAME_EXIST; |
| 326 |
|
|
| 327 |
/* right checknum? sowater */ |
/* right checknum? sowater */ |
| 328 |
} else if((*gamedesc!=checksum_con) && (prefs_antibot_when_password()==0) && prefs_enable_antibot()) { |
} else if((prefs_antibot_when_password()==0) && prefs_enable_antibot() && d2cs_conn_verify_checknum(c, *gamedesc)) { |
| 329 |
eventlog(eventlog_level_info,__FUNCTION__,"checksum %c from packet not match checksum %c from connection",*gamedesc,checksum_con); |
eventlog(eventlog_level_info,__FUNCTION__,"checksum %c from packet not match checksum from connection",*gamedesc); |
| 330 |
reply=D2CS_CLIENT_CREATEGAMEREPLY_FAILED; |
reply=D2CS_CLIENT_CREATEGAMEREPLY_FAILED; |
| 331 |
/* when antibot_when_password is true, by sowater, 20051001 */ |
/* when antibot_when_password is true, by sowater, 20051001 */ |
| 332 |
} else if((*gamedesc!=checksum_con) && (strlen(gamepass)!=0) && prefs_antibot_when_password() |
} else if((strlen(gamepass)!=0 || maxchar<4 || leveldiff<30) && prefs_antibot_when_password() && prefs_enable_antibot() |
| 333 |
&& prefs_enable_antibot()) { |
&& d2cs_conn_verify_checknum(c, *gamedesc)) { |
| 334 |
eventlog(eventlog_level_info,__FUNCTION__,"checksum %c from packet not match checksum %c from connection",*gamedesc,checksum_con); |
eventlog(eventlog_level_info,__FUNCTION__,"checksum %c from packet not match checksum from connection",*gamedesc); |
| 335 |
reply=D2CS_CLIENT_CREATEGAMEREPLY_FAILED; |
reply=D2CS_CLIENT_CREATEGAMEREPLY_FAILED; |
| 336 |
} else if (!gq && gqlist_find_game(gamename)) { |
} else if (!gq && gqlist_find_game(gamename)) { |
| 337 |
eventlog(eventlog_level_info,__FUNCTION__,"game name %s is already exist in game queue",gamename); |
eventlog(eventlog_level_info,__FUNCTION__,"game name %s is already exist in game queue",gamename); |
| 353 |
} else if (!(game=d2cs_game_create(gamename,gamepass,gamedesc,gameflag))) { |
} else if (!(game=d2cs_game_create(gamename,gamepass,gamedesc,gameflag))) { |
| 354 |
reply=D2CS_CLIENT_CREATEGAMEREPLY_NAME_EXIST; |
reply=D2CS_CLIENT_CREATEGAMEREPLY_NAME_EXIST; |
| 355 |
} else { |
} else { |
| 356 |
reply=D2CS_CLIENT_CREATEGAMEREPLY_SUCCEED; |
/* By Leaflet, 20060613 */ |
| 357 |
game_set_d2gs(game,gs); |
if ((cs=charstatus_list_find_charstatus_by_charname(c->charname)) == NULL) |
| 358 |
d2gs_add_gamenum(gs, 1); |
cs = charstatus_create(c->charname); |
| 359 |
game_set_gameflag_ladder(game,ladder); |
|
| 360 |
game_set_gameflag_expansion(game,expansion); |
if (time(NULL) - cs->last_create_time <= prefs_create_game_interval()) |
| 361 |
game_set_created(game,0); |
cs->frequently_create_count++; |
| 362 |
game_set_leveldiff(game,leveldiff); |
|
| 363 |
game_set_charlevel(game,conn_get_charinfo_level(c)); |
if (prefs_enable_antibot() && cs->frequently_create_count > prefs_frequently_create_limit() |
| 364 |
game_set_maxchar(game,maxchar); |
&& d2cs_conn_verify_checknum(c, *gamedesc)) { |
| 365 |
game_set_gameflag_difficulty(game,difficulty); |
eventlog(eventlog_level_info,__FUNCTION__,"checksum %c from packet not match checksum from connection",*gamedesc); |
| 366 |
game_set_gameflag_hardcore(game,hardcore); |
reply=D2CS_CLIENT_CREATEGAMEREPLY_FAILED; |
| 367 |
|
} else { |
| 368 |
|
if (strlen(gamedesc)!=0) { |
| 369 |
|
if (!d2cs_conn_verify_checknum(c, *gamedesc)) |
| 370 |
|
cs->frequently_create_count = 0; |
| 371 |
|
else |
| 372 |
|
eventlog(eventlog_level_info,__FUNCTION__,"checksum %c from packet not match checksum from connection", |
| 373 |
|
*gamedesc); |
| 374 |
|
} |
| 375 |
|
|
| 376 |
|
if (time(NULL) - cs->last_create_time > prefs_create_game_interval()) |
| 377 |
|
{ |
| 378 |
|
cs->frequently_create_count--; |
| 379 |
|
if (cs->frequently_create_count<0) |
| 380 |
|
cs->frequently_create_count=0; |
| 381 |
|
} |
| 382 |
|
cs->last_create_time = time(NULL); |
| 383 |
|
|
| 384 |
|
reply=D2CS_CLIENT_CREATEGAMEREPLY_SUCCEED; |
| 385 |
|
game_set_d2gs(game,gs); |
| 386 |
|
d2gs_add_gamenum(gs, 1); |
| 387 |
|
game_set_gameflag_ladder(game,ladder); |
| 388 |
|
game_set_gameflag_expansion(game,expansion); |
| 389 |
|
game_set_created(game,0); |
| 390 |
|
game_set_leveldiff(game,leveldiff); |
| 391 |
|
game_set_charlevel(game,conn_get_charinfo_level(c)); |
| 392 |
|
game_set_maxchar(game,maxchar); |
| 393 |
|
game_set_gameflag_difficulty(game,difficulty); |
| 394 |
|
game_set_gameflag_hardcore(game,hardcore); |
| 395 |
|
} |
| 396 |
} |
} |
| 397 |
|
|
| 398 |
seqno=bn_short_get(packet->u.client_d2cs_creategamereq.seqno); |
seqno=bn_short_get(packet->u.client_d2cs_creategamereq.seqno); |