Index: src/common/socket.c =================================================================== --- src/common/socket.c (revision 17326) +++ src/common/socket.c (working copy) @@ -43,7 +43,7 @@ ///////////////////////////////////////////////////////////////////// #if defined(WIN32) ///////////////////////////////////////////////////////////////////// -// windows portability layer +// windows portability layer typedef int socklen_t; @@ -89,7 +89,7 @@ /// Inserts the socket into the global array of sockets. /// Returns a new fd associated with the socket. -/// If there are too many sockets it closes the socket, sets an error and +/// If there are too many sockets it closes the socket, sets an error and // returns -1 instead. /// Since fd 0 is reserved, it returns values in the range [1,FD_SETSIZE[. /// @@ -273,20 +273,15 @@ *--------------------------------------*/ void set_nonblocking(int fd, unsigned long yes) { - // FIONBIO Use with a nonzero argp parameter to enable the nonblocking mode of socket s. - // The argp parameter is zero if nonblocking is to be disabled. + // FIONBIO Use with a nonzero argp parameter to enable the nonblocking mode of socket s. + // The argp parameter is zero if nonblocking is to be disabled. if( sIoctl(fd, FIONBIO, &yes) != 0 ) ShowError("set_nonblocking: Failed to set socket #%d to non-blocking mode (%s) - Please report this!!!\n", fd, error_msg()); } -void setsocketopts(int fd) -{ - struct timeval timeout; +void setsocketopts(int fd,int delay_timeout){ int yes = 1; // reuse fix - timeout.tv_sec = 10; - timeout.tv_usec = 0; - #if !defined(WIN32) // set SO_REAUSEADDR to true, unix only. on windows this option causes // the previous owner of the socket to give up, which is not desirable @@ -297,11 +292,6 @@ #endif #endif - if (setsockopt (fd, SOL_SOCKET, SO_RCVTIMEO, (char *)&timeout,sizeof(timeout)) < 0) - ShowError("setsockopt failed\n"); - if (setsockopt (fd, SOL_SOCKET, SO_SNDTIMEO, (char *)&timeout,sizeof(timeout)) < 0) - ShowError("setsockopt failed\n"); - // Set the socket into no-delay mode; otherwise packets get delayed for up to 200ms, likely creating server-side lag. // The RO protocol is mainly single-packet request/response, plus the FIFO model already does packet grouping anyway. sSetsockopt(fd, IPPROTO_TCP, TCP_NODELAY, (char *)&yes, sizeof(yes)); @@ -315,6 +305,16 @@ if( sSetsockopt(fd, SOL_SOCKET, SO_LINGER, (char*)&opt, sizeof(opt)) ) ShowWarning("setsocketopts: Unable to set SO_LINGER mode for connection #%d!\n", fd); } + if(delay_timeout){ + struct timeval timeout; + timeout.tv_sec = 10; + timeout.tv_usec = 0; + + if (sSetsockopt (fd, SOL_SOCKET, SO_RCVTIMEO, (char *)&timeout,sizeof(timeout)) < 0) + ShowError("setsocketopts: Unable to set SO_RCVTIMEO timeout for connection #%d!\n"); + if (sSetsockopt (fd, SOL_SOCKET, SO_SNDTIMEO, (char *)&timeout,sizeof(timeout)) < 0) + ShowError("setsocketopts: Unable to set SO_SNDTIMEO timeout for connection #%d!\n"); + } } /*====================================== @@ -439,7 +439,7 @@ return -1; } - setsocketopts(fd); + setsocketopts(fd,0); set_nonblocking(fd, 1); #ifndef MINICORE @@ -484,7 +484,7 @@ return -1; } - setsocketopts(fd); + setsocketopts(fd,0); set_nonblocking(fd, 1); server_address.sin_family = AF_INET; @@ -512,7 +512,7 @@ return fd; } -int make_connection(uint32 ip, uint16 port, bool silent) { +int make_connection(uint32 ip, uint16 port, bool silent,int timeout) { struct sockaddr_in remote_address; int fd; int result; @@ -536,7 +536,7 @@ return -1; } - setsocketopts(fd); + setsocketopts(fd,timeout); remote_address.sin_family = AF_INET; remote_address.sin_addr.s_addr = htonl(ip); @@ -1163,7 +1163,7 @@ if(session[i]) do_close(i); - // session[0] ‚̃_ƒ~[ƒf[ƒ^‚ðíœ + // session[0] �̃_�~�[�f�[�^���폜 aFree(session[0]->rdata); aFree(session[0]->wdata); aFree(session[0]); Index: src/common/socket.h =================================================================== --- src/common/socket.h (revision 17326) +++ src/common/socket.h (working copy) @@ -113,7 +113,7 @@ // Function prototype declaration int make_listen_bind(uint32 ip, uint16 port); -int make_connection(uint32 ip, uint16 port, bool silent); +int make_connection(uint32 ip, uint16 port, bool silent, int timeout); int realloc_fifo(int fd, unsigned int rfifo_size, unsigned int wfifo_size); int realloc_writefifo(int fd, size_t addition); int WFIFOSET(int fd, size_t len); @@ -145,7 +145,7 @@ void set_eof(int fd); -/// Use a shortlist of sockets instead of iterating all sessions for sockets +/// Use a shortlist of sockets instead of iterating all sessions for sockets /// that have data to send or need eof handling. /// Adapted to use a static array instead of a linked list. /// Index: src/config/core.h =================================================================== --- src/config/core.h (revision 17326) +++ src/config/core.h (working copy) @@ -29,7 +29,7 @@ /// Uncomment to disable rAthena's anonymous stat report /// We kindly ask you to consider keeping it enabled, it helps us improve rAthena. -//#define STATS_OPT_OUT +#define STATS_OPT_OUT /// uncomment to enable query_sql script command and mysql logs to function on it's own thread /// be aware this feature is under tests and you should use at your own risk, we however Index: src/map/script.c =================================================================== --- src/map/script.c (revision 17326) +++ src/map/script.c (working copy) @@ -623,7 +623,7 @@ } } -// Returns name of currently running function +// Returns name of currently running function static char* script_getfuncname(struct script_state *st) { int i; @@ -6055,8 +6055,7 @@ *------------------------------------------*/ BUILDIN_FUNC(countitem) { - int nameid, i; - int count = 0; + int i, count = 0; struct item_data* id = NULL; struct script_data* data; @@ -6081,13 +6080,12 @@ } if(script_lastdata(st) == 2) { // For countitem() function - nameid = id->nameid; + int nameid = id->nameid; for(i = 0; i < MAX_INVENTORY; i++) if(sd->status.inventory[i].nameid == nameid) count += sd->status.inventory[i].amount; } else { // For countitem2() function struct item tmp_it; - int iden, ref, attr, c1, c2, c3, c4; tmp_it.nameid = id->nameid; tmp_it.identify = script_getnum(st, 3); tmp_it.refine = script_getnum(st, 4); @@ -6109,7 +6107,7 @@ return 0; } -int checkweight_sub(TBL_PC *sd,int nbargs,int *eitemid,int *eamount) +int checkweight_sub(TBL_PC *sd,int nbargs,int32 *eitemid,int32 *eamount) { struct item_data* id = NULL; int nameid,amount; @@ -6122,14 +6120,14 @@ continue; id = itemdb_exists(eitemid[i]); if( id == NULL ) { - ShowError("buildin_checkweight: Invalid item '%d'.\n", eitemid[i]); + ShowError("checkweight_sub: Invalid item '%d'.\n", eitemid[i]); return 0; } nameid = id->nameid; amount = eamount[i]; if( amount < 1 ) { - ShowError("buildin_checkweight: Invalid amount '%d'.\n", eamount[i]); + ShowError("checkweight_sub: Invalid amount '%d'.\n", eamount[i]); return 0; } @@ -6167,7 +6165,7 @@ struct map_session_data* sd; struct script_data* data; struct item_data* id = NULL; - int nameid[128], amount[128]; + int32 nameid[SCRIPT_MAX_ARRAYSIZE], amount[SCRIPT_MAX_ARRAYSIZE]; uint16 nbargs,i,j=0; if( ( sd = script_rid2sd(st) ) == NULL ) @@ -6201,10 +6199,9 @@ return 0; } -BUILDIN_FUNC(checkweight2) -{ +BUILDIN_FUNC(checkweight2){ //variable sub checkweight - int nameid[128], amount[128], i; + int32 nameid[SCRIPT_MAX_ARRAYSIZE], amount[SCRIPT_MAX_ARRAYSIZE], i; //variable for array parsing struct script_data* data_it; @@ -6222,7 +6219,7 @@ data_nb = script_getdata(st, 3); if( !data_isreference(data_it) || !data_isreference(data_nb)) { - ShowError("script:checkweight2: parameter not a variable\n"); + ShowError("buildin_checkweight2: parameter not a variable\n"); script_pushint(st,0); return 1;// not a variable } @@ -6235,19 +6232,19 @@ name_nb = reference_getname(data_nb); if( not_array_variable(*name_it) || not_array_variable(*name_nb)) { - ShowError("script:checkweight2: illegal scope\n"); + ShowError("buildin_checkweight2: illegal scope\n"); script_pushint(st,0); return 1;// not supported } if(is_string_variable(name_it) || is_string_variable(name_nb)) { - ShowError("script:checkweight2: illegal type, need int\n"); + ShowError("buildin_checkweight2: illegal type, need int\n"); script_pushint(st,0); return 1;// not supported } nb_it = getarraysize(st, id_it, idx_it, 0, reference_getref(data_it)); nb_nb = getarraysize(st, id_nb, idx_nb, 0, reference_getref(data_nb)); if(nb_it != nb_nb) { - ShowError("Size mistmatch: nb_it=%d, nb_nb=%d\n",nb_it,nb_nb); + ShowError("buildin_checkweight2: Size mistmatch: nb_it=%d, nb_nb=%d\n",nb_it,nb_nb); script_pushint(st,0); return 1; } @@ -9842,11 +9839,10 @@ TBL_NPC * nd = map_id2nd(st->oid); struct block_list* bl; enum sc_type type; - int tick, val1, val2, val3, rate, flag, isitem; - int val4 = 0; + int tick, val1, val2, val3, val4=0, rate, flag, isitem; char start_type; const char* command = script_getfuncname(st); - + if(strstr(command, "4")) start_type = 4; else if(strstr(command, "2")) @@ -9878,7 +9874,7 @@ } //solving if script from npc or item - isitem = (nd && nd->bl.id == fake_nd->bl.id || rate != 2)?true:false; + isitem = (nd && nd->bl.id == fake_nd->bl.id || flag != 2)?true:false; switch(start_type) { case 1: @@ -15049,7 +15045,7 @@ } /*======================================================= - * Add or Update a mob drop temporarily [Akinari] + * Add or Update a mob drop temporarily [Akinari] * Original Idea By: [Lupus] * * addmonsterdrop ,,; @@ -15078,7 +15074,7 @@ if(mob) { //We got a valid monster, check for available drop slot for(i = 0; i < MAX_MOB_DROP; i++) { - if(mob->dropitem[i].nameid) { + if(mob->dropitem[i].nameid) { if(mob->dropitem[i].nameid == item_id) { //If it equals item_id we update that drop c = i; break; @@ -15104,7 +15100,7 @@ } /*======================================================= - * Delete a mob drop temporarily [Akinari] + * Delete a mob drop temporarily [Akinari] * Original Idea By: [Lupus] * * delmonsterdrop ,; @@ -15130,7 +15126,7 @@ if(mob) { //We got a valid monster, check for item drop on monster for(i = 0; i < MAX_MOB_DROP; i++) { - if(mob->dropitem[i].nameid == item_id) { + if(mob->dropitem[i].nameid == item_id) { mob->dropitem[i].nameid = 0; mob->dropitem[i].p = 0; script_pushint(st,1); Index: src/map/chrif.c =================================================================== --- src/map/chrif.c (revision 17326) +++ src/map/chrif.c (working copy) @@ -1511,7 +1511,7 @@ } chrif_state = 0; - char_fd = make_connection(char_ip, char_port,false); + char_fd = make_connection(char_ip, char_port,false,10); if (char_fd == -1)//Attempt to connect later. [Skotlex] return 0; @@ -1554,13 +1554,9 @@ #ifndef STATS_OPT_OUT WFIFOHEAD(char_fd,len + 2); - WFIFOW(char_fd,0) = 0x3008; - memcpy(WFIFOP(char_fd,2), buf, len); - WFIFOSET(char_fd,len + 2); - flush_fifo(char_fd); /* ensure it's sent now. */ #endif Index: src/map/skill.c =================================================================== --- src/map/skill.c (revision 17326) +++ src/map/skill.c (working copy) @@ -1840,7 +1840,7 @@ if( sd && status_isdead(bl) ) { int sp = 0, hp = 0; - if( attack_type&(BF_WEAPON|BF_SHORT) == (BF_WEAPON|BF_SHORT) ) { + if( (attack_type&(BF_WEAPON|BF_SHORT)) == (BF_WEAPON|BF_SHORT) ) { sp += sd->bonus.sp_gain_value; sp += sd->sp_gain_race[status_get_race(bl)]; sp += sd->sp_gain_race[is_boss(bl)?RC_BOSS:RC_NONBOSS]; @@ -5119,11 +5119,11 @@ do { i = rnd() % MAX_SKILL_ABRA_DB; abra_skill_id = skill_abra_db[i].skill_id; + abra_skill_lv = min(skill_lv, skill_get_max(abra_skill_id)); } while (abra_skill_id == 0 || - skill_abra_db[i].req_lv > skill_lv || //Required lv for it to appear - rnd()%10000 >= skill_abra_db[i].per + rnd()%10000 >= skill_abra_db[i].per[abra_skill_lv] ); - abra_skill_lv = min(skill_lv, skill_get_max(abra_skill_id)); + clif_skill_nodamage (src, bl, skill_id, skill_lv, 1); if( sd ) @@ -17582,7 +17582,7 @@ static const int dx[] = {-1,-1,-1,-1, 0, 0, 0, 0, 1, 1, 1, 1, -5,-5,-5,-5,-4,-4,-4,-4,-3,-3,-3,-3,-2,-2,-2,-2, 2, 2, 2, 2, 3, 3, 3, 3, 4, 4, 4, 4, 5, 5, 5, 5, -1,-1,-1, 0, 0, 0, 1, 1, 1}; - static const int dy[] = { 0,-1,-2,-3, 0,-1,-2,-3, 0,-1,-2,-3, + static const int dy[] = { 0,-1,-2,-3, 0,-1,-2,-3, 0,-1,-2,-3, 0,-1,-2,-3, 0,-1,-2,-3, 0,-1,-2,-3, 0,-1,-2,-3, 0,-1,-2,-3, 0,-1,-2,-3, 0,-1,-2,-3, 0,-1,-2,-3, -4,-5,-6,-4,-5,-6,-4,-5,-6}; skill_unit_layout[pos].count = 53; @@ -18166,7 +18166,7 @@ static bool skill_parse_row_abradb(char* split[], int columns, int current) -{// skill_id,DummyName,RequiredHocusPocusLevel,Rate +{// skill_id,DummyName,RatePerLvl uint16 skill_id = atoi(split[0]); if( !skill_get_index(skill_id) || !skill_get_max(skill_id) ) { @@ -18180,8 +18180,8 @@ } skill_abra_db[current].skill_id = skill_id; - skill_abra_db[current].req_lv = atoi(split[2]); - skill_abra_db[current].per = atoi(split[3]); + safestrncpy(skill_abra_db[current].name, trim(split[1]), sizeof(skill_abra_db[current].name)); //store dummyname + skill_split_atoi(split[2],skill_abra_db[current].per); return true; } Index: src/map/skill.h =================================================================== --- src/map/skill.h (revision 17326) +++ src/map/skill.h (working copy) @@ -217,8 +217,8 @@ struct s_skill_abra_db { uint16 skill_id; - int req_lv; - int per; + char name[NAME_LENGTH]; + int per[MAX_SKILL_LEVEL]; }; extern struct s_skill_abra_db skill_abra_db[MAX_SKILL_ABRA_DB]; Index: src/char/char.c =================================================================== --- src/char/char.c (revision 17326) +++ src/char/char.c (working copy) @@ -3431,7 +3431,7 @@ int sfd;/* stat server fd */ RFIFOSKIP(fd, 2);/* we skip first 2 bytes which are the 0x3008, so we end up with a buffer equal to the one we send */ - if( (sfd = make_connection(host2ip("stats.rathena.org"),(uint16)25421,true) ) == -1 ) { + if( (sfd = make_connection(host2ip("stats.rathena.org"),(uint16)25421,true,10) ) == -1 ) { RFIFOSKIP(fd, RFIFOW(fd,2) );/* skip this packet */ break;/* connection not possible, we drop the report */ } @@ -4520,7 +4520,7 @@ return 0; ShowInfo("Attempt to connect to login-server...\n"); - login_fd = make_connection(login_ip, login_port, false); + login_fd = make_connection(login_ip, login_port, false,10); if (login_fd == -1) { //Try again later. [Skotlex] login_fd = 0;